aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Dockerfile63
-rw-r--r--configure.ac24
-rw-r--r--docker-entrypoint.sh3
-rw-r--r--po/POTFILES.in133
-rw-r--r--po/de.po1706
-rw-r--r--po/es.po1760
-rw-r--r--po/fr.po1644
-rw-r--r--po/sv.po1719
-rw-r--r--po/vi.po1731
-rw-r--r--po/zh_CN.po1684
-rw-r--r--src/Makefile.am3
-rw-r--r--src/credential/Makefile.am112
-rw-r--r--src/credential/credential.conf.in5
-rw-r--r--src/credential/credential.h221
-rw-r--r--src/credential/credential_api.c513
-rw-r--r--src/credential/credential_misc.c169
-rw-r--r--src/credential/credential_misc.h35
-rw-r--r--src/credential/credential_serialization.c463
-rw-r--r--src/credential/credential_serialization.h159
-rw-r--r--src/credential/gnunet-credential.c602
-rw-r--r--src/credential/gnunet-service-credential.c1238
-rw-r--r--src/credential/plugin_gnsrecord_credential.c353
-rw-r--r--src/credential/plugin_rest_credential.c1179
-rwxr-xr-xsrc/credential/test_credential_collect.sh47
-rwxr-xr-xsrc/credential/test_credential_collect_rest.sh90
-rw-r--r--src/credential/test_credential_defaults.conf24
-rwxr-xr-xsrc/credential/test_credential_issue.sh44
-rwxr-xr-xsrc/credential/test_credential_issue_rest.sh53
-rw-r--r--src/credential/test_credential_lookup.conf28
-rwxr-xr-xsrc/credential/test_credential_verify.sh81
-rwxr-xr-xsrc/credential/test_credential_verify_and.sh81
-rwxr-xr-xsrc/credential/test_credential_verify_rest.sh87
-rwxr-xr-xsrc/credential/test_credential_verify_simple.sh50
-rw-r--r--src/exit/gnunet-daemon-exit.c2
-rw-r--r--src/gns/gns_api.c11
-rw-r--r--src/gns/plugin_gnsrecord_gns.c67
-rw-r--r--src/identity-attribute/Makefile.am44
-rw-r--r--src/identity-attribute/identity_attribute.c245
-rw-r--r--src/identity-attribute/identity_attribute.h56
-rw-r--r--src/identity-attribute/plugin_identity_attribute_gnuid.c184
-rw-r--r--src/identity-provider/Makefile.am69
-rw-r--r--src/identity-provider/gnunet-identity-token.c179
-rw-r--r--src/identity-provider/gnunet-idp.c413
-rw-r--r--src/identity-provider/gnunet-service-identity-provider.c3104
-rw-r--r--src/identity-provider/identity-provider.conf4
-rw-r--r--src/identity-provider/identity_provider.h307
-rw-r--r--src/identity-provider/identity_provider_api.c1205
-rw-r--r--src/identity-provider/identity_token.c964
-rw-r--r--src/identity-provider/identity_token.h346
-rw-r--r--src/identity-provider/jwt.c172
-rw-r--r--src/identity-provider/plugin_gnsrecord_identity_provider.c (renamed from src/identity/plugin_gnsrecord_identity.c)44
-rw-r--r--src/identity-provider/plugin_identity_provider_sqlite.c736
-rw-r--r--src/identity-provider/plugin_rest_identity_provider.c1108
-rw-r--r--src/identity-provider/test_idp.conf28
-rwxr-xr-xsrc/identity-provider/test_idp.sh31
-rwxr-xr-xsrc/identity-provider/test_idp_attribute.sh40
-rwxr-xr-xsrc/identity-provider/test_idp_consume.sh43
-rw-r--r--src/identity-provider/test_idp_defaults.conf24
-rwxr-xr-xsrc/identity-provider/test_idp_issue.sh42
-rwxr-xr-xsrc/identity-provider/test_idp_revoke.sh60
-rw-r--r--src/identity/Makefile.am11
-rw-r--r--src/identity/plugin_rest_identity.c3
-rw-r--r--src/include/gnunet_credential_service.h308
-rw-r--r--src/include/gnunet_crypto_lib.h82
-rw-r--r--src/include/gnunet_gnsrecord_lib.h22
-rw-r--r--src/include/gnunet_identity_attribute_lib.h231
-rw-r--r--src/include/gnunet_identity_attribute_plugin.h149
-rw-r--r--src/include/gnunet_identity_provider_plugin.h123
-rw-r--r--src/include/gnunet_identity_provider_service.h332
-rw-r--r--src/include/gnunet_jsonapi_lib.h2
-rw-r--r--src/include/gnunet_protocols.h42
-rw-r--r--src/include/gnunet_signatures.h5
-rw-r--r--src/jsonapi/jsonapi_document.c32
-rw-r--r--src/jsonapi/jsonapi_resource.c6
-rw-r--r--src/namestore/plugin_rest_namestore.c27
-rw-r--r--src/rest/rest.conf1
-rw-r--r--src/util/Makefile.am24
-rw-r--r--src/util/crypto_abe.c416
-rw-r--r--src/util/test_crypto_abe.c86
79 files changed, 19232 insertions, 8302 deletions
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000000..5a193a46d7
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,63 @@
+from fedora:26
+
+# Install the required build tools
+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
+
+WORKDIR /usr/src
+
+# Install gnurl from source at version gnurl-7.54.0
+RUN git clone https://git.taler.net/gnurl.git --branch gnurl-7.54.0
+WORKDIR /usr/src/gnurl
+RUN autoreconf -i
+RUN ./configure --enable-ipv6 --with-gnutls --without-libssh2 \
+--without-libmetalink --without-winidn --without-librtmp \
+--without-nghttp2 --without-nss --without-cyassl \
+--without-polarssl --without-ssl --without-winssl \
+--without-darwinssl --disable-sspi --disable-ntlm-wb --disable-ldap \
+--disable-rtsp --disable-dict --disable-telnet --disable-tftp \
+--disable-pop3 --disable-imap --disable-smtp --disable-gopher \
+--disable-file --disable-ftp --disable-smb
+RUN make install
+WORKDIR /usr/src
+
+RUN dnf -y install wget flex bison
+
+# Install libpbc
+RUN wget https://crypto.stanford.edu/pbc/files/pbc-0.5.14.tar.gz
+RUN tar xvzpf pbc-0.5.14.tar.gz
+WORKDIR /usr/src/pbc-0.5.14
+RUN ./configure --prefix=/usr
+RUN make install
+WORKDIR /usr/src
+
+RUN dnf -y install glib2-devel
+
+# Install libbswabe
+RUN git clone https://github.com/schanzen/libgabe.git
+WORKDIR /usr/src/libgabe
+RUN ./configure --prefix=/usr
+RUN make install
+
+# Install WebUI
+WORKDIR /usr/src/
+RUN git clone https://github.com/schanzen/gnunet-webui.git
+WORKDIR /usr/src/gnunet-webui
+RUN git checkout gnuidentity
+
+RUN mkdir /usr/src/gnunet
+WORKDIR /usr/src/gnunet
+ADD . .
+ARG NUM_JOBS
+RUN ./bootstrap
+RUN ./configure --prefix=/usr/local
+RUN make -j$NUM_JOBS
+RUN make install
+
+RUN groupadd gnunetdns
+RUN adduser --system -m --home-dir /var/lib/gnunet gnunet
+RUN chown gnunet:gnunet /var/lib/gnunet
+RUN echo '[arm]\nSYSTEM_ONLY = YES\nUSER_ONLY = NO\n' > /etc/gnunet.conf
+
+ADD docker-entrypoint.sh .
+
+CMD ["sh", "docker-entrypoint.sh"]
diff --git a/configure.ac b/configure.ac
index c97596971e..9ab0a23163 100644
--- a/configure.ac
+++ b/configure.ac
@@ -446,6 +446,27 @@ AC_CHECK_LIB(ogg, ogg_stream_flush_fill,
ogg=0)
+PKG_CHECK_MODULES([GLIB], [glib-2.0])
+# check for pbc library
+pbc=0
+AC_CHECK_HEADER([pbc/pbc.h],pbc=1)
+AC_CHECK_HEADER([gabe.h],abe=1)
+AM_CONDITIONAL(HAVE_PBC, [test "$pbc" = 1])
+AM_CONDITIONAL(HAVE_ABE, [test "$abe" = 1])
+if test "x$pbc" = x1
+then
+ AC_DEFINE([HAVE_PBC],[1],[Have pbc library])
+else
+ AC_DEFINE([HAVE_PBC],[0],[Lacking pbc library])
+fi
+if test "x$abe" = x1
+then
+ AC_DEFINE([HAVE_ABE],[1],[Have ABE library])
+else
+ AC_DEFINE([HAVE_ABE],[0],[Lacking ABE library])
+fi
+
+
gst=0
PKG_CHECK_MODULES(
@@ -1572,6 +1593,8 @@ src/gnsrecord/Makefile
src/hello/Makefile
src/identity/Makefile
src/identity/identity.conf
+src/credential/Makefile
+src/credential/credential.conf
src/include/Makefile
src/integration-tests/Makefile
src/json/Makefile
@@ -1637,6 +1660,7 @@ src/vpn/vpn.conf
src/zonemaster/Makefile
src/zonemaster/zonemaster.conf
src/rest/Makefile
+src/identity-attribute/Makefile
src/identity-provider/Makefile
pkgconfig/Makefile
pkgconfig/gnunetarm.pc
diff --git a/docker-entrypoint.sh b/docker-entrypoint.sh
new file mode 100644
index 0000000000..807d86d6fd
--- /dev/null
+++ b/docker-entrypoint.sh
@@ -0,0 +1,3 @@
+#!/bin/bash
+gnunet-arm -s > $HOME/gnunet.log 2>&1
+exec bash \ No newline at end of file
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 43a5dcb08b..b06eb3a9f7 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -3,13 +3,21 @@ src/arm/arm_monitor_api.c
src/arm/gnunet-arm.c
src/arm/gnunet-service-arm.c
src/arm/mockup-service.c
+src/ats-tests/ats-testing-experiment.c
+src/ats-tests/ats-testing-log.c
+src/ats-tests/ats-testing-preferences.c
+src/ats-tests/ats-testing-traffic.c
+src/ats-tests/ats-testing.c
+src/ats-tests/gnunet-ats-sim.c
+src/ats-tests/gnunet-solver-eval.c
+src/ats-tool/gnunet-ats.c
src/ats/ats_api_connectivity.c
src/ats/ats_api_performance.c
src/ats/ats_api_scanner.c
src/ats/ats_api_scheduling.c
src/ats/gnunet-ats-solver-eval.c
-src/ats/gnunet-service-ats_addresses.c
src/ats/gnunet-service-ats.c
+src/ats/gnunet-service-ats_addresses.c
src/ats/gnunet-service-ats_connectivity.c
src/ats/gnunet-service-ats_normalization.c
src/ats/gnunet-service-ats_performance.c
@@ -20,14 +28,6 @@ src/ats/gnunet-service-ats_scheduling.c
src/ats/plugin_ats_mlp.c
src/ats/plugin_ats_proportional.c
src/ats/plugin_ats_ril.c
-src/ats-tests/ats-testing.c
-src/ats-tests/ats-testing-experiment.c
-src/ats-tests/ats-testing-log.c
-src/ats-tests/ats-testing-preferences.c
-src/ats-tests/ats-testing-traffic.c
-src/ats-tests/gnunet-ats-sim.c
-src/ats-tests/gnunet-solver-eval.c
-src/ats-tool/gnunet-ats.c
src/auction/gnunet-auction-create.c
src/auction/gnunet-auction-info.c
src/auction/gnunet-auction-join.c
@@ -39,8 +39,8 @@ src/block/plugin_block_test.c
src/cadet/cadet_api.c
src/cadet/cadet_test_lib.c
src/cadet/desirability_table.c
-src/cadet/gnunet-cadet.c
src/cadet/gnunet-cadet-profiler.c
+src/cadet/gnunet-cadet.c
src/cadet/gnunet-service-cadet.c
src/cadet/gnunet-service-cadet_channel.c
src/cadet/gnunet-service-cadet_connection.c
@@ -56,15 +56,15 @@ src/consensus/gnunet-service-consensus.c
src/consensus/plugin_block_consensus.c
src/conversation/conversation_api.c
src/conversation/conversation_api_call.c
-src/conversation/gnunet-conversation.c
src/conversation/gnunet-conversation-test.c
-src/conversation/gnunet_gst.c
-src/conversation/gnunet_gst_test.c
-src/conversation/gnunet-helper-audio-playback.c
+src/conversation/gnunet-conversation.c
src/conversation/gnunet-helper-audio-playback-gst.c
-src/conversation/gnunet-helper-audio-record.c
+src/conversation/gnunet-helper-audio-playback.c
src/conversation/gnunet-helper-audio-record-gst.c
+src/conversation/gnunet-helper-audio-record.c
src/conversation/gnunet-service-conversation.c
+src/conversation/gnunet_gst.c
+src/conversation/gnunet_gst_test.c
src/conversation/microphone.c
src/conversation/plugin_gnsrecord_conversation.c
src/conversation/speaker.c
@@ -75,6 +75,13 @@ src/core/gnunet-service-core.c
src/core/gnunet-service-core_kx.c
src/core/gnunet-service-core_sessions.c
src/core/gnunet-service-core_typemap.c
+src/credential/credential_api.c
+src/credential/credential_misc.c
+src/credential/credential_serialization.c
+src/credential/gnunet-credential.c
+src/credential/gnunet-service-credential.c
+src/credential/plugin_gnsrecord_credential.c
+src/credential/plugin_rest_credential.c
src/curl/curl.c
src/curl/curl_reschedule.c
src/datacache/datacache.c
@@ -94,7 +101,6 @@ src/dht/dht_api.c
src/dht/dht_test_lib.c
src/dht/gnunet-dht-get.c
src/dht/gnunet-dht-monitor.c
-src/dht/gnunet_dht_profiler.c
src/dht/gnunet-dht-put.c
src/dht/gnunet-service-dht.c
src/dht/gnunet-service-dht_clients.c
@@ -103,6 +109,7 @@ src/dht/gnunet-service-dht_hello.c
src/dht/gnunet-service-dht_neighbours.c
src/dht/gnunet-service-dht_nse.c
src/dht/gnunet-service-dht_routing.c
+src/dht/gnunet_dht_profiler.c
src/dht/plugin_block_dht.c
src/dns/dns_api.c
src/dns/dnsparser.c
@@ -117,8 +124,8 @@ src/dv/gnunet-dv.c
src/dv/gnunet-service-dv.c
src/dv/plugin_transport_dv.c
src/exit/gnunet-daemon-exit.c
-src/exit/gnunet-helper-exit.c
src/exit/gnunet-helper-exit-windows.c
+src/exit/gnunet-helper-exit.c
src/fragmentation/defragmentation.c
src/fragmentation/fragmentation.c
src/fs/fs_api.c
@@ -143,8 +150,8 @@ src/fs/gnunet-auto-share.c
src/fs/gnunet-daemon-fsprofiler.c
src/fs/gnunet-directory.c
src/fs/gnunet-download.c
-src/fs/gnunet-fs.c
src/fs/gnunet-fs-profiler.c
+src/fs/gnunet-fs.c
src/fs/gnunet-helper-fs-publish.c
src/fs/gnunet-publish.c
src/fs/gnunet-search.c
@@ -162,10 +169,10 @@ src/fs/plugin_block_fs.c
src/gns/gns_api.c
src/gns/gnunet-bcd.c
src/gns/gnunet-dns2gns.c
-src/gns/gnunet-gns.c
src/gns/gnunet-gns-helper-service-w32.c
src/gns/gnunet-gns-import.c
src/gns/gnunet-gns-proxy.c
+src/gns/gnunet-gns.c
src/gns/gnunet-service-gns.c
src/gns/gnunet-service-gns_interceptor.c
src/gns/gnunet-service-gns_resolver.c
@@ -174,41 +181,44 @@ src/gns/nss/nss_gns_query.c
src/gns/plugin_block_gns.c
src/gns/plugin_gnsrecord_gns.c
src/gns/plugin_rest_gns.c
+src/gns/w32nsp-install.c
+src/gns/w32nsp-resolve.c
+src/gns/w32nsp-uninstall.c
+src/gns/w32nsp.c
src/gnsrecord/gnsrecord.c
src/gnsrecord/gnsrecord_crypto.c
src/gnsrecord/gnsrecord_misc.c
src/gnsrecord/gnsrecord_serialization.c
src/gnsrecord/plugin_gnsrecord_dns.c
-src/gns/w32nsp.c
-src/gns/w32nsp-install.c
-src/gns/w32nsp-resolve.c
-src/gns/w32nsp-uninstall.c
src/hello/address.c
src/hello/gnunet-hello.c
src/hello/hello.c
src/hostlist/gnunet-daemon-hostlist.c
src/hostlist/gnunet-daemon-hostlist_client.c
src/hostlist/gnunet-daemon-hostlist_server.c
+src/identity-attribute/identity_attribute.c
+src/identity-attribute/plugin_identity_attribute_type_gnuid.c
+src/identity-provider/gnunet-idp.c
+src/identity-provider/gnunet-service-identity-provider.c
+src/identity-provider/identity_provider_api.c
+src/identity-provider/jwt.c
+src/identity-provider/plugin_gnsrecord_identity_provider.c
+src/identity-provider/plugin_identity_provider_sqlite.c
+src/identity-provider/plugin_rest_identity_provider.c
src/identity/gnunet-identity.c
src/identity/gnunet-service-identity.c
src/identity/identity_api.c
src/identity/identity_api_lookup.c
-src/identity/plugin_gnsrecord_identity.c
src/identity/plugin_rest_identity.c
-src/identity-provider/gnunet-identity-token.c
-src/identity-provider/gnunet-service-identity-provider.c
-src/identity-provider/identity_provider_api.c
-src/identity-provider/identity_token.c
-src/identity-provider/plugin_rest_identity_provider.c
+src/json/json.c
+src/json/json_generator.c
+src/json/json_helper.c
+src/json/json_mhd.c
src/jsonapi/jsonapi.c
src/jsonapi/jsonapi_document.c
src/jsonapi/jsonapi_error.c
src/jsonapi/jsonapi_relationship.c
src/jsonapi/jsonapi_resource.c
-src/json/json.c
-src/json/json_generator.c
-src/json/json_helper.c
-src/json/json_mhd.c
src/multicast/gnunet-multicast.c
src/multicast/gnunet-service-multicast.c
src/multicast/multicast_api.c
@@ -222,8 +232,8 @@ src/namecache/namecache_api.c
src/namecache/plugin_namecache_flat.c
src/namecache/plugin_namecache_postgres.c
src/namecache/plugin_namecache_sqlite.c
-src/namestore/gnunet-namestore.c
src/namestore/gnunet-namestore-fcfsd.c
+src/namestore/gnunet-namestore.c
src/namestore/gnunet-service-namestore.c
src/namestore/namestore_api.c
src/namestore/namestore_api_monitor.c
@@ -238,10 +248,10 @@ src/nat-auto/gnunet-service-nat-auto.c
src/nat-auto/gnunet-service-nat-auto_legacy.c
src/nat-auto/nat_auto_api.c
src/nat-auto/nat_auto_api_test.c
-src/nat/gnunet-helper-nat-client.c
src/nat/gnunet-helper-nat-client-windows.c
-src/nat/gnunet-helper-nat-server.c
+src/nat/gnunet-helper-nat-client.c
src/nat/gnunet-helper-nat-server-windows.c
+src/nat/gnunet-helper-nat-server.c
src/nat/gnunet-nat.c
src/nat/gnunet-service-nat.c
src/nat/gnunet-service-nat_externalip.c
@@ -250,15 +260,15 @@ src/nat/gnunet-service-nat_mini.c
src/nat/gnunet-service-nat_stun.c
src/nat/nat_api.c
src/nat/nat_api_stun.c
-src/nse/gnunet-nse.c
src/nse/gnunet-nse-profiler.c
+src/nse/gnunet-nse.c
src/nse/gnunet-service-nse.c
src/nse/nse_api.c
+src/peerinfo-tool/gnunet-peerinfo.c
+src/peerinfo-tool/gnunet-peerinfo_plugins.c
src/peerinfo/gnunet-service-peerinfo.c
src/peerinfo/peerinfo_api.c
src/peerinfo/peerinfo_api_notify.c
-src/peerinfo-tool/gnunet-peerinfo.c
-src/peerinfo-tool/gnunet-peerinfo_plugins.c
src/peerstore/gnunet-peerstore.c
src/peerstore/gnunet-service-peerstore.c
src/peerstore/peerstore_api.c
@@ -310,13 +320,13 @@ src/rps/gnunet-service-rps_peers.c
src/rps/gnunet-service-rps_sampler.c
src/rps/gnunet-service-rps_sampler_elem.c
src/rps/gnunet-service-rps_view.c
-src/rps/rps_api.c
src/rps/rps-test_util.c
+src/rps/rps_api.c
src/scalarproduct/gnunet-scalarproduct.c
-src/scalarproduct/gnunet-service-scalarproduct_alice.c
-src/scalarproduct/gnunet-service-scalarproduct_bob.c
src/scalarproduct/gnunet-service-scalarproduct-ecc_alice.c
src/scalarproduct/gnunet-service-scalarproduct-ecc_bob.c
+src/scalarproduct/gnunet-service-scalarproduct_alice.c
+src/scalarproduct/gnunet-service-scalarproduct_bob.c
src/scalarproduct/scalarproduct_api.c
src/secretsharing/gnunet-secretsharing-profiler.c
src/secretsharing/gnunet-service-secretsharing.c
@@ -343,15 +353,16 @@ src/statistics/gnunet-statistics.c
src/statistics/statistics_api.c
src/template/gnunet-service-template.c
src/template/gnunet-template.c
+src/testbed-logger/gnunet-service-testbed-logger.c
+src/testbed-logger/testbed_logger_api.c
src/testbed/generate-underlay-topology.c
src/testbed/gnunet-daemon-latency-logger.c
src/testbed/gnunet-daemon-testbed-blacklist.c
src/testbed/gnunet-daemon-testbed-underlay.c
src/testbed/gnunet-helper-testbed.c
-src/testbed/gnunet_mpi_test.c
src/testbed/gnunet-service-test-barriers.c
-src/testbed/gnunet-service-testbed_barriers.c
src/testbed/gnunet-service-testbed.c
+src/testbed/gnunet-service-testbed_barriers.c
src/testbed/gnunet-service-testbed_cache.c
src/testbed/gnunet-service-testbed_connectionpool.c
src/testbed/gnunet-service-testbed_cpustatus.c
@@ -359,20 +370,19 @@ src/testbed/gnunet-service-testbed_links.c
src/testbed/gnunet-service-testbed_meminfo.c
src/testbed/gnunet-service-testbed_oc.c
src/testbed/gnunet-service-testbed_peers.c
-src/testbed/gnunet_testbed_mpi_spawn.c
src/testbed/gnunet-testbed-profiler.c
-src/testbed-logger/gnunet-service-testbed-logger.c
-src/testbed-logger/testbed_logger_api.c
-src/testbed/testbed_api_barriers.c
+src/testbed/gnunet_mpi_test.c
+src/testbed/gnunet_testbed_mpi_spawn.c
src/testbed/testbed_api.c
+src/testbed/testbed_api_barriers.c
src/testbed/testbed_api_hosts.c
src/testbed/testbed_api_operations.c
src/testbed/testbed_api_peers.c
src/testbed/testbed_api_sd.c
src/testbed/testbed_api_services.c
src/testbed/testbed_api_statistics.c
-src/testbed/testbed_api_testbed.c
src/testbed/testbed_api_test.c
+src/testbed/testbed_api_testbed.c
src/testbed/testbed_api_topology.c
src/testbed/testbed_api_underlay.c
src/testing/gnunet-testing.c
@@ -381,34 +391,39 @@ src/testing/testing.c
src/topology/friends.c
src/topology/gnunet-daemon-topology.c
src/transport/gnunet-helper-transport-bluetooth.c
-src/transport/gnunet-helper-transport-wlan.c
src/transport/gnunet-helper-transport-wlan-dummy.c
-src/transport/gnunet-service-transport_ats.c
+src/transport/gnunet-helper-transport-wlan.c
src/transport/gnunet-service-transport.c
+src/transport/gnunet-service-transport_ats.c
src/transport/gnunet-service-transport_hello.c
src/transport/gnunet-service-transport_manipulation.c
src/transport/gnunet-service-transport_neighbours.c
src/transport/gnunet-service-transport_plugins.c
src/transport/gnunet-service-transport_validation.c
-src/transport/gnunet-transport.c
src/transport/gnunet-transport-certificate-creation.c
src/transport/gnunet-transport-profiler.c
src/transport/gnunet-transport-wlan-receiver.c
src/transport/gnunet-transport-wlan-sender.c
+src/transport/gnunet-transport.c
src/transport/plugin_transport_http_client.c
src/transport/plugin_transport_http_common.c
src/transport/plugin_transport_http_server.c
src/transport/plugin_transport_smtp.c
src/transport/plugin_transport_tcp.c
src/transport/plugin_transport_template.c
-src/transport/plugin_transport_udp_broadcasting.c
src/transport/plugin_transport_udp.c
+src/transport/plugin_transport_udp_broadcasting.c
src/transport/plugin_transport_unix.c
src/transport/plugin_transport_wlan.c
src/transport/tcp_connection_legacy.c
src/transport/tcp_server_legacy.c
src/transport/tcp_server_mst_legacy.c
src/transport/tcp_service_legacy.c
+src/transport/transport-testing-filenames.c
+src/transport/transport-testing-loggers.c
+src/transport/transport-testing-main.c
+src/transport/transport-testing-send.c
+src/transport/transport-testing.c
src/transport/transport_api_address_to_string.c
src/transport/transport_api_blacklist.c
src/transport/transport_api_core.c
@@ -417,11 +432,6 @@ src/transport/transport_api_manipulation.c
src/transport/transport_api_monitor_peers.c
src/transport/transport_api_monitor_plugins.c
src/transport/transport_api_offer_hello.c
-src/transport/transport-testing.c
-src/transport/transport-testing-filenames.c
-src/transport/transport-testing-loggers.c
-src/transport/transport-testing-main.c
-src/transport/transport-testing-send.c
src/tun/regex.c
src/tun/tun.c
src/util/bandwidth.c
@@ -435,10 +445,11 @@ src/util/configuration_loader.c
src/util/container_bloomfilter.c
src/util/container_heap.c
src/util/container_meta_data.c
-src/util/container_multihashmap32.c
src/util/container_multihashmap.c
+src/util/container_multihashmap32.c
src/util/container_multipeermap.c
src/util/container_multishortmap.c
+src/util/crypto_abe.c
src/util/crypto_crc.c
src/util/crypto_ecc.c
src/util/crypto_ecc_dlog.c
@@ -455,8 +466,8 @@ src/util/crypto_symmetric.c
src/util/disk.c
src/util/getopt.c
src/util/getopt_helpers.c
-src/util/gnunet-config.c
src/util/gnunet-config-diff.c
+src/util/gnunet-config.c
src/util/gnunet-ecc.c
src/util/gnunet-helper-w32-console.c
src/util/gnunet-resolver.c
@@ -487,8 +498,8 @@ src/util/time.c
src/util/w32cat.c
src/util/win.c
src/util/winproc.c
-src/vpn/gnunet-helper-vpn.c
src/vpn/gnunet-helper-vpn-windows.c
+src/vpn/gnunet-helper-vpn.c
src/vpn/gnunet-service-vpn.c
src/vpn/gnunet-vpn.c
src/vpn/vpn_api.c
diff --git a/po/de.po b/po/de.po
index fde327308f..f6be3a7359 100644
--- a/po/de.po
+++ b/po/de.po
@@ -10,7 +10,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gnunet 0.10.1\n"
"Report-Msgid-Bugs-To: gnunet-developers@mail.gnu.org\n"
-"POT-Creation-Date: 2017-03-31 19:22-0500\n"
+"POT-Creation-Date: 2017-10-20 15:14+0000\n"
"PO-Revision-Date: 2015-03-08 16:16+0100\n"
"Last-Translator: Mario Blättermann <mario.blaettermann@gmail.com>\n"
"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"
msgstr ""
#: src/arm/gnunet-service-arm.c:513
-#: src/transport/plugin_transport_http_server.c:2621
+#: src/transport/plugin_transport_http_server.c:2684
#: src/transport/plugin_transport_tcp.c:1259
#: src/transport/tcp_service_legacy.c:696 src/util/service.c:782
#, c-format
@@ -280,7 +280,7 @@ msgid "Failed to resolve `%s': %s\n"
msgstr "»%s« konnte nicht aufgelöst werden: %s\n"
#: src/arm/gnunet-service-arm.c:532
-#: src/transport/plugin_transport_http_server.c:2639
+#: src/transport/plugin_transport_http_server.c:2702
#: src/transport/plugin_transport_tcp.c:1278
#: src/transport/tcp_service_legacy.c:715 src/util/service.c:802
#, fuzzy, c-format
@@ -353,133 +353,14 @@ msgstr ""
msgid "Initiating shutdown as requested by client.\n"
msgstr ""
-#: src/ats/gnunet-ats-solver-eval.c:2781 src/ats/gnunet-ats-solver-eval.c:2822
-#, c-format
-msgid ""
-"Could not load quota for network `%s': `%s', assigning default bandwidth "
-"%llu\n"
-msgstr ""
-
-#: src/ats/gnunet-ats-solver-eval.c:2799
-#, c-format
-msgid ""
-"No outbound quota configured for network `%s', assigning default bandwidth "
-"%llu\n"
-msgstr ""
-
-#: src/ats/gnunet-ats-solver-eval.c:2840
-#, c-format
-msgid ""
-"No outbound quota configure for network `%s', assigning default bandwidth "
-"%llu\n"
-msgstr ""
-
-#: src/ats/gnunet-ats-solver-eval.c:3294
-#: src/ats-tests/gnunet-solver-eval.c:939
-msgid "solver to use"
-msgstr ""
-
-#: src/ats/gnunet-ats-solver-eval.c:3299
-#: src/ats-tests/gnunet-solver-eval.c:945
-#: src/ats-tests/gnunet-solver-eval.c:950
-msgid "experiment to use"
-msgstr ""
-
-#: src/ats/gnunet-ats-solver-eval.c:3306
-msgid "print logging"
-msgstr ""
-
-#: src/ats/gnunet-ats-solver-eval.c:3311
-msgid "save logging to disk"
-msgstr ""
-
-#: src/ats/gnunet-ats-solver-eval.c:3316
-msgid "disable normalization"
-msgstr ""
-
-#: src/ats/gnunet-service-ats_plugins.c:304
-#, c-format
-msgid ""
-"Could not load %s quota for network `%s': `%s', assigning default bandwidth "
-"%llu\n"
-msgstr ""
-
-#: src/ats/gnunet-service-ats_plugins.c:314
-#, c-format
-msgid "%s quota configured for network `%s' is %llu\n"
-msgstr ""
-
-#: src/ats/gnunet-service-ats_plugins.c:359
-#, c-format
-msgid ""
-"No %s-quota configured for network `%s', assigning default bandwidth %llu\n"
-msgstr ""
-
-#: src/ats/gnunet-service-ats_plugins.c:451
-#, fuzzy, c-format
-msgid "Failed to initialize solver `%s'!\n"
-msgstr "SQLite Datenbank konnte nicht initialisiert werden.\n"
-
-#: src/ats/plugin_ats_mlp.c:1274
-msgid "Problem size too large, cannot allocate memory!\n"
-msgstr ""
-
-#: src/ats/plugin_ats_mlp.c:1869
-#, fuzzy, c-format
-msgid "Adding address for peer `%s' multiple times\n"
-msgstr "Adresse des Knotens `%s' konnte nicht ermittelt werden.\n"
-
-#: src/ats/plugin_ats_mlp.c:1913
-#, fuzzy, c-format
-msgid "Updating address property for peer `%s' %p not added before\n"
-msgstr "Adresse des Knotens `%s' konnte nicht ermittelt werden.\n"
-
-#: src/ats/plugin_ats_mlp.c:2475
-msgid ""
-"MLP solver is not optimizing for anything, changing to feasibility check\n"
-msgstr ""
-
-#: src/ats/plugin_ats_mlp.c:2515 src/ats/plugin_ats_mlp.c:2532
-#: src/ats/plugin_ats_mlp.c:2564 src/ats/plugin_ats_mlp.c:2582
-#: src/ats/plugin_ats_mlp.c:2601 src/ats/plugin_ats_proportional.c:1141
-#: src/ats/plugin_ats_ril.c:2612 src/ats/plugin_ats_ril.c:2629
-#: src/ats/plugin_ats_ril.c:2646 src/ats/plugin_ats_ril.c:2663
-#: src/ats/plugin_ats_ril.c:2680 src/ats/plugin_ats_ril.c:2697
-#: src/ats/plugin_ats_ril.c:2714 src/ats/plugin_ats_ril.c:2731
-#, fuzzy, c-format
-msgid "Invalid %s configuration %f \n"
-msgstr "Konfiguration konnte nicht aus %s geladen werden\n"
-
-#: src/ats/plugin_ats_mlp.c:2670
-#, c-format
-msgid ""
-"Adjusting inconsistent outbound quota configuration for network `%s', is "
-"%llu must be at least %llu\n"
-msgstr ""
-
-#: src/ats/plugin_ats_mlp.c:2679
-#, c-format
-msgid ""
-"Adjusting inconsistent inbound quota configuration for network `%s', is %llu "
-"must be at least %llu\n"
-msgstr ""
-
-#: src/ats/plugin_ats_mlp.c:2689
-#, c-format
-msgid ""
-"Adjusting outbound quota configuration for network `%s'from %llu to %.0f\n"
-msgstr ""
-
-#: src/ats/plugin_ats_mlp.c:2698
-#, c-format
-msgid ""
-"Adjusting inbound quota configuration for network `%s' from %llu to %.0f\n"
-msgstr ""
+#: src/ats-tests/ats-testing-log.c:837
+msgid "Stop logging\n"
+msgstr "Protokollierung stoppen\n"
-#: src/ats/plugin_ats_proportional.c:1164
+#: src/ats-tests/ats-testing-log.c:892
#, fuzzy, c-format
-msgid "Invalid %s configuration %f\n"
-msgstr " gconfig\tGTK Konfiguration\n"
+msgid "Start logging `%s'\n"
+msgstr "Collection `%s' begonnen.\n"
#: src/ats-tests/ats-testing.c:422
#, c-format
@@ -491,15 +372,6 @@ msgstr ""
msgid "Failed to connect master peer [%u] with slave [%u]\n"
msgstr "Es konnte keine Verbindung mit gnunetd hergestellt werden.\n"
-#: src/ats-tests/ats-testing-log.c:837
-msgid "Stop logging\n"
-msgstr "Protokollierung stoppen\n"
-
-#: src/ats-tests/ats-testing-log.c:892
-#, fuzzy, c-format
-msgid "Start logging `%s'\n"
-msgstr "Collection `%s' begonnen.\n"
-
#: src/ats-tests/gnunet-ats-sim.c:90
#, c-format
msgid ""
@@ -507,6 +379,15 @@ msgid ""
"= %u KiB/s\n"
msgstr ""
+#: src/ats-tests/gnunet-solver-eval.c:939 src/ats/gnunet-ats-solver-eval.c:3294
+msgid "solver to use"
+msgstr ""
+
+#: src/ats-tests/gnunet-solver-eval.c:945
+#: src/ats-tests/gnunet-solver-eval.c:950 src/ats/gnunet-ats-solver-eval.c:3299
+msgid "experiment to use"
+msgstr ""
+
#: src/ats-tool/gnunet-ats.c:307
#, c-format
msgid "%u address resolutions had a timeout\n"
@@ -624,6 +505,123 @@ msgstr ""
msgid "Print information about ATS state"
msgstr "Informationen über andere GNUnet Knoten ausgeben."
+#: src/ats/gnunet-ats-solver-eval.c:2781 src/ats/gnunet-ats-solver-eval.c:2822
+#, c-format
+msgid ""
+"Could not load quota for network `%s': `%s', assigning default bandwidth "
+"%llu\n"
+msgstr ""
+
+#: src/ats/gnunet-ats-solver-eval.c:2799
+#, c-format
+msgid ""
+"No outbound quota configured for network `%s', assigning default bandwidth "
+"%llu\n"
+msgstr ""
+
+#: src/ats/gnunet-ats-solver-eval.c:2840
+#, c-format
+msgid ""
+"No outbound quota configure for network `%s', assigning default bandwidth "
+"%llu\n"
+msgstr ""
+
+#: src/ats/gnunet-ats-solver-eval.c:3306
+msgid "print logging"
+msgstr ""
+
+#: src/ats/gnunet-ats-solver-eval.c:3311
+msgid "save logging to disk"
+msgstr ""
+
+#: src/ats/gnunet-ats-solver-eval.c:3316
+msgid "disable normalization"
+msgstr ""
+
+#: src/ats/gnunet-service-ats_plugins.c:304
+#, c-format
+msgid ""
+"Could not load %s quota for network `%s': `%s', assigning default bandwidth "
+"%llu\n"
+msgstr ""
+
+#: src/ats/gnunet-service-ats_plugins.c:314
+#, c-format
+msgid "%s quota configured for network `%s' is %llu\n"
+msgstr ""
+
+#: src/ats/gnunet-service-ats_plugins.c:359
+#, c-format
+msgid ""
+"No %s-quota configured for network `%s', assigning default bandwidth %llu\n"
+msgstr ""
+
+#: src/ats/gnunet-service-ats_plugins.c:451
+#, fuzzy, c-format
+msgid "Failed to initialize solver `%s'!\n"
+msgstr "SQLite Datenbank konnte nicht initialisiert werden.\n"
+
+#: src/ats/plugin_ats_mlp.c:1274
+msgid "Problem size too large, cannot allocate memory!\n"
+msgstr ""
+
+#: src/ats/plugin_ats_mlp.c:1869
+#, fuzzy, c-format
+msgid "Adding address for peer `%s' multiple times\n"
+msgstr "Adresse des Knotens `%s' konnte nicht ermittelt werden.\n"
+
+#: src/ats/plugin_ats_mlp.c:1913
+#, fuzzy, c-format
+msgid "Updating address property for peer `%s' %p not added before\n"
+msgstr "Adresse des Knotens `%s' konnte nicht ermittelt werden.\n"
+
+#: src/ats/plugin_ats_mlp.c:2475
+msgid ""
+"MLP solver is not optimizing for anything, changing to feasibility check\n"
+msgstr ""
+
+#: src/ats/plugin_ats_mlp.c:2515 src/ats/plugin_ats_mlp.c:2532
+#: src/ats/plugin_ats_mlp.c:2564 src/ats/plugin_ats_mlp.c:2582
+#: src/ats/plugin_ats_mlp.c:2601 src/ats/plugin_ats_proportional.c:1141
+#: src/ats/plugin_ats_ril.c:2612 src/ats/plugin_ats_ril.c:2629
+#: src/ats/plugin_ats_ril.c:2646 src/ats/plugin_ats_ril.c:2663
+#: src/ats/plugin_ats_ril.c:2680 src/ats/plugin_ats_ril.c:2697
+#: src/ats/plugin_ats_ril.c:2714 src/ats/plugin_ats_ril.c:2731
+#, fuzzy, c-format
+msgid "Invalid %s configuration %f \n"
+msgstr "Konfiguration konnte nicht aus %s geladen werden\n"
+
+#: src/ats/plugin_ats_mlp.c:2670
+#, c-format
+msgid ""
+"Adjusting inconsistent outbound quota configuration for network `%s', is "
+"%llu must be at least %llu\n"
+msgstr ""
+
+#: src/ats/plugin_ats_mlp.c:2679
+#, c-format
+msgid ""
+"Adjusting inconsistent inbound quota configuration for network `%s', is %llu "
+"must be at least %llu\n"
+msgstr ""
+
+#: src/ats/plugin_ats_mlp.c:2689
+#, c-format
+msgid ""
+"Adjusting outbound quota configuration for network `%s'from %llu to %.0f\n"
+msgstr ""
+
+#: src/ats/plugin_ats_mlp.c:2698
+#, c-format
+msgid ""
+"Adjusting inbound quota configuration for network `%s' from %llu to %.0f\n"
+msgstr ""
+
+#: src/ats/plugin_ats_proportional.c:1164
+#, fuzzy, c-format
+msgid "Invalid %s configuration %f\n"
+msgstr " gconfig\tGTK Konfiguration\n"
+
#: src/auction/gnunet-auction-create.c:163
msgid "description of the item to be sold"
msgstr ""
@@ -769,6 +767,28 @@ msgstr "Ausführlicherer Modus (empfangene Werte ausgeben)"
msgid "Connection to conversation service lost, trying to reconnect\n"
msgstr ""
+#: src/conversation/gnunet-conversation-test.c:119
+#, c-format
+msgid ""
+"\n"
+"End of transmission. Have a GNU day.\n"
+msgstr ""
+
+#: src/conversation/gnunet-conversation-test.c:145
+#, c-format
+msgid ""
+"\n"
+"We are now playing your recording back. If you can hear it, your audio "
+"settings are working..."
+msgstr ""
+
+#: src/conversation/gnunet-conversation-test.c:210
+#, c-format
+msgid ""
+"We will now be recording you for %s. After that time, the recording will be "
+"played back to you..."
+msgstr ""
+
#: src/conversation/gnunet-conversation.c:269
#, c-format
msgid "Incoming call from `%s'. Please /accept %u or /cancel %u the call.\n"
@@ -1026,30 +1046,8 @@ msgstr ""
msgid "Enables having a conversation with other GNUnet users."
msgstr ""
-#: src/conversation/gnunet-conversation-test.c:119
-#, c-format
-msgid ""
-"\n"
-"End of transmission. Have a GNU day.\n"
-msgstr ""
-
-#: src/conversation/gnunet-conversation-test.c:145
-#, c-format
-msgid ""
-"\n"
-"We are now playing your recording back. If you can hear it, your audio "
-"settings are working..."
-msgstr ""
-
-#: src/conversation/gnunet-conversation-test.c:210
-#, c-format
-msgid ""
-"We will now be recording you for %s. After that time, the recording will be "
-"played back to you..."
-msgstr ""
-
-#: src/conversation/gnunet_gst.c:622
#: src/conversation/gnunet-helper-audio-playback-gst.c:356
+#: src/conversation/gnunet_gst.c:622
#, c-format
msgid "Read error from STDIN: %d %s\n"
msgstr "Fehler beim Lesen aus STDIN: %d %s\n"
@@ -1174,6 +1172,11 @@ msgstr "ogg_stream_init() fehlgeschlagen.\n"
msgid "Failed to allocate %u bytes for second packet\n"
msgstr "UDP-Sockets können nicht geöffnet werden\n"
+#: src/conversation/gnunet-service-conversation.c:1276
+#, fuzzy, c-format
+msgid "Could not open line, port %s already in use!\n"
+msgstr "Verbindung zum %s-Dienst ist fehlgeschlagen!\n"
+
#: src/conversation/microphone.c:119
msgid "Could not start record audio helper\n"
msgstr ""
@@ -1463,8 +1466,138 @@ msgstr "# Bytes empfangen über TCP"
msgid "# updates to my type map"
msgstr ""
+#: src/credential/credential_misc.c:88
+#, fuzzy, c-format
+msgid "Unable to parse CRED record string `%s'\n"
+msgstr "Fehler beim Speichern der Konfigurationsdatei `%s':"
+
+#: src/credential/gnunet-credential.c:278 src/namestore/gnunet-namestore.c:776
+#: src/namestore/plugin_rest_namestore.c:1009
+#, fuzzy, c-format
+msgid "Ego `%s' not known to identity service\n"
+msgstr "`%s': unbekannter Dienst: %s\n"
+
+#: src/credential/gnunet-credential.c:294
+#: src/credential/gnunet-credential.c:446
+#, c-format
+msgid "Issuer public key `%s' is not well-formed\n"
+msgstr ""
+
+#: src/credential/gnunet-credential.c:375
+#: src/credential/gnunet-credential.c:435
+#, fuzzy, c-format
+msgid "Issuer public key not well-formed\n"
+msgstr "Ungültiger Parameter: `%s'\n"
+
+#: src/credential/gnunet-credential.c:386
+#: src/credential/gnunet-credential.c:455
+#, fuzzy, c-format
+msgid "Failed to connect to CREDENTIAL\n"
+msgstr "Es konnte keine Verbindung mit gnunetd hergestellt werden.\n"
+
+#: src/credential/gnunet-credential.c:392
+#, c-format
+msgid "You must provide issuer the attribute\n"
+msgstr ""
+
+#: src/credential/gnunet-credential.c:399
+#, fuzzy, c-format
+msgid "ego required\n"
+msgstr "Gültiger Typ ist erforderlich\n"
+
+#: src/credential/gnunet-credential.c:415
+#, c-format
+msgid "Subject public key needed\n"
+msgstr ""
+
+#: src/credential/gnunet-credential.c:426
+#, c-format
+msgid "Subject public key `%s' is not well-formed\n"
+msgstr ""
+
+#: src/credential/gnunet-credential.c:461
+#, c-format
+msgid "You must provide issuer and subject attributes\n"
+msgstr ""
+
+#: src/credential/gnunet-credential.c:511
+#, fuzzy, c-format
+msgid "Issuer ego required\n"
+msgstr "Gültiger Typ ist erforderlich\n"
+
+#: src/credential/gnunet-credential.c:523
+#, c-format
+msgid "Please specify name to lookup, subject key and issuer key!\n"
+msgstr ""
+
+#: src/credential/gnunet-credential.c:543
+msgid "create credential"
+msgstr ""
+
+#: src/credential/gnunet-credential.c:547
+msgid "verify credential against attribute"
+msgstr ""
+
+#: src/credential/gnunet-credential.c:552
+#, fuzzy
+msgid "The public key of the subject to lookup the credential for"
+msgstr "Die Priorität des Inhalts angeben"
+
+#: src/credential/gnunet-credential.c:557
+msgid "The name of the credential presented by the subject"
+msgstr ""
+
+#: src/credential/gnunet-credential.c:562
+msgid "The public key of the authority to verify the credential against"
+msgstr ""
+
+#: src/credential/gnunet-credential.c:567
+msgid "The ego to use"
+msgstr ""
+
+#: src/credential/gnunet-credential.c:572
+msgid "The issuer attribute to verify against or to issue"
+msgstr ""
+
+#: src/credential/gnunet-credential.c:577
+msgid "The time to live for the credential"
+msgstr ""
+
+#: src/credential/gnunet-credential.c:581
+msgid "collect credentials"
+msgstr ""
+
+#: src/credential/gnunet-credential.c:595
+#, fuzzy
+msgid "GNUnet credential resolver tool"
+msgstr "GNUnet Netzwerk Topologie tracen."
+
+#: src/credential/gnunet-service-credential.c:1204
+#: src/gns/gnunet-gns-helper-service-w32.c:727 src/gns/gnunet-gns.c:355
+#, fuzzy, c-format
+msgid "Failed to connect to GNS\n"
+msgstr "Es konnte keine Verbindung mit gnunetd hergestellt werden.\n"
+
+#: src/credential/gnunet-service-credential.c:1210
+#: src/namestore/gnunet-namestore-fcfsd.c:1034
+#: src/namestore/gnunet-namestore.c:802
+#: src/namestore/plugin_rest_namestore.c:1022
+#, fuzzy, c-format
+msgid "Failed to connect to namestore\n"
+msgstr "Es konnte keine Verbindung mit gnunetd hergestellt werden.\n"
+
+#: src/credential/plugin_gnsrecord_credential.c:186
+#, fuzzy, c-format
+msgid "Unable to parse ATTR record string `%s'\n"
+msgstr "Fehler beim Speichern der Konfigurationsdatei `%s':"
+
+#: src/credential/plugin_rest_credential.c:1155 src/gns/plugin_rest_gns.c:668
+#, fuzzy
+msgid "GNS REST API initialized\n"
+msgstr " Verbindung fehlgeschlagen\n"
+
#: src/datacache/datacache.c:119 src/datacache/datacache.c:294
-#: src/datastore/gnunet-service-datastore.c:775
+#: src/datastore/gnunet-service-datastore.c:757
msgid "# bytes stored"
msgstr "# gespeicherte Bytes"
@@ -1506,13 +1639,12 @@ msgstr ""
#: src/datacache/plugin_datacache_sqlite.c:113
#: src/datacache/plugin_datacache_sqlite.c:122
-#: src/datastore/plugin_datastore_mysql.c:980
+#: src/datastore/plugin_datastore_mysql.c:892
#: src/datastore/plugin_datastore_sqlite.c:58
-#: src/datastore/plugin_datastore_sqlite.c:66 src/my/my.c:80 src/my/my.c:92
-#: src/mysql/mysql.c:42 src/mysql/mysql.c:49
-#: src/namecache/plugin_namecache_postgres.c:53
+#: src/datastore/plugin_datastore_sqlite.c:66
+#: src/identity-provider/plugin_identity_provider_sqlite.c:52 src/my/my.c:80
+#: src/my/my.c:92 src/mysql/mysql.c:42 src/mysql/mysql.c:49
#: src/namecache/plugin_namecache_sqlite.c:53
-#: src/namestore/plugin_namestore_postgres.c:53
#: src/namestore/plugin_namestore_sqlite.c:53
#: src/peerstore/plugin_peerstore_sqlite.c:52
#: src/psycstore/plugin_psycstore_mysql.c:62
@@ -1521,14 +1653,15 @@ msgstr ""
#: src/testbed/gnunet-daemon-testbed-underlay.c:56
#: src/testbed/testbed_api_hosts.c:69 src/util/crypto_ecc.c:52
#: src/util/crypto_ecc_setup.c:41 src/util/crypto_mpi.c:39
-#: src/include/gnunet_common.h:720 src/include/gnunet_common.h:729
+#: src/include/gnunet_common.h:735 src/include/gnunet_common.h:744
#: src/scalarproduct/scalarproduct.h:35
#, c-format
msgid "`%s' failed at %s:%d with error: %s\n"
msgstr "»%s« schlug bei %s:%d mit dem Fehler %s fehl\n"
#: src/datacache/plugin_datacache_sqlite.c:817
-#: src/datastore/plugin_datastore_sqlite.c:475
+#: src/datastore/plugin_datastore_sqlite.c:456
+#: src/identity-provider/plugin_identity_provider_sqlite.c:336
#: src/namecache/plugin_namecache_sqlite.c:296
#: src/namestore/plugin_namestore_sqlite.c:355
msgid "Tried to close sqlite without finalizing all prepared statements.\n"
@@ -1596,23 +1729,74 @@ msgstr ""
msgid "# GET requests executed"
msgstr "# ausgeführte GET-Anfragen"
-#: src/datastore/gnunet-datastore.c:113
+#: src/datastore/gnunet-datastore.c:189
+#, c-format
+msgid "Dumped %<PRIu64> records\n"
+msgstr ""
+
+#: src/datastore/gnunet-datastore.c:217 src/datastore/gnunet-datastore.c:229
+#, c-format
+msgid "Short write to file: %zd bytes expecting %zd\n"
+msgstr ""
+
+#: src/datastore/gnunet-datastore.c:261
+#, fuzzy
+msgid "Error queueing datastore GET operation\n"
+msgstr "Fehler beim Anlegen des Benutzers"
+
+#: src/datastore/gnunet-datastore.c:287 src/datastore/gnunet-datastore.c:412
+#, fuzzy, c-format
+msgid "Unable to open dump file: %s\n"
+msgstr "Zustellung der Nachricht `%s' fehlgeschlagen.\n"
+
+#: src/datastore/gnunet-datastore.c:326
#, c-format
msgid "Failed to store item: %s, aborting\n"
msgstr "Objekt konnte nicht gespeichert werden: %s, Abbruch\n"
-#: src/datastore/gnunet-datastore.c:209
+#: src/datastore/gnunet-datastore.c:340
#, c-format
-msgid "Cannot use the same configuration for source and destination\n"
+msgid "Inserted %<PRIu64> records\n"
msgstr ""
-#: src/datastore/gnunet-datastore.c:256
-msgid ""
-"specifies the configuration to use to access an alternative datastore; will "
-"merge that datastore into our current datastore"
+#: src/datastore/gnunet-datastore.c:349 src/datastore/gnunet-datastore.c:363
+#, c-format
+msgid "Short read from file: %zd bytes expecting %zd\n"
msgstr ""
-#: src/datastore/gnunet-datastore.c:265
+#: src/datastore/gnunet-datastore.c:389
+#, fuzzy
+msgid "Error queueing datastore PUT operation\n"
+msgstr "Fehler beim Anlegen des Benutzers"
+
+#: src/datastore/gnunet-datastore.c:432
+msgid "Input file is not of a supported format\n"
+msgstr ""
+
+#: src/datastore/gnunet-datastore.c:458
+#, fuzzy
+msgid "Failed connecting to the datastore.\n"
+msgstr "Es konnte keine Verbindung mit gnunetd hergestellt werden."
+
+#: src/datastore/gnunet-datastore.c:470
+#, c-format
+msgid "Please choose at least one operation: %s, %s\n"
+msgstr ""
+
+#: src/datastore/gnunet-datastore.c:493
+msgid "Dump all records from the datastore"
+msgstr ""
+
+#: src/datastore/gnunet-datastore.c:497
+#, fuzzy
+msgid "Insert records into the datastore"
+msgstr "# bytes in der Datenbank"
+
+#: src/datastore/gnunet-datastore.c:502
+msgid "File to dump or insert"
+msgstr ""
+
+#: src/datastore/gnunet-datastore.c:511
#, fuzzy
msgid "Manipulate GNUnet datastore"
msgstr "sqlite Datenspeicher"
@@ -1655,8 +1839,8 @@ msgstr ""
#: src/datastore/gnunet-service-datastore.c:634
#: src/datastore/gnunet-service-datastore.c:689
-#: src/datastore/gnunet-service-datastore.c:977
-#: src/datastore/gnunet-service-datastore.c:1633
+#: src/datastore/gnunet-service-datastore.c:837
+#: src/datastore/gnunet-service-datastore.c:1469
msgid "# reserved"
msgstr ""
@@ -1664,147 +1848,148 @@ msgstr ""
msgid "Could not find matching reservation"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:792
+#: src/datastore/gnunet-service-datastore.c:773
#, c-format
msgid "Need %llu bytes more space (%llu allowed, using %llu)\n"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1026
+#: src/datastore/gnunet-service-datastore.c:876
#, fuzzy
msgid "# GET requests received"
msgstr "# Client Trace-Anfragen empfangen"
-#: src/datastore/gnunet-service-datastore.c:1058
+#: src/datastore/gnunet-service-datastore.c:907
#, fuzzy
msgid "# GET KEY requests received"
msgstr "# Client Trace-Anfragen empfangen"
-#: src/datastore/gnunet-service-datastore.c:1071
+#: src/datastore/gnunet-service-datastore.c:920
msgid "# requests filtered by bloomfilter"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1108
+#: src/datastore/gnunet-service-datastore.c:956
#, fuzzy
msgid "# GET REPLICATION requests received"
msgstr "# Client Trace-Anfragen empfangen"
-#: src/datastore/gnunet-service-datastore.c:1141
+#: src/datastore/gnunet-service-datastore.c:989
#, fuzzy
msgid "# GET ZERO ANONYMITY requests received"
msgstr "# Client Trace-Anfragen empfangen"
-#: src/datastore/gnunet-service-datastore.c:1190
+#: src/datastore/gnunet-service-datastore.c:1036
msgid "Content not found"
msgstr "Kein Inhalt gefunden"
-#: src/datastore/gnunet-service-datastore.c:1199
+#: src/datastore/gnunet-service-datastore.c:1043
msgid "# bytes removed (explicit request)"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1246
+#: src/datastore/gnunet-service-datastore.c:1088
#, fuzzy
msgid "# REMOVE requests received"
msgstr "# Client Trace-Anfragen empfangen"
-#: src/datastore/gnunet-service-datastore.c:1301
+#: src/datastore/gnunet-service-datastore.c:1137
#, c-format
msgid ""
"Datastore payload must have been inaccurate (%lld < %lld). Recomputing it.\n"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1307
-#: src/datastore/gnunet-service-datastore.c:1482
+#: src/datastore/gnunet-service-datastore.c:1143
+#: src/datastore/gnunet-service-datastore.c:1318
#, c-format
msgid "New payload: %lld\n"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1361
+#: src/datastore/gnunet-service-datastore.c:1197
#, c-format
msgid "Loading `%s' datastore plugin\n"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1373
+#: src/datastore/gnunet-service-datastore.c:1209
#, fuzzy, c-format
msgid "Failed to load datastore plugin for `%s'\n"
msgstr "Anwendung `%s' konnte nicht initialisiert werden.\n"
-#: src/datastore/gnunet-service-datastore.c:1433
+#: src/datastore/gnunet-service-datastore.c:1269
msgid "Bloomfilter construction complete.\n"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1489
+#: src/datastore/gnunet-service-datastore.c:1325
msgid "Rebuilding bloomfilter. Please be patient.\n"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1500
+#: src/datastore/gnunet-service-datastore.c:1336
msgid "Plugin does not support get_keys function. Please fix!\n"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1670
+#: src/datastore/gnunet-service-datastore.c:1506
#, fuzzy, c-format
msgid "# bytes used in file-sharing datastore `%s'"
msgstr "# bytes erlaubt in der Datenbank"
-#: src/datastore/gnunet-service-datastore.c:1686
+#: src/datastore/gnunet-service-datastore.c:1522
msgid "# quota"
msgstr "# Kontingent"
-#: src/datastore/gnunet-service-datastore.c:1691
+#: src/datastore/gnunet-service-datastore.c:1527
msgid "# cache size"
msgstr "# Zwischenspeichergröße"
-#: src/datastore/gnunet-service-datastore.c:1707
+#: src/datastore/gnunet-service-datastore.c:1543
#, c-format
msgid "Could not use specified filename `%s' for bloomfilter.\n"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1725
-#: src/datastore/gnunet-service-datastore.c:1741
+#: src/datastore/gnunet-service-datastore.c:1561
+#: src/datastore/gnunet-service-datastore.c:1577
#, fuzzy, c-format
msgid "Failed to remove bogus bloomfilter file `%s'\n"
msgstr "Datei wurde als `%s' gespeichert.\n"
-#: src/datastore/gnunet-service-datastore.c:1773
+#: src/datastore/gnunet-service-datastore.c:1609
msgid "Failed to initialize bloomfilter.\n"
msgstr "Bloomfilter konnte nicht initialisiert werden.\n"
-#: src/datastore/plugin_datastore_heap.c:769
+#: src/datastore/plugin_datastore_heap.c:893
msgid "Heap database running\n"
msgstr "Heap-Datenbank läuft\n"
-#: src/datastore/plugin_datastore_mysql.c:377
-#: src/datastore/plugin_datastore_sqlite.c:590
+#: src/datastore/plugin_datastore_mysql.c:371
+#: src/datastore/plugin_datastore_mysql.c:423
+#: src/datastore/plugin_datastore_mysql.c:1075
+msgid "MySQL statement run failure"
+msgstr ""
+
+#: src/datastore/plugin_datastore_mysql.c:410
+#: src/datastore/plugin_datastore_sqlite.c:626
#, fuzzy
msgid "Data too large"
msgstr "Anzahl der Werte"
-#: src/datastore/plugin_datastore_mysql.c:393
-msgid "MySQL statement run failure"
-msgstr ""
-
-#: src/datastore/plugin_datastore_mysql.c:936
+#: src/datastore/plugin_datastore_mysql.c:848
#, fuzzy, c-format
msgid "`%s' for `%s' failed at %s:%d with error: %s\n"
msgstr "`%s' an `%s' schlug fehl bei %s:%d mit dem Fehler: %s\n"
-#: src/datastore/plugin_datastore_mysql.c:1208
+#: src/datastore/plugin_datastore_mysql.c:1180
#: src/psycstore/plugin_psycstore_mysql.c:1936
msgid "Mysql database running\n"
msgstr "MySQL-Datenbank läuft\n"
-#: src/datastore/plugin_datastore_postgres.c:345
+#: src/datastore/plugin_datastore_postgres.c:274
+#: src/datastore/plugin_datastore_postgres.c:891
msgid "Postgress exec failure"
msgstr ""
-#: src/datastore/plugin_datastore_postgres.c:866
+#: src/datastore/plugin_datastore_postgres.c:852
#, fuzzy
msgid "Failed to drop table from database.\n"
msgstr "Fehler beim Binden an UDP Port %d.\n"
-#: src/datastore/plugin_datastore_postgres.c:903
-#: src/namecache/plugin_namecache_postgres.c:398
-#: src/namestore/plugin_namestore_postgres.c:571
-#: src/psycstore/plugin_psycstore_postgres.c:1721
+#: src/datastore/plugin_datastore_postgres.c:950
+#: src/psycstore/plugin_psycstore_postgres.c:1506
msgid "Postgres database running\n"
msgstr "PostgreSQL-Datenbank läuft\n"
@@ -1816,7 +2001,8 @@ msgstr "PostgreSQL-Datenbank läuft\n"
msgid "`%s' failed at %s:%u with error: %s"
msgstr "`%s' schlug bei %s:%d mit dem Fehler %s fehl\n"
-#: src/datastore/plugin_datastore_sqlite.c:281
+#: src/datastore/plugin_datastore_sqlite.c:271
+#: src/identity-provider/plugin_identity_provider_sqlite.c:212
#: src/namecache/plugin_namecache_sqlite.c:194
#: src/namestore/plugin_namestore_sqlite.c:222
#: src/peerstore/plugin_peerstore_sqlite.c:535
@@ -1825,24 +2011,29 @@ msgstr "`%s' schlug bei %s:%d mit dem Fehler %s fehl\n"
msgid "Unable to initialize SQLite: %s.\n"
msgstr "SQLite-Datenbank konnte nicht initialisiert werden: %s.\n"
-#: src/datastore/plugin_datastore_sqlite.c:1234
+#: src/datastore/plugin_datastore_sqlite.c:577
+msgid "sqlite bind failure"
+msgstr ""
+
+#: src/datastore/plugin_datastore_sqlite.c:1259
msgid "sqlite version to old to determine size, assuming zero\n"
msgstr ""
-#: src/datastore/plugin_datastore_sqlite.c:1268
+#: src/datastore/plugin_datastore_sqlite.c:1293
#, c-format
msgid ""
"Using sqlite page utilization to estimate payload (%llu pages of size %llu "
"bytes)\n"
msgstr ""
-#: src/datastore/plugin_datastore_sqlite.c:1312
+#: src/datastore/plugin_datastore_sqlite.c:1337
+#: src/identity-provider/plugin_identity_provider_sqlite.c:711
#: src/namecache/plugin_namecache_sqlite.c:603
#: src/namestore/plugin_namestore_sqlite.c:802
msgid "Sqlite database running\n"
msgstr "Sqlite-Datenbank läuft\n"
-#: src/datastore/plugin_datastore_template.c:259
+#: src/datastore/plugin_datastore_template.c:253
msgid "Template database running\n"
msgstr ""
@@ -1903,52 +2094,6 @@ msgstr ""
msgid "Prints all packets that go through the DHT."
msgstr ""
-#: src/dht/gnunet_dht_profiler.c:1161
-#: src/testbed/gnunet-testbed-profiler.c:255
-#, c-format
-msgid "Exiting as the number of peers is %u\n"
-msgstr ""
-
-#: src/dht/gnunet_dht_profiler.c:1188
-#, fuzzy
-msgid "number of peers to start"
-msgstr "Anzahl an Durchläufen"
-
-#: src/dht/gnunet_dht_profiler.c:1194
-msgid ""
-"maximum number of times we try to search for successor circle formation (0 "
-"for R5N)"
-msgstr ""
-
-#: src/dht/gnunet_dht_profiler.c:1200 src/nse/gnunet-nse-profiler.c:853
-#: src/testbed/gnunet-testbed-profiler.c:305
-msgid "name of the file with the login information for the testbed"
-msgstr ""
-
-#: src/dht/gnunet_dht_profiler.c:1206
-msgid "delay between rounds for collecting statistics (default: 30 sec)"
-msgstr ""
-
-#: src/dht/gnunet_dht_profiler.c:1212
-msgid "delay to start doing PUTs (default: 1 sec)"
-msgstr ""
-
-#: src/dht/gnunet_dht_profiler.c:1218
-msgid "delay to start doing GETs (default: 5 min)"
-msgstr ""
-
-#: src/dht/gnunet_dht_profiler.c:1223
-msgid "replication degree for DHT PUTs"
-msgstr ""
-
-#: src/dht/gnunet_dht_profiler.c:1230
-msgid "timeout for DHT PUT and GET requests (default: 1 min)"
-msgstr ""
-
-#: src/dht/gnunet_dht_profiler.c:1248
-msgid "Measure quality and performance of the DHT service."
-msgstr ""
-
#: src/dht/gnunet-dht-put.c:120
msgid "PUT request sent with key"
msgstr ""
@@ -2215,6 +2360,51 @@ msgstr ""
msgid "# DHT requests combined"
msgstr "# dht Anfragen weitergeleitet"
+#: src/dht/gnunet_dht_profiler.c:1161 src/testbed/gnunet-testbed-profiler.c:255
+#, c-format
+msgid "Exiting as the number of peers is %u\n"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:1188
+#, fuzzy
+msgid "number of peers to start"
+msgstr "Anzahl an Durchläufen"
+
+#: src/dht/gnunet_dht_profiler.c:1194
+msgid ""
+"maximum number of times we try to search for successor circle formation (0 "
+"for R5N)"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:1200 src/nse/gnunet-nse-profiler.c:853
+#: src/testbed/gnunet-testbed-profiler.c:305
+msgid "name of the file with the login information for the testbed"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:1206
+msgid "delay between rounds for collecting statistics (default: 30 sec)"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:1212
+msgid "delay to start doing PUTs (default: 1 sec)"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:1218
+msgid "delay to start doing GETs (default: 5 min)"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:1223
+msgid "replication degree for DHT PUTs"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:1230
+msgid "timeout for DHT PUT and GET requests (default: 1 min)"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:1248
+msgid "Measure quality and performance of the DHT service."
+msgstr ""
+
#: src/dht/plugin_block_dht.c:187
#, fuzzy, c-format
msgid "Block not of type %u\n"
@@ -2546,7 +2736,7 @@ msgstr ""
msgid "No useful service enabled. Exiting.\n"
msgstr ""
-#: src/exit/gnunet-daemon-exit.c:3969
+#: src/exit/gnunet-daemon-exit.c:3970
msgid "Daemon to run to provide an IP exit node for the VPN"
msgstr ""
@@ -3199,15 +3389,6 @@ msgid ""
"chk/...)"
msgstr ""
-#: src/fs/gnunet-fs.c:119
-msgid "print a list of all indexed files"
-msgstr ""
-
-#: src/fs/gnunet-fs.c:130
-#, fuzzy
-msgid "Special file-sharing operations"
-msgstr "Alle Optionen anzeigen"
-
#: src/fs/gnunet-fs-profiler.c:211
msgid "run the experiment with COUNT peers"
msgstr ""
@@ -3224,6 +3405,15 @@ msgstr ""
msgid "run a testbed to measure file-sharing performance"
msgstr ""
+#: src/fs/gnunet-fs.c:119
+msgid "print a list of all indexed files"
+msgstr ""
+
+#: src/fs/gnunet-fs.c:130
+#, fuzzy
+msgid "Special file-sharing operations"
+msgstr "Alle Optionen anzeigen"
+
#: src/fs/gnunet-publish.c:219 src/fs/gnunet-publish.c:231
#, c-format
msgid "Publishing `%s' at %llu/%llu (%s remaining)\n"
@@ -3923,22 +4113,11 @@ msgstr ""
msgid "GNUnet DNS-to-GNS proxy (a DNS server)"
msgstr ""
-#: src/gns/gnunet-gns.c:235 src/gns/plugin_rest_gns.c:346
-#, c-format
-msgid "Invalid typename specified, assuming `ANY'\n"
-msgstr ""
-
-#: src/gns/gnunet-gns.c:252
-#, c-format
-msgid "Please specify name to lookup!\n"
-msgstr ""
-
-#: src/gns/gnunet-gns.c:276
-#, c-format
-msgid "Ego for `%s' not found, cannot perform lookup.\n"
+#: src/gns/gnunet-gns-helper-service-w32.c:602
+msgid "Not ready to process requests, lacking ego data\n"
msgstr ""
-#: src/gns/gnunet-gns.c:315 src/gns/gnunet-gns-helper-service-w32.c:701
+#: src/gns/gnunet-gns-helper-service-w32.c:701 src/gns/gnunet-gns.c:315
#: src/gns/plugin_rest_gns.c:422
#, c-format
msgid ""
@@ -3946,56 +4125,12 @@ msgid ""
"gns-import.sh?\n"
msgstr ""
-#: src/gns/gnunet-gns.c:355 src/gns/gnunet-gns-helper-service-w32.c:727
-#, fuzzy, c-format
-msgid "Failed to connect to GNS\n"
-msgstr "Es konnte keine Verbindung mit gnunetd hergestellt werden.\n"
-
-#: src/gns/gnunet-gns.c:374
-#, c-format
-msgid "Public key `%s' is not well-formed\n"
-msgstr ""
-
-#: src/gns/gnunet-gns.c:428
-msgid "Lookup a record for the given name"
-msgstr ""
-
-#: src/gns/gnunet-gns.c:434
-#, fuzzy
-msgid "Specify the type of the record to lookup"
-msgstr "Die Priorität des Inhalts angeben"
-
-#: src/gns/gnunet-gns.c:440
-msgid "Specify timeout for the lookup"
-msgstr ""
-
-#: src/gns/gnunet-gns.c:445
-msgid "No unneeded output"
-msgstr ""
-
-#: src/gns/gnunet-gns.c:451
-msgid "Specify the public key of the zone to lookup the record in"
-msgstr ""
-
-#: src/gns/gnunet-gns.c:457
-msgid "Specify the name of the ego of the zone to lookup the record in"
-msgstr ""
-
-#: src/gns/gnunet-gns.c:476
-#, fuzzy
-msgid "GNUnet GNS resolver tool"
-msgstr "GNUnet Netzwerk Topologie tracen."
-
-#: src/gns/gnunet-gns-helper-service-w32.c:602
-msgid "Not ready to process requests, lacking ego data\n"
-msgstr ""
-
#: src/gns/gnunet-gns-helper-service-w32.c:739
#, fuzzy, c-format
msgid "Failed to connect to identity service\n"
msgstr "Es konnte keine Verbindung mit gnunetd hergestellt werden.\n"
-#: src/gns/gnunet-gns-import.c:489
+#: src/gns/gnunet-gns-import.c:452
msgid "This program will import some GNS authorities into your GNS namestore."
msgstr ""
@@ -4120,13 +4255,63 @@ msgstr ""
msgid "GNUnet GNS proxy"
msgstr ""
+#: src/gns/gnunet-gns.c:235 src/gns/plugin_rest_gns.c:346
+#, c-format
+msgid "Invalid typename specified, assuming `ANY'\n"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:252
+#, c-format
+msgid "Please specify name to lookup!\n"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:276
+#, c-format
+msgid "Ego for `%s' not found, cannot perform lookup.\n"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:374
+#, c-format
+msgid "Public key `%s' is not well-formed\n"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:428
+msgid "Lookup a record for the given name"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:434
+#, fuzzy
+msgid "Specify the type of the record to lookup"
+msgstr "Die Priorität des Inhalts angeben"
+
+#: src/gns/gnunet-gns.c:440
+msgid "Specify timeout for the lookup"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:445
+msgid "No unneeded output"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:451
+msgid "Specify the public key of the zone to lookup the record in"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:457
+msgid "Specify the name of the ego of the zone to lookup the record in"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:476
+#, fuzzy
+msgid "GNUnet GNS resolver tool"
+msgstr "GNUnet Netzwerk Topologie tracen."
+
#: src/gns/gnunet-service-gns.c:442
#, fuzzy
msgid "Failed to connect to the namecache!\n"
msgstr "Es konnte keine Verbindung mit gnunetd hergestellt werden.\n"
#: src/gns/gnunet-service-gns.c:461
-#: src/zonemaster/gnunet-service-zonemaster.c:741
+#: src/zonemaster/gnunet-service-zonemaster.c:742
#, fuzzy
msgid "Could not connect to DHT!\n"
msgstr "Verbindung zu gnunetd konnte nicht hergestellt werden.\n"
@@ -4185,45 +4370,35 @@ msgstr ""
msgid "Hostname `%s' is not well-formed, resolution fails\n"
msgstr ""
-#: src/gns/plugin_gnsrecord_gns.c:203
+#: src/gns/plugin_gnsrecord_gns.c:179
#, c-format
msgid "Unable to parse PKEY record `%s'\n"
msgstr ""
-#: src/gns/plugin_gnsrecord_gns.c:232
+#: src/gns/plugin_gnsrecord_gns.c:208
#, fuzzy, c-format
msgid "Unable to parse GNS2DNS record `%s'\n"
msgstr "Dateiformat fehlerhaft (kein GNUnet Verzeichnis?)\n"
-#: src/gns/plugin_gnsrecord_gns.c:253
+#: src/gns/plugin_gnsrecord_gns.c:229
#, c-format
msgid "Failed to serialize GNS2DNS record with value `%s'\n"
msgstr ""
-#: src/gns/plugin_gnsrecord_gns.c:276
+#: src/gns/plugin_gnsrecord_gns.c:252
#, fuzzy, c-format
msgid "Unable to parse VPN record string `%s'\n"
msgstr "Fehler beim Speichern der Konfigurationsdatei `%s':"
-#: src/gns/plugin_gnsrecord_gns.c:312
+#: src/gns/plugin_gnsrecord_gns.c:288
#, fuzzy, c-format
msgid "Unable to parse BOX record string `%s'\n"
msgstr "Fehler beim Speichern der Konfigurationsdatei `%s':"
-#: src/gns/plugin_gnsrecord_gns.c:360
-#, fuzzy, c-format
-msgid "Unable to parse REVERSE record string `%s'\n"
-msgstr "Fehler beim Speichern der Konfigurationsdatei `%s':"
-
#: src/gns/plugin_rest_gns.c:384
msgid "Ego for not found, cannot perform lookup.\n"
msgstr ""
-#: src/gns/plugin_rest_gns.c:668
-#, fuzzy
-msgid "GNS REST API initialized\n"
-msgstr " Verbindung fehlgeschlagen\n"
-
#: src/gnsrecord/plugin_gnsrecord_dns.c:359
#, c-format
msgid "Unable to parse IPv4 address `%s'\n"
@@ -4655,6 +4830,53 @@ msgstr "»%s« ist keine gültige IP-Adresse.\n"
msgid "Could not start hostlist HTTP server on port %u\n"
msgstr "Der Transportdienst auf Port %d konnte nicht gestartet werden.\n"
+#: src/identity-provider/gnunet-idp.c:348
+#, fuzzy
+msgid "Ego is required\n"
+msgstr "Option `%s' macht keinen Sinn ohne die Option `%s'.\n"
+
+#: src/identity-provider/gnunet-idp.c:370
+msgid "Add attribute"
+msgstr ""
+
+#: src/identity-provider/gnunet-idp.c:376
+msgid "Attribute value"
+msgstr ""
+
+#: src/identity-provider/gnunet-idp.c:381
+msgid "Ego"
+msgstr ""
+
+#: src/identity-provider/gnunet-idp.c:386
+msgid "Audience (relying party)"
+msgstr ""
+
+#: src/identity-provider/gnunet-idp.c:390
+msgid "List attributes for Ego"
+msgstr ""
+
+#: src/identity-provider/gnunet-idp.c:395
+msgid "Issue a ticket"
+msgstr ""
+
+#: src/identity-provider/gnunet-idp.c:400
+msgid "Consume a ticket"
+msgstr ""
+
+#: src/identity-provider/gnunet-idp.c:405
+msgid "Revoke a ticket"
+msgstr ""
+
+#: src/identity-provider/identity_provider_api.c:429
+#, fuzzy
+msgid "failed to store record\n"
+msgstr "Zustellung der Nachricht `%s' fehlgeschlagen.\n"
+
+#: src/identity-provider/plugin_rest_identity_provider.c:1175
+#, fuzzy
+msgid "Identity Provider REST API initialized\n"
+msgstr " Verbindung fehlgeschlagen\n"
+
#: src/identity/gnunet-identity.c:179
#, fuzzy, c-format
msgid "Failed to create ego: %s\n"
@@ -4742,33 +4964,10 @@ msgstr "Fehler beim Speichern der Konfigurationsdatei `%s':"
msgid "Failed to create directory `%s' for storing egos\n"
msgstr "Dateiformat fehlerhaft (kein GNUnet Verzeichnis?)\n"
-#: src/identity/plugin_rest_identity.c:967
+#: src/identity/plugin_rest_identity.c:964
msgid "Identity REST API initialized\n"
msgstr ""
-#: src/identity-provider/gnunet-identity-token.c:66
-#, fuzzy
-msgid "Option `-t' is required\n"
-msgstr "Option `%s' macht keinen Sinn ohne die Option `%s'.\n"
-
-#: src/identity-provider/gnunet-identity-token.c:77
-#, fuzzy, c-format
-msgid "Token `%s' is malformed\n"
-msgstr "Schlüssel »%s« ist gültig\n"
-
-#: src/identity-provider/gnunet-identity-token.c:166
-msgid "GNUid token"
-msgstr ""
-
-#: src/identity-provider/gnunet-identity-token.c:171
-msgid "Print token contents"
-msgstr ""
-
-#: src/identity-provider/plugin_rest_identity_provider.c:1166
-#, fuzzy
-msgid "Identity Token REST API initialized\n"
-msgstr " Verbindung fehlgeschlagen\n"
-
#: src/json/json.c:119
#, fuzzy, c-format
msgid "Failed to parse JSON in option `%s': %s (%s)\n"
@@ -4870,11 +5069,65 @@ msgstr "Zustellung der Nachricht `%s' fehlgeschlagen.\n"
msgid "flat plugin running\n"
msgstr "Sqlite-Datenbank läuft\n"
-#: src/namecache/plugin_namecache_postgres.c:90
-#: src/namestore/plugin_namestore_postgres.c:97
+#: src/namestore/gnunet-namestore-fcfsd.c:508
+#, fuzzy, c-format
+msgid "Unsupported form value `%s'\n"
+msgstr "Kommando `%s' wird nicht unterstützt. Vorgang wird abgebrochen.\n"
+
+#: src/namestore/gnunet-namestore-fcfsd.c:535
+#, fuzzy, c-format
+msgid "Failed to create record for domain `%s': %s\n"
+msgstr "Fehler beim Lesen der Freunde-Liste von `%s'\n"
+
+#: src/namestore/gnunet-namestore-fcfsd.c:555
+msgid "Error when mapping zone to name\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:585
+#, c-format
+msgid "Found existing name `%s' for the given key\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:662
+#, c-format
+msgid "Found %u existing records for domain `%s'\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:718
+#, fuzzy, c-format
+msgid "Failed to create page for `%s'\n"
+msgstr "Fehler beim Aktualisieren der Daten des Moduls `%s'\n"
+
+#: src/namestore/gnunet-namestore-fcfsd.c:734
+#, fuzzy, c-format
+msgid "Failed to setup post processor for `%s'\n"
+msgstr "Fehler beim Aktualisieren der Daten des Moduls `%s'\n"
+
+#: src/namestore/gnunet-namestore-fcfsd.c:770
+msgid "Domain name must not contain `.'\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:778
+msgid "Domain name must not contain `+'\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:974
+msgid "No ego configured for `fcfsd` subsystem\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:1000
#, fuzzy
-msgid "Failed to create indices\n"
-msgstr "Zustellung der Nachricht `%s' fehlgeschlagen.\n"
+msgid "Failed to start HTTP server\n"
+msgstr "Fehler beim Senden einer `%s' Anfrage an den SMTP Server.\n"
+
+#: src/namestore/gnunet-namestore-fcfsd.c:1042
+#, fuzzy
+msgid "Failed to connect to identity\n"
+msgstr "Es konnte keine Verbindung mit gnunetd hergestellt werden.\n"
+
+#: src/namestore/gnunet-namestore-fcfsd.c:1074
+msgid "GNU Name System First Come First Serve name registration service"
+msgstr ""
#: src/namestore/gnunet-namestore.c:301
#, c-format
@@ -4882,13 +5135,13 @@ msgid "Adding record failed: %s\n"
msgstr ""
#: src/namestore/gnunet-namestore.c:330
-#: src/namestore/plugin_rest_namestore.c:562
+#: src/namestore/plugin_rest_namestore.c:567
#, c-format
msgid "Deleting record failed, record does not exist%s%s\n"
msgstr ""
#: src/namestore/gnunet-namestore.c:337
-#: src/namestore/plugin_rest_namestore.c:571
+#: src/namestore/plugin_rest_namestore.c:576
#, c-format
msgid "Deleting record failed%s%s\n"
msgstr ""
@@ -4906,7 +5159,7 @@ msgid "Records already exist under `%s', cannot add `%s' record.\n"
msgstr ""
#: src/namestore/gnunet-namestore.c:698
-#: src/namestore/plugin_rest_namestore.c:597
+#: src/namestore/plugin_rest_namestore.c:602
#, c-format
msgid "There are no records under label `%s' that could be deleted.\n"
msgstr ""
@@ -4917,24 +5170,11 @@ msgid ""
"There are no records under label `%s' that match the request for deletion.\n"
msgstr ""
-#: src/namestore/gnunet-namestore.c:776
-#: src/namestore/plugin_rest_namestore.c:1004
-#, fuzzy, c-format
-msgid "Ego `%s' not known to identity service\n"
-msgstr "`%s': unbekannter Dienst: %s\n"
-
#: src/namestore/gnunet-namestore.c:791
#, c-format
msgid "No options given\n"
msgstr ""
-#: src/namestore/gnunet-namestore.c:802
-#: src/namestore/gnunet-namestore-fcfsd.c:1034
-#: src/namestore/plugin_rest_namestore.c:1017
-#, fuzzy
-msgid "Failed to connect to namestore\n"
-msgstr "Es konnte keine Verbindung mit gnunetd hergestellt werden.\n"
-
#: src/namestore/gnunet-namestore.c:810 src/namestore/gnunet-namestore.c:819
#: src/namestore/gnunet-namestore.c:838 src/namestore/gnunet-namestore.c:861
#: src/namestore/gnunet-namestore.c:915
@@ -4948,14 +5188,14 @@ msgid "add"
msgstr ""
#: src/namestore/gnunet-namestore.c:829
-#: src/namestore/plugin_rest_namestore.c:671
+#: src/namestore/plugin_rest_namestore.c:676
#, fuzzy, c-format
msgid "Unsupported type `%s'\n"
msgstr "Kommando `%s' wird nicht unterstützt. Vorgang wird abgebrochen.\n"
#: src/namestore/gnunet-namestore.c:851
-#: src/namestore/plugin_rest_namestore.c:689
-#: src/namestore/plugin_rest_namestore.c:729
+#: src/namestore/plugin_rest_namestore.c:694
+#: src/namestore/plugin_rest_namestore.c:734
#, fuzzy, c-format
msgid "Value `%s' invalid for record type `%s'\n"
msgstr "%s: Symbolwert `%s' ist ungültig für %s\n"
@@ -4974,8 +5214,7 @@ msgstr ""
msgid "Invalid public key for reverse lookup `%s'\n"
msgstr ""
-#: src/namestore/gnunet-namestore.c:979
-#: src/peerinfo-tool/gnunet-peerinfo.c:775
+#: src/namestore/gnunet-namestore.c:979 src/peerinfo-tool/gnunet-peerinfo.c:775
#, fuzzy, c-format
msgid "Invalid URI `%s'\n"
msgstr "Ungültiger Parameter: `%s'\n"
@@ -4986,13 +5225,13 @@ msgid "Invalid nick `%s'\n"
msgstr "Ungültiger Parameter: `%s'\n"
#: src/namestore/gnunet-namestore.c:1051
-#: src/namestore/plugin_rest_namestore.c:1047
+#: src/namestore/plugin_rest_namestore.c:1052
#, c-format
msgid "No default ego configured in identity service\n"
msgstr ""
#: src/namestore/gnunet-namestore.c:1108
-#: src/namestore/plugin_rest_namestore.c:1143
+#: src/namestore/plugin_rest_namestore.c:1148
#, fuzzy, c-format
msgid "Cannot connect to identity service\n"
msgstr "Verbindung zu %u.%u.%u.%u:%u fehlgeschlagen: %s\n"
@@ -5052,67 +5291,7 @@ msgstr ""
msgid "name of the ego controlling the zone"
msgstr ""
-#: src/namestore/gnunet-namestore-fcfsd.c:508
-#, fuzzy, c-format
-msgid "Unsupported form value `%s'\n"
-msgstr "Kommando `%s' wird nicht unterstützt. Vorgang wird abgebrochen.\n"
-
-#: src/namestore/gnunet-namestore-fcfsd.c:535
-#, fuzzy, c-format
-msgid "Failed to create record for domain `%s': %s\n"
-msgstr "Fehler beim Lesen der Freunde-Liste von `%s'\n"
-
-#: src/namestore/gnunet-namestore-fcfsd.c:555
-msgid "Error when mapping zone to name\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:585
-#, c-format
-msgid "Found existing name `%s' for the given key\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:662
-#, c-format
-msgid "Found %u existing records for domain `%s'\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:718
-#, fuzzy, c-format
-msgid "Failed to create page for `%s'\n"
-msgstr "Fehler beim Aktualisieren der Daten des Moduls `%s'\n"
-
-#: src/namestore/gnunet-namestore-fcfsd.c:734
-#, fuzzy, c-format
-msgid "Failed to setup post processor for `%s'\n"
-msgstr "Fehler beim Aktualisieren der Daten des Moduls `%s'\n"
-
-#: src/namestore/gnunet-namestore-fcfsd.c:770
-msgid "Domain name must not contain `.'\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:778
-msgid "Domain name must not contain `+'\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:974
-msgid "No ego configured for `fcfsd` subsystem\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:1000
-#, fuzzy
-msgid "Failed to start HTTP server\n"
-msgstr "Fehler beim Senden einer `%s' Anfrage an den SMTP Server.\n"
-
-#: src/namestore/gnunet-namestore-fcfsd.c:1042
-#, fuzzy
-msgid "Failed to connect to identity\n"
-msgstr "Es konnte keine Verbindung mit gnunetd hergestellt werden.\n"
-
-#: src/namestore/gnunet-namestore-fcfsd.c:1074
-msgid "GNU Name System First Come First Serve name registration service"
-msgstr ""
-
-#: src/namestore/gnunet-service-namestore.c:612
+#: src/namestore/gnunet-service-namestore.c:615
#, c-format
msgid "Failed to replicate block in namecache: %s\n"
msgstr ""
@@ -5126,7 +5305,7 @@ msgstr ""
msgid "flat file database running\n"
msgstr "Sqlite-Datenbank läuft\n"
-#: src/namestore/plugin_rest_namestore.c:1188
+#: src/namestore/plugin_rest_namestore.c:1193
#, fuzzy
msgid "Namestore REST API initialized\n"
msgstr " Verbindung fehlgeschlagen\n"
@@ -5416,10 +5595,6 @@ msgstr "Kommando `%s' wurde nicht gefunden!\n"
msgid "`upnpc' command not found\n"
msgstr "Kommando `%s' wurde nicht gefunden!\n"
-#: src/nse/gnunet-nse.c:122
-msgid "Show network size estimates from NSE service."
-msgstr ""
-
#: src/nse/gnunet-nse-profiler.c:842
msgid "limit to the number of connections to NSE services, 0 for none"
msgstr ""
@@ -5444,68 +5619,15 @@ msgstr ""
msgid "Measure quality and performance of the NSE service."
msgstr ""
+#: src/nse/gnunet-nse.c:122
+msgid "Show network size estimates from NSE service."
+msgstr ""
+
#: src/nse/gnunet-service-nse.c:1534
#: src/revocation/gnunet-service-revocation.c:838 src/util/gnunet-scrypt.c:276
msgid "Value is too large.\n"
msgstr ""
-#: src/peerinfo/gnunet-service-peerinfo.c:178
-#, fuzzy, c-format
-msgid "Removing expired address of transport `%s'\n"
-msgstr "Verfügbare(r) Transport(e): %s\n"
-
-#: src/peerinfo/gnunet-service-peerinfo.c:310
-#, fuzzy, c-format
-msgid "Failed to parse HELLO in file `%s': %s\n"
-msgstr "Datei wurde als `%s' gespeichert.\n"
-
-#: src/peerinfo/gnunet-service-peerinfo.c:331
-#: src/peerinfo/gnunet-service-peerinfo.c:362
-#, fuzzy, c-format
-msgid "Failed to parse HELLO in file `%s'\n"
-msgstr "Datei wurde als `%s' gespeichert.\n"
-
-#: src/peerinfo/gnunet-service-peerinfo.c:446
-msgid "# peers known"
-msgstr ""
-
-#: src/peerinfo/gnunet-service-peerinfo.c:489
-#, c-format
-msgid ""
-"File `%s' in directory `%s' does not match naming convention. Removed.\n"
-msgstr ""
-"Die Datei »%s« im Verzeichnis »%s« entspricht nicht der Namenskonvention. "
-"Die Datei wurde entfernt.\n"
-
-#: src/peerinfo/gnunet-service-peerinfo.c:655
-#, fuzzy, c-format
-msgid "Scanning directory `%s'\n"
-msgstr "==> Verzeichnis `%s':\n"
-
-#: src/peerinfo/gnunet-service-peerinfo.c:663
-#, fuzzy, c-format
-msgid "Still no peers found in `%s'!\n"
-msgstr "Dienst `%s' konnte nicht ordentlich entladen werden!\n"
-
-#: src/peerinfo/gnunet-service-peerinfo.c:1076
-#, fuzzy, c-format
-msgid "Cleaning up directory `%s'\n"
-msgstr "==> Verzeichnis `%s':\n"
-
-#: src/peerinfo/gnunet-service-peerinfo.c:1405
-#, c-format
-msgid "Importing HELLOs from `%s'\n"
-msgstr ""
-
-#: src/peerinfo/gnunet-service-peerinfo.c:1418
-msgid "Skipping import of included HELLOs\n"
-msgstr ""
-
-#: src/peerinfo/peerinfo_api.c:220
-#, fuzzy
-msgid "Failed to receive response from `PEERINFO' service."
-msgstr "Fehler beim Empfangen der Antwort von gnunetd auf die `%s' Nachricht\n"
-
#: src/peerinfo-tool/gnunet-peerinfo.c:239
#, fuzzy, c-format
msgid "%sPeer `%s'\n"
@@ -5596,6 +5718,63 @@ msgstr "Teste Transport(e) %s\n"
msgid "Failed to load transport plugin for `%s'\n"
msgstr "Anwendung `%s' konnte nicht initialisiert werden.\n"
+#: src/peerinfo/gnunet-service-peerinfo.c:178
+#, fuzzy, c-format
+msgid "Removing expired address of transport `%s'\n"
+msgstr "Verfügbare(r) Transport(e): %s\n"
+
+#: src/peerinfo/gnunet-service-peerinfo.c:310
+#, fuzzy, c-format
+msgid "Failed to parse HELLO in file `%s': %s\n"
+msgstr "Datei wurde als `%s' gespeichert.\n"
+
+#: src/peerinfo/gnunet-service-peerinfo.c:331
+#: src/peerinfo/gnunet-service-peerinfo.c:362
+#, fuzzy, c-format
+msgid "Failed to parse HELLO in file `%s'\n"
+msgstr "Datei wurde als `%s' gespeichert.\n"
+
+#: src/peerinfo/gnunet-service-peerinfo.c:446
+msgid "# peers known"
+msgstr ""
+
+#: src/peerinfo/gnunet-service-peerinfo.c:489
+#, c-format
+msgid ""
+"File `%s' in directory `%s' does not match naming convention. Removed.\n"
+msgstr ""
+"Die Datei »%s« im Verzeichnis »%s« entspricht nicht der Namenskonvention. "
+"Die Datei wurde entfernt.\n"
+
+#: src/peerinfo/gnunet-service-peerinfo.c:655
+#, fuzzy, c-format
+msgid "Scanning directory `%s'\n"
+msgstr "==> Verzeichnis `%s':\n"
+
+#: src/peerinfo/gnunet-service-peerinfo.c:663
+#, fuzzy, c-format
+msgid "Still no peers found in `%s'!\n"
+msgstr "Dienst `%s' konnte nicht ordentlich entladen werden!\n"
+
+#: src/peerinfo/gnunet-service-peerinfo.c:1076
+#, fuzzy, c-format
+msgid "Cleaning up directory `%s'\n"
+msgstr "==> Verzeichnis `%s':\n"
+
+#: src/peerinfo/gnunet-service-peerinfo.c:1405
+#, c-format
+msgid "Importing HELLOs from `%s'\n"
+msgstr ""
+
+#: src/peerinfo/gnunet-service-peerinfo.c:1418
+msgid "Skipping import of included HELLOs\n"
+msgstr ""
+
+#: src/peerinfo/peerinfo_api.c:220
+#, fuzzy
+msgid "Failed to receive response from `PEERINFO' service."
+msgstr "Fehler beim Empfangen der Antwort von gnunetd auf die `%s' Nachricht\n"
+
#: src/peerstore/gnunet-peerstore.c:91
msgid "peerstore"
msgstr ""
@@ -5644,15 +5823,10 @@ msgstr ""
msgid "Unable to create indices: %s.\n"
msgstr "Zustellung der Nachricht `%s' fehlgeschlagen.\n"
-#: src/postgres/postgres.c:67
+#: src/pq/pq_prepare.c:80
#, fuzzy, c-format
-msgid "`%s:%s' failed at %s:%d with error: %s\n"
-msgstr "`%s' schlug bei %s:%d mit dem Fehler %s fehl\n"
-
-#: src/postgres/postgres.c:192
-#, fuzzy, c-format
-msgid "Unable to connect to Postgres database '%s': %s\n"
-msgstr "Fehler beim Anlegen des Benutzerkontos:"
+msgid "PQprepare (`%s' as `%s') failed with error: %s\n"
+msgstr "`%s' an `%s' schlug fehl bei %s:%d mit dem Fehler: %s\n"
#: src/psycstore/gnunet-service-psycstore.c:249
#, fuzzy
@@ -5832,56 +6006,56 @@ msgstr ""
msgid "Daemon to announce regular expressions for the peer using cadet."
msgstr ""
-#: src/regex/gnunet-regex-profiler.c:1314
+#: src/regex/gnunet-regex-profiler.c:1386
msgid "No configuration file given. Exiting\n"
msgstr "Keine Konfigurationsdatei angegeben. Abbruch\n"
-#: src/regex/gnunet-regex-profiler.c:1355
+#: src/regex/gnunet-regex-profiler.c:1427
#: src/regex/gnunet-regex-simulation-profiler.c:630
#, c-format
msgid "No policy directory specified on command line. Exiting.\n"
msgstr ""
-#: src/regex/gnunet-regex-profiler.c:1361
+#: src/regex/gnunet-regex-profiler.c:1433
#: src/regex/gnunet-regex-simulation-profiler.c:638
#, c-format
msgid "Specified policies directory does not exist. Exiting.\n"
msgstr ""
-#: src/regex/gnunet-regex-profiler.c:1368
+#: src/regex/gnunet-regex-profiler.c:1440
#, c-format
msgid "No files found in `%s'\n"
msgstr "Keine Dateien in »%s« gefunden\n"
-#: src/regex/gnunet-regex-profiler.c:1377
+#: src/regex/gnunet-regex-profiler.c:1449
msgid "No search strings file given. Exiting.\n"
msgstr ""
-#: src/regex/gnunet-regex-profiler.c:1397
+#: src/regex/gnunet-regex-profiler.c:1469
msgid "Error loading search strings. Exiting.\n"
msgstr ""
-#: src/regex/gnunet-regex-profiler.c:1485
+#: src/regex/gnunet-regex-profiler.c:1557
msgid "name of the file for writing statistics"
msgstr ""
-#: src/regex/gnunet-regex-profiler.c:1491
+#: src/regex/gnunet-regex-profiler.c:1563
msgid "wait TIMEOUT before ending the experiment"
msgstr ""
-#: src/regex/gnunet-regex-profiler.c:1497
+#: src/regex/gnunet-regex-profiler.c:1569
msgid "directory with policy files"
msgstr ""
-#: src/regex/gnunet-regex-profiler.c:1504
+#: src/regex/gnunet-regex-profiler.c:1576
msgid "name of file with input strings"
msgstr ""
-#: src/regex/gnunet-regex-profiler.c:1510
+#: src/regex/gnunet-regex-profiler.c:1582
msgid "name of file with hosts' names"
msgstr ""
-#: src/regex/gnunet-regex-profiler.c:1523
+#: src/regex/gnunet-regex-profiler.c:1595
msgid "Profiler for regex"
msgstr ""
@@ -6110,10 +6284,10 @@ msgstr ""
msgid "Calculate the Vectorproduct with a GNUnet peer."
msgstr ""
-#: src/scalarproduct/gnunet-service-scalarproduct_alice.c:1407
-#: src/scalarproduct/gnunet-service-scalarproduct_bob.c:1345
-#: src/scalarproduct/gnunet-service-scalarproduct-ecc_alice.c:1180
+#: src/scalarproduct/gnunet-service-scalarproduct-ecc_alice.c:1172
#: src/scalarproduct/gnunet-service-scalarproduct-ecc_bob.c:1063
+#: src/scalarproduct/gnunet-service-scalarproduct_alice.c:1401
+#: src/scalarproduct/gnunet-service-scalarproduct_bob.c:1345
#, fuzzy
msgid "Connect to CADET failed\n"
msgstr " Verbindung fehlgeschlagen\n"
@@ -6138,7 +6312,7 @@ msgstr ""
msgid "also profile decryption"
msgstr ""
-#: src/set/gnunet-service-set.c:1948
+#: src/set/gnunet-service-set.c:1989
#, fuzzy
msgid "Could not connect to CADET service\n"
msgstr "Verbindung zum %s-Dienst ist fehlgeschlagen!\n"
@@ -6198,113 +6372,113 @@ msgstr ""
msgid "say good-bye and leave somebody else's place"
msgstr ""
-#: src/social/gnunet-social.c:1227 src/social/gnunet-social.c:1232
+#: src/social/gnunet-social.c:1227
msgid "create a place"
msgstr ""
-#: src/social/gnunet-social.c:1237
+#: src/social/gnunet-social.c:1232
msgid "destroy a place we were hosting"
msgstr ""
-#: src/social/gnunet-social.c:1242
+#: src/social/gnunet-social.c:1237
msgid "enter somebody else's place"
msgstr ""
-#: src/social/gnunet-social.c:1248
+#: src/social/gnunet-social.c:1243
msgid "find state matching name prefix"
msgstr ""
-#: src/social/gnunet-social.c:1253
+#: src/social/gnunet-social.c:1248
msgid "replay history of messages up to the given --limit"
msgstr ""
-#: src/social/gnunet-social.c:1258
+#: src/social/gnunet-social.c:1253
msgid "reconnect to a previously created place"
msgstr ""
-#: src/social/gnunet-social.c:1263
+#: src/social/gnunet-social.c:1258
msgid "publish something to a place we are hosting"
msgstr ""
-#: src/social/gnunet-social.c:1268
+#: src/social/gnunet-social.c:1263
msgid "reconnect to a previously entered place"
msgstr ""
-#: src/social/gnunet-social.c:1273
+#: src/social/gnunet-social.c:1268
msgid "search for state matching exact name"
msgstr ""
-#: src/social/gnunet-social.c:1278
+#: src/social/gnunet-social.c:1273
msgid "submit something to somebody's place"
msgstr ""
-#: src/social/gnunet-social.c:1283
+#: src/social/gnunet-social.c:1278
msgid "list of egos and subscribed places"
msgstr ""
-#: src/social/gnunet-social.c:1288
+#: src/social/gnunet-social.c:1283
msgid "extract and replay history between message IDs --start and --until"
msgstr ""
-#: src/social/gnunet-social.c:1297
+#: src/social/gnunet-social.c:1292
msgid "application ID to use when connecting"
msgstr ""
-#: src/social/gnunet-social.c:1303
+#: src/social/gnunet-social.c:1298
msgid "message body or state value"
msgstr ""
-#: src/social/gnunet-social.c:1309
+#: src/social/gnunet-social.c:1304
#, fuzzy
msgid "name or public key of ego"
msgstr "Ungültiger Parameter: `%s'\n"
-#: src/social/gnunet-social.c:1314
+#: src/social/gnunet-social.c:1309
msgid "wait for incoming messages"
msgstr ""
-#: src/social/gnunet-social.c:1320
+#: src/social/gnunet-social.c:1315
msgid "GNS name"
msgstr ""
-#: src/social/gnunet-social.c:1326
+#: src/social/gnunet-social.c:1321
msgid "peer ID for --guest-enter"
msgstr ""
-#: src/social/gnunet-social.c:1332
+#: src/social/gnunet-social.c:1327
msgid "name (key) to query from state"
msgstr ""
-#: src/social/gnunet-social.c:1338
+#: src/social/gnunet-social.c:1333
msgid "method name"
msgstr ""
-#: src/social/gnunet-social.c:1344
+#: src/social/gnunet-social.c:1339
#, fuzzy
msgid "number of messages to replay from history"
msgstr "Anzahl an Durchläufen"
-#: src/social/gnunet-social.c:1350
+#: src/social/gnunet-social.c:1345
msgid "key address of place"
msgstr ""
-#: src/social/gnunet-social.c:1356
+#: src/social/gnunet-social.c:1351
msgid "start message ID for history replay"
msgstr ""
-#: src/social/gnunet-social.c:1361
+#: src/social/gnunet-social.c:1356
msgid "respond to entry requests by admitting all guests"
msgstr ""
-#: src/social/gnunet-social.c:1367
+#: src/social/gnunet-social.c:1362
msgid "end message ID for history replay"
msgstr ""
-#: src/social/gnunet-social.c:1372
+#: src/social/gnunet-social.c:1367
msgid "respond to entry requests by refusing all guests"
msgstr ""
-#: src/social/gnunet-social.c:1382
+#: src/social/gnunet-social.c:1377
msgid ""
"gnunet-social - Interact with the social service: enter/leave, send/receive "
"messages, access history and state.\n"
@@ -6497,7 +6671,7 @@ msgid ""
msgstr ""
#: src/testbed/gnunet-daemon-testbed-underlay.c:231 src/testing/list-keys.c:46
-#: src/testing/testing.c:288 src/util/gnunet-ecc.c:298
+#: src/testing/testing.c:288 src/util/gnunet-ecc.c:301
#, c-format
msgid "Incorrect hostkey file format: %s\n"
msgstr ""
@@ -6567,6 +6741,17 @@ msgstr ""
msgid "%.s Unknown result code."
msgstr ""
+#: src/testbed/gnunet-testbed-profiler.c:290
+msgid "tolerate COUNT number of continious timeout failures"
+msgstr ""
+
+#: src/testbed/gnunet-testbed-profiler.c:295
+msgid ""
+"run profiler in non-interactive mode where upon testbed setup the profiler "
+"does not wait for a keystroke but continues to run until a termination "
+"signal is received"
+msgstr ""
+
#: src/testbed/gnunet_testbed_mpi_spawn.c:118
#, fuzzy
msgid "Waiting for child to exit.\n"
@@ -6579,17 +6764,6 @@ msgstr ""
msgid "Spawning process `%s'\n"
msgstr "Ungültige Antwort auf `%s'.\n"
-#: src/testbed/gnunet-testbed-profiler.c:290
-msgid "tolerate COUNT number of continious timeout failures"
-msgstr ""
-
-#: src/testbed/gnunet-testbed-profiler.c:295
-msgid ""
-"run profiler in non-interactive mode where upon testbed setup the profiler "
-"does not wait for a keystroke but continues to run until a termination "
-"signal is received"
-msgstr ""
-
#: src/testbed/testbed_api.c:410
#, fuzzy, c-format
msgid "Adding host %u failed with error: %s\n"
@@ -6882,10 +7056,6 @@ msgstr "# HELLO-Meldungen empfangen"
msgid "GNUnet topology control"
msgstr ""
-#: src/transport/gnunet-service-transport_ats.c:141
-msgid "# Addresses given to ATS"
-msgstr ""
-
#: src/transport/gnunet-service-transport.c:448
msgid "# messages dropped due to slow client"
msgstr ""
@@ -6930,6 +7100,10 @@ msgstr ""
msgid "Transport service is lacking key configuration settings. Exiting.\n"
msgstr ""
+#: src/transport/gnunet-service-transport_ats.c:141
+msgid "# Addresses given to ATS"
+msgstr ""
+
#: src/transport/gnunet-service-transport_hello.c:195
msgid "# refreshed my HELLO"
msgstr ""
@@ -7251,6 +7425,43 @@ msgstr ""
msgid "# validations succeeded"
msgstr ""
+#: src/transport/gnunet-transport-profiler.c:219
+#, c-format
+msgid "%llu B in %llu ms == %.2f KB/s!\n"
+msgstr ""
+
+#: src/transport/gnunet-transport-profiler.c:617
+msgid "send data to peer"
+msgstr ""
+
+#: src/transport/gnunet-transport-profiler.c:621
+#, fuzzy
+msgid "receive data from peer"
+msgstr "# Bytes des Typs %d empfangen"
+
+#: src/transport/gnunet-transport-profiler.c:626
+msgid "iterations"
+msgstr ""
+
+#: src/transport/gnunet-transport-profiler.c:631
+#, fuzzy
+msgid "number of messages to send"
+msgstr "Anzahl an Durchläufen"
+
+#: src/transport/gnunet-transport-profiler.c:636
+msgid "message size to use"
+msgstr ""
+
+#: src/transport/gnunet-transport-profiler.c:641
+#: src/transport/gnunet-transport.c:1462
+msgid "peer identity"
+msgstr ""
+
+#: src/transport/gnunet-transport-profiler.c:652
+#: src/transport/gnunet-transport.c:1482
+msgid "Direct access to transport service."
+msgstr "Direkter Zugriff auf den Transportdienst"
+
#: src/transport/gnunet-transport.c:413
#, c-format
msgid "Transmitted %llu bytes/s (%llu bytes in %s)\n"
@@ -7383,11 +7594,6 @@ msgstr ""
msgid "do not resolve hostnames"
msgstr "Keine Rechnernamen auflösen"
-#: src/transport/gnunet-transport.c:1462
-#: src/transport/gnunet-transport-profiler.c:641
-msgid "peer identity"
-msgstr ""
-
#: src/transport/gnunet-transport.c:1466
msgid "monitor plugin sessions"
msgstr ""
@@ -7396,41 +7602,9 @@ msgstr ""
msgid "send data for benchmarking to the other peer (until CTRL-C)"
msgstr ""
-#: src/transport/gnunet-transport.c:1482
-#: src/transport/gnunet-transport-profiler.c:652
-msgid "Direct access to transport service."
-msgstr "Direkter Zugriff auf den Transportdienst"
-
-#: src/transport/gnunet-transport-profiler.c:219
-#, c-format
-msgid "%llu B in %llu ms == %.2f KB/s!\n"
-msgstr ""
-
-#: src/transport/gnunet-transport-profiler.c:617
-msgid "send data to peer"
-msgstr ""
-
-#: src/transport/gnunet-transport-profiler.c:621
-#, fuzzy
-msgid "receive data from peer"
-msgstr "# Bytes des Typs %d empfangen"
-
-#: src/transport/gnunet-transport-profiler.c:626
-msgid "iterations"
-msgstr ""
-
-#: src/transport/gnunet-transport-profiler.c:631
-#, fuzzy
-msgid "number of messages to send"
-msgstr "Anzahl an Durchläufen"
-
-#: src/transport/gnunet-transport-profiler.c:636
-msgid "message size to use"
-msgstr ""
-
#: src/transport/plugin_transport_http_client.c:1474
-#: src/transport/plugin_transport_http_server.c:2249
-#: src/transport/plugin_transport_http_server.c:3463
+#: src/transport/plugin_transport_http_server.c:2312
+#: src/transport/plugin_transport_http_server.c:3526
#: src/transport/plugin_transport_tcp.c:3890
#: src/transport/plugin_transport_tcp.c:3897
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"
msgstr ""
#: src/transport/plugin_transport_http_client.c:2164
-#: src/transport/plugin_transport_http_server.c:3178
+#: src/transport/plugin_transport_http_server.c:3241
#, fuzzy, c-format
msgid "Shutting down plugin `%s'\n"
msgstr "Collection `%s' begonnen.\n"
#: src/transport/plugin_transport_http_client.c:2181
-#: src/transport/plugin_transport_http_server.c:3248
+#: src/transport/plugin_transport_http_server.c:3311
#, fuzzy, c-format
msgid "Shutdown for plugin `%s' complete\n"
msgstr "GNUnet wurde erfolgreich heruntergefahren.\n"
@@ -7458,103 +7632,103 @@ msgstr "GNUnet wurde erfolgreich heruntergefahren.\n"
msgid "Maximum number of requests is %u\n"
msgstr "Maximale Anzahl der Verbindungen ist %u\n"
-#: src/transport/plugin_transport_http_server.c:1727
+#: src/transport/plugin_transport_http_server.c:1756
#, c-format
msgid ""
"Access from connection %p (%u of %u) for `%s' `%s' url `%s' with upload data "
"size %u\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:1967
+#: src/transport/plugin_transport_http_server.c:2028
#, c-format
msgid "Accepting connection (%u of %u) from `%s'\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:1975
+#: src/transport/plugin_transport_http_server.c:2036
#, c-format
msgid ""
"Server reached maximum number connections (%u), rejecting new connection\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:2125
+#: src/transport/plugin_transport_http_server.c:2186
msgid ""
"Could not create a new TLS certificate, program `gnunet-transport-"
"certificate-creation' could not be started!\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:2148
+#: src/transport/plugin_transport_http_server.c:2209
#, c-format
msgid "No usable TLS certificate found and creating one at `%s/%s' failed!\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:2275
+#: src/transport/plugin_transport_http_server.c:2338
msgid "Could not load or create server certificate! Loading plugin failed!\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:2587
+#: src/transport/plugin_transport_http_server.c:2650
msgid "Require valid port number for service in configuration!\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:2752
+#: src/transport/plugin_transport_http_server.c:2815
#, c-format
msgid "Found %u addresses to report to NAT service\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:2838
+#: src/transport/plugin_transport_http_server.c:2901
#: src/transport/plugin_transport_udp.c:3622
msgid "Disabling IPv6 since it is not supported on this system!\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:2944
+#: src/transport/plugin_transport_http_server.c:3007
#, c-format
msgid "IPv4 support is %s\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:2959
+#: src/transport/plugin_transport_http_server.c:3022
#, c-format
msgid "IPv6 support is %s\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:2965
+#: src/transport/plugin_transport_http_server.c:3028
msgid "Neither IPv4 nor IPv6 are enabled! Fix in configuration\n"
msgstr ""
"Weder IPv4 noch IPv6 sind aktiviert! Bearbeiten Sie die Konfiguration\n"
-#: src/transport/plugin_transport_http_server.c:2976
+#: src/transport/plugin_transport_http_server.c:3039
msgid "Port is required! Fix in configuration\n"
msgstr "Port ist erforderlich! Bearbeiten Sie die Konfiguration\n"
-#: src/transport/plugin_transport_http_server.c:2982
+#: src/transport/plugin_transport_http_server.c:3045
#, c-format
msgid "Using port %u\n"
msgstr "Port %u wird verwendet\n"
-#: src/transport/plugin_transport_http_server.c:3001
+#: src/transport/plugin_transport_http_server.c:3064
#, c-format
msgid "Specific IPv4 address `%s' in configuration file is invalid!\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:3036
+#: src/transport/plugin_transport_http_server.c:3099
#, c-format
msgid "Specific IPv6 address `%s' in configuration file is invalid!\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:3111
+#: src/transport/plugin_transport_http_server.c:3174
#, c-format
msgid "Using external hostname `%s'\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:3132
+#: src/transport/plugin_transport_http_server.c:3195
#, fuzzy, c-format
msgid "Notifying transport only about hostname `%s'\n"
msgstr "Teste Transport(e) %s\n"
-#: src/transport/plugin_transport_http_server.c:3149
+#: src/transport/plugin_transport_http_server.c:3212
#, c-format
msgid "Maximum number of connections is %u\n"
msgstr "Maximale Anzahl der Verbindungen ist %u\n"
-#: src/transport/plugin_transport_http_server.c:3475
+#: src/transport/plugin_transport_http_server.c:3538
msgid "Unable to compile URL regex\n"
msgstr ""
@@ -7700,21 +7874,6 @@ msgstr ""
msgid "TCP transport advertises itself as being on port %llu\n"
msgstr ""
-#: src/transport/plugin_transport_udp_broadcasting.c:168
-#, fuzzy
-msgid "# Multicast HELLO beacons received via UDP"
-msgstr "# Bytes empfangen über TCP"
-
-#: src/transport/plugin_transport_udp_broadcasting.c:548
-msgid ""
-"Disabling HELLO broadcasting due to friend-to-friend only configuration!\n"
-msgstr ""
-
-#: src/transport/plugin_transport_udp_broadcasting.c:565
-#, fuzzy, c-format
-msgid "Failed to set IPv4 broadcast option for broadcast socket on port %d\n"
-msgstr "Der Transportdienst auf Port %d konnte nicht gestartet werden.\n"
-
#: src/transport/plugin_transport_udp.c:3366
#, c-format
msgid ""
@@ -7762,6 +7921,21 @@ msgstr "»%s« ist keine gültige IP-Adresse.\n"
msgid "Failed to create UDP network sockets\n"
msgstr "UDP-Sockets können nicht geöffnet werden\n"
+#: src/transport/plugin_transport_udp_broadcasting.c:168
+#, fuzzy
+msgid "# Multicast HELLO beacons received via UDP"
+msgstr "# Bytes empfangen über TCP"
+
+#: src/transport/plugin_transport_udp_broadcasting.c:548
+msgid ""
+"Disabling HELLO broadcasting due to friend-to-friend only configuration!\n"
+msgstr ""
+
+#: src/transport/plugin_transport_udp_broadcasting.c:565
+#, fuzzy, c-format
+msgid "Failed to set IPv4 broadcast option for broadcast socket on port %d\n"
+msgstr "Der Transportdienst auf Port %d konnte nicht gestartet werden.\n"
+
#: src/transport/plugin_transport_unix.c:1403
#, c-format
msgid "Cannot create path to `%s'\n"
@@ -7875,7 +8049,7 @@ msgid ""
"`GNUNET_SERVER_receive_done' after %s\n"
msgstr ""
-#: src/transport/tcp_service_legacy.c:339 src/util/service.c:2337
+#: src/transport/tcp_service_legacy.c:339 src/util/service.c:2336
#, c-format
msgid "Unknown address family %d\n"
msgstr ""
@@ -7920,51 +8094,51 @@ msgstr "Es konnte keine Verbindung mit gnunetd hergestellt werden.\n"
msgid "Service `%s' runs at %s\n"
msgstr "Dienst »%s« läuft auf %s\n"
-#: src/transport/tcp_service_legacy.c:1251 src/util/service.c:1501
+#: src/transport/tcp_service_legacy.c:1251 src/util/service.c:1500
msgid "Service process failed to initialize\n"
msgstr ""
-#: src/transport/tcp_service_legacy.c:1255 src/util/service.c:1505
+#: src/transport/tcp_service_legacy.c:1255 src/util/service.c:1504
msgid "Service process could not initialize server function\n"
msgstr ""
-#: src/transport/tcp_service_legacy.c:1259 src/util/service.c:1509
+#: src/transport/tcp_service_legacy.c:1259 src/util/service.c:1508
msgid "Service process failed to report status\n"
msgstr ""
#: src/transport/tcp_service_legacy.c:1313 src/util/disk.c:1488
-#: src/util/service.c:1379
+#: src/util/service.c:1378
#, fuzzy, c-format
msgid "Cannot obtain information about user `%s': %s\n"
msgstr "Fehler beim Speichern der Konfigurationsdatei: `%s': %s.\n"
-#: src/transport/tcp_service_legacy.c:1314 src/util/service.c:1381
+#: src/transport/tcp_service_legacy.c:1314 src/util/service.c:1380
msgid "No such user"
msgstr ""
-#: src/transport/tcp_service_legacy.c:1327 src/util/service.c:1400
+#: src/transport/tcp_service_legacy.c:1327 src/util/service.c:1399
#, c-format
msgid "Cannot change user/group to `%s': %s\n"
msgstr "Benutzer/Gruppe kann nicht zu »%s« geändert werden: %s\n"
-#: src/transport/tcp_service_legacy.c:1398 src/util/service.c:1728
+#: src/transport/tcp_service_legacy.c:1398 src/util/service.c:1727
msgid "do daemonize (detach from terminal)"
msgstr ""
#: src/transport/tcp_service_legacy.c:1448 src/util/program.c:244
-#: src/util/service.c:1791
+#: src/util/service.c:1790
#, fuzzy, c-format
msgid "Malformed configuration file `%s', exit ...\n"
msgstr "Konfigurationsdatei `%s' wurde erzeugt.\n"
#: src/transport/tcp_service_legacy.c:1458 src/util/program.c:261
-#: src/util/service.c:1802
+#: src/util/service.c:1801
#, fuzzy
msgid "Malformed configuration, exit ...\n"
msgstr "GNUnet Konfiguration"
#: src/transport/tcp_service_legacy.c:1463 src/util/program.c:256
-#: src/util/service.c:1808
+#: src/util/service.c:1807
#, fuzzy, c-format
msgid "Could not access configuration file `%s'\n"
msgstr "Konfigurationsdatei `%s' konnte nicht geparst werden.\n"
@@ -8008,55 +8182,55 @@ msgstr ""
msgid "Need a non-empty hostname for service `%s'.\n"
msgstr ""
-#: src/util/common_logging.c:256 src/util/common_logging.c:1129
+#: src/util/common_logging.c:259 src/util/common_logging.c:1132
msgid "DEBUG"
msgstr "DEBUG"
-#: src/util/common_logging.c:258 src/util/common_logging.c:1127
+#: src/util/common_logging.c:261 src/util/common_logging.c:1130
msgid "INFO"
msgstr "INFO"
-#: src/util/common_logging.c:260 src/util/common_logging.c:1125
+#: src/util/common_logging.c:263 src/util/common_logging.c:1128
msgid "MESSAGE"
msgstr ""
-#: src/util/common_logging.c:262 src/util/common_logging.c:1123
+#: src/util/common_logging.c:265 src/util/common_logging.c:1126
msgid "WARNING"
msgstr "WARNUNG"
-#: src/util/common_logging.c:264 src/util/common_logging.c:1121
+#: src/util/common_logging.c:267 src/util/common_logging.c:1124
msgid "ERROR"
msgstr "FEHLER"
-#: src/util/common_logging.c:266 src/util/common_logging.c:1131
+#: src/util/common_logging.c:269 src/util/common_logging.c:1134
msgid "NONE"
msgstr ""
-#: src/util/common_logging.c:879
+#: src/util/common_logging.c:882
#, c-format
msgid "Message `%.*s' repeated %u times in the last %s\n"
msgstr ""
-#: src/util/common_logging.c:1132
+#: src/util/common_logging.c:1135
msgid "INVALID"
msgstr ""
-#: src/util/common_logging.c:1302
+#: src/util/common_logging.c:1326
msgid "unknown address"
msgstr "Unbekannte Adresse"
-#: src/util/common_logging.c:1344
+#: src/util/common_logging.c:1368
msgid "invalid address"
msgstr "Ungültige Adresse"
-#: src/util/common_logging.c:1362
+#: src/util/common_logging.c:1386
#, fuzzy, c-format
msgid "Configuration fails to specify option `%s' in section `%s'!\n"
msgstr ""
"Die Konfigurationsdatei muss in der Sektion `%s' unter `%s' ein Verzeichnis "
"angeben, in dem FS Daten gespeichert werden.\n"
-#: src/util/common_logging.c:1383
+#: src/util/common_logging.c:1407
#, fuzzy, c-format
msgid ""
"Configuration specifies invalid value for option `%s' in section `%s': %s\n"
@@ -8064,34 +8238,34 @@ msgstr ""
"Die Konfigurationsdatei muss in der Sektion `%s' unter `%s' ein Verzeichnis "
"angeben, in dem FS Daten gespeichert werden.\n"
-#: src/util/configuration.c:286
+#: src/util/configuration.c:296
#, fuzzy, c-format
msgid "Syntax error while deserializing in line %u\n"
msgstr "Syntaxfehler in Konfigurationsdatei `%s' in Zeile %d.\n"
-#: src/util/configuration.c:344
+#: src/util/configuration.c:355
#, fuzzy, c-format
msgid "Error while reading file `%s'\n"
msgstr "Konfigurationsdatei `%s' konnte nicht geöffnet werden.\n"
-#: src/util/configuration.c:1017
+#: src/util/configuration.c:1034
#, c-format
msgid ""
"Configuration value '%s' for '%s' in section '%s' is not in set of legal "
"choices\n"
msgstr ""
-#: src/util/configuration.c:1136
+#: src/util/configuration.c:1153
#, c-format
msgid "Recursive expansion suspected, aborting $-expansion for term `%s'\n"
msgstr ""
-#: src/util/configuration.c:1169
+#: src/util/configuration.c:1186
#, c-format
msgid "Missing closing `%s' in option `%s'\n"
msgstr ""
-#: src/util/configuration.c:1237
+#: src/util/configuration.c:1254
#, c-format
msgid ""
"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"
msgid "EdDSA signature verification failed at %s:%d: %s\n"
msgstr "RSA Signaturüberprüfung fehlgeschlagen bei %s:%d: %s\n"
-#: src/util/crypto_ecc_setup.c:122 src/util/crypto_ecc_setup.c:160
-#: src/util/crypto_ecc_setup.c:278 src/util/crypto_ecc_setup.c:316
+#: src/util/crypto_ecc_setup.c:122 src/util/crypto_ecc_setup.c:161
+#: src/util/crypto_ecc_setup.c:279 src/util/crypto_ecc_setup.c:317
#, fuzzy, c-format
msgid "Could not acquire lock on file `%s': %s...\n"
msgstr "PID konnte nicht in Datei `%s' geschrieben werden: %s.\n"
-#: src/util/crypto_ecc_setup.c:127 src/util/crypto_ecc_setup.c:283
+#: src/util/crypto_ecc_setup.c:128 src/util/crypto_ecc_setup.c:284
#, fuzzy
msgid "Creating a new private key. This may take a while.\n"
msgstr "Ein neuer Hostkey wird erzeugt (dies kann eine Weile dauern).\n"
-#: src/util/crypto_ecc_setup.c:164 src/util/crypto_ecc_setup.c:320
+#: src/util/crypto_ecc_setup.c:165 src/util/crypto_ecc_setup.c:322
msgid "This may be ok if someone is currently generating a private key.\n"
msgstr ""
-#: src/util/crypto_ecc_setup.c:194 src/util/crypto_ecc_setup.c:350
+#: src/util/crypto_ecc_setup.c:195 src/util/crypto_ecc_setup.c:352
#, c-format
msgid ""
"When trying to read key file `%s' I found %u bytes but I need at least %u.\n"
msgstr ""
-#: src/util/crypto_ecc_setup.c:198 src/util/crypto_ecc_setup.c:354
+#: src/util/crypto_ecc_setup.c:199 src/util/crypto_ecc_setup.c:356
msgid "This may be ok if someone is currently generating a key.\n"
msgstr ""
-#: src/util/crypto_ecc_setup.c:413
+#: src/util/crypto_ecc_setup.c:415
#, fuzzy
msgid "Could not load peer's private key\n"
msgstr "Anwendung `%s' konnte nicht initialisiert werden.\n"
@@ -8344,22 +8518,22 @@ msgstr ""
msgid "Manipulate GNUnet configuration files"
msgstr "GNUnet-Konfigurationsdateien bearbeiten"
-#: src/util/gnunet-ecc.c:84
+#: src/util/gnunet-ecc.c:89
#, c-format
msgid "Failed to open `%s': %s\n"
msgstr "»%s« kann nicht geöffnet werden: %s\n"
-#: src/util/gnunet-ecc.c:120
+#: src/util/gnunet-ecc.c:125
#, c-format
msgid "Generating %u keys like %s, please wait"
msgstr ""
-#: src/util/gnunet-ecc.c:133
+#: src/util/gnunet-ecc.c:138
#, c-format
msgid "Generating %u keys, please wait"
msgstr ""
-#: src/util/gnunet-ecc.c:174
+#: src/util/gnunet-ecc.c:179
#, c-format
msgid ""
"\n"
@@ -8368,7 +8542,7 @@ msgstr ""
"\n"
"Schreiben in »%s« nicht möglich: %s\n"
-#: src/util/gnunet-ecc.c:184
+#: src/util/gnunet-ecc.c:189
#, c-format
msgid ""
"\n"
@@ -8377,53 +8551,57 @@ msgstr ""
"\n"
"Abgeschlossen!\n"
-#: src/util/gnunet-ecc.c:187
+#: src/util/gnunet-ecc.c:192
#, c-format
msgid ""
"\n"
"Error, %u keys not generated\n"
msgstr ""
-#: src/util/gnunet-ecc.c:280
+#: src/util/gnunet-ecc.c:283
#, fuzzy, c-format
msgid "Hostkeys file `%s' not found\n"
msgstr "Kommando `%s' wurde nicht gefunden!\n"
-#: src/util/gnunet-ecc.c:291
+#: src/util/gnunet-ecc.c:294
#, c-format
msgid "Hostkeys file `%s' is empty\n"
msgstr ""
-#: src/util/gnunet-ecc.c:313
+#: src/util/gnunet-ecc.c:316
#, fuzzy, c-format
msgid "Could not read hostkey file: %s\n"
msgstr "PID konnte nicht in Datei `%s' geschrieben werden: %s.\n"
-#: src/util/gnunet-ecc.c:364
+#: src/util/gnunet-ecc.c:367
msgid "No hostkey file specified on command line\n"
msgstr ""
-#: src/util/gnunet-ecc.c:416
+#: src/util/gnunet-ecc.c:425
msgid "list keys included in a file (for testing)"
msgstr ""
-#: src/util/gnunet-ecc.c:421
+#: src/util/gnunet-ecc.c:430
msgid "number of keys to list included in a file (for testing)"
msgstr ""
-#: src/util/gnunet-ecc.c:426
+#: src/util/gnunet-ecc.c:435
msgid "create COUNT public-private key pairs (for testing)"
msgstr ""
-#: src/util/gnunet-ecc.c:430
+#: src/util/gnunet-ecc.c:439
msgid "print the public key in ASCII format"
msgstr ""
-#: src/util/gnunet-ecc.c:434
+#: src/util/gnunet-ecc.c:443
+msgid "print the public key in HEX format"
+msgstr ""
+
+#: src/util/gnunet-ecc.c:447
msgid "print examples of ECC operations (used for compatibility testing)"
msgstr ""
-#: src/util/gnunet-ecc.c:449
+#: src/util/gnunet-ecc.c:463
msgid "Manipulate GNUnet private ECC key files"
msgstr ""
@@ -8515,7 +8693,7 @@ msgstr "Verbindung zu %u.%u.%u.%u:%u fehlgeschlagen: %s\n"
msgid "Unable to shorten unix path `%s' while keeping name unique\n"
msgstr ""
-#: src/util/network.c:1793 src/util/network.c:1969
+#: src/util/network.c:1793 src/util/network.c:1977
#, c-format
msgid ""
"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"
msgid "Could not determine plugin installation path.\n"
msgstr "Öffentliche IP-Adresse konnte nicht ermittelt werden.\n"
-#: src/util/resolver_api.c:204
+#: src/util/resolver_api.c:203
#, c-format
msgid ""
"Missing `%s' for `%s' in configuration, DNS resolution will be unavailable.\n"
@@ -8584,33 +8762,33 @@ msgstr ""
"Sie müssen für `%s' in der Sektion `%s' der Konfigurationsdatei eine "
"positive Zahl angeben.\n"
-#: src/util/resolver_api.c:815
+#: src/util/resolver_api.c:826
#, fuzzy, c-format
msgid "Timeout trying to resolve hostname `%s'.\n"
msgstr "Fehler beim Lesen der Freunde-Liste von `%s'\n"
-#: src/util/resolver_api.c:827
+#: src/util/resolver_api.c:839
#, c-format
msgid "Timeout trying to resolve IP address `%s'.\n"
msgstr ""
-#: src/util/resolver_api.c:1004
+#: src/util/resolver_api.c:1023
#, fuzzy
msgid "Resolver not configured correctly.\n"
msgstr "Standarddienst »%s« ist nicht korrekt eingerichtet!\n"
-#: src/util/resolver_api.c:1086 src/util/resolver_api.c:1107
-#: src/util/resolver_api.c:1121
+#: src/util/resolver_api.c:1109 src/util/resolver_api.c:1132
+#: src/util/resolver_api.c:1146
#, fuzzy, c-format
msgid "Could not resolve our FQDN: %s\n"
msgstr "`%s' konnte nicht aufgelöst werden: %s\n"
-#: src/util/service.c:1306
+#: src/util/service.c:1305
msgid ""
"Could not bind to any of the ports I was supposed to, refusing to run!\n"
msgstr ""
-#: src/util/service.c:2082
+#: src/util/service.c:2081
#, c-format
msgid ""
"Processing code for message of type %u did not call "
@@ -8685,63 +8863,63 @@ msgstr "Tage"
msgid "end of time"
msgstr ""
-#: src/util/strings.c:1269
+#: src/util/strings.c:1270
msgid "IPv6 address did not start with `['\n"
msgstr "IPv6-Adresse beginnt nicht mit »[«\n"
-#: src/util/strings.c:1277
+#: src/util/strings.c:1278
msgid "IPv6 address did contain ':' to separate port number\n"
msgstr "IPv6-Adresse enthält kein »:« zur Abtrennung der Portnummer\n"
-#: src/util/strings.c:1283
+#: src/util/strings.c:1284
msgid "IPv6 address did contain ']' before ':' to separate port number\n"
msgstr "IPv6-Adresse enthält kein »]« vor »:« zur Abtrennung der Portnummer\n"
-#: src/util/strings.c:1290
+#: src/util/strings.c:1291
msgid "IPv6 address did contain a valid port number after the last ':'\n"
msgstr "IPv6-Adresse enthält keine gültige Portnummer nach dem letzten »:«\n"
-#: src/util/strings.c:1299
+#: src/util/strings.c:1300
#, fuzzy, c-format
msgid "Invalid IPv6 address `%s': %s\n"
msgstr "Ungültige Antwort auf `%s' von `%s'\n"
-#: src/util/strings.c:1571 src/util/strings.c:1587
+#: src/util/strings.c:1572 src/util/strings.c:1588
msgid "Port not in range\n"
msgstr "Port außerhalb des Bereichs\n"
-#: src/util/strings.c:1596
+#: src/util/strings.c:1597
#, c-format
msgid "Malformed port policy `%s'\n"
msgstr ""
-#: src/util/strings.c:1679 src/util/strings.c:1710 src/util/strings.c:1758
-#: src/util/strings.c:1779
+#: src/util/strings.c:1680 src/util/strings.c:1711 src/util/strings.c:1759
+#: src/util/strings.c:1780
#, c-format
msgid "Invalid format for IP: `%s'\n"
msgstr "Ungültiges Format für IP: »%s«\n"
-#: src/util/strings.c:1736
+#: src/util/strings.c:1737
#, c-format
msgid "Invalid network notation ('/%d' is not legal in IPv4 CIDR)."
msgstr "Ungültige Netzwerk-Notation ('/%d ist nicht gültig in IPv4 CIDR)."
-#: src/util/strings.c:1788
+#: src/util/strings.c:1789
#, fuzzy, c-format
msgid "Invalid format: `%s'\n"
msgstr "Ungültiges Format für IP: `%s'\n"
-#: src/util/strings.c:1840
+#: src/util/strings.c:1841
#, c-format
msgid "Invalid network notation (does not end with ';': `%s')\n"
msgstr "Ungültige Netzwerk-Notation (endet nicht mit »;«: »%s«)\n"
-#: src/util/strings.c:1890
+#: src/util/strings.c:1891
#, fuzzy, c-format
msgid "Wrong format `%s' for netmask\n"
msgstr "Falsches Format `%s' für Netzmaske: %s\n"
-#: src/util/strings.c:1921
+#: src/util/strings.c:1922
#, fuzzy, c-format
msgid "Wrong format `%s' for network\n"
msgstr "Falsches Format `%s' für Netzwerk: %s\n"
@@ -8920,28 +9098,44 @@ msgstr "Dienst wird über UDP angeboten"
msgid "Setup tunnels via VPN."
msgstr "Tunnel über VPN einrichten."
-#: src/zonemaster/gnunet-service-zonemaster.c:705
+#: src/zonemaster/gnunet-service-zonemaster.c:706
#, fuzzy
msgid "Failed to connect to the namestore!\n"
msgstr "Es konnte keine Verbindung mit gnunetd hergestellt werden.\n"
-#: src/include/gnunet_common.h:674 src/include/gnunet_common.h:681
-#: src/include/gnunet_common.h:691 src/include/gnunet_common.h:699
+#: src/include/gnunet_common.h:689 src/include/gnunet_common.h:696
+#: src/include/gnunet_common.h:706 src/include/gnunet_common.h:714
#, fuzzy, c-format
msgid "Assertion failed at %s:%d.\n"
msgstr "`%s' schlug fehl bei %s:%d mit dem Fehler: `%s'.\n"
-#: src/include/gnunet_common.h:711
+#: src/include/gnunet_common.h:726
#, fuzzy, c-format
msgid "External protocol violation detected at %s:%d.\n"
msgstr "Protokollverletzung auf Socket. Kommando erwartet.\n"
-#: src/include/gnunet_common.h:738 src/include/gnunet_common.h:747
+#: src/include/gnunet_common.h:753 src/include/gnunet_common.h:762
#, fuzzy, c-format
msgid "`%s' failed on file `%s' at %s:%d with error: %s\n"
msgstr "`%s' schlug bei Datei `%s' fehl. Ort: %s:%d. Fehler: %s\n"
#, fuzzy
+#~ msgid "Token `%s' is malformed\n"
+#~ msgstr "Schlüssel »%s« ist gültig\n"
+
+#, fuzzy
+#~ msgid "Failed to create indices\n"
+#~ msgstr "Zustellung der Nachricht `%s' fehlgeschlagen.\n"
+
+#, fuzzy
+#~ msgid "`%s:%s' failed at %s:%d with error: %s\n"
+#~ msgstr "`%s' schlug bei %s:%d mit dem Fehler %s fehl\n"
+
+#, fuzzy
+#~ msgid "Unable to connect to Postgres database '%s': %s\n"
+#~ msgstr "Fehler beim Anlegen des Benutzerkontos:"
+
+#, fuzzy
#~ msgid "Misconfiguration (can not connect to the ARM service)"
#~ msgstr ""
#~ "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"
#~ msgstr "Ausführliche Ausgabe"
#, fuzzy
-#~ msgid "Specify the public key of the zone to reverse lookup a name for"
-#~ msgstr "Die Priorität des Inhalts angeben"
-
-#, fuzzy
#~ msgid "# UPDATE requests executed"
#~ msgstr "# dht Anfragen weitergeleitet"
@@ -9054,10 +9244,6 @@ msgstr "`%s' schlug bei Datei `%s' fehl. Ort: %s:%d. Fehler: %s\n"
#~ msgstr "# Klartext PONG Nachrichten empfangen"
#, fuzzy
-#~ msgid "# bytes sent to datastore"
-#~ msgstr "# bytes in der Datenbank"
-
-#, fuzzy
#~ msgid "Failed to receive status response from database."
#~ msgstr ""
#~ "\n"
@@ -9282,10 +9468,6 @@ msgstr "`%s' schlug bei Datei `%s' fehl. Ort: %s:%d. Fehler: %s\n"
#~ msgstr "Fehler beim Senden einer `%s' Anfrage an den SMTP Server.\n"
#, fuzzy
-#~ msgid "Error reading sensor version\n"
-#~ msgstr "Fehler beim Anlegen des Benutzers"
-
-#, fuzzy
#~ msgid "Error reading sensor category\n"
#~ msgstr "Fehler beim Anlegen des Benutzers"
diff --git a/po/es.po b/po/es.po
index 090f097d29..c4ede04a35 100644
--- a/po/es.po
+++ b/po/es.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gnunet 0.9.5a\n"
"Report-Msgid-Bugs-To: gnunet-developers@mail.gnu.org\n"
-"POT-Creation-Date: 2017-03-31 19:22-0500\n"
+"POT-Creation-Date: 2017-10-20 15:14+0000\n"
"PO-Revision-Date: 2013-02-23 17:50+0100\n"
"Last-Translator: Miguel Ángel Arruga Vivas <rosen644835@gmail.com>\n"
"Language-Team: Spanish <es@li.org>\n"
@@ -288,7 +288,7 @@ msgstr ""
"uno es necesario\n"
#: src/arm/gnunet-service-arm.c:513
-#: src/transport/plugin_transport_http_server.c:2621
+#: src/transport/plugin_transport_http_server.c:2684
#: src/transport/plugin_transport_tcp.c:1259
#: src/transport/tcp_service_legacy.c:696 src/util/service.c:782
#, c-format
@@ -296,7 +296,7 @@ msgid "Failed to resolve `%s': %s\n"
msgstr "Se produjo un fallo al resolver «%s»: %s\n"
#: src/arm/gnunet-service-arm.c:532
-#: src/transport/plugin_transport_http_server.c:2639
+#: src/transport/plugin_transport_http_server.c:2702
#: src/transport/plugin_transport_tcp.c:1278
#: src/transport/tcp_service_legacy.c:715 src/util/service.c:802
#, c-format
@@ -376,152 +376,14 @@ msgstr "El servicio «%s» finalizó con estado %s/%d, se reiniciará en %llu ms
msgid "Initiating shutdown as requested by client.\n"
msgstr "Iniciando apagado bajo petición del cliente.\n"
-#: src/ats/gnunet-ats-solver-eval.c:2781 src/ats/gnunet-ats-solver-eval.c:2822
-#, c-format
-msgid ""
-"Could not load quota for network `%s': `%s', assigning default bandwidth "
-"%llu\n"
-msgstr ""
-"No se pudieron cargar las cuotas para la red «%s»: «%s», asignando el ancho "
-"de banda predeterminado %llu\n"
-
-#: src/ats/gnunet-ats-solver-eval.c:2799
-#, c-format
-msgid ""
-"No outbound quota configured for network `%s', assigning default bandwidth "
-"%llu\n"
-msgstr ""
-"No hay configurada una cuota de salida para la red «%s», asignando el ancho "
-"de banda predeterminado %llu\n"
-
-#: src/ats/gnunet-ats-solver-eval.c:2840
-#, c-format
-msgid ""
-"No outbound quota configure for network `%s', assigning default bandwidth "
-"%llu\n"
-msgstr ""
-"No hay configurada una cuota de salida para la red «%s», asignando el ancho "
-"de banda predeterminado %llu\n"
-
-#: src/ats/gnunet-ats-solver-eval.c:3294
-#: src/ats-tests/gnunet-solver-eval.c:939
-#, fuzzy
-msgid "solver to use"
-msgstr "valor a establecer"
-
-#: src/ats/gnunet-ats-solver-eval.c:3299
-#: src/ats-tests/gnunet-solver-eval.c:945
-#: src/ats-tests/gnunet-solver-eval.c:950
-msgid "experiment to use"
-msgstr ""
-
-#: src/ats/gnunet-ats-solver-eval.c:3306
-#, fuzzy
-msgid "print logging"
-msgstr "Iniciando descarga «%s».\n"
-
-#: src/ats/gnunet-ats-solver-eval.c:3311
-msgid "save logging to disk"
-msgstr ""
-
-#: src/ats/gnunet-ats-solver-eval.c:3316
-msgid "disable normalization"
-msgstr ""
-
-#: src/ats/gnunet-service-ats_plugins.c:304
-#, fuzzy, c-format
-msgid ""
-"Could not load %s quota for network `%s': `%s', assigning default bandwidth "
-"%llu\n"
-msgstr ""
-"No se pudieron cargar las cuotas para la red «%s»: «%s», asignando el ancho "
-"de banda predeterminado %llu\n"
-
-# Miguel: "Inbound" lo he traducido como entrada en todo el texto.
-#: src/ats/gnunet-service-ats_plugins.c:314
-#, fuzzy, c-format
-msgid "%s quota configured for network `%s' is %llu\n"
-msgstr "La cuota de entrada configurada para la red «%s» es %llu\n"
-
-#: src/ats/gnunet-service-ats_plugins.c:359
-#, fuzzy, c-format
-msgid ""
-"No %s-quota configured for network `%s', assigning default bandwidth %llu\n"
-msgstr ""
-"No hay configurada una cuota de salida para la red «%s», asignando el ancho "
-"de banda predeterminado %llu\n"
-
-#: src/ats/gnunet-service-ats_plugins.c:451
-#, fuzzy, c-format
-msgid "Failed to initialize solver `%s'!\n"
-msgstr "¡No se puede inicializar el resolvedor!\n"
-
-#: src/ats/plugin_ats_mlp.c:1274
-msgid "Problem size too large, cannot allocate memory!\n"
-msgstr ""
-
-#: src/ats/plugin_ats_mlp.c:1869
-#, fuzzy, c-format
-msgid "Adding address for peer `%s' multiple times\n"
-msgstr "Añadiendo «%s» sin direcciones para el par «%s»\n"
-
-#: src/ats/plugin_ats_mlp.c:1913
-#, fuzzy, c-format
-msgid "Updating address property for peer `%s' %p not added before\n"
-msgstr "Añadiendo «%s» sin direcciones para el par «%s»\n"
-
-#: src/ats/plugin_ats_mlp.c:2475
-msgid ""
-"MLP solver is not optimizing for anything, changing to feasibility check\n"
-msgstr ""
-
-#: src/ats/plugin_ats_mlp.c:2515 src/ats/plugin_ats_mlp.c:2532
-#: src/ats/plugin_ats_mlp.c:2564 src/ats/plugin_ats_mlp.c:2582
-#: src/ats/plugin_ats_mlp.c:2601 src/ats/plugin_ats_proportional.c:1141
-#: src/ats/plugin_ats_ril.c:2612 src/ats/plugin_ats_ril.c:2629
-#: src/ats/plugin_ats_ril.c:2646 src/ats/plugin_ats_ril.c:2663
-#: src/ats/plugin_ats_ril.c:2680 src/ats/plugin_ats_ril.c:2697
-#: src/ats/plugin_ats_ril.c:2714 src/ats/plugin_ats_ril.c:2731
-#, fuzzy, c-format
-msgid "Invalid %s configuration %f \n"
-msgstr "Se produjo un fallo al cargar la configuración de %s\n"
-
-#: src/ats/plugin_ats_mlp.c:2670
-#, fuzzy, c-format
-msgid ""
-"Adjusting inconsistent outbound quota configuration for network `%s', is "
-"%llu must be at least %llu\n"
-msgstr ""
-"No hay configurada una cuota de salida para la red «%s», asignando el ancho "
-"de banda predeterminado %llu\n"
-
-#: src/ats/plugin_ats_mlp.c:2679
-#, fuzzy, c-format
-msgid ""
-"Adjusting inconsistent inbound quota configuration for network `%s', is %llu "
-"must be at least %llu\n"
+#: src/ats-tests/ats-testing-log.c:837
+msgid "Stop logging\n"
msgstr ""
-"No hay configuración de cuota de entrada para la red '%s', asignando el "
-"ancho de banda predeterminado (%llu)\n"
-
-# Miguel: "Outbound" lo he traducido como salida en todo el texto.
-#: src/ats/plugin_ats_mlp.c:2689
-#, fuzzy, c-format
-msgid ""
-"Adjusting outbound quota configuration for network `%s'from %llu to %.0f\n"
-msgstr "La cuota de salida configurada para la red «%s» es %llu\n"
-
-# Miguel: "Outbound" lo he traducido como salida en todo el texto.
-#: src/ats/plugin_ats_mlp.c:2698
-#, fuzzy, c-format
-msgid ""
-"Adjusting inbound quota configuration for network `%s' from %llu to %.0f\n"
-msgstr "La cuota de salida configurada para la red «%s» es %llu\n"
-#: src/ats/plugin_ats_proportional.c:1164
+#: src/ats-tests/ats-testing-log.c:892
#, fuzzy, c-format
-msgid "Invalid %s configuration %f\n"
-msgstr "Se produjo un fallo al cargar la configuración de %s\n"
+msgid "Start logging `%s'\n"
+msgstr "Iniciando descarga «%s».\n"
#: src/ats-tests/ats-testing.c:422
#, c-format
@@ -533,15 +395,6 @@ msgstr ""
msgid "Failed to connect master peer [%u] with slave [%u]\n"
msgstr "Fallo al conectar a gnunetd.\n"
-#: src/ats-tests/ats-testing-log.c:837
-msgid "Stop logging\n"
-msgstr ""
-
-#: src/ats-tests/ats-testing-log.c:892
-#, fuzzy, c-format
-msgid "Start logging `%s'\n"
-msgstr "Iniciando descarga «%s».\n"
-
#: src/ats-tests/gnunet-ats-sim.c:90
#, c-format
msgid ""
@@ -549,6 +402,16 @@ msgid ""
"= %u KiB/s\n"
msgstr ""
+#: src/ats-tests/gnunet-solver-eval.c:939 src/ats/gnunet-ats-solver-eval.c:3294
+#, fuzzy
+msgid "solver to use"
+msgstr "valor a establecer"
+
+#: src/ats-tests/gnunet-solver-eval.c:945
+#: src/ats-tests/gnunet-solver-eval.c:950 src/ats/gnunet-ats-solver-eval.c:3299
+msgid "experiment to use"
+msgstr ""
+
# Miguel: ¿Como podría traducir "resolutions" y "resolve"?
# Son difíciles de no calcar, puesto que no conozco como expresar
# 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)"
msgid "Print information about ATS state"
msgstr "Imprime información acerca del estado del ATS"
+#: src/ats/gnunet-ats-solver-eval.c:2781 src/ats/gnunet-ats-solver-eval.c:2822
+#, c-format
+msgid ""
+"Could not load quota for network `%s': `%s', assigning default bandwidth "
+"%llu\n"
+msgstr ""
+"No se pudieron cargar las cuotas para la red «%s»: «%s», asignando el ancho "
+"de banda predeterminado %llu\n"
+
+#: src/ats/gnunet-ats-solver-eval.c:2799
+#, c-format
+msgid ""
+"No outbound quota configured for network `%s', assigning default bandwidth "
+"%llu\n"
+msgstr ""
+"No hay configurada una cuota de salida para la red «%s», asignando el ancho "
+"de banda predeterminado %llu\n"
+
+#: src/ats/gnunet-ats-solver-eval.c:2840
+#, c-format
+msgid ""
+"No outbound quota configure for network `%s', assigning default bandwidth "
+"%llu\n"
+msgstr ""
+"No hay configurada una cuota de salida para la red «%s», asignando el ancho "
+"de banda predeterminado %llu\n"
+
+#: src/ats/gnunet-ats-solver-eval.c:3306
+#, fuzzy
+msgid "print logging"
+msgstr "Iniciando descarga «%s».\n"
+
+#: src/ats/gnunet-ats-solver-eval.c:3311
+msgid "save logging to disk"
+msgstr ""
+
+#: src/ats/gnunet-ats-solver-eval.c:3316
+msgid "disable normalization"
+msgstr ""
+
+#: src/ats/gnunet-service-ats_plugins.c:304
+#, fuzzy, c-format
+msgid ""
+"Could not load %s quota for network `%s': `%s', assigning default bandwidth "
+"%llu\n"
+msgstr ""
+"No se pudieron cargar las cuotas para la red «%s»: «%s», asignando el ancho "
+"de banda predeterminado %llu\n"
+
+# Miguel: "Inbound" lo he traducido como entrada en todo el texto.
+#: src/ats/gnunet-service-ats_plugins.c:314
+#, fuzzy, c-format
+msgid "%s quota configured for network `%s' is %llu\n"
+msgstr "La cuota de entrada configurada para la red «%s» es %llu\n"
+
+#: src/ats/gnunet-service-ats_plugins.c:359
+#, fuzzy, c-format
+msgid ""
+"No %s-quota configured for network `%s', assigning default bandwidth %llu\n"
+msgstr ""
+"No hay configurada una cuota de salida para la red «%s», asignando el ancho "
+"de banda predeterminado %llu\n"
+
+#: src/ats/gnunet-service-ats_plugins.c:451
+#, fuzzy, c-format
+msgid "Failed to initialize solver `%s'!\n"
+msgstr "¡No se puede inicializar el resolvedor!\n"
+
+#: src/ats/plugin_ats_mlp.c:1274
+msgid "Problem size too large, cannot allocate memory!\n"
+msgstr ""
+
+#: src/ats/plugin_ats_mlp.c:1869
+#, fuzzy, c-format
+msgid "Adding address for peer `%s' multiple times\n"
+msgstr "Añadiendo «%s» sin direcciones para el par «%s»\n"
+
+#: src/ats/plugin_ats_mlp.c:1913
+#, fuzzy, c-format
+msgid "Updating address property for peer `%s' %p not added before\n"
+msgstr "Añadiendo «%s» sin direcciones para el par «%s»\n"
+
+#: src/ats/plugin_ats_mlp.c:2475
+msgid ""
+"MLP solver is not optimizing for anything, changing to feasibility check\n"
+msgstr ""
+
+#: src/ats/plugin_ats_mlp.c:2515 src/ats/plugin_ats_mlp.c:2532
+#: src/ats/plugin_ats_mlp.c:2564 src/ats/plugin_ats_mlp.c:2582
+#: src/ats/plugin_ats_mlp.c:2601 src/ats/plugin_ats_proportional.c:1141
+#: src/ats/plugin_ats_ril.c:2612 src/ats/plugin_ats_ril.c:2629
+#: src/ats/plugin_ats_ril.c:2646 src/ats/plugin_ats_ril.c:2663
+#: src/ats/plugin_ats_ril.c:2680 src/ats/plugin_ats_ril.c:2697
+#: src/ats/plugin_ats_ril.c:2714 src/ats/plugin_ats_ril.c:2731
+#, fuzzy, c-format
+msgid "Invalid %s configuration %f \n"
+msgstr "Se produjo un fallo al cargar la configuración de %s\n"
+
+#: src/ats/plugin_ats_mlp.c:2670
+#, fuzzy, c-format
+msgid ""
+"Adjusting inconsistent outbound quota configuration for network `%s', is "
+"%llu must be at least %llu\n"
+msgstr ""
+"No hay configurada una cuota de salida para la red «%s», asignando el ancho "
+"de banda predeterminado %llu\n"
+
+#: src/ats/plugin_ats_mlp.c:2679
+#, fuzzy, c-format
+msgid ""
+"Adjusting inconsistent inbound quota configuration for network `%s', is %llu "
+"must be at least %llu\n"
+msgstr ""
+"No hay configuración de cuota de entrada para la red '%s', asignando el "
+"ancho de banda predeterminado (%llu)\n"
+
+# Miguel: "Outbound" lo he traducido como salida en todo el texto.
+#: src/ats/plugin_ats_mlp.c:2689
+#, fuzzy, c-format
+msgid ""
+"Adjusting outbound quota configuration for network `%s'from %llu to %.0f\n"
+msgstr "La cuota de salida configurada para la red «%s» es %llu\n"
+
+# Miguel: "Outbound" lo he traducido como salida en todo el texto.
+#: src/ats/plugin_ats_mlp.c:2698
+#, fuzzy, c-format
+msgid ""
+"Adjusting inbound quota configuration for network `%s' from %llu to %.0f\n"
+msgstr "La cuota de salida configurada para la red «%s» es %llu\n"
+
+#: src/ats/plugin_ats_proportional.c:1164
+#, fuzzy, c-format
+msgid "Invalid %s configuration %f\n"
+msgstr "Se produjo un fallo al cargar la configuración de %s\n"
+
#: src/auction/gnunet-auction-create.c:163
msgid "description of the item to be sold"
msgstr ""
@@ -834,6 +832,28 @@ msgid "Connection to conversation service lost, trying to reconnect\n"
msgstr ""
"El cliente se desconectó del servicio principal, tratando de reconectar.\n"
+#: src/conversation/gnunet-conversation-test.c:119
+#, c-format
+msgid ""
+"\n"
+"End of transmission. Have a GNU day.\n"
+msgstr ""
+
+#: src/conversation/gnunet-conversation-test.c:145
+#, c-format
+msgid ""
+"\n"
+"We are now playing your recording back. If you can hear it, your audio "
+"settings are working..."
+msgstr ""
+
+#: src/conversation/gnunet-conversation-test.c:210
+#, c-format
+msgid ""
+"We will now be recording you for %s. After that time, the recording will be "
+"played back to you..."
+msgstr ""
+
#: src/conversation/gnunet-conversation.c:269
#, c-format
msgid "Incoming call from `%s'. Please /accept %u or /cancel %u the call.\n"
@@ -1092,30 +1112,8 @@ msgstr ""
msgid "Enables having a conversation with other GNUnet users."
msgstr ""
-#: src/conversation/gnunet-conversation-test.c:119
-#, c-format
-msgid ""
-"\n"
-"End of transmission. Have a GNU day.\n"
-msgstr ""
-
-#: src/conversation/gnunet-conversation-test.c:145
-#, c-format
-msgid ""
-"\n"
-"We are now playing your recording back. If you can hear it, your audio "
-"settings are working..."
-msgstr ""
-
-#: src/conversation/gnunet-conversation-test.c:210
-#, c-format
-msgid ""
-"We will now be recording you for %s. After that time, the recording will be "
-"played back to you..."
-msgstr ""
-
-#: src/conversation/gnunet_gst.c:622
#: src/conversation/gnunet-helper-audio-playback-gst.c:356
+#: src/conversation/gnunet_gst.c:622
#, c-format
msgid "Read error from STDIN: %d %s\n"
msgstr ""
@@ -1247,6 +1245,11 @@ msgid "Failed to allocate %u bytes for second packet\n"
msgstr ""
"Se produjo un fallo al alojar las direcciones IP para el nuevo destino\n"
+#: src/conversation/gnunet-service-conversation.c:1276
+#, fuzzy, c-format
+msgid "Could not open line, port %s already in use!\n"
+msgstr "¡No se pudo conectar al servicio %s!\n"
+
#: src/conversation/microphone.c:119
#, fuzzy
msgid "Could not start record audio helper\n"
@@ -1534,8 +1537,140 @@ msgstr "# mapas de tipos recibidos"
msgid "# updates to my type map"
msgstr "# actualizaciones de mi mapa de tipos"
+#: src/credential/credential_misc.c:88
+#, fuzzy, c-format
+msgid "Unable to parse CRED record string `%s'\n"
+msgstr "No se pudo procesar la cadena de registro VPN «%s»\n"
+
+#: src/credential/gnunet-credential.c:278 src/namestore/gnunet-namestore.c:776
+#: src/namestore/plugin_rest_namestore.c:1009
+#, fuzzy, c-format
+msgid "Ego `%s' not known to identity service\n"
+msgstr "'%s': servicio desconocido: %s\n"
+
+#: src/credential/gnunet-credential.c:294
+#: src/credential/gnunet-credential.c:446
+#, fuzzy, c-format
+msgid "Issuer public key `%s' is not well-formed\n"
+msgstr "El bloque del tipo %u está mal formado\n"
+
+#: src/credential/gnunet-credential.c:375
+#: src/credential/gnunet-credential.c:435
+#, fuzzy, c-format
+msgid "Issuer public key not well-formed\n"
+msgstr "El bloque del tipo %u está mal formado\n"
+
+#: src/credential/gnunet-credential.c:386
+#: src/credential/gnunet-credential.c:455
+#, fuzzy, c-format
+msgid "Failed to connect to CREDENTIAL\n"
+msgstr "Se produjo un fallo al conectar con GNS\n"
+
+#: src/credential/gnunet-credential.c:392
+#, c-format
+msgid "You must provide issuer the attribute\n"
+msgstr ""
+
+#: src/credential/gnunet-credential.c:399
+#, fuzzy, c-format
+msgid "ego required\n"
+msgstr "Tipo requerido\n"
+
+#: src/credential/gnunet-credential.c:415
+#, c-format
+msgid "Subject public key needed\n"
+msgstr ""
+
+#: src/credential/gnunet-credential.c:426
+#, fuzzy, c-format
+msgid "Subject public key `%s' is not well-formed\n"
+msgstr "El bloque del tipo %u está mal formado\n"
+
+#: src/credential/gnunet-credential.c:461
+#, c-format
+msgid "You must provide issuer and subject attributes\n"
+msgstr ""
+
+#: src/credential/gnunet-credential.c:511
+#, fuzzy, c-format
+msgid "Issuer ego required\n"
+msgstr "Tipo requerido\n"
+
+#: src/credential/gnunet-credential.c:523
+#, c-format
+msgid "Please specify name to lookup, subject key and issuer key!\n"
+msgstr ""
+
+#: src/credential/gnunet-credential.c:543
+msgid "create credential"
+msgstr ""
+
+#: src/credential/gnunet-credential.c:547
+msgid "verify credential against attribute"
+msgstr ""
+
+#: src/credential/gnunet-credential.c:552
+#, fuzzy
+msgid "The public key of the subject to lookup the credential for"
+msgstr "Especificar el tipo del registro a buscar"
+
+#: src/credential/gnunet-credential.c:557
+msgid "The name of the credential presented by the subject"
+msgstr ""
+
+#: src/credential/gnunet-credential.c:562
+#, fuzzy
+msgid "The public key of the authority to verify the credential against"
+msgstr "Especificar el tipo del registro a buscar"
+
+#: src/credential/gnunet-credential.c:567
+#, fuzzy
+msgid "The ego to use"
+msgstr "tamaño del mensaje"
+
+#: src/credential/gnunet-credential.c:572
+msgid "The issuer attribute to verify against or to issue"
+msgstr ""
+
+#: src/credential/gnunet-credential.c:577
+msgid "The time to live for the credential"
+msgstr ""
+
+#: src/credential/gnunet-credential.c:581
+msgid "collect credentials"
+msgstr ""
+
+#: src/credential/gnunet-credential.c:595
+#, fuzzy
+msgid "GNUnet credential resolver tool"
+msgstr "Herramienta de acceso GNUnet GNS"
+
+#: src/credential/gnunet-service-credential.c:1204
+#: src/gns/gnunet-gns-helper-service-w32.c:727 src/gns/gnunet-gns.c:355
+#, c-format
+msgid "Failed to connect to GNS\n"
+msgstr "Se produjo un fallo al conectar con GNS\n"
+
+#: src/credential/gnunet-service-credential.c:1210
+#: src/namestore/gnunet-namestore-fcfsd.c:1034
+#: src/namestore/gnunet-namestore.c:802
+#: src/namestore/plugin_rest_namestore.c:1022
+#, c-format
+msgid "Failed to connect to namestore\n"
+msgstr "Se produjo un fallo al conectar con el almacén de nombres\n"
+
+#: src/credential/plugin_gnsrecord_credential.c:186
+#, fuzzy, c-format
+msgid "Unable to parse ATTR record string `%s'\n"
+msgstr "No se pudo procesar la cadena de registro TLSA «%s»\n"
+
+#: src/credential/plugin_rest_credential.c:1155 src/gns/plugin_rest_gns.c:668
+#, fuzzy
+msgid "GNS REST API initialized\n"
+msgstr "Conexión fallida\n"
+
#: src/datacache/datacache.c:119 src/datacache/datacache.c:294
-#: src/datastore/gnunet-service-datastore.c:775
+#: src/datastore/gnunet-service-datastore.c:757
msgid "# bytes stored"
msgstr "# bytes almacenados"
@@ -1578,13 +1713,12 @@ msgstr "Caché de datos de montículo (heap) ejecutándose\n"
#: src/datacache/plugin_datacache_sqlite.c:113
#: src/datacache/plugin_datacache_sqlite.c:122
-#: src/datastore/plugin_datastore_mysql.c:980
+#: src/datastore/plugin_datastore_mysql.c:892
#: src/datastore/plugin_datastore_sqlite.c:58
-#: src/datastore/plugin_datastore_sqlite.c:66 src/my/my.c:80 src/my/my.c:92
-#: src/mysql/mysql.c:42 src/mysql/mysql.c:49
-#: src/namecache/plugin_namecache_postgres.c:53
+#: src/datastore/plugin_datastore_sqlite.c:66
+#: src/identity-provider/plugin_identity_provider_sqlite.c:52 src/my/my.c:80
+#: src/my/my.c:92 src/mysql/mysql.c:42 src/mysql/mysql.c:49
#: src/namecache/plugin_namecache_sqlite.c:53
-#: src/namestore/plugin_namestore_postgres.c:53
#: src/namestore/plugin_namestore_sqlite.c:53
#: src/peerstore/plugin_peerstore_sqlite.c:52
#: src/psycstore/plugin_psycstore_mysql.c:62
@@ -1593,14 +1727,15 @@ msgstr "Caché de datos de montículo (heap) ejecutándose\n"
#: src/testbed/gnunet-daemon-testbed-underlay.c:56
#: src/testbed/testbed_api_hosts.c:69 src/util/crypto_ecc.c:52
#: src/util/crypto_ecc_setup.c:41 src/util/crypto_mpi.c:39
-#: src/include/gnunet_common.h:720 src/include/gnunet_common.h:729
+#: src/include/gnunet_common.h:735 src/include/gnunet_common.h:744
#: src/scalarproduct/scalarproduct.h:35
#, c-format
msgid "`%s' failed at %s:%d with error: %s\n"
msgstr "«%s» falló en %s: %d con el error: %s\n"
#: src/datacache/plugin_datacache_sqlite.c:817
-#: src/datastore/plugin_datastore_sqlite.c:475
+#: src/datastore/plugin_datastore_sqlite.c:456
+#: src/identity-provider/plugin_identity_provider_sqlite.c:336
#: src/namecache/plugin_namecache_sqlite.c:296
#: src/namestore/plugin_namestore_sqlite.c:355
msgid "Tried to close sqlite without finalizing all prepared statements.\n"
@@ -1665,23 +1800,75 @@ msgstr "# peticiones «GET ZERO ANONYMITY» ejecutadas"
msgid "# GET requests executed"
msgstr "# peticiones «GET» ejecutadas"
-#: src/datastore/gnunet-datastore.c:113
+#: src/datastore/gnunet-datastore.c:189
+#, c-format
+msgid "Dumped %<PRIu64> records\n"
+msgstr ""
+
+#: src/datastore/gnunet-datastore.c:217 src/datastore/gnunet-datastore.c:229
+#, c-format
+msgid "Short write to file: %zd bytes expecting %zd\n"
+msgstr ""
+
+#: src/datastore/gnunet-datastore.c:261
+#, fuzzy
+msgid "Error queueing datastore GET operation\n"
+msgstr "Error leyendo «%s»: %s"
+
+#: src/datastore/gnunet-datastore.c:287 src/datastore/gnunet-datastore.c:412
+#, fuzzy, c-format
+msgid "Unable to open dump file: %s\n"
+msgstr "Se produjo un fallo al crear los índices\n"
+
+#: src/datastore/gnunet-datastore.c:326
#, fuzzy, c-format
msgid "Failed to store item: %s, aborting\n"
msgstr "Se produjo un fallo al abrir «%s» para escritura"
-#: src/datastore/gnunet-datastore.c:209
+#: src/datastore/gnunet-datastore.c:340
+#, fuzzy, c-format
+msgid "Inserted %<PRIu64> records\n"
+msgstr "establece registros de clase A"
+
+#: src/datastore/gnunet-datastore.c:349 src/datastore/gnunet-datastore.c:363
#, c-format
-msgid "Cannot use the same configuration for source and destination\n"
+msgid "Short read from file: %zd bytes expecting %zd\n"
msgstr ""
-#: src/datastore/gnunet-datastore.c:256
-msgid ""
-"specifies the configuration to use to access an alternative datastore; will "
-"merge that datastore into our current datastore"
+#: src/datastore/gnunet-datastore.c:389
+#, fuzzy
+msgid "Error queueing datastore PUT operation\n"
+msgstr "Error leyendo «%s»: %s"
+
+#: src/datastore/gnunet-datastore.c:432
+msgid "Input file is not of a supported format\n"
msgstr ""
-#: src/datastore/gnunet-datastore.c:265
+#: src/datastore/gnunet-datastore.c:458
+#, fuzzy
+msgid "Failed connecting to the datastore.\n"
+msgstr "Se produjo un fallo al conectar con el almacén de datos."
+
+#: src/datastore/gnunet-datastore.c:470
+#, fuzzy, c-format
+msgid "Please choose at least one operation: %s, %s\n"
+msgstr "Por favor, seleccione una operación: %s o %s o %s o %s o %s\n"
+
+#: src/datastore/gnunet-datastore.c:493
+#, fuzzy
+msgid "Dump all records from the datastore"
+msgstr "Buscar el registro para el nombre dado"
+
+#: src/datastore/gnunet-datastore.c:497
+#, fuzzy
+msgid "Insert records into the datastore"
+msgstr "# bytes mandados al almacén de datos"
+
+#: src/datastore/gnunet-datastore.c:502
+msgid "File to dump or insert"
+msgstr ""
+
+#: src/datastore/gnunet-datastore.c:511
#, fuzzy
msgid "Manipulate GNUnet datastore"
msgstr "Manipular ficheros de configuración de GNUnet"
@@ -1730,8 +1917,8 @@ msgstr "Espacio insuficiente para satisfacer la petición"
#: src/datastore/gnunet-service-datastore.c:634
#: src/datastore/gnunet-service-datastore.c:689
-#: src/datastore/gnunet-service-datastore.c:977
-#: src/datastore/gnunet-service-datastore.c:1633
+#: src/datastore/gnunet-service-datastore.c:837
+#: src/datastore/gnunet-service-datastore.c:1469
msgid "# reserved"
msgstr "# reservado"
@@ -1739,47 +1926,47 @@ msgstr "# reservado"
msgid "Could not find matching reservation"
msgstr "No se pudo encontrar una reserva coincidente"
-#: src/datastore/gnunet-service-datastore.c:792
+#: src/datastore/gnunet-service-datastore.c:773
#, c-format
msgid "Need %llu bytes more space (%llu allowed, using %llu)\n"
msgstr ""
"Se necesitan %llu bytes más de espacio (%llu permitidos, usando %llu)\n"
-#: src/datastore/gnunet-service-datastore.c:1026
+#: src/datastore/gnunet-service-datastore.c:876
msgid "# GET requests received"
msgstr "# peticiones «GET» recibidas"
-#: src/datastore/gnunet-service-datastore.c:1058
+#: src/datastore/gnunet-service-datastore.c:907
#, fuzzy
msgid "# GET KEY requests received"
msgstr "# peticiones «GET» recibidas"
-#: src/datastore/gnunet-service-datastore.c:1071
+#: src/datastore/gnunet-service-datastore.c:920
msgid "# requests filtered by bloomfilter"
msgstr "# peticiones filtradas por el «bloomfilter»"
-#: src/datastore/gnunet-service-datastore.c:1108
+#: src/datastore/gnunet-service-datastore.c:956
msgid "# GET REPLICATION requests received"
msgstr "# peticiones «GET REPLICATION» recibidas"
-#: src/datastore/gnunet-service-datastore.c:1141
+#: src/datastore/gnunet-service-datastore.c:989
msgid "# GET ZERO ANONYMITY requests received"
msgstr "# peticiones «GET ZERO ANONYMITY» recibidas"
-#: src/datastore/gnunet-service-datastore.c:1190
+#: src/datastore/gnunet-service-datastore.c:1036
msgid "Content not found"
msgstr "Contenido no encontrado"
-#: src/datastore/gnunet-service-datastore.c:1199
+#: src/datastore/gnunet-service-datastore.c:1043
msgid "# bytes removed (explicit request)"
msgstr "# bytes eliminados (petición explícita)"
-#: src/datastore/gnunet-service-datastore.c:1246
+#: src/datastore/gnunet-service-datastore.c:1088
msgid "# REMOVE requests received"
msgstr "# peticiones «REMOVE» recibidas"
# Miguel: ¿Cómo traducir «payload»? ¿Código cargado?
-#: src/datastore/gnunet-service-datastore.c:1301
+#: src/datastore/gnunet-service-datastore.c:1137
#, fuzzy, c-format
msgid ""
"Datastore payload must have been inaccurate (%lld < %lld). Recomputing it.\n"
@@ -1787,102 +1974,103 @@ msgstr ""
"El «payload» del almacén de datos es impreciso (%lld < %lld). Intentando "
"repararlo.\n"
-#: src/datastore/gnunet-service-datastore.c:1307
-#: src/datastore/gnunet-service-datastore.c:1482
+#: src/datastore/gnunet-service-datastore.c:1143
+#: src/datastore/gnunet-service-datastore.c:1318
#, c-format
msgid "New payload: %lld\n"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1361
+#: src/datastore/gnunet-service-datastore.c:1197
#, c-format
msgid "Loading `%s' datastore plugin\n"
msgstr "Cargando el módulo del almacén de datos «%s»\n"
-#: src/datastore/gnunet-service-datastore.c:1373
+#: src/datastore/gnunet-service-datastore.c:1209
#, c-format
msgid "Failed to load datastore plugin for `%s'\n"
msgstr ""
"Se produjo un fallo al inicializar el módulo del almacén de datos para «%s»\n"
-#: src/datastore/gnunet-service-datastore.c:1433
+#: src/datastore/gnunet-service-datastore.c:1269
msgid "Bloomfilter construction complete.\n"
msgstr "Construcción de «bloomfilter» completa.\n"
-#: src/datastore/gnunet-service-datastore.c:1489
+#: src/datastore/gnunet-service-datastore.c:1325
msgid "Rebuilding bloomfilter. Please be patient.\n"
msgstr "Reconstruyendo «bloomfilter». Por favor, tenga paciencia.\n"
-#: src/datastore/gnunet-service-datastore.c:1500
+#: src/datastore/gnunet-service-datastore.c:1336
msgid "Plugin does not support get_keys function. Please fix!\n"
msgstr "El módulo no soporta la función «get_keys». Por favor, corríjalo.\n"
-#: src/datastore/gnunet-service-datastore.c:1670
+#: src/datastore/gnunet-service-datastore.c:1506
#, c-format
msgid "# bytes used in file-sharing datastore `%s'"
msgstr "# bytes usados en el almacén de ficheros compartidos «%s»"
-#: src/datastore/gnunet-service-datastore.c:1686
+#: src/datastore/gnunet-service-datastore.c:1522
msgid "# quota"
msgstr "# cuota"
-#: src/datastore/gnunet-service-datastore.c:1691
+#: src/datastore/gnunet-service-datastore.c:1527
msgid "# cache size"
msgstr "# tamaño de la caché"
-#: src/datastore/gnunet-service-datastore.c:1707
+#: src/datastore/gnunet-service-datastore.c:1543
#, c-format
msgid "Could not use specified filename `%s' for bloomfilter.\n"
msgstr ""
"No se pudo usar el nombre de fichero especificado «%s» para «bloomfilter».\n"
-#: src/datastore/gnunet-service-datastore.c:1725
-#: src/datastore/gnunet-service-datastore.c:1741
+#: src/datastore/gnunet-service-datastore.c:1561
+#: src/datastore/gnunet-service-datastore.c:1577
#, c-format
msgid "Failed to remove bogus bloomfilter file `%s'\n"
msgstr ""
"Se produjo un fallo al borrar el fichero de configuración defectuoso de "
"«bloomfilter» «%s»:\n"
-#: src/datastore/gnunet-service-datastore.c:1773
+#: src/datastore/gnunet-service-datastore.c:1609
msgid "Failed to initialize bloomfilter.\n"
msgstr "Se produjo un fallo al inicializar «bloomfilter».\n"
-#: src/datastore/plugin_datastore_heap.c:769
+#: src/datastore/plugin_datastore_heap.c:893
msgid "Heap database running\n"
msgstr "Base de datos de montículo ejecutándose\n"
-#: src/datastore/plugin_datastore_mysql.c:377
-#: src/datastore/plugin_datastore_sqlite.c:590
+#: src/datastore/plugin_datastore_mysql.c:371
+#: src/datastore/plugin_datastore_mysql.c:423
+#: src/datastore/plugin_datastore_mysql.c:1075
+msgid "MySQL statement run failure"
+msgstr ""
+
+#: src/datastore/plugin_datastore_mysql.c:410
+#: src/datastore/plugin_datastore_sqlite.c:626
#, fuzzy
msgid "Data too large"
msgstr "número de valores"
-#: src/datastore/plugin_datastore_mysql.c:393
-msgid "MySQL statement run failure"
-msgstr ""
-
-#: src/datastore/plugin_datastore_mysql.c:936
+#: src/datastore/plugin_datastore_mysql.c:848
#, c-format
msgid "`%s' for `%s' failed at %s:%d with error: %s\n"
msgstr "«%s» para «%s» falló en %s: %d con error: %s\n"
-#: src/datastore/plugin_datastore_mysql.c:1208
+#: src/datastore/plugin_datastore_mysql.c:1180
#: src/psycstore/plugin_psycstore_mysql.c:1936
msgid "Mysql database running\n"
msgstr "Base de datos Mysql ejecutándose\n"
-#: src/datastore/plugin_datastore_postgres.c:345
+#: src/datastore/plugin_datastore_postgres.c:274
+#: src/datastore/plugin_datastore_postgres.c:891
msgid "Postgress exec failure"
msgstr ""
-#: src/datastore/plugin_datastore_postgres.c:866
+#: src/datastore/plugin_datastore_postgres.c:852
msgid "Failed to drop table from database.\n"
msgstr "Se produjo un fallo al borrar una tabla de la base de datos.\n"
-#: src/datastore/plugin_datastore_postgres.c:903
-#: src/namecache/plugin_namecache_postgres.c:398
-#: src/namestore/plugin_namestore_postgres.c:571
-#: src/psycstore/plugin_psycstore_postgres.c:1721
+#: src/datastore/plugin_datastore_postgres.c:950
+#: src/psycstore/plugin_psycstore_postgres.c:1506
msgid "Postgres database running\n"
msgstr "Base de datos Postgres ejecutándose\n"
@@ -1894,7 +2082,8 @@ msgstr "Base de datos Postgres ejecutándose\n"
msgid "`%s' failed at %s:%u with error: %s"
msgstr "«%s» falló en %s:%u con el error: %s"
-#: src/datastore/plugin_datastore_sqlite.c:281
+#: src/datastore/plugin_datastore_sqlite.c:271
+#: src/identity-provider/plugin_identity_provider_sqlite.c:212
#: src/namecache/plugin_namecache_sqlite.c:194
#: src/namestore/plugin_namestore_sqlite.c:222
#: src/peerstore/plugin_peerstore_sqlite.c:535
@@ -1903,14 +2092,18 @@ msgstr "«%s» falló en %s:%u con el error: %s"
msgid "Unable to initialize SQLite: %s.\n"
msgstr "Imposible inicializar SQLite: %s.\n"
+#: src/datastore/plugin_datastore_sqlite.c:577
+msgid "sqlite bind failure"
+msgstr ""
+
# to should be too, i think
-#: src/datastore/plugin_datastore_sqlite.c:1234
+#: src/datastore/plugin_datastore_sqlite.c:1259
msgid "sqlite version to old to determine size, assuming zero\n"
msgstr ""
"la versión de sqlite es muy antigua para determinar el tamaño, se asume "
"cero\n"
-#: src/datastore/plugin_datastore_sqlite.c:1268
+#: src/datastore/plugin_datastore_sqlite.c:1293
#, c-format
msgid ""
"Using sqlite page utilization to estimate payload (%llu pages of size %llu "
@@ -1919,13 +2112,14 @@ msgstr ""
"Usando la utilización de páginas de sqlite para estimar el «payload» (%llu "
"páginas de %llu bytes de tamaño)\n"
-#: src/datastore/plugin_datastore_sqlite.c:1312
+#: src/datastore/plugin_datastore_sqlite.c:1337
+#: src/identity-provider/plugin_identity_provider_sqlite.c:711
#: src/namecache/plugin_namecache_sqlite.c:603
#: src/namestore/plugin_namestore_sqlite.c:802
msgid "Sqlite database running\n"
msgstr "Base de datos sqlite ejecutándose\n"
-#: src/datastore/plugin_datastore_template.c:259
+#: src/datastore/plugin_datastore_template.c:253
msgid "Template database running\n"
msgstr "Base de datos de plantilla ejecutándose\n"
@@ -1989,54 +2183,6 @@ msgstr "ser prolijo (imprime información de progreso)"
msgid "Prints all packets that go through the DHT."
msgstr "Imprime todos los paquetes que pasan por la DHT."
-#: src/dht/gnunet_dht_profiler.c:1161
-#: src/testbed/gnunet-testbed-profiler.c:255
-#, fuzzy, c-format
-msgid "Exiting as the number of peers is %u\n"
-msgstr "El número máximo de conexiones es %u\n"
-
-#: src/dht/gnunet_dht_profiler.c:1188
-msgid "number of peers to start"
-msgstr "número de pares para empezar"
-
-#: src/dht/gnunet_dht_profiler.c:1194
-msgid ""
-"maximum number of times we try to search for successor circle formation (0 "
-"for R5N)"
-msgstr ""
-
-#: src/dht/gnunet_dht_profiler.c:1200 src/nse/gnunet-nse-profiler.c:853
-#: src/testbed/gnunet-testbed-profiler.c:305
-msgid "name of the file with the login information for the testbed"
-msgstr ""
-"nombre del fichero con la información de acceso usada para la batería de "
-"pruebas"
-
-#: src/dht/gnunet_dht_profiler.c:1206
-msgid "delay between rounds for collecting statistics (default: 30 sec)"
-msgstr ""
-
-#: src/dht/gnunet_dht_profiler.c:1212
-msgid "delay to start doing PUTs (default: 1 sec)"
-msgstr ""
-
-#: src/dht/gnunet_dht_profiler.c:1218
-msgid "delay to start doing GETs (default: 5 min)"
-msgstr ""
-
-#: src/dht/gnunet_dht_profiler.c:1223
-msgid "replication degree for DHT PUTs"
-msgstr ""
-
-#: src/dht/gnunet_dht_profiler.c:1230
-msgid "timeout for DHT PUT and GET requests (default: 1 min)"
-msgstr ""
-
-#: src/dht/gnunet_dht_profiler.c:1248
-#, fuzzy
-msgid "Measure quality and performance of the DHT service."
-msgstr "Medir la calidad y rendimiento del servicio NSE."
-
#: src/dht/gnunet-dht-put.c:120
msgid "PUT request sent with key"
msgstr "Petición «PUT» enviada con clave"
@@ -2303,6 +2449,53 @@ msgstr "# Entradas añadidas a la tabla de encaminamiento"
msgid "# DHT requests combined"
msgstr "# Peticiones a la DHT combinadas"
+#: src/dht/gnunet_dht_profiler.c:1161 src/testbed/gnunet-testbed-profiler.c:255
+#, fuzzy, c-format
+msgid "Exiting as the number of peers is %u\n"
+msgstr "El número máximo de conexiones es %u\n"
+
+#: src/dht/gnunet_dht_profiler.c:1188
+msgid "number of peers to start"
+msgstr "número de pares para empezar"
+
+#: src/dht/gnunet_dht_profiler.c:1194
+msgid ""
+"maximum number of times we try to search for successor circle formation (0 "
+"for R5N)"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:1200 src/nse/gnunet-nse-profiler.c:853
+#: src/testbed/gnunet-testbed-profiler.c:305
+msgid "name of the file with the login information for the testbed"
+msgstr ""
+"nombre del fichero con la información de acceso usada para la batería de "
+"pruebas"
+
+#: src/dht/gnunet_dht_profiler.c:1206
+msgid "delay between rounds for collecting statistics (default: 30 sec)"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:1212
+msgid "delay to start doing PUTs (default: 1 sec)"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:1218
+msgid "delay to start doing GETs (default: 5 min)"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:1223
+msgid "replication degree for DHT PUTs"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:1230
+msgid "timeout for DHT PUT and GET requests (default: 1 min)"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:1248
+#, fuzzy
+msgid "Measure quality and performance of the DHT service."
+msgstr "Medir la calidad y rendimiento del servicio NSE."
+
#: src/dht/plugin_block_dht.c:187
#, c-format
msgid "Block not of type %u\n"
@@ -2646,7 +2839,7 @@ msgstr "«%s» debe ser instalado con SUID, se niega a arrancar\n"
msgid "No useful service enabled. Exiting.\n"
msgstr "Ningún servicio útil habilitado. Saliendo.\n"
-#: src/exit/gnunet-daemon-exit.c:3969
+#: src/exit/gnunet-daemon-exit.c:3970
msgid "Daemon to run to provide an IP exit node for the VPN"
msgstr "Demonio a ejecutar para obtener un nodo de salida IP para la VPN"
@@ -3325,14 +3518,6 @@ msgstr ""
"Descargar ficheros de GNUnet usando una URI GNUnet CHK o LOC (gnunet://fs/"
"chk/...)"
-#: src/fs/gnunet-fs.c:119
-msgid "print a list of all indexed files"
-msgstr "imprimir una lista de todos los ficheros indexados"
-
-#: src/fs/gnunet-fs.c:130
-msgid "Special file-sharing operations"
-msgstr "Operaciones especiales de compartición de ficheros"
-
#: src/fs/gnunet-fs-profiler.c:211
msgid "run the experiment with COUNT peers"
msgstr "ejecuta el experimento con «COUNT» pares"
@@ -3353,6 +3538,14 @@ msgstr ""
"ejecuta una batería de pruebas para medir el rendimiento de la compartición "
"de ficheros"
+#: src/fs/gnunet-fs.c:119
+msgid "print a list of all indexed files"
+msgstr "imprimir una lista de todos los ficheros indexados"
+
+#: src/fs/gnunet-fs.c:130
+msgid "Special file-sharing operations"
+msgstr "Operaciones especiales de compartición de ficheros"
+
#: src/fs/gnunet-publish.c:219 src/fs/gnunet-publish.c:231
#, c-format
msgid "Publishing `%s' at %llu/%llu (%s remaining)\n"
@@ -4049,22 +4242,11 @@ msgstr ""
msgid "GNUnet DNS-to-GNS proxy (a DNS server)"
msgstr "Pasarela GNUnet DNS-a-GNS (un servidor DNS)"
-#: src/gns/gnunet-gns.c:235 src/gns/plugin_rest_gns.c:346
-#, c-format
-msgid "Invalid typename specified, assuming `ANY'\n"
-msgstr ""
-
-#: src/gns/gnunet-gns.c:252
-#, c-format
-msgid "Please specify name to lookup!\n"
-msgstr ""
-
-#: src/gns/gnunet-gns.c:276
-#, c-format
-msgid "Ego for `%s' not found, cannot perform lookup.\n"
+#: src/gns/gnunet-gns-helper-service-w32.c:602
+msgid "Not ready to process requests, lacking ego data\n"
msgstr ""
-#: src/gns/gnunet-gns.c:315 src/gns/gnunet-gns-helper-service-w32.c:701
+#: src/gns/gnunet-gns-helper-service-w32.c:701 src/gns/gnunet-gns.c:315
#: src/gns/plugin_rest_gns.c:422
#, c-format
msgid ""
@@ -4072,58 +4254,12 @@ msgid ""
"gns-import.sh?\n"
msgstr ""
-#: src/gns/gnunet-gns.c:355 src/gns/gnunet-gns-helper-service-w32.c:727
-#, c-format
-msgid "Failed to connect to GNS\n"
-msgstr "Se produjo un fallo al conectar con GNS\n"
-
-#: src/gns/gnunet-gns.c:374
-#, c-format
-msgid "Public key `%s' is not well-formed\n"
-msgstr ""
-
-#: src/gns/gnunet-gns.c:428
-msgid "Lookup a record for the given name"
-msgstr "Buscar el registro para el nombre dado"
-
-#: src/gns/gnunet-gns.c:434
-msgid "Specify the type of the record to lookup"
-msgstr "Especificar el tipo del registro a buscar"
-
-#: src/gns/gnunet-gns.c:440
-#, fuzzy
-msgid "Specify timeout for the lookup"
-msgstr "Especificar el tipo del registro a buscar"
-
-#: src/gns/gnunet-gns.c:445
-msgid "No unneeded output"
-msgstr "Sin salida innecesaria"
-
-#: src/gns/gnunet-gns.c:451
-#, fuzzy
-msgid "Specify the public key of the zone to lookup the record in"
-msgstr "Especificar el tipo del registro a buscar"
-
-#: src/gns/gnunet-gns.c:457
-#, fuzzy
-msgid "Specify the name of the ego of the zone to lookup the record in"
-msgstr "Especificar el tipo del registro a buscar"
-
-#: src/gns/gnunet-gns.c:476
-#, fuzzy
-msgid "GNUnet GNS resolver tool"
-msgstr "Herramienta de acceso GNUnet GNS"
-
-#: src/gns/gnunet-gns-helper-service-w32.c:602
-msgid "Not ready to process requests, lacking ego data\n"
-msgstr ""
-
#: src/gns/gnunet-gns-helper-service-w32.c:739
#, fuzzy, c-format
msgid "Failed to connect to identity service\n"
msgstr "Fallo al conectar a gnunetd.\n"
-#: src/gns/gnunet-gns-import.c:489
+#: src/gns/gnunet-gns-import.c:452
msgid "This program will import some GNS authorities into your GNS namestore."
msgstr ""
@@ -4249,13 +4385,65 @@ msgstr "fichero pem para usar como autoridad de certificación (CA)"
msgid "GNUnet GNS proxy"
msgstr "Proxy GNUnet GNS"
+#: src/gns/gnunet-gns.c:235 src/gns/plugin_rest_gns.c:346
+#, c-format
+msgid "Invalid typename specified, assuming `ANY'\n"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:252
+#, c-format
+msgid "Please specify name to lookup!\n"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:276
+#, c-format
+msgid "Ego for `%s' not found, cannot perform lookup.\n"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:374
+#, c-format
+msgid "Public key `%s' is not well-formed\n"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:428
+msgid "Lookup a record for the given name"
+msgstr "Buscar el registro para el nombre dado"
+
+#: src/gns/gnunet-gns.c:434
+msgid "Specify the type of the record to lookup"
+msgstr "Especificar el tipo del registro a buscar"
+
+#: src/gns/gnunet-gns.c:440
+#, fuzzy
+msgid "Specify timeout for the lookup"
+msgstr "Especificar el tipo del registro a buscar"
+
+#: src/gns/gnunet-gns.c:445
+msgid "No unneeded output"
+msgstr "Sin salida innecesaria"
+
+#: src/gns/gnunet-gns.c:451
+#, fuzzy
+msgid "Specify the public key of the zone to lookup the record in"
+msgstr "Especificar el tipo del registro a buscar"
+
+#: src/gns/gnunet-gns.c:457
+#, fuzzy
+msgid "Specify the name of the ego of the zone to lookup the record in"
+msgstr "Especificar el tipo del registro a buscar"
+
+#: src/gns/gnunet-gns.c:476
+#, fuzzy
+msgid "GNUnet GNS resolver tool"
+msgstr "Herramienta de acceso GNUnet GNS"
+
#: src/gns/gnunet-service-gns.c:442
#, fuzzy
msgid "Failed to connect to the namecache!\n"
msgstr "¡Se produjo un fallo al conectar con el almacén de nombres!\n"
#: src/gns/gnunet-service-gns.c:461
-#: src/zonemaster/gnunet-service-zonemaster.c:741
+#: src/zonemaster/gnunet-service-zonemaster.c:742
msgid "Could not connect to DHT!\n"
msgstr "¡No se pudo conectar a la DHT!\n"
@@ -4313,47 +4501,37 @@ msgstr ""
msgid "Hostname `%s' is not well-formed, resolution fails\n"
msgstr ""
-#: src/gns/plugin_gnsrecord_gns.c:203
+#: src/gns/plugin_gnsrecord_gns.c:179
#, c-format
msgid "Unable to parse PKEY record `%s'\n"
msgstr "No se pudo procesar el registro PKEY «%s»\n"
-#: src/gns/plugin_gnsrecord_gns.c:232
+#: src/gns/plugin_gnsrecord_gns.c:208
#, fuzzy, c-format
msgid "Unable to parse GNS2DNS record `%s'\n"
msgstr "No se pudo procesar el registro SOA «%s»\n"
-#: src/gns/plugin_gnsrecord_gns.c:253
+#: src/gns/plugin_gnsrecord_gns.c:229
#, fuzzy, c-format
msgid "Failed to serialize GNS2DNS record with value `%s'\n"
msgstr ""
"Se produjo un fallo al escribir el directorio con los resultados de búsqueda "
"de «%s»\n"
-#: src/gns/plugin_gnsrecord_gns.c:276
+#: src/gns/plugin_gnsrecord_gns.c:252
#, c-format
msgid "Unable to parse VPN record string `%s'\n"
msgstr "No se pudo procesar la cadena de registro VPN «%s»\n"
-#: src/gns/plugin_gnsrecord_gns.c:312
+#: src/gns/plugin_gnsrecord_gns.c:288
#, fuzzy, c-format
msgid "Unable to parse BOX record string `%s'\n"
msgstr "No se pudo procesar la cadena de registro VPN «%s»\n"
-#: src/gns/plugin_gnsrecord_gns.c:360
-#, fuzzy, c-format
-msgid "Unable to parse REVERSE record string `%s'\n"
-msgstr "No se pudo procesar la cadena de registro VPN «%s»\n"
-
#: src/gns/plugin_rest_gns.c:384
msgid "Ego for not found, cannot perform lookup.\n"
msgstr ""
-#: src/gns/plugin_rest_gns.c:668
-#, fuzzy
-msgid "GNS REST API initialized\n"
-msgstr "Conexión fallida\n"
-
#: src/gnsrecord/plugin_gnsrecord_dns.c:359
#, c-format
msgid "Unable to parse IPv4 address `%s'\n"
@@ -4816,6 +4994,53 @@ msgid "Could not start hostlist HTTP server on port %u\n"
msgstr ""
"No se pudo arrancar un servidor de listas de máquinas HTTP en el puerto %u\n"
+#: src/identity-provider/gnunet-idp.c:348
+#, fuzzy
+msgid "Ego is required\n"
+msgstr "Las opción «%s» o «%s» es necesaria.\n"
+
+#: src/identity-provider/gnunet-idp.c:370
+msgid "Add attribute"
+msgstr ""
+
+#: src/identity-provider/gnunet-idp.c:376
+msgid "Attribute value"
+msgstr ""
+
+#: src/identity-provider/gnunet-idp.c:381
+msgid "Ego"
+msgstr ""
+
+#: src/identity-provider/gnunet-idp.c:386
+msgid "Audience (relying party)"
+msgstr ""
+
+#: src/identity-provider/gnunet-idp.c:390
+msgid "List attributes for Ego"
+msgstr ""
+
+#: src/identity-provider/gnunet-idp.c:395
+msgid "Issue a ticket"
+msgstr ""
+
+#: src/identity-provider/gnunet-idp.c:400
+msgid "Consume a ticket"
+msgstr ""
+
+#: src/identity-provider/gnunet-idp.c:405
+msgid "Revoke a ticket"
+msgstr ""
+
+#: src/identity-provider/identity_provider_api.c:429
+#, fuzzy
+msgid "failed to store record\n"
+msgstr "El almacén de nombres no pudo añadir el registro\n"
+
+#: src/identity-provider/plugin_rest_identity_provider.c:1175
+#, fuzzy
+msgid "Identity Provider REST API initialized\n"
+msgstr "Conexión fallida\n"
+
#: src/identity/gnunet-identity.c:179
#, fuzzy, c-format
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"
msgid "Failed to create directory `%s' for storing egos\n"
msgstr "Se produjo un fallo al leer el directorio «%s»\n"
-#: src/identity/plugin_rest_identity.c:967
+#: src/identity/plugin_rest_identity.c:964
#, fuzzy
msgid "Identity REST API initialized\n"
msgstr "Conexión fallida\n"
-#: src/identity-provider/gnunet-identity-token.c:66
-#, fuzzy
-msgid "Option `-t' is required\n"
-msgstr "Las opción «%s» o «%s» es necesaria.\n"
-
-#: src/identity-provider/gnunet-identity-token.c:77
-#, fuzzy, c-format
-msgid "Token `%s' is malformed\n"
-msgstr "El bloque del tipo %u está mal formado\n"
-
-#: src/identity-provider/gnunet-identity-token.c:166
-msgid "GNUid token"
-msgstr ""
-
-#: src/identity-provider/gnunet-identity-token.c:171
-msgid "Print token contents"
-msgstr ""
-
-#: src/identity-provider/plugin_rest_identity_provider.c:1166
-#, fuzzy
-msgid "Identity Token REST API initialized\n"
-msgstr "Conexión fallida\n"
-
#: src/json/json.c:119
#, fuzzy, c-format
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"
msgid "flat plugin running\n"
msgstr "Base de datos sqlite ejecutándose\n"
-#: src/namecache/plugin_namecache_postgres.c:90
-#: src/namestore/plugin_namestore_postgres.c:97
-msgid "Failed to create indices\n"
-msgstr "Se produjo un fallo al crear los índices\n"
+# form??
+#: src/namestore/gnunet-namestore-fcfsd.c:508
+#, c-format
+msgid "Unsupported form value `%s'\n"
+msgstr "Forma de valor no soportada «%s»\n"
+
+#: src/namestore/gnunet-namestore-fcfsd.c:535
+#, c-format
+msgid "Failed to create record for domain `%s': %s\n"
+msgstr "Se produjo un fallo al crear un registro para el dominio «%s»: %s\n"
+
+#: src/namestore/gnunet-namestore-fcfsd.c:555
+msgid "Error when mapping zone to name\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:585
+#, c-format
+msgid "Found existing name `%s' for the given key\n"
+msgstr "Encontrado nombre «%s» para la clave dada\n"
+
+#: src/namestore/gnunet-namestore-fcfsd.c:662
+#, c-format
+msgid "Found %u existing records for domain `%s'\n"
+msgstr "Encontrados %u registros para el dominio «%s»\n"
+
+#: src/namestore/gnunet-namestore-fcfsd.c:718
+#, c-format
+msgid "Failed to create page for `%s'\n"
+msgstr "Se produjo un fallo al crear la página para «%s»\n"
+
+#: src/namestore/gnunet-namestore-fcfsd.c:734
+#, c-format
+msgid "Failed to setup post processor for `%s'\n"
+msgstr "Se produjo un fallo al configurar el post-procesador para «%s»\n"
+
+#: src/namestore/gnunet-namestore-fcfsd.c:770
+msgid "Domain name must not contain `.'\n"
+msgstr "El nombre de dominio no puede contener «.»\n"
+
+#: src/namestore/gnunet-namestore-fcfsd.c:778
+msgid "Domain name must not contain `+'\n"
+msgstr "El nombre de dominio no puede contener «+»\n"
+
+#: src/namestore/gnunet-namestore-fcfsd.c:974
+msgid "No ego configured for `fcfsd` subsystem\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:1000
+msgid "Failed to start HTTP server\n"
+msgstr "Se produjo un fallo al iniciar el servidor HTTP\n"
+
+#: src/namestore/gnunet-namestore-fcfsd.c:1042
+#, fuzzy
+msgid "Failed to connect to identity\n"
+msgstr "Se produjo un fallo al conectar con GNS\n"
+
+#: src/namestore/gnunet-namestore-fcfsd.c:1074
+#, fuzzy
+msgid "GNU Name System First Come First Serve name registration service"
+msgstr "Servicio de registro GNUnet GNS primero en llegar, primero en servirse"
#: src/namestore/gnunet-namestore.c:301
#, c-format
@@ -5051,13 +5309,13 @@ msgid "Adding record failed: %s\n"
msgstr "No se pudo añadir el registro: %s\n"
#: src/namestore/gnunet-namestore.c:330
-#: src/namestore/plugin_rest_namestore.c:562
+#: src/namestore/plugin_rest_namestore.c:567
#, fuzzy, c-format
msgid "Deleting record failed, record does not exist%s%s\n"
msgstr "No se pudo borrar el registro: %s\n"
#: src/namestore/gnunet-namestore.c:337
-#: src/namestore/plugin_rest_namestore.c:571
+#: src/namestore/plugin_rest_namestore.c:576
#, fuzzy, c-format
msgid "Deleting record failed%s%s\n"
msgstr "No se pudo borrar el registro: %s\n"
@@ -5075,7 +5333,7 @@ msgid "Records already exist under `%s', cannot add `%s' record.\n"
msgstr ""
#: src/namestore/gnunet-namestore.c:698
-#: src/namestore/plugin_rest_namestore.c:597
+#: src/namestore/plugin_rest_namestore.c:602
#, c-format
msgid "There are no records under label `%s' that could be deleted.\n"
msgstr ""
@@ -5086,23 +5344,11 @@ msgid ""
"There are no records under label `%s' that match the request for deletion.\n"
msgstr ""
-#: src/namestore/gnunet-namestore.c:776
-#: src/namestore/plugin_rest_namestore.c:1004
-#, fuzzy, c-format
-msgid "Ego `%s' not known to identity service\n"
-msgstr "'%s': servicio desconocido: %s\n"
-
#: src/namestore/gnunet-namestore.c:791
#, c-format
msgid "No options given\n"
msgstr "No se han proporcionado opciones\n"
-#: src/namestore/gnunet-namestore.c:802
-#: src/namestore/gnunet-namestore-fcfsd.c:1034
-#: src/namestore/plugin_rest_namestore.c:1017
-msgid "Failed to connect to namestore\n"
-msgstr "Se produjo un fallo al conectar con el almacén de nombres\n"
-
#: src/namestore/gnunet-namestore.c:810 src/namestore/gnunet-namestore.c:819
#: src/namestore/gnunet-namestore.c:838 src/namestore/gnunet-namestore.c:861
#: src/namestore/gnunet-namestore.c:915
@@ -5116,14 +5362,14 @@ msgid "add"
msgstr "añadir"
#: src/namestore/gnunet-namestore.c:829
-#: src/namestore/plugin_rest_namestore.c:671
+#: src/namestore/plugin_rest_namestore.c:676
#, c-format
msgid "Unsupported type `%s'\n"
msgstr "Tipo no soportado «%s»\n"
#: src/namestore/gnunet-namestore.c:851
-#: src/namestore/plugin_rest_namestore.c:689
-#: src/namestore/plugin_rest_namestore.c:729
+#: src/namestore/plugin_rest_namestore.c:694
+#: src/namestore/plugin_rest_namestore.c:734
#, c-format
msgid "Value `%s' invalid for record type `%s'\n"
msgstr "Valor «%s» no válido para el tipo de registro «%s»\n"
@@ -5142,8 +5388,7 @@ msgstr "borrar"
msgid "Invalid public key for reverse lookup `%s'\n"
msgstr "Parámetro no válido «%s»\n"
-#: src/namestore/gnunet-namestore.c:979
-#: src/peerinfo-tool/gnunet-peerinfo.c:775
+#: src/namestore/gnunet-namestore.c:979 src/peerinfo-tool/gnunet-peerinfo.c:775
#, c-format
msgid "Invalid URI `%s'\n"
msgstr "URI no válida: «%s»\n"
@@ -5154,13 +5399,13 @@ msgid "Invalid nick `%s'\n"
msgstr "URI no válida: «%s»\n"
#: src/namestore/gnunet-namestore.c:1051
-#: src/namestore/plugin_rest_namestore.c:1047
+#: src/namestore/plugin_rest_namestore.c:1052
#, fuzzy, c-format
msgid "No default ego configured in identity service\n"
msgstr "'%s': servicio desconocido: %s\n"
#: src/namestore/gnunet-namestore.c:1108
-#: src/namestore/plugin_rest_namestore.c:1143
+#: src/namestore/plugin_rest_namestore.c:1148
#, fuzzy, c-format
msgid "Cannot connect to identity service\n"
msgstr "¡No se pudo conectar al servicio %s!\n"
@@ -5226,68 +5471,7 @@ msgstr ""
msgid "name of the ego controlling the zone"
msgstr "nombre de la sección a la que acceder"
-# form??
-#: src/namestore/gnunet-namestore-fcfsd.c:508
-#, c-format
-msgid "Unsupported form value `%s'\n"
-msgstr "Forma de valor no soportada «%s»\n"
-
-#: src/namestore/gnunet-namestore-fcfsd.c:535
-#, c-format
-msgid "Failed to create record for domain `%s': %s\n"
-msgstr "Se produjo un fallo al crear un registro para el dominio «%s»: %s\n"
-
-#: src/namestore/gnunet-namestore-fcfsd.c:555
-msgid "Error when mapping zone to name\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:585
-#, c-format
-msgid "Found existing name `%s' for the given key\n"
-msgstr "Encontrado nombre «%s» para la clave dada\n"
-
-#: src/namestore/gnunet-namestore-fcfsd.c:662
-#, c-format
-msgid "Found %u existing records for domain `%s'\n"
-msgstr "Encontrados %u registros para el dominio «%s»\n"
-
-#: src/namestore/gnunet-namestore-fcfsd.c:718
-#, c-format
-msgid "Failed to create page for `%s'\n"
-msgstr "Se produjo un fallo al crear la página para «%s»\n"
-
-#: src/namestore/gnunet-namestore-fcfsd.c:734
-#, c-format
-msgid "Failed to setup post processor for `%s'\n"
-msgstr "Se produjo un fallo al configurar el post-procesador para «%s»\n"
-
-#: src/namestore/gnunet-namestore-fcfsd.c:770
-msgid "Domain name must not contain `.'\n"
-msgstr "El nombre de dominio no puede contener «.»\n"
-
-#: src/namestore/gnunet-namestore-fcfsd.c:778
-msgid "Domain name must not contain `+'\n"
-msgstr "El nombre de dominio no puede contener «+»\n"
-
-#: src/namestore/gnunet-namestore-fcfsd.c:974
-msgid "No ego configured for `fcfsd` subsystem\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:1000
-msgid "Failed to start HTTP server\n"
-msgstr "Se produjo un fallo al iniciar el servidor HTTP\n"
-
-#: src/namestore/gnunet-namestore-fcfsd.c:1042
-#, fuzzy
-msgid "Failed to connect to identity\n"
-msgstr "Se produjo un fallo al conectar con GNS\n"
-
-#: src/namestore/gnunet-namestore-fcfsd.c:1074
-#, fuzzy
-msgid "GNU Name System First Come First Serve name registration service"
-msgstr "Servicio de registro GNUnet GNS primero en llegar, primero en servirse"
-
-#: src/namestore/gnunet-service-namestore.c:612
+#: src/namestore/gnunet-service-namestore.c:615
#, fuzzy, c-format
msgid "Failed to replicate block in namecache: %s\n"
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"
msgid "flat file database running\n"
msgstr "Base de datos de plantilla ejecutándose\n"
-#: src/namestore/plugin_rest_namestore.c:1188
+#: src/namestore/plugin_rest_namestore.c:1193
#, fuzzy
msgid "Namestore REST API initialized\n"
msgstr "Conexión fallida\n"
@@ -5602,11 +5786,6 @@ msgstr "comando «external-ip» no encontrado\n"
msgid "`upnpc' command not found\n"
msgstr "comando «upnpc» no encontrado\n"
-#: src/nse/gnunet-nse.c:122
-#, fuzzy
-msgid "Show network size estimates from NSE service."
-msgstr "# Estimaciones del tamaño de red recibidas"
-
#: src/nse/gnunet-nse-profiler.c:842
msgid "limit to the number of connections to NSE services, 0 for none"
msgstr "límite al número de conexiones a servicios NSE, 0 para ilimitadas"
@@ -5632,70 +5811,16 @@ msgstr "retraso entre rondas"
msgid "Measure quality and performance of the NSE service."
msgstr "Medir la calidad y rendimiento del servicio NSE."
+#: src/nse/gnunet-nse.c:122
+#, fuzzy
+msgid "Show network size estimates from NSE service."
+msgstr "# Estimaciones del tamaño de red recibidas"
+
#: src/nse/gnunet-service-nse.c:1534
#: src/revocation/gnunet-service-revocation.c:838 src/util/gnunet-scrypt.c:276
msgid "Value is too large.\n"
msgstr ""
-#: src/peerinfo/gnunet-service-peerinfo.c:178
-#, c-format
-msgid "Removing expired address of transport `%s'\n"
-msgstr "Eliminando dirección de transporte «%s»\n"
-
-#: src/peerinfo/gnunet-service-peerinfo.c:310
-#, fuzzy, c-format
-msgid "Failed to parse HELLO in file `%s': %s\n"
-msgstr "Se produjo un fallo al procesar «HELLO» en el fichero «%s»\n"
-
-#: src/peerinfo/gnunet-service-peerinfo.c:331
-#: src/peerinfo/gnunet-service-peerinfo.c:362
-#, fuzzy, c-format
-msgid "Failed to parse HELLO in file `%s'\n"
-msgstr "Se produjo un fallo al procesar «HELLO» en el fichero «%s»\n"
-
-#: src/peerinfo/gnunet-service-peerinfo.c:446
-msgid "# peers known"
-msgstr "# pares conocidos"
-
-#: src/peerinfo/gnunet-service-peerinfo.c:489
-#, c-format
-msgid ""
-"File `%s' in directory `%s' does not match naming convention. Removed.\n"
-msgstr ""
-"El fichero «%s» en el directorio «%s» no sigue la convención de nombres. "
-"Eliminado.\n"
-
-#: src/peerinfo/gnunet-service-peerinfo.c:655
-#, fuzzy, c-format
-msgid "Scanning directory `%s'\n"
-msgstr "Escaneando directorio «%s».\n"
-
-#: src/peerinfo/gnunet-service-peerinfo.c:663
-#, c-format
-msgid "Still no peers found in `%s'!\n"
-msgstr "¡Aún no se han encontrado pares en «%s»!\n"
-
-#: src/peerinfo/gnunet-service-peerinfo.c:1076
-#, fuzzy, c-format
-msgid "Cleaning up directory `%s'\n"
-msgstr "Escaneando directorio «%s».\n"
-
-#: src/peerinfo/gnunet-service-peerinfo.c:1405
-#, c-format
-msgid "Importing HELLOs from `%s'\n"
-msgstr "Importando HELLO de «%s»\n"
-
-#: src/peerinfo/gnunet-service-peerinfo.c:1418
-msgid "Skipping import of included HELLOs\n"
-msgstr ""
-
-# Miguel: "Failed to receive" también aquí está traducido como
-# "no se obtuvo respuesta" por claridad.
-#: src/peerinfo/peerinfo_api.c:220
-msgid "Failed to receive response from `PEERINFO' service."
-msgstr ""
-"No se obtuvo respuesta del servicio de información de pares (PEERINFO)."
-
#: src/peerinfo-tool/gnunet-peerinfo.c:239
#, fuzzy, c-format
msgid "%sPeer `%s'\n"
@@ -5785,6 +5910,65 @@ msgstr "Cargando el módulo de transporte «%s»\n"
msgid "Failed to load transport plugin for `%s'\n"
msgstr "Se produjo un fallo al cargar el módulo del transporte para «%s»\n"
+#: src/peerinfo/gnunet-service-peerinfo.c:178
+#, c-format
+msgid "Removing expired address of transport `%s'\n"
+msgstr "Eliminando dirección de transporte «%s»\n"
+
+#: src/peerinfo/gnunet-service-peerinfo.c:310
+#, fuzzy, c-format
+msgid "Failed to parse HELLO in file `%s': %s\n"
+msgstr "Se produjo un fallo al procesar «HELLO» en el fichero «%s»\n"
+
+#: src/peerinfo/gnunet-service-peerinfo.c:331
+#: src/peerinfo/gnunet-service-peerinfo.c:362
+#, fuzzy, c-format
+msgid "Failed to parse HELLO in file `%s'\n"
+msgstr "Se produjo un fallo al procesar «HELLO» en el fichero «%s»\n"
+
+#: src/peerinfo/gnunet-service-peerinfo.c:446
+msgid "# peers known"
+msgstr "# pares conocidos"
+
+#: src/peerinfo/gnunet-service-peerinfo.c:489
+#, c-format
+msgid ""
+"File `%s' in directory `%s' does not match naming convention. Removed.\n"
+msgstr ""
+"El fichero «%s» en el directorio «%s» no sigue la convención de nombres. "
+"Eliminado.\n"
+
+#: src/peerinfo/gnunet-service-peerinfo.c:655
+#, fuzzy, c-format
+msgid "Scanning directory `%s'\n"
+msgstr "Escaneando directorio «%s».\n"
+
+#: src/peerinfo/gnunet-service-peerinfo.c:663
+#, c-format
+msgid "Still no peers found in `%s'!\n"
+msgstr "¡Aún no se han encontrado pares en «%s»!\n"
+
+#: src/peerinfo/gnunet-service-peerinfo.c:1076
+#, fuzzy, c-format
+msgid "Cleaning up directory `%s'\n"
+msgstr "Escaneando directorio «%s».\n"
+
+#: src/peerinfo/gnunet-service-peerinfo.c:1405
+#, c-format
+msgid "Importing HELLOs from `%s'\n"
+msgstr "Importando HELLO de «%s»\n"
+
+#: src/peerinfo/gnunet-service-peerinfo.c:1418
+msgid "Skipping import of included HELLOs\n"
+msgstr ""
+
+# Miguel: "Failed to receive" también aquí está traducido como
+# "no se obtuvo respuesta" por claridad.
+#: src/peerinfo/peerinfo_api.c:220
+msgid "Failed to receive response from `PEERINFO' service."
+msgstr ""
+"No se obtuvo respuesta del servicio de información de pares (PEERINFO)."
+
#: src/peerstore/gnunet-peerstore.c:91
msgid "peerstore"
msgstr ""
@@ -5834,15 +6018,10 @@ msgstr "Error leyendo de «%s»: %s\n"
msgid "Unable to create indices: %s.\n"
msgstr "Se produjo un fallo al crear los índices\n"
-#: src/postgres/postgres.c:67
+#: src/pq/pq_prepare.c:80
#, fuzzy, c-format
-msgid "`%s:%s' failed at %s:%d with error: %s\n"
-msgstr "«%s:%s» falló en %s:%d con error: %s"
-
-#: src/postgres/postgres.c:192
-#, fuzzy, c-format
-msgid "Unable to connect to Postgres database '%s': %s\n"
-msgstr "Imposible guardar el fichero de configuración '%s':"
+msgid "PQprepare (`%s' as `%s') failed with error: %s\n"
+msgstr "«%s» para «%s» falló en %s: %d con error: %s\n"
#: src/psycstore/gnunet-service-psycstore.c:249
#, fuzzy
@@ -6019,11 +6198,11 @@ msgstr ""
msgid "Daemon to announce regular expressions for the peer using cadet."
msgstr "Demonio para anunciar expresiones regulares para el par usando mesh."
-#: src/regex/gnunet-regex-profiler.c:1314
+#: src/regex/gnunet-regex-profiler.c:1386
msgid "No configuration file given. Exiting\n"
msgstr "No se ha introducido ningún fichero de configuración. Saliendo\n"
-#: src/regex/gnunet-regex-profiler.c:1355
+#: src/regex/gnunet-regex-profiler.c:1427
#: src/regex/gnunet-regex-simulation-profiler.c:630
#, c-format
msgid "No policy directory specified on command line. Exiting.\n"
@@ -6031,51 +6210,51 @@ msgstr ""
"No se ha especificado una política de directorios en la línea de comandos. "
"Saliendo.\n"
-#: src/regex/gnunet-regex-profiler.c:1361
+#: src/regex/gnunet-regex-profiler.c:1433
#: src/regex/gnunet-regex-simulation-profiler.c:638
#, c-format
msgid "Specified policies directory does not exist. Exiting.\n"
msgstr "Las políticas de directorio especificadas no existen. Saliendo.\n"
-#: src/regex/gnunet-regex-profiler.c:1368
+#: src/regex/gnunet-regex-profiler.c:1440
#, c-format
msgid "No files found in `%s'\n"
msgstr "No se han encontrado ficheros en «%s»\n"
-#: src/regex/gnunet-regex-profiler.c:1377
+#: src/regex/gnunet-regex-profiler.c:1449
msgid "No search strings file given. Exiting.\n"
msgstr "No se ha proporcionado un fichero de cadenas de búsqueda. Saliendo.\n"
-#: src/regex/gnunet-regex-profiler.c:1397
+#: src/regex/gnunet-regex-profiler.c:1469
msgid "Error loading search strings. Exiting.\n"
msgstr "Error cargando cadenas de búsqueda. Saliendo.\n"
-#: src/regex/gnunet-regex-profiler.c:1485
+#: src/regex/gnunet-regex-profiler.c:1557
msgid "name of the file for writing statistics"
msgstr "nombre del fichero para escribir las estadísticas"
-#: src/regex/gnunet-regex-profiler.c:1491
+#: src/regex/gnunet-regex-profiler.c:1563
#, fuzzy
msgid "wait TIMEOUT before ending the experiment"
msgstr ""
"esperar «TIMEOUT» antes de considerar que una coincidencia de cadenas como "
"fallida"
-#: src/regex/gnunet-regex-profiler.c:1497
+#: src/regex/gnunet-regex-profiler.c:1569
msgid "directory with policy files"
msgstr ""
-#: src/regex/gnunet-regex-profiler.c:1504
+#: src/regex/gnunet-regex-profiler.c:1576
#, fuzzy
msgid "name of file with input strings"
msgstr "nombre del fichero para escribir las estadísticas"
-#: src/regex/gnunet-regex-profiler.c:1510
+#: src/regex/gnunet-regex-profiler.c:1582
#, fuzzy
msgid "name of file with hosts' names"
msgstr "nombre del fichero para escribir las estadísticas"
-#: src/regex/gnunet-regex-profiler.c:1523
+#: src/regex/gnunet-regex-profiler.c:1595
msgid "Profiler for regex"
msgstr "Perfilador para expresiones regulares."
@@ -6312,10 +6491,10 @@ msgstr ""
msgid "Calculate the Vectorproduct with a GNUnet peer."
msgstr ""
-#: src/scalarproduct/gnunet-service-scalarproduct_alice.c:1407
-#: src/scalarproduct/gnunet-service-scalarproduct_bob.c:1345
-#: src/scalarproduct/gnunet-service-scalarproduct-ecc_alice.c:1180
+#: src/scalarproduct/gnunet-service-scalarproduct-ecc_alice.c:1172
#: src/scalarproduct/gnunet-service-scalarproduct-ecc_bob.c:1063
+#: src/scalarproduct/gnunet-service-scalarproduct_alice.c:1401
+#: src/scalarproduct/gnunet-service-scalarproduct_bob.c:1345
#, fuzzy
msgid "Connect to CADET failed\n"
msgstr "Conexión fallida (¿bug?)\n"
@@ -6340,7 +6519,7 @@ msgstr ""
msgid "also profile decryption"
msgstr ""
-#: src/set/gnunet-service-set.c:1948
+#: src/set/gnunet-service-set.c:1989
#, fuzzy
msgid "Could not connect to CADET service\n"
msgstr "¡No se pudo conectar al servicio %s!\n"
@@ -6401,116 +6580,116 @@ msgstr ""
msgid "say good-bye and leave somebody else's place"
msgstr ""
-#: src/social/gnunet-social.c:1227 src/social/gnunet-social.c:1232
+#: src/social/gnunet-social.c:1227
msgid "create a place"
msgstr ""
-#: src/social/gnunet-social.c:1237
+#: src/social/gnunet-social.c:1232
msgid "destroy a place we were hosting"
msgstr ""
-#: src/social/gnunet-social.c:1242
+#: src/social/gnunet-social.c:1237
msgid "enter somebody else's place"
msgstr ""
-#: src/social/gnunet-social.c:1248
+#: src/social/gnunet-social.c:1243
msgid "find state matching name prefix"
msgstr ""
-#: src/social/gnunet-social.c:1253
+#: src/social/gnunet-social.c:1248
msgid "replay history of messages up to the given --limit"
msgstr ""
-#: src/social/gnunet-social.c:1258
+#: src/social/gnunet-social.c:1253
msgid "reconnect to a previously created place"
msgstr ""
-#: src/social/gnunet-social.c:1263
+#: src/social/gnunet-social.c:1258
msgid "publish something to a place we are hosting"
msgstr ""
-#: src/social/gnunet-social.c:1268
+#: src/social/gnunet-social.c:1263
msgid "reconnect to a previously entered place"
msgstr ""
-#: src/social/gnunet-social.c:1273
+#: src/social/gnunet-social.c:1268
msgid "search for state matching exact name"
msgstr ""
-#: src/social/gnunet-social.c:1278
+#: src/social/gnunet-social.c:1273
msgid "submit something to somebody's place"
msgstr ""
-#: src/social/gnunet-social.c:1283
+#: src/social/gnunet-social.c:1278
msgid "list of egos and subscribed places"
msgstr ""
-#: src/social/gnunet-social.c:1288
+#: src/social/gnunet-social.c:1283
msgid "extract and replay history between message IDs --start and --until"
msgstr ""
-#: src/social/gnunet-social.c:1297
+#: src/social/gnunet-social.c:1292
msgid "application ID to use when connecting"
msgstr ""
-#: src/social/gnunet-social.c:1303
+#: src/social/gnunet-social.c:1298
msgid "message body or state value"
msgstr ""
-#: src/social/gnunet-social.c:1309
+#: src/social/gnunet-social.c:1304
#, fuzzy
msgid "name or public key of ego"
msgstr "Parámetro no válido «%s»\n"
-#: src/social/gnunet-social.c:1314
+#: src/social/gnunet-social.c:1309
#, fuzzy
msgid "wait for incoming messages"
msgstr "Falló al entregar el mensaje '%s'.\n"
-#: src/social/gnunet-social.c:1320
+#: src/social/gnunet-social.c:1315
#, fuzzy
msgid "GNS name"
msgstr "Mostrar el _nombre"
-#: src/social/gnunet-social.c:1326
+#: src/social/gnunet-social.c:1321
msgid "peer ID for --guest-enter"
msgstr ""
-#: src/social/gnunet-social.c:1332
+#: src/social/gnunet-social.c:1327
msgid "name (key) to query from state"
msgstr ""
-#: src/social/gnunet-social.c:1338
+#: src/social/gnunet-social.c:1333
#, fuzzy
msgid "method name"
msgstr "Mostrar el _nombre"
-#: src/social/gnunet-social.c:1344
+#: src/social/gnunet-social.c:1339
#, fuzzy
msgid "number of messages to replay from history"
msgstr "número de mensajes a usar por iteración"
-#: src/social/gnunet-social.c:1350
+#: src/social/gnunet-social.c:1345
msgid "key address of place"
msgstr ""
-#: src/social/gnunet-social.c:1356
+#: src/social/gnunet-social.c:1351
msgid "start message ID for history replay"
msgstr ""
-#: src/social/gnunet-social.c:1361
+#: src/social/gnunet-social.c:1356
msgid "respond to entry requests by admitting all guests"
msgstr ""
-#: src/social/gnunet-social.c:1367
+#: src/social/gnunet-social.c:1362
msgid "end message ID for history replay"
msgstr ""
-#: src/social/gnunet-social.c:1372
+#: src/social/gnunet-social.c:1367
msgid "respond to entry requests by refusing all guests"
msgstr ""
-#: src/social/gnunet-social.c:1382
+#: src/social/gnunet-social.c:1377
msgid ""
"gnunet-social - Interact with the social service: enter/leave, send/receive "
"messages, access history and state.\n"
@@ -6703,7 +6882,7 @@ msgid ""
msgstr ""
#: src/testbed/gnunet-daemon-testbed-underlay.c:231 src/testing/list-keys.c:46
-#: src/testing/testing.c:288 src/util/gnunet-ecc.c:298
+#: src/testing/testing.c:288 src/util/gnunet-ecc.c:301
#, c-format
msgid "Incorrect hostkey file format: %s\n"
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"
msgid "%.s Unknown result code."
msgstr "Código de respuesta del ARM desconocido.\n"
-#: src/testbed/gnunet_testbed_mpi_spawn.c:118
-#, fuzzy
-msgid "Waiting for child to exit.\n"
-msgstr "Esperando a los pares para conectar (%u ciclos restantes)...\n"
-
-#: src/testbed/gnunet_testbed_mpi_spawn.c:241
-#, fuzzy, c-format
-msgid "Spawning process `%s'\n"
-msgstr "Iniciando el proceso auxiliar (HELPER) «%s»\n"
-
#: src/testbed/gnunet-testbed-profiler.c:290
msgid "tolerate COUNT number of continious timeout failures"
msgstr "tolerar un número «COUNT» de continuas expiraciones de plazo"
@@ -6798,6 +6967,16 @@ msgid ""
"signal is received"
msgstr ""
+#: src/testbed/gnunet_testbed_mpi_spawn.c:118
+#, fuzzy
+msgid "Waiting for child to exit.\n"
+msgstr "Esperando a los pares para conectar (%u ciclos restantes)...\n"
+
+#: src/testbed/gnunet_testbed_mpi_spawn.c:241
+#, fuzzy, c-format
+msgid "Spawning process `%s'\n"
+msgstr "Iniciando el proceso auxiliar (HELPER) «%s»\n"
+
#: src/testbed/testbed_api.c:410
#, c-format
msgid "Adding host %u failed with error: %s\n"
@@ -7118,10 +7297,6 @@ msgstr "# mensajes «HELLO» recibidos"
msgid "GNUnet topology control"
msgstr ""
-#: src/transport/gnunet-service-transport_ats.c:141
-msgid "# Addresses given to ATS"
-msgstr ""
-
#: src/transport/gnunet-service-transport.c:448
msgid "# messages dropped due to slow client"
msgstr "# mensajes omitidos debido a un cliente lento"
@@ -7170,6 +7345,10 @@ msgstr ""
"El servicio de transporte carece de opciones de configuración de clave. "
"Saliendo.\n"
+#: src/transport/gnunet-service-transport_ats.c:141
+msgid "# Addresses given to ATS"
+msgstr ""
+
#: src/transport/gnunet-service-transport_hello.c:195
msgid "# refreshed my HELLO"
msgstr "# refrescos de mi «HELLO»"
@@ -7506,6 +7685,45 @@ msgstr "# Mensajes PONG omitidos, firma expirada"
msgid "# validations succeeded"
msgstr "# revalidaciones de direcciones iniciadas"
+#: src/transport/gnunet-transport-profiler.c:219
+#, c-format
+msgid "%llu B in %llu ms == %.2f KB/s!\n"
+msgstr ""
+
+#: src/transport/gnunet-transport-profiler.c:617
+msgid "send data to peer"
+msgstr ""
+
+#: src/transport/gnunet-transport-profiler.c:621
+#, fuzzy
+msgid "receive data from peer"
+msgstr "# respuestas recibidas de otros pares"
+
+#: src/transport/gnunet-transport-profiler.c:626
+#, fuzzy
+msgid "iterations"
+msgstr "Otras configuraciones"
+
+#: src/transport/gnunet-transport-profiler.c:631
+#, fuzzy
+msgid "number of messages to send"
+msgstr "número de mensajes a usar por iteración"
+
+#: src/transport/gnunet-transport-profiler.c:636
+#, fuzzy
+msgid "message size to use"
+msgstr "tamaño del mensaje"
+
+#: src/transport/gnunet-transport-profiler.c:641
+#: src/transport/gnunet-transport.c:1462
+msgid "peer identity"
+msgstr "identidad del par"
+
+#: src/transport/gnunet-transport-profiler.c:652
+#: src/transport/gnunet-transport.c:1482
+msgid "Direct access to transport service."
+msgstr "Acceso directo al servicio de transporte."
+
#: src/transport/gnunet-transport.c:413
#, c-format
msgid "Transmitted %llu bytes/s (%llu bytes in %s)\n"
@@ -7649,11 +7867,6 @@ msgstr ""
msgid "do not resolve hostnames"
msgstr "no resolver nombres de máquinas"
-#: src/transport/gnunet-transport.c:1462
-#: src/transport/gnunet-transport-profiler.c:641
-msgid "peer identity"
-msgstr "identidad del par"
-
#: src/transport/gnunet-transport.c:1466
#, fuzzy
msgid "monitor plugin sessions"
@@ -7663,43 +7876,9 @@ msgstr "# sesiones wlan pendientes"
msgid "send data for benchmarking to the other peer (until CTRL-C)"
msgstr "enviar data para prueba a otro par (hasta CTRL-C)"
-#: src/transport/gnunet-transport.c:1482
-#: src/transport/gnunet-transport-profiler.c:652
-msgid "Direct access to transport service."
-msgstr "Acceso directo al servicio de transporte."
-
-#: src/transport/gnunet-transport-profiler.c:219
-#, c-format
-msgid "%llu B in %llu ms == %.2f KB/s!\n"
-msgstr ""
-
-#: src/transport/gnunet-transport-profiler.c:617
-msgid "send data to peer"
-msgstr ""
-
-#: src/transport/gnunet-transport-profiler.c:621
-#, fuzzy
-msgid "receive data from peer"
-msgstr "# respuestas recibidas de otros pares"
-
-#: src/transport/gnunet-transport-profiler.c:626
-#, fuzzy
-msgid "iterations"
-msgstr "Otras configuraciones"
-
-#: src/transport/gnunet-transport-profiler.c:631
-#, fuzzy
-msgid "number of messages to send"
-msgstr "número de mensajes a usar por iteración"
-
-#: src/transport/gnunet-transport-profiler.c:636
-#, fuzzy
-msgid "message size to use"
-msgstr "tamaño del mensaje"
-
#: src/transport/plugin_transport_http_client.c:1474
-#: src/transport/plugin_transport_http_server.c:2249
-#: src/transport/plugin_transport_http_server.c:3463
+#: src/transport/plugin_transport_http_server.c:2312
+#: src/transport/plugin_transport_http_server.c:3526
#: src/transport/plugin_transport_tcp.c:3890
#: src/transport/plugin_transport_tcp.c:3897
msgid "TCP_STEALTH not supported on this platform.\n"
@@ -7713,13 +7892,13 @@ msgstr ""
"módulo %s!\n"
#: src/transport/plugin_transport_http_client.c:2164
-#: src/transport/plugin_transport_http_server.c:3178
+#: src/transport/plugin_transport_http_server.c:3241
#, c-format
msgid "Shutting down plugin `%s'\n"
msgstr "Finalizando el módulo «%s»\n"
#: src/transport/plugin_transport_http_client.c:2181
-#: src/transport/plugin_transport_http_server.c:3248
+#: src/transport/plugin_transport_http_server.c:3311
#, c-format
msgid "Shutdown for plugin `%s' complete\n"
msgstr "Finalización del módulo «%s» completa\n"
@@ -7729,7 +7908,7 @@ msgstr "Finalización del módulo «%s» completa\n"
msgid "Maximum number of requests is %u\n"
msgstr "El número máximo de conexiones es %u\n"
-#: src/transport/plugin_transport_http_server.c:1727
+#: src/transport/plugin_transport_http_server.c:1756
#, c-format
msgid ""
"Access from connection %p (%u of %u) for `%s' `%s' url `%s' with upload data "
@@ -7738,12 +7917,12 @@ msgstr ""
"Acceso desde la conexión %p (%u de %u) para «%s» «%s» URL «%s» con tamaño de "
"los datos de subida %u\n"
-#: src/transport/plugin_transport_http_server.c:1967
+#: src/transport/plugin_transport_http_server.c:2028
#, c-format
msgid "Accepting connection (%u of %u) from `%s'\n"
msgstr "Aceptando conexión (%u de %u) desde «%s»\n"
-#: src/transport/plugin_transport_http_server.c:1975
+#: src/transport/plugin_transport_http_server.c:2036
#, c-format
msgid ""
"Server reached maximum number connections (%u), rejecting new connection\n"
@@ -7751,7 +7930,7 @@ msgstr ""
"El servidor ha alcanzado el número máximo de conexiones (%u), rechazando "
"nueva conexión\n"
-#: src/transport/plugin_transport_http_server.c:2125
+#: src/transport/plugin_transport_http_server.c:2186
msgid ""
"Could not create a new TLS certificate, program `gnunet-transport-"
"certificate-creation' could not be started!\n"
@@ -7759,84 +7938,84 @@ msgstr ""
"¡No se pudo crear un certificado TLS nuevo, el programa «gnunet-transport-"
"certificate-creation» no pudo ser iniciado!\n"
-#: src/transport/plugin_transport_http_server.c:2148
+#: src/transport/plugin_transport_http_server.c:2209
#, fuzzy, c-format
msgid "No usable TLS certificate found and creating one at `%s/%s' failed!\n"
msgstr ""
"¡No se encontró ningún certificado TLS útil y se produjo un fallo al crear "
"uno!\n"
-#: src/transport/plugin_transport_http_server.c:2275
+#: src/transport/plugin_transport_http_server.c:2338
msgid "Could not load or create server certificate! Loading plugin failed!\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:2587
+#: src/transport/plugin_transport_http_server.c:2650
msgid "Require valid port number for service in configuration!\n"
msgstr "¡Se necesita un puerto válido para el servicio en la configuración!\n"
-#: src/transport/plugin_transport_http_server.c:2752
+#: src/transport/plugin_transport_http_server.c:2815
#, c-format
msgid "Found %u addresses to report to NAT service\n"
msgstr "Encontradas %u direcciones para comunicar al servicio NAT\n"
-#: src/transport/plugin_transport_http_server.c:2838
+#: src/transport/plugin_transport_http_server.c:2901
#: src/transport/plugin_transport_udp.c:3622
msgid "Disabling IPv6 since it is not supported on this system!\n"
msgstr "¡Deshabilitando IPv6 ya que no está soportado en este sistema!\n"
-#: src/transport/plugin_transport_http_server.c:2944
+#: src/transport/plugin_transport_http_server.c:3007
#, c-format
msgid "IPv4 support is %s\n"
msgstr "El soporte IPv4 es %s\n"
-#: src/transport/plugin_transport_http_server.c:2959
+#: src/transport/plugin_transport_http_server.c:3022
#, c-format
msgid "IPv6 support is %s\n"
msgstr "El soporte IPv6 es %s\n"
-#: src/transport/plugin_transport_http_server.c:2965
+#: src/transport/plugin_transport_http_server.c:3028
msgid "Neither IPv4 nor IPv6 are enabled! Fix in configuration\n"
msgstr "¡Ni IPv4 ni IPv6 están habilitadas! Corrija la configuración\n"
-#: src/transport/plugin_transport_http_server.c:2976
+#: src/transport/plugin_transport_http_server.c:3039
msgid "Port is required! Fix in configuration\n"
msgstr "¡El puerto es necesario! Corrija la configuración\n"
-#: src/transport/plugin_transport_http_server.c:2982
+#: src/transport/plugin_transport_http_server.c:3045
#, c-format
msgid "Using port %u\n"
msgstr "Usando puerto %u\n"
-#: src/transport/plugin_transport_http_server.c:3001
+#: src/transport/plugin_transport_http_server.c:3064
#, c-format
msgid "Specific IPv4 address `%s' in configuration file is invalid!\n"
msgstr ""
"¡La dirección IPv4 «%s» especificada en el fichero de configuración no es "
"válida!\n"
-#: src/transport/plugin_transport_http_server.c:3036
+#: src/transport/plugin_transport_http_server.c:3099
#, c-format
msgid "Specific IPv6 address `%s' in configuration file is invalid!\n"
msgstr ""
"¡La dirección IPv6 «%s» especificada en el fichero de configuración no es "
"válida!\n"
-#: src/transport/plugin_transport_http_server.c:3111
+#: src/transport/plugin_transport_http_server.c:3174
#, c-format
msgid "Using external hostname `%s'\n"
msgstr "Usando nombre de máquina externo «%s»\n"
-#: src/transport/plugin_transport_http_server.c:3132
+#: src/transport/plugin_transport_http_server.c:3195
#, c-format
msgid "Notifying transport only about hostname `%s'\n"
msgstr "Notificando al transporte sólo el nombre de máquina «%s»\n"
-#: src/transport/plugin_transport_http_server.c:3149
+#: src/transport/plugin_transport_http_server.c:3212
#, c-format
msgid "Maximum number of connections is %u\n"
msgstr "El número máximo de conexiones es %u\n"
-#: src/transport/plugin_transport_http_server.c:3475
+#: src/transport/plugin_transport_http_server.c:3538
#, fuzzy
msgid "Unable to compile URL regex\n"
msgstr "¡Imposible obtener «HELLO» del par!\n"
@@ -7981,23 +8160,6 @@ msgstr "Transporte TCP no escuchando en ningún puerto (únicamente cliente)\n"
msgid "TCP transport advertises itself as being on port %llu\n"
msgstr "El transporte TCP anuncia que está en el puerto %llu\n"
-#: src/transport/plugin_transport_udp_broadcasting.c:168
-#, fuzzy
-msgid "# Multicast HELLO beacons received via UDP"
-msgstr "# beacons HELLO multicast IPv6 recibidos vía UDP"
-
-#: src/transport/plugin_transport_udp_broadcasting.c:548
-msgid ""
-"Disabling HELLO broadcasting due to friend-to-friend only configuration!\n"
-msgstr ""
-
-#: src/transport/plugin_transport_udp_broadcasting.c:565
-#, c-format
-msgid "Failed to set IPv4 broadcast option for broadcast socket on port %d\n"
-msgstr ""
-"Se produjo un fallo al establecer la opción de «broadcast» IPv4 para el "
-"«socket» en el puerto %d\n"
-
#: src/transport/plugin_transport_udp.c:3366
#, c-format
msgid ""
@@ -8052,6 +8214,23 @@ msgstr "«%s» no es una dirección IP válida.\n"
msgid "Failed to create UDP network sockets\n"
msgstr "Se produjo un fallo al crear una nueva firma"
+#: src/transport/plugin_transport_udp_broadcasting.c:168
+#, fuzzy
+msgid "# Multicast HELLO beacons received via UDP"
+msgstr "# beacons HELLO multicast IPv6 recibidos vía UDP"
+
+#: src/transport/plugin_transport_udp_broadcasting.c:548
+msgid ""
+"Disabling HELLO broadcasting due to friend-to-friend only configuration!\n"
+msgstr ""
+
+#: src/transport/plugin_transport_udp_broadcasting.c:565
+#, c-format
+msgid "Failed to set IPv4 broadcast option for broadcast socket on port %d\n"
+msgstr ""
+"Se produjo un fallo al establecer la opción de «broadcast» IPv4 para el "
+"«socket» en el puerto %d\n"
+
#: src/transport/plugin_transport_unix.c:1403
#, fuzzy, c-format
msgid "Cannot create path to `%s'\n"
@@ -8171,7 +8350,7 @@ msgstr ""
"El código de procesado para el mensaje del tipo %u no llamó a "
"«GNUNET_SERVER_receive_done» después de %s\n"
-#: src/transport/tcp_service_legacy.c:339 src/util/service.c:2337
+#: src/transport/tcp_service_legacy.c:339 src/util/service.c:2336
#, c-format
msgid "Unknown address family %d\n"
msgstr "Familia de direcciones %d desconocida\n"
@@ -8220,52 +8399,52 @@ msgstr "Se produjo un fallo al inciar «%s» en «%s»\n"
msgid "Service `%s' runs at %s\n"
msgstr "El servicio «%s» se ejecuta en %s\n"
-#: src/transport/tcp_service_legacy.c:1251 src/util/service.c:1501
+#: src/transport/tcp_service_legacy.c:1251 src/util/service.c:1500
msgid "Service process failed to initialize\n"
msgstr "No se pudo inicializar el proceso del servicio\n"
-#: src/transport/tcp_service_legacy.c:1255 src/util/service.c:1505
+#: src/transport/tcp_service_legacy.c:1255 src/util/service.c:1504
msgid "Service process could not initialize server function\n"
msgstr ""
"No se pudo inicializar la función del servidor en el proceso del servicio\n"
-#: src/transport/tcp_service_legacy.c:1259 src/util/service.c:1509
+#: src/transport/tcp_service_legacy.c:1259 src/util/service.c:1508
msgid "Service process failed to report status\n"
msgstr "El proceso del servicio no devolvió un estado\n"
#: src/transport/tcp_service_legacy.c:1313 src/util/disk.c:1488
-#: src/util/service.c:1379
+#: src/util/service.c:1378
#, c-format
msgid "Cannot obtain information about user `%s': %s\n"
msgstr "No se pudo obtener información acerca del usuario «%s»: %s\n"
-#: src/transport/tcp_service_legacy.c:1314 src/util/service.c:1381
+#: src/transport/tcp_service_legacy.c:1314 src/util/service.c:1380
msgid "No such user"
msgstr "No existe tal usuario"
-#: src/transport/tcp_service_legacy.c:1327 src/util/service.c:1400
+#: src/transport/tcp_service_legacy.c:1327 src/util/service.c:1399
#, c-format
msgid "Cannot change user/group to `%s': %s\n"
msgstr "Imposible cambiar el usuario/grupo a «%s»: %s\n"
-#: src/transport/tcp_service_legacy.c:1398 src/util/service.c:1728
+#: src/transport/tcp_service_legacy.c:1398 src/util/service.c:1727
msgid "do daemonize (detach from terminal)"
msgstr "demonizar (desasociar del terminal)"
#: src/transport/tcp_service_legacy.c:1448 src/util/program.c:244
-#: src/util/service.c:1791
+#: src/util/service.c:1790
#, fuzzy, c-format
msgid "Malformed configuration file `%s', exit ...\n"
msgstr "Se produjo un fallo al borrar el fichero de configuración %s\n"
#: src/transport/tcp_service_legacy.c:1458 src/util/program.c:261
-#: src/util/service.c:1802
+#: src/util/service.c:1801
#, fuzzy
msgid "Malformed configuration, exit ...\n"
msgstr "Se produjo un fallo al borrar el fichero de configuración %s\n"
#: src/transport/tcp_service_legacy.c:1463 src/util/program.c:256
-#: src/util/service.c:1808
+#: src/util/service.c:1807
#, c-format
msgid "Could not access configuration file `%s'\n"
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»"
msgid "Need a non-empty hostname for service `%s'.\n"
msgstr "Se necesita un nombre de máquina no vacío para el servicio «%s».\n"
-#: src/util/common_logging.c:256 src/util/common_logging.c:1129
+#: src/util/common_logging.c:259 src/util/common_logging.c:1132
msgid "DEBUG"
msgstr "DEPURACIÓN"
-#: src/util/common_logging.c:258 src/util/common_logging.c:1127
+#: src/util/common_logging.c:261 src/util/common_logging.c:1130
msgid "INFO"
msgstr "INFORMACIÓN"
-#: src/util/common_logging.c:260 src/util/common_logging.c:1125
+#: src/util/common_logging.c:263 src/util/common_logging.c:1128
msgid "MESSAGE"
msgstr "MENSAJE"
-#: src/util/common_logging.c:262 src/util/common_logging.c:1123
+#: src/util/common_logging.c:265 src/util/common_logging.c:1126
msgid "WARNING"
msgstr "PELIGRO"
-#: src/util/common_logging.c:264 src/util/common_logging.c:1121
+#: src/util/common_logging.c:267 src/util/common_logging.c:1124
msgid "ERROR"
msgstr "ERROR"
-#: src/util/common_logging.c:266 src/util/common_logging.c:1131
+#: src/util/common_logging.c:269 src/util/common_logging.c:1134
msgid "NONE"
msgstr "NINGUNO"
-#: src/util/common_logging.c:879
+#: src/util/common_logging.c:882
#, c-format
msgid "Message `%.*s' repeated %u times in the last %s\n"
msgstr "Mensaje `%.*s» repetido %u veces en el último %s\n"
-#: src/util/common_logging.c:1132
+#: src/util/common_logging.c:1135
msgid "INVALID"
msgstr "NO VÁLIDO"
-#: src/util/common_logging.c:1302
+#: src/util/common_logging.c:1326
msgid "unknown address"
msgstr "dirección desconocida"
-#: src/util/common_logging.c:1344
+#: src/util/common_logging.c:1368
msgid "invalid address"
msgstr "dirección no válida"
-#: src/util/common_logging.c:1362
+#: src/util/common_logging.c:1386
#, c-format
msgid "Configuration fails to specify option `%s' in section `%s'!\n"
msgstr "¡La configuración no especifica la opción «%s» en la sección «%s»!\n"
-#: src/util/common_logging.c:1383
+#: src/util/common_logging.c:1407
#, c-format
msgid ""
"Configuration specifies invalid value for option `%s' in section `%s': %s\n"
@@ -8363,17 +8542,17 @@ msgstr ""
"La configuración especifica un valor no válido en la opción «%s» de la "
"sección «%s»: %s\n"
-#: src/util/configuration.c:286
+#: src/util/configuration.c:296
#, c-format
msgid "Syntax error while deserializing in line %u\n"
msgstr "Error de sintaxis en la línea %u mientras se deserializaba\n"
-#: src/util/configuration.c:344
+#: src/util/configuration.c:355
#, fuzzy, c-format
msgid "Error while reading file `%s'\n"
msgstr "Error decodificando clave %u\n"
-#: src/util/configuration.c:1017
+#: src/util/configuration.c:1034
#, c-format
msgid ""
"Configuration value '%s' for '%s' in section '%s' is not in set of legal "
@@ -8382,17 +8561,17 @@ msgstr ""
"El valor de configuración «%s» para «%s» de la sección «%s» no está dentro "
"de las opciones legales\n"
-#: src/util/configuration.c:1136
+#: src/util/configuration.c:1153
#, c-format
msgid "Recursive expansion suspected, aborting $-expansion for term `%s'\n"
msgstr ""
-#: src/util/configuration.c:1169
+#: src/util/configuration.c:1186
#, fuzzy, c-format
msgid "Missing closing `%s' in option `%s'\n"
msgstr "Falta la opción «%s» para la operación «%s»\n"
-#: src/util/configuration.c:1237
+#: src/util/configuration.c:1254
#, c-format
msgid ""
"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"
msgid "EdDSA signature verification failed at %s:%d: %s\n"
msgstr "La verificación de la firma RSA fallo en %s:%d: %s\n"
-#: src/util/crypto_ecc_setup.c:122 src/util/crypto_ecc_setup.c:160
-#: src/util/crypto_ecc_setup.c:278 src/util/crypto_ecc_setup.c:316
+#: src/util/crypto_ecc_setup.c:122 src/util/crypto_ecc_setup.c:161
+#: src/util/crypto_ecc_setup.c:279 src/util/crypto_ecc_setup.c:317
#, c-format
msgid "Could not acquire lock on file `%s': %s...\n"
msgstr "No se pudo bloquear el fichero «%s»: %s...\n"
-#: src/util/crypto_ecc_setup.c:127 src/util/crypto_ecc_setup.c:283
+#: src/util/crypto_ecc_setup.c:128 src/util/crypto_ecc_setup.c:284
msgid "Creating a new private key. This may take a while.\n"
msgstr "Generando una clave privada nueva. Esto puede tomar un tiempo.\n"
-#: src/util/crypto_ecc_setup.c:164 src/util/crypto_ecc_setup.c:320
+#: src/util/crypto_ecc_setup.c:165 src/util/crypto_ecc_setup.c:322
msgid "This may be ok if someone is currently generating a private key.\n"
msgstr ""
"Esto puede estar bien si alguien está actualmente generando una clave "
"privada.\n"
-#: src/util/crypto_ecc_setup.c:194 src/util/crypto_ecc_setup.c:350
+#: src/util/crypto_ecc_setup.c:195 src/util/crypto_ecc_setup.c:352
#, c-format
msgid ""
"When trying to read key file `%s' I found %u bytes but I need at least %u.\n"
@@ -8452,13 +8631,13 @@ msgstr ""
"Cuando se intentaba leer el fichero de claves «%s» se encontraron %u bytes "
"pero al menos %u son necesarios.\n"
-#: src/util/crypto_ecc_setup.c:198 src/util/crypto_ecc_setup.c:354
+#: src/util/crypto_ecc_setup.c:199 src/util/crypto_ecc_setup.c:356
msgid "This may be ok if someone is currently generating a key.\n"
msgstr ""
"Esto puede ser correcto si alguien está actualmente generando una clave de "
"máquina.\n"
-#: src/util/crypto_ecc_setup.c:413
+#: src/util/crypto_ecc_setup.c:415
#, fuzzy
msgid "Could not load peer's private key\n"
msgstr "No se pudo acceder a la clave de máquina.\n"
@@ -8651,22 +8830,22 @@ msgstr ""
msgid "Manipulate GNUnet configuration files"
msgstr "Manipular ficheros de configuración de GNUnet"
-#: src/util/gnunet-ecc.c:84
+#: src/util/gnunet-ecc.c:89
#, c-format
msgid "Failed to open `%s': %s\n"
msgstr "Se produjo un fallo al abrir «%s»: %s\n"
-#: src/util/gnunet-ecc.c:120
+#: src/util/gnunet-ecc.c:125
#, fuzzy, c-format
msgid "Generating %u keys like %s, please wait"
msgstr "Generando %u claves, por favor, espere"
-#: src/util/gnunet-ecc.c:133
+#: src/util/gnunet-ecc.c:138
#, c-format
msgid "Generating %u keys, please wait"
msgstr "Generando %u claves, por favor, espere"
-#: src/util/gnunet-ecc.c:174
+#: src/util/gnunet-ecc.c:179
#, c-format
msgid ""
"\n"
@@ -8675,60 +8854,65 @@ msgstr ""
"\n"
"Se produjo un fallo al escribir en «%s»: %s\n"
-#: src/util/gnunet-ecc.c:184
+#: src/util/gnunet-ecc.c:189
#, fuzzy, c-format
msgid ""
"\n"
"Finished!\n"
msgstr "¡Finalizado!\n"
-#: src/util/gnunet-ecc.c:187
+#: src/util/gnunet-ecc.c:192
#, c-format
msgid ""
"\n"
"Error, %u keys not generated\n"
msgstr ""
-#: src/util/gnunet-ecc.c:280
+#: src/util/gnunet-ecc.c:283
#, fuzzy, c-format
msgid "Hostkeys file `%s' not found\n"
msgstr "El fichero de máquinas %s no fue encontrado\n"
-#: src/util/gnunet-ecc.c:291
+#: src/util/gnunet-ecc.c:294
#, fuzzy, c-format
msgid "Hostkeys file `%s' is empty\n"
msgstr "El archivo de amigos «%s» está vacío.\n"
-#: src/util/gnunet-ecc.c:313
+#: src/util/gnunet-ecc.c:316
#, fuzzy, c-format
msgid "Could not read hostkey file: %s\n"
msgstr "¡No se puede leer el fichero de claves de máquina!\n"
-#: src/util/gnunet-ecc.c:364
+#: src/util/gnunet-ecc.c:367
msgid "No hostkey file specified on command line\n"
msgstr "No se ha especificado la clave de máquina en la línea de comandos\n"
-#: src/util/gnunet-ecc.c:416
+#: src/util/gnunet-ecc.c:425
msgid "list keys included in a file (for testing)"
msgstr ""
-#: src/util/gnunet-ecc.c:421
+#: src/util/gnunet-ecc.c:430
msgid "number of keys to list included in a file (for testing)"
msgstr ""
-#: src/util/gnunet-ecc.c:426
+#: src/util/gnunet-ecc.c:435
msgid "create COUNT public-private key pairs (for testing)"
msgstr "crea «COUNT» pares de claves pública-privada (para pruebas)"
-#: src/util/gnunet-ecc.c:430
+#: src/util/gnunet-ecc.c:439
msgid "print the public key in ASCII format"
msgstr "imprime la clave pública en formato ASCII"
-#: src/util/gnunet-ecc.c:434
+#: src/util/gnunet-ecc.c:443
+#, fuzzy
+msgid "print the public key in HEX format"
+msgstr "imprime la clave pública en formato ASCII"
+
+#: src/util/gnunet-ecc.c:447
msgid "print examples of ECC operations (used for compatibility testing)"
msgstr ""
-#: src/util/gnunet-ecc.c:449
+#: src/util/gnunet-ecc.c:463
msgid "Manipulate GNUnet private ECC key files"
msgstr "Manipular los ficheros de clave privada ECC de GNUnet"
@@ -8823,7 +9007,7 @@ msgstr "Error escribiendo a «%s»: %s\n"
msgid "Unable to shorten unix path `%s' while keeping name unique\n"
msgstr "Imposible acortar la ruta unix «%s» manteniendo el nombre único\n"
-#: src/util/network.c:1793 src/util/network.c:1969
+#: src/util/network.c:1793 src/util/network.c:1977
#, c-format
msgid ""
"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"
msgid "Could not determine plugin installation path.\n"
msgstr "No se pudo determinar la ruta de instalación de los módulos.\n"
-#: src/util/resolver_api.c:204
+#: src/util/resolver_api.c:203
#, c-format
msgid ""
"Missing `%s' for `%s' in configuration, DNS resolution will be unavailable.\n"
@@ -8894,12 +9078,12 @@ msgstr ""
"¡Se debe especificar «%s» o una dirección numérica IP para «%s» de «%s» en "
"la configuración!\n"
-#: src/util/resolver_api.c:815
+#: src/util/resolver_api.c:826
#, c-format
msgid "Timeout trying to resolve hostname `%s'.\n"
msgstr "Expiración de plazo intentando resolver el nombre de máquina «%s».\n"
-#: src/util/resolver_api.c:827
+#: src/util/resolver_api.c:839
#, c-format
msgid "Timeout trying to resolve IP address `%s'.\n"
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"
# Miguel: He traducido "default" por "predeterminado", la locución
# "por defecto" no tiene sentido en sitios como este y he tratado
# de ser consistente.
-#: src/util/resolver_api.c:1004
+#: src/util/resolver_api.c:1023
#, fuzzy
msgid "Resolver not configured correctly.\n"
msgstr "¡El servicio predeterminado «%s» no está configurado correctamente!\n"
-#: src/util/resolver_api.c:1086 src/util/resolver_api.c:1107
-#: src/util/resolver_api.c:1121
+#: src/util/resolver_api.c:1109 src/util/resolver_api.c:1132
+#: src/util/resolver_api.c:1146
#, fuzzy, c-format
msgid "Could not resolve our FQDN: %s\n"
msgstr ""
"No se pudo resolver nuestro nombre de dominio cualificado (FQDN) : %s\n"
-#: src/util/service.c:1306
+#: src/util/service.c:1305
msgid ""
"Could not bind to any of the ports I was supposed to, refusing to run!\n"
msgstr ""
-#: src/util/service.c:2082
+#: src/util/service.c:2081
#, fuzzy, c-format
msgid ""
"Processing code for message of type %u did not call "
@@ -9003,67 +9187,67 @@ msgstr "días"
msgid "end of time"
msgstr "fin del plazo"
-#: src/util/strings.c:1269
+#: src/util/strings.c:1270
msgid "IPv6 address did not start with `['\n"
msgstr "La dirección IPv6 no empezaba con «[»\n"
-#: src/util/strings.c:1277
+#: src/util/strings.c:1278
msgid "IPv6 address did contain ':' to separate port number\n"
msgstr "La dirección IPv6 contenía «:» para separar el número de puerto\n"
-#: src/util/strings.c:1283
+#: src/util/strings.c:1284
msgid "IPv6 address did contain ']' before ':' to separate port number\n"
msgstr ""
"La dirección IPv6 contenía «]» antes de «:» para separar el número de "
"puerto\n"
-#: src/util/strings.c:1290
+#: src/util/strings.c:1291
msgid "IPv6 address did contain a valid port number after the last ':'\n"
msgstr ""
"La dirección IPv6 contenía un número de puerto válido después del último "
"«:»\n"
-#: src/util/strings.c:1299
+#: src/util/strings.c:1300
#, c-format
msgid "Invalid IPv6 address `%s': %s\n"
msgstr "Dirección IPv6 «%s» no válida: %s\n"
-#: src/util/strings.c:1571 src/util/strings.c:1587
+#: src/util/strings.c:1572 src/util/strings.c:1588
msgid "Port not in range\n"
msgstr ""
-#: src/util/strings.c:1596
+#: src/util/strings.c:1597
#, fuzzy, c-format
msgid "Malformed port policy `%s'\n"
msgstr "Se produjo un fallo al iniciar el servicio «%s»\n"
-#: src/util/strings.c:1679 src/util/strings.c:1710 src/util/strings.c:1758
-#: src/util/strings.c:1779
+#: src/util/strings.c:1680 src/util/strings.c:1711 src/util/strings.c:1759
+#: src/util/strings.c:1780
#, c-format
msgid "Invalid format for IP: `%s'\n"
msgstr "Formato no válido para la IP: «%s»\n"
-#: src/util/strings.c:1736
+#: src/util/strings.c:1737
#, c-format
msgid "Invalid network notation ('/%d' is not legal in IPv4 CIDR)."
msgstr "Notación de red no válida («/%d» no es válido en IPv4 CIDR)."
-#: src/util/strings.c:1788
+#: src/util/strings.c:1789
#, fuzzy, c-format
msgid "Invalid format: `%s'\n"
msgstr "Formato de tiempo no válido «%s»\n"
-#: src/util/strings.c:1840
+#: src/util/strings.c:1841
#, c-format
msgid "Invalid network notation (does not end with ';': `%s')\n"
msgstr "Notación de red no válida (no termina con «;»: «%s»)\n"
-#: src/util/strings.c:1890
+#: src/util/strings.c:1891
#, c-format
msgid "Wrong format `%s' for netmask\n"
msgstr "Formato «%s» erroneo para máscara de red\n"
-#: src/util/strings.c:1921
+#: src/util/strings.c:1922
#, c-format
msgid "Wrong format `%s' for network\n"
msgstr "Formato «%s» erroneo para red\n"
@@ -9244,27 +9428,42 @@ msgstr "el servicio es ofrecido vía UDP"
msgid "Setup tunnels via VPN."
msgstr "Configurar túneles vía VPN."
-#: src/zonemaster/gnunet-service-zonemaster.c:705
+#: src/zonemaster/gnunet-service-zonemaster.c:706
msgid "Failed to connect to the namestore!\n"
msgstr "¡Se produjo un fallo al conectar con el almacén de nombres!\n"
-#: src/include/gnunet_common.h:674 src/include/gnunet_common.h:681
-#: src/include/gnunet_common.h:691 src/include/gnunet_common.h:699
+#: src/include/gnunet_common.h:689 src/include/gnunet_common.h:696
+#: src/include/gnunet_common.h:706 src/include/gnunet_common.h:714
#, c-format
msgid "Assertion failed at %s:%d.\n"
msgstr "Aserción fallida en %s:%d.\n"
-#: src/include/gnunet_common.h:711
+#: src/include/gnunet_common.h:726
#, c-format
msgid "External protocol violation detected at %s:%d.\n"
msgstr "Violación externa del protocolo detectada en %s:%d.\n"
-#: src/include/gnunet_common.h:738 src/include/gnunet_common.h:747
+#: src/include/gnunet_common.h:753 src/include/gnunet_common.h:762
#, c-format
msgid "`%s' failed on file `%s' at %s:%d with error: %s\n"
msgstr "«%s» falló en el fichero «%s» en %s:%d con el error: %s\n"
#, fuzzy
+#~ msgid "Token `%s' is malformed\n"
+#~ msgstr "El bloque del tipo %u está mal formado\n"
+
+#~ msgid "Failed to create indices\n"
+#~ msgstr "Se produjo un fallo al crear los índices\n"
+
+#, fuzzy
+#~ msgid "`%s:%s' failed at %s:%d with error: %s\n"
+#~ msgstr "«%s:%s» falló en %s:%d con error: %s"
+
+#, fuzzy
+#~ msgid "Unable to connect to Postgres database '%s': %s\n"
+#~ msgstr "Imposible guardar el fichero de configuración '%s':"
+
+#, fuzzy
#~ msgid "Misconfiguration (can not connect to the ARM service)"
#~ msgstr "¡Se produjo un fallo al conectar con el servicio dv!\n"
@@ -9473,9 +9672,6 @@ msgstr "«%s» falló en el fichero «%s» en %s:%d con el error: %s\n"
#~ msgid "# transmission request failures"
#~ msgstr "# fallos en peticiones de transmisión"
-#~ msgid "# bytes sent to datastore"
-#~ msgstr "# bytes mandados al almacén de datos"
-
#~ msgid "Failed to receive status response from database."
#~ msgstr ""
#~ "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"
#~ "información de pares (PEERINFO)."
#, fuzzy
-#~ msgid "Error reading sensor version\n"
-#~ msgstr "Error leyendo «%s»: %s"
-
-#, fuzzy
#~ msgid "Error reading sensor category\n"
#~ msgstr "Error leyendo «%s»: %s"
diff --git a/po/fr.po b/po/fr.po
index ef13614254..be24a2c35c 100644
--- a/po/fr.po
+++ b/po/fr.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gnunet 0.10.1\n"
"Report-Msgid-Bugs-To: gnunet-developers@mail.gnu.org\n"
-"POT-Creation-Date: 2017-03-31 19:22-0500\n"
+"POT-Creation-Date: 2017-10-20 15:14+0000\n"
"PO-Revision-Date: 2015-12-24 01:20+0100\n"
"Last-Translator: Stéphane Aulery <lkppo@free.fr>\n"
"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"
msgstr ""
#: src/arm/gnunet-service-arm.c:513
-#: src/transport/plugin_transport_http_server.c:2621
+#: src/transport/plugin_transport_http_server.c:2684
#: src/transport/plugin_transport_tcp.c:1259
#: src/transport/tcp_service_legacy.c:696 src/util/service.c:782
#, c-format
@@ -275,7 +275,7 @@ msgid "Failed to resolve `%s': %s\n"
msgstr "Résolution de « %s » échouée : %s\n"
#: src/arm/gnunet-service-arm.c:532
-#: src/transport/plugin_transport_http_server.c:2639
+#: src/transport/plugin_transport_http_server.c:2702
#: src/transport/plugin_transport_tcp.c:1278
#: src/transport/tcp_service_legacy.c:715 src/util/service.c:802
#, c-format
@@ -348,133 +348,14 @@ msgstr ""
msgid "Initiating shutdown as requested by client.\n"
msgstr ""
-#: src/ats/gnunet-ats-solver-eval.c:2781 src/ats/gnunet-ats-solver-eval.c:2822
-#, c-format
-msgid ""
-"Could not load quota for network `%s': `%s', assigning default bandwidth "
-"%llu\n"
-msgstr ""
-
-#: src/ats/gnunet-ats-solver-eval.c:2799
-#, c-format
-msgid ""
-"No outbound quota configured for network `%s', assigning default bandwidth "
-"%llu\n"
-msgstr ""
-
-#: src/ats/gnunet-ats-solver-eval.c:2840
-#, c-format
-msgid ""
-"No outbound quota configure for network `%s', assigning default bandwidth "
-"%llu\n"
-msgstr ""
-
-#: src/ats/gnunet-ats-solver-eval.c:3294
-#: src/ats-tests/gnunet-solver-eval.c:939
-msgid "solver to use"
-msgstr "solveur utilisé"
-
-#: src/ats/gnunet-ats-solver-eval.c:3299
-#: src/ats-tests/gnunet-solver-eval.c:945
-#: src/ats-tests/gnunet-solver-eval.c:950
-msgid "experiment to use"
-msgstr ""
-
-#: src/ats/gnunet-ats-solver-eval.c:3306
-msgid "print logging"
-msgstr "afficher le journal"
-
-#: src/ats/gnunet-ats-solver-eval.c:3311
-msgid "save logging to disk"
-msgstr ""
-
-#: src/ats/gnunet-ats-solver-eval.c:3316
-msgid "disable normalization"
-msgstr ""
-
-#: src/ats/gnunet-service-ats_plugins.c:304
-#, c-format
-msgid ""
-"Could not load %s quota for network `%s': `%s', assigning default bandwidth "
-"%llu\n"
-msgstr ""
-
-#: src/ats/gnunet-service-ats_plugins.c:314
-#, c-format
-msgid "%s quota configured for network `%s' is %llu\n"
-msgstr ""
-
-#: src/ats/gnunet-service-ats_plugins.c:359
-#, c-format
-msgid ""
-"No %s-quota configured for network `%s', assigning default bandwidth %llu\n"
-msgstr ""
-
-#: src/ats/gnunet-service-ats_plugins.c:451
-#, c-format
-msgid "Failed to initialize solver `%s'!\n"
-msgstr ""
-
-#: src/ats/plugin_ats_mlp.c:1274
-msgid "Problem size too large, cannot allocate memory!\n"
-msgstr ""
-
-#: src/ats/plugin_ats_mlp.c:1869
-#, c-format
-msgid "Adding address for peer `%s' multiple times\n"
-msgstr ""
-
-#: src/ats/plugin_ats_mlp.c:1913
-#, c-format
-msgid "Updating address property for peer `%s' %p not added before\n"
-msgstr ""
-
-#: src/ats/plugin_ats_mlp.c:2475
-msgid ""
-"MLP solver is not optimizing for anything, changing to feasibility check\n"
-msgstr ""
-
-#: src/ats/plugin_ats_mlp.c:2515 src/ats/plugin_ats_mlp.c:2532
-#: src/ats/plugin_ats_mlp.c:2564 src/ats/plugin_ats_mlp.c:2582
-#: src/ats/plugin_ats_mlp.c:2601 src/ats/plugin_ats_proportional.c:1141
-#: src/ats/plugin_ats_ril.c:2612 src/ats/plugin_ats_ril.c:2629
-#: src/ats/plugin_ats_ril.c:2646 src/ats/plugin_ats_ril.c:2663
-#: src/ats/plugin_ats_ril.c:2680 src/ats/plugin_ats_ril.c:2697
-#: src/ats/plugin_ats_ril.c:2714 src/ats/plugin_ats_ril.c:2731
-#, fuzzy, c-format
-msgid "Invalid %s configuration %f \n"
-msgstr "fornat invalide : « %s »\n"
-
-#: src/ats/plugin_ats_mlp.c:2670
-#, c-format
-msgid ""
-"Adjusting inconsistent outbound quota configuration for network `%s', is "
-"%llu must be at least %llu\n"
-msgstr ""
-
-#: src/ats/plugin_ats_mlp.c:2679
-#, c-format
-msgid ""
-"Adjusting inconsistent inbound quota configuration for network `%s', is %llu "
-"must be at least %llu\n"
-msgstr ""
-
-#: src/ats/plugin_ats_mlp.c:2689
-#, c-format
-msgid ""
-"Adjusting outbound quota configuration for network `%s'from %llu to %.0f\n"
-msgstr ""
+#: src/ats-tests/ats-testing-log.c:837
+msgid "Stop logging\n"
+msgstr "Arrêter la journalisation\n"
-#: src/ats/plugin_ats_mlp.c:2698
+#: src/ats-tests/ats-testing-log.c:892
#, c-format
-msgid ""
-"Adjusting inbound quota configuration for network `%s' from %llu to %.0f\n"
-msgstr ""
-
-#: src/ats/plugin_ats_proportional.c:1164
-#, fuzzy, c-format
-msgid "Invalid %s configuration %f\n"
-msgstr "fornat invalide : « %s »\n"
+msgid "Start logging `%s'\n"
+msgstr "Démarrer la journalisation « %s »\n"
#: src/ats-tests/ats-testing.c:422
#, c-format
@@ -486,15 +367,6 @@ msgstr ""
msgid "Failed to connect master peer [%u] with slave [%u]\n"
msgstr ""
-#: src/ats-tests/ats-testing-log.c:837
-msgid "Stop logging\n"
-msgstr "Arrêter la journalisation\n"
-
-#: src/ats-tests/ats-testing-log.c:892
-#, c-format
-msgid "Start logging `%s'\n"
-msgstr "Démarrer la journalisation « %s »\n"
-
#: src/ats-tests/gnunet-ats-sim.c:90
#, c-format
msgid ""
@@ -502,6 +374,15 @@ msgid ""
"= %u KiB/s\n"
msgstr ""
+#: src/ats-tests/gnunet-solver-eval.c:939 src/ats/gnunet-ats-solver-eval.c:3294
+msgid "solver to use"
+msgstr "solveur utilisé"
+
+#: src/ats-tests/gnunet-solver-eval.c:945
+#: src/ats-tests/gnunet-solver-eval.c:950 src/ats/gnunet-ats-solver-eval.c:3299
+msgid "experiment to use"
+msgstr ""
+
#: src/ats-tool/gnunet-ats.c:307
#, c-format
msgid "%u address resolutions had a timeout\n"
@@ -617,6 +498,123 @@ msgstr ""
msgid "Print information about ATS state"
msgstr ""
+#: src/ats/gnunet-ats-solver-eval.c:2781 src/ats/gnunet-ats-solver-eval.c:2822
+#, c-format
+msgid ""
+"Could not load quota for network `%s': `%s', assigning default bandwidth "
+"%llu\n"
+msgstr ""
+
+#: src/ats/gnunet-ats-solver-eval.c:2799
+#, c-format
+msgid ""
+"No outbound quota configured for network `%s', assigning default bandwidth "
+"%llu\n"
+msgstr ""
+
+#: src/ats/gnunet-ats-solver-eval.c:2840
+#, c-format
+msgid ""
+"No outbound quota configure for network `%s', assigning default bandwidth "
+"%llu\n"
+msgstr ""
+
+#: src/ats/gnunet-ats-solver-eval.c:3306
+msgid "print logging"
+msgstr "afficher le journal"
+
+#: src/ats/gnunet-ats-solver-eval.c:3311
+msgid "save logging to disk"
+msgstr ""
+
+#: src/ats/gnunet-ats-solver-eval.c:3316
+msgid "disable normalization"
+msgstr ""
+
+#: src/ats/gnunet-service-ats_plugins.c:304
+#, c-format
+msgid ""
+"Could not load %s quota for network `%s': `%s', assigning default bandwidth "
+"%llu\n"
+msgstr ""
+
+#: src/ats/gnunet-service-ats_plugins.c:314
+#, c-format
+msgid "%s quota configured for network `%s' is %llu\n"
+msgstr ""
+
+#: src/ats/gnunet-service-ats_plugins.c:359
+#, c-format
+msgid ""
+"No %s-quota configured for network `%s', assigning default bandwidth %llu\n"
+msgstr ""
+
+#: src/ats/gnunet-service-ats_plugins.c:451
+#, c-format
+msgid "Failed to initialize solver `%s'!\n"
+msgstr ""
+
+#: src/ats/plugin_ats_mlp.c:1274
+msgid "Problem size too large, cannot allocate memory!\n"
+msgstr ""
+
+#: src/ats/plugin_ats_mlp.c:1869
+#, c-format
+msgid "Adding address for peer `%s' multiple times\n"
+msgstr ""
+
+#: src/ats/plugin_ats_mlp.c:1913
+#, c-format
+msgid "Updating address property for peer `%s' %p not added before\n"
+msgstr ""
+
+#: src/ats/plugin_ats_mlp.c:2475
+msgid ""
+"MLP solver is not optimizing for anything, changing to feasibility check\n"
+msgstr ""
+
+#: src/ats/plugin_ats_mlp.c:2515 src/ats/plugin_ats_mlp.c:2532
+#: src/ats/plugin_ats_mlp.c:2564 src/ats/plugin_ats_mlp.c:2582
+#: src/ats/plugin_ats_mlp.c:2601 src/ats/plugin_ats_proportional.c:1141
+#: src/ats/plugin_ats_ril.c:2612 src/ats/plugin_ats_ril.c:2629
+#: src/ats/plugin_ats_ril.c:2646 src/ats/plugin_ats_ril.c:2663
+#: src/ats/plugin_ats_ril.c:2680 src/ats/plugin_ats_ril.c:2697
+#: src/ats/plugin_ats_ril.c:2714 src/ats/plugin_ats_ril.c:2731
+#, fuzzy, c-format
+msgid "Invalid %s configuration %f \n"
+msgstr "fornat invalide : « %s »\n"
+
+#: src/ats/plugin_ats_mlp.c:2670
+#, c-format
+msgid ""
+"Adjusting inconsistent outbound quota configuration for network `%s', is "
+"%llu must be at least %llu\n"
+msgstr ""
+
+#: src/ats/plugin_ats_mlp.c:2679
+#, c-format
+msgid ""
+"Adjusting inconsistent inbound quota configuration for network `%s', is %llu "
+"must be at least %llu\n"
+msgstr ""
+
+#: src/ats/plugin_ats_mlp.c:2689
+#, c-format
+msgid ""
+"Adjusting outbound quota configuration for network `%s'from %llu to %.0f\n"
+msgstr ""
+
+#: src/ats/plugin_ats_mlp.c:2698
+#, c-format
+msgid ""
+"Adjusting inbound quota configuration for network `%s' from %llu to %.0f\n"
+msgstr ""
+
+#: src/ats/plugin_ats_proportional.c:1164
+#, fuzzy, c-format
+msgid "Invalid %s configuration %f\n"
+msgstr "fornat invalide : « %s »\n"
+
#: src/auction/gnunet-auction-create.c:163
msgid "description of the item to be sold"
msgstr ""
@@ -755,6 +753,28 @@ msgstr ""
msgid "Connection to conversation service lost, trying to reconnect\n"
msgstr ""
+#: src/conversation/gnunet-conversation-test.c:119
+#, c-format
+msgid ""
+"\n"
+"End of transmission. Have a GNU day.\n"
+msgstr ""
+
+#: src/conversation/gnunet-conversation-test.c:145
+#, c-format
+msgid ""
+"\n"
+"We are now playing your recording back. If you can hear it, your audio "
+"settings are working..."
+msgstr ""
+
+#: src/conversation/gnunet-conversation-test.c:210
+#, c-format
+msgid ""
+"We will now be recording you for %s. After that time, the recording will be "
+"played back to you..."
+msgstr ""
+
#: src/conversation/gnunet-conversation.c:269
#, c-format
msgid "Incoming call from `%s'. Please /accept %u or /cancel %u the call.\n"
@@ -1008,30 +1028,8 @@ msgstr ""
msgid "Enables having a conversation with other GNUnet users."
msgstr ""
-#: src/conversation/gnunet-conversation-test.c:119
-#, c-format
-msgid ""
-"\n"
-"End of transmission. Have a GNU day.\n"
-msgstr ""
-
-#: src/conversation/gnunet-conversation-test.c:145
-#, c-format
-msgid ""
-"\n"
-"We are now playing your recording back. If you can hear it, your audio "
-"settings are working..."
-msgstr ""
-
-#: src/conversation/gnunet-conversation-test.c:210
-#, c-format
-msgid ""
-"We will now be recording you for %s. After that time, the recording will be "
-"played back to you..."
-msgstr ""
-
-#: src/conversation/gnunet_gst.c:622
#: src/conversation/gnunet-helper-audio-playback-gst.c:356
+#: src/conversation/gnunet_gst.c:622
#, c-format
msgid "Read error from STDIN: %d %s\n"
msgstr ""
@@ -1155,6 +1153,11 @@ msgstr "ogg_stream_init() échoué.\n"
msgid "Failed to allocate %u bytes for second packet\n"
msgstr ""
+#: src/conversation/gnunet-service-conversation.c:1276
+#, c-format
+msgid "Could not open line, port %s already in use!\n"
+msgstr ""
+
#: src/conversation/microphone.c:119
msgid "Could not start record audio helper\n"
msgstr ""
@@ -1418,8 +1421,135 @@ msgstr ""
msgid "# updates to my type map"
msgstr ""
+#: src/credential/credential_misc.c:88
+#, c-format
+msgid "Unable to parse CRED record string `%s'\n"
+msgstr ""
+
+#: src/credential/gnunet-credential.c:278 src/namestore/gnunet-namestore.c:776
+#: src/namestore/plugin_rest_namestore.c:1009
+#, c-format
+msgid "Ego `%s' not known to identity service\n"
+msgstr ""
+
+#: src/credential/gnunet-credential.c:294
+#: src/credential/gnunet-credential.c:446
+#, c-format
+msgid "Issuer public key `%s' is not well-formed\n"
+msgstr ""
+
+#: src/credential/gnunet-credential.c:375
+#: src/credential/gnunet-credential.c:435
+#, c-format
+msgid "Issuer public key not well-formed\n"
+msgstr ""
+
+#: src/credential/gnunet-credential.c:386
+#: src/credential/gnunet-credential.c:455
+#, fuzzy, c-format
+msgid "Failed to connect to CREDENTIAL\n"
+msgstr "Impossible d’ouvrir « %s ».\n"
+
+#: src/credential/gnunet-credential.c:392
+#, c-format
+msgid "You must provide issuer the attribute\n"
+msgstr ""
+
+#: src/credential/gnunet-credential.c:399
+#, c-format
+msgid "ego required\n"
+msgstr ""
+
+#: src/credential/gnunet-credential.c:415
+#, c-format
+msgid "Subject public key needed\n"
+msgstr ""
+
+#: src/credential/gnunet-credential.c:426
+#, c-format
+msgid "Subject public key `%s' is not well-formed\n"
+msgstr ""
+
+#: src/credential/gnunet-credential.c:461
+#, c-format
+msgid "You must provide issuer and subject attributes\n"
+msgstr ""
+
+#: src/credential/gnunet-credential.c:511
+#, c-format
+msgid "Issuer ego required\n"
+msgstr ""
+
+#: src/credential/gnunet-credential.c:523
+#, c-format
+msgid "Please specify name to lookup, subject key and issuer key!\n"
+msgstr ""
+
+#: src/credential/gnunet-credential.c:543
+msgid "create credential"
+msgstr ""
+
+#: src/credential/gnunet-credential.c:547
+msgid "verify credential against attribute"
+msgstr ""
+
+#: src/credential/gnunet-credential.c:552
+msgid "The public key of the subject to lookup the credential for"
+msgstr ""
+
+#: src/credential/gnunet-credential.c:557
+msgid "The name of the credential presented by the subject"
+msgstr ""
+
+#: src/credential/gnunet-credential.c:562
+msgid "The public key of the authority to verify the credential against"
+msgstr ""
+
+#: src/credential/gnunet-credential.c:567
+msgid "The ego to use"
+msgstr ""
+
+#: src/credential/gnunet-credential.c:572
+msgid "The issuer attribute to verify against or to issue"
+msgstr ""
+
+#: src/credential/gnunet-credential.c:577
+msgid "The time to live for the credential"
+msgstr ""
+
+#: src/credential/gnunet-credential.c:581
+msgid "collect credentials"
+msgstr ""
+
+#: src/credential/gnunet-credential.c:595
+msgid "GNUnet credential resolver tool"
+msgstr ""
+
+#: src/credential/gnunet-service-credential.c:1204
+#: src/gns/gnunet-gns-helper-service-w32.c:727 src/gns/gnunet-gns.c:355
+#, c-format
+msgid "Failed to connect to GNS\n"
+msgstr ""
+
+#: src/credential/gnunet-service-credential.c:1210
+#: src/namestore/gnunet-namestore-fcfsd.c:1034
+#: src/namestore/gnunet-namestore.c:802
+#: src/namestore/plugin_rest_namestore.c:1022
+#, c-format
+msgid "Failed to connect to namestore\n"
+msgstr ""
+
+#: src/credential/plugin_gnsrecord_credential.c:186
+#, fuzzy, c-format
+msgid "Unable to parse ATTR record string `%s'\n"
+msgstr "Résolution de « %s » échouée\n"
+
+#: src/credential/plugin_rest_credential.c:1155 src/gns/plugin_rest_gns.c:668
+msgid "GNS REST API initialized\n"
+msgstr ""
+
#: src/datacache/datacache.c:119 src/datacache/datacache.c:294
-#: src/datastore/gnunet-service-datastore.c:775
+#: src/datastore/gnunet-service-datastore.c:757
msgid "# bytes stored"
msgstr ""
@@ -1459,13 +1589,12 @@ msgstr ""
#: src/datacache/plugin_datacache_sqlite.c:113
#: src/datacache/plugin_datacache_sqlite.c:122
-#: src/datastore/plugin_datastore_mysql.c:980
+#: src/datastore/plugin_datastore_mysql.c:892
#: src/datastore/plugin_datastore_sqlite.c:58
-#: src/datastore/plugin_datastore_sqlite.c:66 src/my/my.c:80 src/my/my.c:92
-#: src/mysql/mysql.c:42 src/mysql/mysql.c:49
-#: src/namecache/plugin_namecache_postgres.c:53
+#: src/datastore/plugin_datastore_sqlite.c:66
+#: src/identity-provider/plugin_identity_provider_sqlite.c:52 src/my/my.c:80
+#: src/my/my.c:92 src/mysql/mysql.c:42 src/mysql/mysql.c:49
#: src/namecache/plugin_namecache_sqlite.c:53
-#: src/namestore/plugin_namestore_postgres.c:53
#: src/namestore/plugin_namestore_sqlite.c:53
#: src/peerstore/plugin_peerstore_sqlite.c:52
#: src/psycstore/plugin_psycstore_mysql.c:62
@@ -1474,14 +1603,15 @@ msgstr ""
#: src/testbed/gnunet-daemon-testbed-underlay.c:56
#: src/testbed/testbed_api_hosts.c:69 src/util/crypto_ecc.c:52
#: src/util/crypto_ecc_setup.c:41 src/util/crypto_mpi.c:39
-#: src/include/gnunet_common.h:720 src/include/gnunet_common.h:729
+#: src/include/gnunet_common.h:735 src/include/gnunet_common.h:744
#: src/scalarproduct/scalarproduct.h:35
#, c-format
msgid "`%s' failed at %s:%d with error: %s\n"
msgstr ""
#: src/datacache/plugin_datacache_sqlite.c:817
-#: src/datastore/plugin_datastore_sqlite.c:475
+#: src/datastore/plugin_datastore_sqlite.c:456
+#: src/identity-provider/plugin_identity_provider_sqlite.c:336
#: src/namecache/plugin_namecache_sqlite.c:296
#: src/namestore/plugin_namestore_sqlite.c:355
msgid "Tried to close sqlite without finalizing all prepared statements.\n"
@@ -1545,23 +1675,70 @@ msgstr ""
msgid "# GET requests executed"
msgstr ""
-#: src/datastore/gnunet-datastore.c:113
+#: src/datastore/gnunet-datastore.c:189
+#, c-format
+msgid "Dumped %<PRIu64> records\n"
+msgstr ""
+
+#: src/datastore/gnunet-datastore.c:217 src/datastore/gnunet-datastore.c:229
+#, c-format
+msgid "Short write to file: %zd bytes expecting %zd\n"
+msgstr ""
+
+#: src/datastore/gnunet-datastore.c:261
+msgid "Error queueing datastore GET operation\n"
+msgstr ""
+
+#: src/datastore/gnunet-datastore.c:287 src/datastore/gnunet-datastore.c:412
+#, fuzzy, c-format
+msgid "Unable to open dump file: %s\n"
+msgstr "Résolution de « %s » échouée\n"
+
+#: src/datastore/gnunet-datastore.c:326
#, c-format
msgid "Failed to store item: %s, aborting\n"
msgstr ""
-#: src/datastore/gnunet-datastore.c:209
+#: src/datastore/gnunet-datastore.c:340
#, c-format
-msgid "Cannot use the same configuration for source and destination\n"
+msgid "Inserted %<PRIu64> records\n"
msgstr ""
-#: src/datastore/gnunet-datastore.c:256
-msgid ""
-"specifies the configuration to use to access an alternative datastore; will "
-"merge that datastore into our current datastore"
+#: src/datastore/gnunet-datastore.c:349 src/datastore/gnunet-datastore.c:363
+#, c-format
+msgid "Short read from file: %zd bytes expecting %zd\n"
+msgstr ""
+
+#: src/datastore/gnunet-datastore.c:389
+msgid "Error queueing datastore PUT operation\n"
+msgstr ""
+
+#: src/datastore/gnunet-datastore.c:432
+msgid "Input file is not of a supported format\n"
+msgstr ""
+
+#: src/datastore/gnunet-datastore.c:458
+msgid "Failed connecting to the datastore.\n"
msgstr ""
-#: src/datastore/gnunet-datastore.c:265
+#: src/datastore/gnunet-datastore.c:470
+#, c-format
+msgid "Please choose at least one operation: %s, %s\n"
+msgstr ""
+
+#: src/datastore/gnunet-datastore.c:493
+msgid "Dump all records from the datastore"
+msgstr ""
+
+#: src/datastore/gnunet-datastore.c:497
+msgid "Insert records into the datastore"
+msgstr ""
+
+#: src/datastore/gnunet-datastore.c:502
+msgid "File to dump or insert"
+msgstr ""
+
+#: src/datastore/gnunet-datastore.c:511
msgid "Manipulate GNUnet datastore"
msgstr ""
@@ -1603,8 +1780,8 @@ msgstr ""
#: src/datastore/gnunet-service-datastore.c:634
#: src/datastore/gnunet-service-datastore.c:689
-#: src/datastore/gnunet-service-datastore.c:977
-#: src/datastore/gnunet-service-datastore.c:1633
+#: src/datastore/gnunet-service-datastore.c:837
+#: src/datastore/gnunet-service-datastore.c:1469
msgid "# reserved"
msgstr "# réservé"
@@ -1612,140 +1789,141 @@ msgstr "# réservé"
msgid "Could not find matching reservation"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:792
+#: src/datastore/gnunet-service-datastore.c:773
#, c-format
msgid "Need %llu bytes more space (%llu allowed, using %llu)\n"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1026
+#: src/datastore/gnunet-service-datastore.c:876
msgid "# GET requests received"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1058
+#: src/datastore/gnunet-service-datastore.c:907
msgid "# GET KEY requests received"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1071
+#: src/datastore/gnunet-service-datastore.c:920
msgid "# requests filtered by bloomfilter"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1108
+#: src/datastore/gnunet-service-datastore.c:956
msgid "# GET REPLICATION requests received"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1141
+#: src/datastore/gnunet-service-datastore.c:989
msgid "# GET ZERO ANONYMITY requests received"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1190
+#: src/datastore/gnunet-service-datastore.c:1036
msgid "Content not found"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1199
+#: src/datastore/gnunet-service-datastore.c:1043
msgid "# bytes removed (explicit request)"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1246
+#: src/datastore/gnunet-service-datastore.c:1088
msgid "# REMOVE requests received"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1301
+#: src/datastore/gnunet-service-datastore.c:1137
#, c-format
msgid ""
"Datastore payload must have been inaccurate (%lld < %lld). Recomputing it.\n"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1307
-#: src/datastore/gnunet-service-datastore.c:1482
+#: src/datastore/gnunet-service-datastore.c:1143
+#: src/datastore/gnunet-service-datastore.c:1318
#, c-format
msgid "New payload: %lld\n"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1361
+#: src/datastore/gnunet-service-datastore.c:1197
#, c-format
msgid "Loading `%s' datastore plugin\n"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1373
+#: src/datastore/gnunet-service-datastore.c:1209
#, c-format
msgid "Failed to load datastore plugin for `%s'\n"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1433
+#: src/datastore/gnunet-service-datastore.c:1269
msgid "Bloomfilter construction complete.\n"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1489
+#: src/datastore/gnunet-service-datastore.c:1325
msgid "Rebuilding bloomfilter. Please be patient.\n"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1500
+#: src/datastore/gnunet-service-datastore.c:1336
msgid "Plugin does not support get_keys function. Please fix!\n"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1670
+#: src/datastore/gnunet-service-datastore.c:1506
#, c-format
msgid "# bytes used in file-sharing datastore `%s'"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1686
+#: src/datastore/gnunet-service-datastore.c:1522
msgid "# quota"
msgstr "# quota"
-#: src/datastore/gnunet-service-datastore.c:1691
+#: src/datastore/gnunet-service-datastore.c:1527
msgid "# cache size"
msgstr "# taille du cache"
-#: src/datastore/gnunet-service-datastore.c:1707
+#: src/datastore/gnunet-service-datastore.c:1543
#, c-format
msgid "Could not use specified filename `%s' for bloomfilter.\n"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1725
-#: src/datastore/gnunet-service-datastore.c:1741
+#: src/datastore/gnunet-service-datastore.c:1561
+#: src/datastore/gnunet-service-datastore.c:1577
#, c-format
msgid "Failed to remove bogus bloomfilter file `%s'\n"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1773
+#: src/datastore/gnunet-service-datastore.c:1609
msgid "Failed to initialize bloomfilter.\n"
msgstr ""
-#: src/datastore/plugin_datastore_heap.c:769
+#: src/datastore/plugin_datastore_heap.c:893
msgid "Heap database running\n"
msgstr ""
-#: src/datastore/plugin_datastore_mysql.c:377
-#: src/datastore/plugin_datastore_sqlite.c:590
-msgid "Data too large"
+#: src/datastore/plugin_datastore_mysql.c:371
+#: src/datastore/plugin_datastore_mysql.c:423
+#: src/datastore/plugin_datastore_mysql.c:1075
+msgid "MySQL statement run failure"
msgstr ""
-#: src/datastore/plugin_datastore_mysql.c:393
-msgid "MySQL statement run failure"
+#: src/datastore/plugin_datastore_mysql.c:410
+#: src/datastore/plugin_datastore_sqlite.c:626
+msgid "Data too large"
msgstr ""
-#: src/datastore/plugin_datastore_mysql.c:936
+#: src/datastore/plugin_datastore_mysql.c:848
#, c-format
msgid "`%s' for `%s' failed at %s:%d with error: %s\n"
msgstr ""
-#: src/datastore/plugin_datastore_mysql.c:1208
+#: src/datastore/plugin_datastore_mysql.c:1180
#: src/psycstore/plugin_psycstore_mysql.c:1936
msgid "Mysql database running\n"
msgstr ""
-#: src/datastore/plugin_datastore_postgres.c:345
+#: src/datastore/plugin_datastore_postgres.c:274
+#: src/datastore/plugin_datastore_postgres.c:891
msgid "Postgress exec failure"
msgstr ""
-#: src/datastore/plugin_datastore_postgres.c:866
+#: src/datastore/plugin_datastore_postgres.c:852
msgid "Failed to drop table from database.\n"
msgstr ""
-#: src/datastore/plugin_datastore_postgres.c:903
-#: src/namecache/plugin_namecache_postgres.c:398
-#: src/namestore/plugin_namestore_postgres.c:571
-#: src/psycstore/plugin_psycstore_postgres.c:1721
+#: src/datastore/plugin_datastore_postgres.c:950
+#: src/psycstore/plugin_psycstore_postgres.c:1506
msgid "Postgres database running\n"
msgstr ""
@@ -1757,7 +1935,8 @@ msgstr ""
msgid "`%s' failed at %s:%u with error: %s"
msgstr ""
-#: src/datastore/plugin_datastore_sqlite.c:281
+#: src/datastore/plugin_datastore_sqlite.c:271
+#: src/identity-provider/plugin_identity_provider_sqlite.c:212
#: src/namecache/plugin_namecache_sqlite.c:194
#: src/namestore/plugin_namestore_sqlite.c:222
#: src/peerstore/plugin_peerstore_sqlite.c:535
@@ -1766,24 +1945,29 @@ msgstr ""
msgid "Unable to initialize SQLite: %s.\n"
msgstr ""
-#: src/datastore/plugin_datastore_sqlite.c:1234
+#: src/datastore/plugin_datastore_sqlite.c:577
+msgid "sqlite bind failure"
+msgstr ""
+
+#: src/datastore/plugin_datastore_sqlite.c:1259
msgid "sqlite version to old to determine size, assuming zero\n"
msgstr ""
-#: src/datastore/plugin_datastore_sqlite.c:1268
+#: src/datastore/plugin_datastore_sqlite.c:1293
#, c-format
msgid ""
"Using sqlite page utilization to estimate payload (%llu pages of size %llu "
"bytes)\n"
msgstr ""
-#: src/datastore/plugin_datastore_sqlite.c:1312
+#: src/datastore/plugin_datastore_sqlite.c:1337
+#: src/identity-provider/plugin_identity_provider_sqlite.c:711
#: src/namecache/plugin_namecache_sqlite.c:603
#: src/namestore/plugin_namestore_sqlite.c:802
msgid "Sqlite database running\n"
msgstr ""
-#: src/datastore/plugin_datastore_template.c:259
+#: src/datastore/plugin_datastore_template.c:253
msgid "Template database running\n"
msgstr ""
@@ -1846,52 +2030,6 @@ msgstr ""
msgid "Prints all packets that go through the DHT."
msgstr ""
-#: src/dht/gnunet_dht_profiler.c:1161
-#: src/testbed/gnunet-testbed-profiler.c:255
-#, c-format
-msgid "Exiting as the number of peers is %u\n"
-msgstr ""
-
-#: src/dht/gnunet_dht_profiler.c:1188
-#, fuzzy
-msgid "number of peers to start"
-msgstr "nombre de valeurs"
-
-#: src/dht/gnunet_dht_profiler.c:1194
-msgid ""
-"maximum number of times we try to search for successor circle formation (0 "
-"for R5N)"
-msgstr ""
-
-#: src/dht/gnunet_dht_profiler.c:1200 src/nse/gnunet-nse-profiler.c:853
-#: src/testbed/gnunet-testbed-profiler.c:305
-msgid "name of the file with the login information for the testbed"
-msgstr ""
-
-#: src/dht/gnunet_dht_profiler.c:1206
-msgid "delay between rounds for collecting statistics (default: 30 sec)"
-msgstr ""
-
-#: src/dht/gnunet_dht_profiler.c:1212
-msgid "delay to start doing PUTs (default: 1 sec)"
-msgstr ""
-
-#: src/dht/gnunet_dht_profiler.c:1218
-msgid "delay to start doing GETs (default: 5 min)"
-msgstr ""
-
-#: src/dht/gnunet_dht_profiler.c:1223
-msgid "replication degree for DHT PUTs"
-msgstr ""
-
-#: src/dht/gnunet_dht_profiler.c:1230
-msgid "timeout for DHT PUT and GET requests (default: 1 min)"
-msgstr ""
-
-#: src/dht/gnunet_dht_profiler.c:1248
-msgid "Measure quality and performance of the DHT service."
-msgstr ""
-
#: src/dht/gnunet-dht-put.c:120
msgid "PUT request sent with key"
msgstr ""
@@ -2141,6 +2279,51 @@ msgstr ""
msgid "# DHT requests combined"
msgstr ""
+#: src/dht/gnunet_dht_profiler.c:1161 src/testbed/gnunet-testbed-profiler.c:255
+#, c-format
+msgid "Exiting as the number of peers is %u\n"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:1188
+#, fuzzy
+msgid "number of peers to start"
+msgstr "nombre de valeurs"
+
+#: src/dht/gnunet_dht_profiler.c:1194
+msgid ""
+"maximum number of times we try to search for successor circle formation (0 "
+"for R5N)"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:1200 src/nse/gnunet-nse-profiler.c:853
+#: src/testbed/gnunet-testbed-profiler.c:305
+msgid "name of the file with the login information for the testbed"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:1206
+msgid "delay between rounds for collecting statistics (default: 30 sec)"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:1212
+msgid "delay to start doing PUTs (default: 1 sec)"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:1218
+msgid "delay to start doing GETs (default: 5 min)"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:1223
+msgid "replication degree for DHT PUTs"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:1230
+msgid "timeout for DHT PUT and GET requests (default: 1 min)"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:1248
+msgid "Measure quality and performance of the DHT service."
+msgstr ""
+
#: src/dht/plugin_block_dht.c:187
#, c-format
msgid "Block not of type %u\n"
@@ -2455,7 +2638,7 @@ msgstr ""
msgid "No useful service enabled. Exiting.\n"
msgstr ""
-#: src/exit/gnunet-daemon-exit.c:3969
+#: src/exit/gnunet-daemon-exit.c:3970
msgid "Daemon to run to provide an IP exit node for the VPN"
msgstr ""
@@ -3074,14 +3257,6 @@ msgid ""
"chk/...)"
msgstr ""
-#: src/fs/gnunet-fs.c:119
-msgid "print a list of all indexed files"
-msgstr ""
-
-#: src/fs/gnunet-fs.c:130
-msgid "Special file-sharing operations"
-msgstr ""
-
#: src/fs/gnunet-fs-profiler.c:211
msgid "run the experiment with COUNT peers"
msgstr ""
@@ -3098,6 +3273,14 @@ msgstr ""
msgid "run a testbed to measure file-sharing performance"
msgstr ""
+#: src/fs/gnunet-fs.c:119
+msgid "print a list of all indexed files"
+msgstr ""
+
+#: src/fs/gnunet-fs.c:130
+msgid "Special file-sharing operations"
+msgstr ""
+
#: src/fs/gnunet-publish.c:219 src/fs/gnunet-publish.c:231
#, c-format
msgid "Publishing `%s' at %llu/%llu (%s remaining)\n"
@@ -3743,22 +3926,11 @@ msgstr ""
msgid "GNUnet DNS-to-GNS proxy (a DNS server)"
msgstr ""
-#: src/gns/gnunet-gns.c:235 src/gns/plugin_rest_gns.c:346
-#, c-format
-msgid "Invalid typename specified, assuming `ANY'\n"
-msgstr ""
-
-#: src/gns/gnunet-gns.c:252
-#, c-format
-msgid "Please specify name to lookup!\n"
-msgstr ""
-
-#: src/gns/gnunet-gns.c:276
-#, c-format
-msgid "Ego for `%s' not found, cannot perform lookup.\n"
+#: src/gns/gnunet-gns-helper-service-w32.c:602
+msgid "Not ready to process requests, lacking ego data\n"
msgstr ""
-#: src/gns/gnunet-gns.c:315 src/gns/gnunet-gns-helper-service-w32.c:701
+#: src/gns/gnunet-gns-helper-service-w32.c:701 src/gns/gnunet-gns.c:315
#: src/gns/plugin_rest_gns.c:422
#, c-format
msgid ""
@@ -3766,54 +3938,12 @@ msgid ""
"gns-import.sh?\n"
msgstr ""
-#: src/gns/gnunet-gns.c:355 src/gns/gnunet-gns-helper-service-w32.c:727
-#, c-format
-msgid "Failed to connect to GNS\n"
-msgstr ""
-
-#: src/gns/gnunet-gns.c:374
-#, c-format
-msgid "Public key `%s' is not well-formed\n"
-msgstr ""
-
-#: src/gns/gnunet-gns.c:428
-msgid "Lookup a record for the given name"
-msgstr ""
-
-#: src/gns/gnunet-gns.c:434
-msgid "Specify the type of the record to lookup"
-msgstr ""
-
-#: src/gns/gnunet-gns.c:440
-msgid "Specify timeout for the lookup"
-msgstr ""
-
-#: src/gns/gnunet-gns.c:445
-msgid "No unneeded output"
-msgstr ""
-
-#: src/gns/gnunet-gns.c:451
-msgid "Specify the public key of the zone to lookup the record in"
-msgstr ""
-
-#: src/gns/gnunet-gns.c:457
-msgid "Specify the name of the ego of the zone to lookup the record in"
-msgstr ""
-
-#: src/gns/gnunet-gns.c:476
-msgid "GNUnet GNS resolver tool"
-msgstr ""
-
-#: src/gns/gnunet-gns-helper-service-w32.c:602
-msgid "Not ready to process requests, lacking ego data\n"
-msgstr ""
-
#: src/gns/gnunet-gns-helper-service-w32.c:739
#, c-format
msgid "Failed to connect to identity service\n"
msgstr ""
-#: src/gns/gnunet-gns-import.c:489
+#: src/gns/gnunet-gns-import.c:452
msgid "This program will import some GNS authorities into your GNS namestore."
msgstr ""
@@ -3937,12 +4067,60 @@ msgstr ""
msgid "GNUnet GNS proxy"
msgstr ""
+#: src/gns/gnunet-gns.c:235 src/gns/plugin_rest_gns.c:346
+#, c-format
+msgid "Invalid typename specified, assuming `ANY'\n"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:252
+#, c-format
+msgid "Please specify name to lookup!\n"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:276
+#, c-format
+msgid "Ego for `%s' not found, cannot perform lookup.\n"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:374
+#, c-format
+msgid "Public key `%s' is not well-formed\n"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:428
+msgid "Lookup a record for the given name"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:434
+msgid "Specify the type of the record to lookup"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:440
+msgid "Specify timeout for the lookup"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:445
+msgid "No unneeded output"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:451
+msgid "Specify the public key of the zone to lookup the record in"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:457
+msgid "Specify the name of the ego of the zone to lookup the record in"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:476
+msgid "GNUnet GNS resolver tool"
+msgstr ""
+
#: src/gns/gnunet-service-gns.c:442
msgid "Failed to connect to the namecache!\n"
msgstr ""
#: src/gns/gnunet-service-gns.c:461
-#: src/zonemaster/gnunet-service-zonemaster.c:741
+#: src/zonemaster/gnunet-service-zonemaster.c:742
msgid "Could not connect to DHT!\n"
msgstr ""
@@ -3997,44 +4175,35 @@ msgstr ""
msgid "Hostname `%s' is not well-formed, resolution fails\n"
msgstr ""
-#: src/gns/plugin_gnsrecord_gns.c:203
+#: src/gns/plugin_gnsrecord_gns.c:179
#, c-format
msgid "Unable to parse PKEY record `%s'\n"
msgstr ""
-#: src/gns/plugin_gnsrecord_gns.c:232
+#: src/gns/plugin_gnsrecord_gns.c:208
#, c-format
msgid "Unable to parse GNS2DNS record `%s'\n"
msgstr ""
-#: src/gns/plugin_gnsrecord_gns.c:253
+#: src/gns/plugin_gnsrecord_gns.c:229
#, c-format
msgid "Failed to serialize GNS2DNS record with value `%s'\n"
msgstr ""
-#: src/gns/plugin_gnsrecord_gns.c:276
+#: src/gns/plugin_gnsrecord_gns.c:252
#, c-format
msgid "Unable to parse VPN record string `%s'\n"
msgstr ""
-#: src/gns/plugin_gnsrecord_gns.c:312
+#: src/gns/plugin_gnsrecord_gns.c:288
#, c-format
msgid "Unable to parse BOX record string `%s'\n"
msgstr ""
-#: src/gns/plugin_gnsrecord_gns.c:360
-#, c-format
-msgid "Unable to parse REVERSE record string `%s'\n"
-msgstr ""
-
#: src/gns/plugin_rest_gns.c:384
msgid "Ego for not found, cannot perform lookup.\n"
msgstr ""
-#: src/gns/plugin_rest_gns.c:668
-msgid "GNS REST API initialized\n"
-msgstr ""
-
#: src/gnsrecord/plugin_gnsrecord_dns.c:359
#, c-format
msgid "Unable to parse IPv4 address `%s'\n"
@@ -4454,6 +4623,51 @@ msgstr ""
msgid "Could not start hostlist HTTP server on port %u\n"
msgstr ""
+#: src/identity-provider/gnunet-idp.c:348
+msgid "Ego is required\n"
+msgstr ""
+
+#: src/identity-provider/gnunet-idp.c:370
+msgid "Add attribute"
+msgstr ""
+
+#: src/identity-provider/gnunet-idp.c:376
+msgid "Attribute value"
+msgstr ""
+
+#: src/identity-provider/gnunet-idp.c:381
+msgid "Ego"
+msgstr ""
+
+#: src/identity-provider/gnunet-idp.c:386
+msgid "Audience (relying party)"
+msgstr ""
+
+#: src/identity-provider/gnunet-idp.c:390
+msgid "List attributes for Ego"
+msgstr ""
+
+#: src/identity-provider/gnunet-idp.c:395
+msgid "Issue a ticket"
+msgstr ""
+
+#: src/identity-provider/gnunet-idp.c:400
+msgid "Consume a ticket"
+msgstr ""
+
+#: src/identity-provider/gnunet-idp.c:405
+msgid "Revoke a ticket"
+msgstr ""
+
+#: src/identity-provider/identity_provider_api.c:429
+#, fuzzy
+msgid "failed to store record\n"
+msgstr "Échec du démarrage de %s\n"
+
+#: src/identity-provider/plugin_rest_identity_provider.c:1175
+msgid "Identity Provider REST API initialized\n"
+msgstr ""
+
#: src/identity/gnunet-identity.c:179
#, c-format
msgid "Failed to create ego: %s\n"
@@ -4541,31 +4755,10 @@ msgstr ""
msgid "Failed to create directory `%s' for storing egos\n"
msgstr ""
-#: src/identity/plugin_rest_identity.c:967
+#: src/identity/plugin_rest_identity.c:964
msgid "Identity REST API initialized\n"
msgstr ""
-#: src/identity-provider/gnunet-identity-token.c:66
-msgid "Option `-t' is required\n"
-msgstr ""
-
-#: src/identity-provider/gnunet-identity-token.c:77
-#, c-format
-msgid "Token `%s' is malformed\n"
-msgstr ""
-
-#: src/identity-provider/gnunet-identity-token.c:166
-msgid "GNUid token"
-msgstr ""
-
-#: src/identity-provider/gnunet-identity-token.c:171
-msgid "Print token contents"
-msgstr ""
-
-#: src/identity-provider/plugin_rest_identity_provider.c:1166
-msgid "Identity Token REST API initialized\n"
-msgstr ""
-
#: src/json/json.c:119
#, fuzzy, c-format
msgid "Failed to parse JSON in option `%s': %s (%s)\n"
@@ -4663,9 +4856,62 @@ msgstr "Résolution de « %s » échouée\n"
msgid "flat plugin running\n"
msgstr ""
-#: src/namecache/plugin_namecache_postgres.c:90
-#: src/namestore/plugin_namestore_postgres.c:97
-msgid "Failed to create indices\n"
+#: src/namestore/gnunet-namestore-fcfsd.c:508
+#, c-format
+msgid "Unsupported form value `%s'\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:535
+#, c-format
+msgid "Failed to create record for domain `%s': %s\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:555
+msgid "Error when mapping zone to name\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:585
+#, c-format
+msgid "Found existing name `%s' for the given key\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:662
+#, c-format
+msgid "Found %u existing records for domain `%s'\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:718
+#, c-format
+msgid "Failed to create page for `%s'\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:734
+#, c-format
+msgid "Failed to setup post processor for `%s'\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:770
+msgid "Domain name must not contain `.'\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:778
+msgid "Domain name must not contain `+'\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:974
+msgid "No ego configured for `fcfsd` subsystem\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:1000
+msgid "Failed to start HTTP server\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:1042
+msgid "Failed to connect to identity\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:1074
+msgid "GNU Name System First Come First Serve name registration service"
msgstr ""
#: src/namestore/gnunet-namestore.c:301
@@ -4674,13 +4920,13 @@ msgid "Adding record failed: %s\n"
msgstr ""
#: src/namestore/gnunet-namestore.c:330
-#: src/namestore/plugin_rest_namestore.c:562
+#: src/namestore/plugin_rest_namestore.c:567
#, c-format
msgid "Deleting record failed, record does not exist%s%s\n"
msgstr ""
#: src/namestore/gnunet-namestore.c:337
-#: src/namestore/plugin_rest_namestore.c:571
+#: src/namestore/plugin_rest_namestore.c:576
#, c-format
msgid "Deleting record failed%s%s\n"
msgstr ""
@@ -4698,7 +4944,7 @@ msgid "Records already exist under `%s', cannot add `%s' record.\n"
msgstr ""
#: src/namestore/gnunet-namestore.c:698
-#: src/namestore/plugin_rest_namestore.c:597
+#: src/namestore/plugin_rest_namestore.c:602
#, c-format
msgid "There are no records under label `%s' that could be deleted.\n"
msgstr ""
@@ -4709,23 +4955,11 @@ msgid ""
"There are no records under label `%s' that match the request for deletion.\n"
msgstr ""
-#: src/namestore/gnunet-namestore.c:776
-#: src/namestore/plugin_rest_namestore.c:1004
-#, c-format
-msgid "Ego `%s' not known to identity service\n"
-msgstr ""
-
#: src/namestore/gnunet-namestore.c:791
#, c-format
msgid "No options given\n"
msgstr ""
-#: src/namestore/gnunet-namestore.c:802
-#: src/namestore/gnunet-namestore-fcfsd.c:1034
-#: src/namestore/plugin_rest_namestore.c:1017
-msgid "Failed to connect to namestore\n"
-msgstr ""
-
#: src/namestore/gnunet-namestore.c:810 src/namestore/gnunet-namestore.c:819
#: src/namestore/gnunet-namestore.c:838 src/namestore/gnunet-namestore.c:861
#: src/namestore/gnunet-namestore.c:915
@@ -4739,14 +4973,14 @@ msgid "add"
msgstr "ajouter"
#: src/namestore/gnunet-namestore.c:829
-#: src/namestore/plugin_rest_namestore.c:671
+#: src/namestore/plugin_rest_namestore.c:676
#, c-format
msgid "Unsupported type `%s'\n"
msgstr ""
#: src/namestore/gnunet-namestore.c:851
-#: src/namestore/plugin_rest_namestore.c:689
-#: src/namestore/plugin_rest_namestore.c:729
+#: src/namestore/plugin_rest_namestore.c:694
+#: src/namestore/plugin_rest_namestore.c:734
#, c-format
msgid "Value `%s' invalid for record type `%s'\n"
msgstr ""
@@ -4765,8 +4999,7 @@ msgstr "supprimer"
msgid "Invalid public key for reverse lookup `%s'\n"
msgstr ""
-#: src/namestore/gnunet-namestore.c:979
-#: src/peerinfo-tool/gnunet-peerinfo.c:775
+#: src/namestore/gnunet-namestore.c:979 src/peerinfo-tool/gnunet-peerinfo.c:775
#, c-format
msgid "Invalid URI `%s'\n"
msgstr "URI invalide « %s »\n"
@@ -4777,13 +5010,13 @@ msgid "Invalid nick `%s'\n"
msgstr ""
#: src/namestore/gnunet-namestore.c:1051
-#: src/namestore/plugin_rest_namestore.c:1047
+#: src/namestore/plugin_rest_namestore.c:1052
#, c-format
msgid "No default ego configured in identity service\n"
msgstr ""
#: src/namestore/gnunet-namestore.c:1108
-#: src/namestore/plugin_rest_namestore.c:1143
+#: src/namestore/plugin_rest_namestore.c:1148
#, c-format
msgid "Cannot connect to identity service\n"
msgstr ""
@@ -4843,65 +5076,7 @@ msgstr ""
msgid "name of the ego controlling the zone"
msgstr ""
-#: src/namestore/gnunet-namestore-fcfsd.c:508
-#, c-format
-msgid "Unsupported form value `%s'\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:535
-#, c-format
-msgid "Failed to create record for domain `%s': %s\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:555
-msgid "Error when mapping zone to name\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:585
-#, c-format
-msgid "Found existing name `%s' for the given key\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:662
-#, c-format
-msgid "Found %u existing records for domain `%s'\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:718
-#, c-format
-msgid "Failed to create page for `%s'\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:734
-#, c-format
-msgid "Failed to setup post processor for `%s'\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:770
-msgid "Domain name must not contain `.'\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:778
-msgid "Domain name must not contain `+'\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:974
-msgid "No ego configured for `fcfsd` subsystem\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:1000
-msgid "Failed to start HTTP server\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:1042
-msgid "Failed to connect to identity\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:1074
-msgid "GNU Name System First Come First Serve name registration service"
-msgstr ""
-
-#: src/namestore/gnunet-service-namestore.c:612
+#: src/namestore/gnunet-service-namestore.c:615
#, c-format
msgid "Failed to replicate block in namecache: %s\n"
msgstr ""
@@ -4914,7 +5089,7 @@ msgstr ""
msgid "flat file database running\n"
msgstr ""
-#: src/namestore/plugin_rest_namestore.c:1188
+#: src/namestore/plugin_rest_namestore.c:1193
msgid "Namestore REST API initialized\n"
msgstr ""
@@ -5189,10 +5364,6 @@ msgstr ""
msgid "`upnpc' command not found\n"
msgstr ""
-#: src/nse/gnunet-nse.c:122
-msgid "Show network size estimates from NSE service."
-msgstr ""
-
#: src/nse/gnunet-nse-profiler.c:842
msgid "limit to the number of connections to NSE services, 0 for none"
msgstr ""
@@ -5217,65 +5388,15 @@ msgstr ""
msgid "Measure quality and performance of the NSE service."
msgstr ""
+#: src/nse/gnunet-nse.c:122
+msgid "Show network size estimates from NSE service."
+msgstr ""
+
#: src/nse/gnunet-service-nse.c:1534
#: src/revocation/gnunet-service-revocation.c:838 src/util/gnunet-scrypt.c:276
msgid "Value is too large.\n"
msgstr ""
-#: src/peerinfo/gnunet-service-peerinfo.c:178
-#, c-format
-msgid "Removing expired address of transport `%s'\n"
-msgstr ""
-
-#: src/peerinfo/gnunet-service-peerinfo.c:310
-#, c-format
-msgid "Failed to parse HELLO in file `%s': %s\n"
-msgstr ""
-
-#: src/peerinfo/gnunet-service-peerinfo.c:331
-#: src/peerinfo/gnunet-service-peerinfo.c:362
-#, c-format
-msgid "Failed to parse HELLO in file `%s'\n"
-msgstr ""
-
-#: src/peerinfo/gnunet-service-peerinfo.c:446
-msgid "# peers known"
-msgstr ""
-
-#: src/peerinfo/gnunet-service-peerinfo.c:489
-#, c-format
-msgid ""
-"File `%s' in directory `%s' does not match naming convention. Removed.\n"
-msgstr ""
-
-#: src/peerinfo/gnunet-service-peerinfo.c:655
-#, c-format
-msgid "Scanning directory `%s'\n"
-msgstr ""
-
-#: src/peerinfo/gnunet-service-peerinfo.c:663
-#, c-format
-msgid "Still no peers found in `%s'!\n"
-msgstr ""
-
-#: src/peerinfo/gnunet-service-peerinfo.c:1076
-#, c-format
-msgid "Cleaning up directory `%s'\n"
-msgstr ""
-
-#: src/peerinfo/gnunet-service-peerinfo.c:1405
-#, c-format
-msgid "Importing HELLOs from `%s'\n"
-msgstr ""
-
-#: src/peerinfo/gnunet-service-peerinfo.c:1418
-msgid "Skipping import of included HELLOs\n"
-msgstr ""
-
-#: src/peerinfo/peerinfo_api.c:220
-msgid "Failed to receive response from `PEERINFO' service."
-msgstr ""
-
#: src/peerinfo-tool/gnunet-peerinfo.c:239
#, c-format
msgid "%sPeer `%s'\n"
@@ -5365,6 +5486,60 @@ msgstr ""
msgid "Failed to load transport plugin for `%s'\n"
msgstr ""
+#: src/peerinfo/gnunet-service-peerinfo.c:178
+#, c-format
+msgid "Removing expired address of transport `%s'\n"
+msgstr ""
+
+#: src/peerinfo/gnunet-service-peerinfo.c:310
+#, c-format
+msgid "Failed to parse HELLO in file `%s': %s\n"
+msgstr ""
+
+#: src/peerinfo/gnunet-service-peerinfo.c:331
+#: src/peerinfo/gnunet-service-peerinfo.c:362
+#, c-format
+msgid "Failed to parse HELLO in file `%s'\n"
+msgstr ""
+
+#: src/peerinfo/gnunet-service-peerinfo.c:446
+msgid "# peers known"
+msgstr ""
+
+#: src/peerinfo/gnunet-service-peerinfo.c:489
+#, c-format
+msgid ""
+"File `%s' in directory `%s' does not match naming convention. Removed.\n"
+msgstr ""
+
+#: src/peerinfo/gnunet-service-peerinfo.c:655
+#, c-format
+msgid "Scanning directory `%s'\n"
+msgstr ""
+
+#: src/peerinfo/gnunet-service-peerinfo.c:663
+#, c-format
+msgid "Still no peers found in `%s'!\n"
+msgstr ""
+
+#: src/peerinfo/gnunet-service-peerinfo.c:1076
+#, c-format
+msgid "Cleaning up directory `%s'\n"
+msgstr ""
+
+#: src/peerinfo/gnunet-service-peerinfo.c:1405
+#, c-format
+msgid "Importing HELLOs from `%s'\n"
+msgstr ""
+
+#: src/peerinfo/gnunet-service-peerinfo.c:1418
+msgid "Skipping import of included HELLOs\n"
+msgstr ""
+
+#: src/peerinfo/peerinfo_api.c:220
+msgid "Failed to receive response from `PEERINFO' service."
+msgstr ""
+
#: src/peerstore/gnunet-peerstore.c:91
msgid "peerstore"
msgstr ""
@@ -5412,16 +5587,11 @@ msgstr ""
msgid "Unable to create indices: %s.\n"
msgstr ""
-#: src/postgres/postgres.c:67
+#: src/pq/pq_prepare.c:80
#, c-format
-msgid "`%s:%s' failed at %s:%d with error: %s\n"
+msgid "PQprepare (`%s' as `%s') failed with error: %s\n"
msgstr ""
-#: src/postgres/postgres.c:192
-#, fuzzy, c-format
-msgid "Unable to connect to Postgres database '%s': %s\n"
-msgstr "Résolution de « %s » échouée\n"
-
#: src/psycstore/gnunet-service-psycstore.c:249
msgid "Failed to store membership information!\n"
msgstr ""
@@ -5580,56 +5750,56 @@ msgstr ""
msgid "Daemon to announce regular expressions for the peer using cadet."
msgstr ""
-#: src/regex/gnunet-regex-profiler.c:1314
+#: src/regex/gnunet-regex-profiler.c:1386
msgid "No configuration file given. Exiting\n"
msgstr ""
-#: src/regex/gnunet-regex-profiler.c:1355
+#: src/regex/gnunet-regex-profiler.c:1427
#: src/regex/gnunet-regex-simulation-profiler.c:630
#, c-format
msgid "No policy directory specified on command line. Exiting.\n"
msgstr ""
-#: src/regex/gnunet-regex-profiler.c:1361
+#: src/regex/gnunet-regex-profiler.c:1433
#: src/regex/gnunet-regex-simulation-profiler.c:638
#, c-format
msgid "Specified policies directory does not exist. Exiting.\n"
msgstr ""
-#: src/regex/gnunet-regex-profiler.c:1368
+#: src/regex/gnunet-regex-profiler.c:1440
#, c-format
msgid "No files found in `%s'\n"
msgstr ""
-#: src/regex/gnunet-regex-profiler.c:1377
+#: src/regex/gnunet-regex-profiler.c:1449
msgid "No search strings file given. Exiting.\n"
msgstr ""
-#: src/regex/gnunet-regex-profiler.c:1397
+#: src/regex/gnunet-regex-profiler.c:1469
msgid "Error loading search strings. Exiting.\n"
msgstr ""
-#: src/regex/gnunet-regex-profiler.c:1485
+#: src/regex/gnunet-regex-profiler.c:1557
msgid "name of the file for writing statistics"
msgstr ""
-#: src/regex/gnunet-regex-profiler.c:1491
+#: src/regex/gnunet-regex-profiler.c:1563
msgid "wait TIMEOUT before ending the experiment"
msgstr ""
-#: src/regex/gnunet-regex-profiler.c:1497
+#: src/regex/gnunet-regex-profiler.c:1569
msgid "directory with policy files"
msgstr ""
-#: src/regex/gnunet-regex-profiler.c:1504
+#: src/regex/gnunet-regex-profiler.c:1576
msgid "name of file with input strings"
msgstr ""
-#: src/regex/gnunet-regex-profiler.c:1510
+#: src/regex/gnunet-regex-profiler.c:1582
msgid "name of file with hosts' names"
msgstr ""
-#: src/regex/gnunet-regex-profiler.c:1523
+#: src/regex/gnunet-regex-profiler.c:1595
msgid "Profiler for regex"
msgstr ""
@@ -5851,10 +6021,10 @@ msgstr ""
msgid "Calculate the Vectorproduct with a GNUnet peer."
msgstr ""
-#: src/scalarproduct/gnunet-service-scalarproduct_alice.c:1407
-#: src/scalarproduct/gnunet-service-scalarproduct_bob.c:1345
-#: src/scalarproduct/gnunet-service-scalarproduct-ecc_alice.c:1180
+#: src/scalarproduct/gnunet-service-scalarproduct-ecc_alice.c:1172
#: src/scalarproduct/gnunet-service-scalarproduct-ecc_bob.c:1063
+#: src/scalarproduct/gnunet-service-scalarproduct_alice.c:1401
+#: src/scalarproduct/gnunet-service-scalarproduct_bob.c:1345
msgid "Connect to CADET failed\n"
msgstr ""
@@ -5878,7 +6048,7 @@ msgstr "threshold"
msgid "also profile decryption"
msgstr ""
-#: src/set/gnunet-service-set.c:1948
+#: src/set/gnunet-service-set.c:1989
#, fuzzy
msgid "Could not connect to CADET service\n"
msgstr "Impossible d’ouvrir « %s ».\n"
@@ -5935,112 +6105,112 @@ msgstr ""
msgid "say good-bye and leave somebody else's place"
msgstr ""
-#: src/social/gnunet-social.c:1227 src/social/gnunet-social.c:1232
+#: src/social/gnunet-social.c:1227
msgid "create a place"
msgstr ""
-#: src/social/gnunet-social.c:1237
+#: src/social/gnunet-social.c:1232
msgid "destroy a place we were hosting"
msgstr ""
-#: src/social/gnunet-social.c:1242
+#: src/social/gnunet-social.c:1237
msgid "enter somebody else's place"
msgstr ""
-#: src/social/gnunet-social.c:1248
+#: src/social/gnunet-social.c:1243
msgid "find state matching name prefix"
msgstr ""
-#: src/social/gnunet-social.c:1253
+#: src/social/gnunet-social.c:1248
msgid "replay history of messages up to the given --limit"
msgstr ""
-#: src/social/gnunet-social.c:1258
+#: src/social/gnunet-social.c:1253
msgid "reconnect to a previously created place"
msgstr ""
-#: src/social/gnunet-social.c:1263
+#: src/social/gnunet-social.c:1258
msgid "publish something to a place we are hosting"
msgstr ""
-#: src/social/gnunet-social.c:1268
+#: src/social/gnunet-social.c:1263
msgid "reconnect to a previously entered place"
msgstr ""
-#: src/social/gnunet-social.c:1273
+#: src/social/gnunet-social.c:1268
msgid "search for state matching exact name"
msgstr ""
-#: src/social/gnunet-social.c:1278
+#: src/social/gnunet-social.c:1273
msgid "submit something to somebody's place"
msgstr ""
-#: src/social/gnunet-social.c:1283
+#: src/social/gnunet-social.c:1278
msgid "list of egos and subscribed places"
msgstr ""
-#: src/social/gnunet-social.c:1288
+#: src/social/gnunet-social.c:1283
msgid "extract and replay history between message IDs --start and --until"
msgstr ""
-#: src/social/gnunet-social.c:1297
+#: src/social/gnunet-social.c:1292
msgid "application ID to use when connecting"
msgstr ""
-#: src/social/gnunet-social.c:1303
+#: src/social/gnunet-social.c:1298
msgid "message body or state value"
msgstr ""
-#: src/social/gnunet-social.c:1309
+#: src/social/gnunet-social.c:1304
msgid "name or public key of ego"
msgstr ""
-#: src/social/gnunet-social.c:1314
+#: src/social/gnunet-social.c:1309
msgid "wait for incoming messages"
msgstr ""
-#: src/social/gnunet-social.c:1320
+#: src/social/gnunet-social.c:1315
msgid "GNS name"
msgstr ""
-#: src/social/gnunet-social.c:1326
+#: src/social/gnunet-social.c:1321
msgid "peer ID for --guest-enter"
msgstr ""
-#: src/social/gnunet-social.c:1332
+#: src/social/gnunet-social.c:1327
msgid "name (key) to query from state"
msgstr ""
-#: src/social/gnunet-social.c:1338
+#: src/social/gnunet-social.c:1333
msgid "method name"
msgstr ""
-#: src/social/gnunet-social.c:1344
+#: src/social/gnunet-social.c:1339
#, fuzzy
msgid "number of messages to replay from history"
msgstr "nombre de valeurs"
-#: src/social/gnunet-social.c:1350
+#: src/social/gnunet-social.c:1345
msgid "key address of place"
msgstr ""
-#: src/social/gnunet-social.c:1356
+#: src/social/gnunet-social.c:1351
msgid "start message ID for history replay"
msgstr ""
-#: src/social/gnunet-social.c:1361
+#: src/social/gnunet-social.c:1356
msgid "respond to entry requests by admitting all guests"
msgstr ""
-#: src/social/gnunet-social.c:1367
+#: src/social/gnunet-social.c:1362
msgid "end message ID for history replay"
msgstr ""
-#: src/social/gnunet-social.c:1372
+#: src/social/gnunet-social.c:1367
msgid "respond to entry requests by refusing all guests"
msgstr ""
-#: src/social/gnunet-social.c:1382
+#: src/social/gnunet-social.c:1377
msgid ""
"gnunet-social - Interact with the social service: enter/leave, send/receive "
"messages, access history and state.\n"
@@ -6230,7 +6400,7 @@ msgid ""
msgstr ""
#: src/testbed/gnunet-daemon-testbed-underlay.c:231 src/testing/list-keys.c:46
-#: src/testing/testing.c:288 src/util/gnunet-ecc.c:298
+#: src/testing/testing.c:288 src/util/gnunet-ecc.c:301
#, c-format
msgid "Incorrect hostkey file format: %s\n"
msgstr ""
@@ -6300,15 +6470,6 @@ msgstr ""
msgid "%.s Unknown result code."
msgstr "%.s Code d'erreur inconnu"
-#: src/testbed/gnunet_testbed_mpi_spawn.c:118
-msgid "Waiting for child to exit.\n"
-msgstr ""
-
-#: src/testbed/gnunet_testbed_mpi_spawn.c:241
-#, c-format
-msgid "Spawning process `%s'\n"
-msgstr ""
-
#: src/testbed/gnunet-testbed-profiler.c:290
msgid "tolerate COUNT number of continious timeout failures"
msgstr ""
@@ -6320,6 +6481,15 @@ msgid ""
"signal is received"
msgstr ""
+#: src/testbed/gnunet_testbed_mpi_spawn.c:118
+msgid "Waiting for child to exit.\n"
+msgstr ""
+
+#: src/testbed/gnunet_testbed_mpi_spawn.c:241
+#, c-format
+msgid "Spawning process `%s'\n"
+msgstr ""
+
#: src/testbed/testbed_api.c:410
#, c-format
msgid "Adding host %u failed with error: %s\n"
@@ -6607,10 +6777,6 @@ msgstr ""
msgid "GNUnet topology control"
msgstr ""
-#: src/transport/gnunet-service-transport_ats.c:141
-msgid "# Addresses given to ATS"
-msgstr ""
-
#: src/transport/gnunet-service-transport.c:448
msgid "# messages dropped due to slow client"
msgstr ""
@@ -6655,6 +6821,10 @@ msgstr ""
msgid "Transport service is lacking key configuration settings. Exiting.\n"
msgstr ""
+#: src/transport/gnunet-service-transport_ats.c:141
+msgid "# Addresses given to ATS"
+msgstr ""
+
#: src/transport/gnunet-service-transport_hello.c:195
msgid "# refreshed my HELLO"
msgstr ""
@@ -6956,6 +7126,42 @@ msgstr ""
msgid "# validations succeeded"
msgstr ""
+#: src/transport/gnunet-transport-profiler.c:219
+#, c-format
+msgid "%llu B in %llu ms == %.2f KB/s!\n"
+msgstr ""
+
+#: src/transport/gnunet-transport-profiler.c:617
+msgid "send data to peer"
+msgstr ""
+
+#: src/transport/gnunet-transport-profiler.c:621
+msgid "receive data from peer"
+msgstr ""
+
+#: src/transport/gnunet-transport-profiler.c:626
+msgid "iterations"
+msgstr ""
+
+#: src/transport/gnunet-transport-profiler.c:631
+#, fuzzy
+msgid "number of messages to send"
+msgstr "nombre de valeurs"
+
+#: src/transport/gnunet-transport-profiler.c:636
+msgid "message size to use"
+msgstr ""
+
+#: src/transport/gnunet-transport-profiler.c:641
+#: src/transport/gnunet-transport.c:1462
+msgid "peer identity"
+msgstr ""
+
+#: src/transport/gnunet-transport-profiler.c:652
+#: src/transport/gnunet-transport.c:1482
+msgid "Direct access to transport service."
+msgstr ""
+
#: src/transport/gnunet-transport.c:413
#, c-format
msgid "Transmitted %llu bytes/s (%llu bytes in %s)\n"
@@ -7084,11 +7290,6 @@ msgstr ""
msgid "do not resolve hostnames"
msgstr ""
-#: src/transport/gnunet-transport.c:1462
-#: src/transport/gnunet-transport-profiler.c:641
-msgid "peer identity"
-msgstr ""
-
#: src/transport/gnunet-transport.c:1466
msgid "monitor plugin sessions"
msgstr ""
@@ -7097,40 +7298,9 @@ msgstr ""
msgid "send data for benchmarking to the other peer (until CTRL-C)"
msgstr ""
-#: src/transport/gnunet-transport.c:1482
-#: src/transport/gnunet-transport-profiler.c:652
-msgid "Direct access to transport service."
-msgstr ""
-
-#: src/transport/gnunet-transport-profiler.c:219
-#, c-format
-msgid "%llu B in %llu ms == %.2f KB/s!\n"
-msgstr ""
-
-#: src/transport/gnunet-transport-profiler.c:617
-msgid "send data to peer"
-msgstr ""
-
-#: src/transport/gnunet-transport-profiler.c:621
-msgid "receive data from peer"
-msgstr ""
-
-#: src/transport/gnunet-transport-profiler.c:626
-msgid "iterations"
-msgstr ""
-
-#: src/transport/gnunet-transport-profiler.c:631
-#, fuzzy
-msgid "number of messages to send"
-msgstr "nombre de valeurs"
-
-#: src/transport/gnunet-transport-profiler.c:636
-msgid "message size to use"
-msgstr ""
-
#: src/transport/plugin_transport_http_client.c:1474
-#: src/transport/plugin_transport_http_server.c:2249
-#: src/transport/plugin_transport_http_server.c:3463
+#: src/transport/plugin_transport_http_server.c:2312
+#: src/transport/plugin_transport_http_server.c:3526
#: src/transport/plugin_transport_tcp.c:3890
#: src/transport/plugin_transport_tcp.c:3897
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"
msgstr ""
#: src/transport/plugin_transport_http_client.c:2164
-#: src/transport/plugin_transport_http_server.c:3178
+#: src/transport/plugin_transport_http_server.c:3241
#, c-format
msgid "Shutting down plugin `%s'\n"
msgstr ""
#: src/transport/plugin_transport_http_client.c:2181
-#: src/transport/plugin_transport_http_server.c:3248
+#: src/transport/plugin_transport_http_server.c:3311
#, c-format
msgid "Shutdown for plugin `%s' complete\n"
msgstr ""
@@ -7158,102 +7328,102 @@ msgstr ""
msgid "Maximum number of requests is %u\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:1727
+#: src/transport/plugin_transport_http_server.c:1756
#, c-format
msgid ""
"Access from connection %p (%u of %u) for `%s' `%s' url `%s' with upload data "
"size %u\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:1967
+#: src/transport/plugin_transport_http_server.c:2028
#, c-format
msgid "Accepting connection (%u of %u) from `%s'\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:1975
+#: src/transport/plugin_transport_http_server.c:2036
#, c-format
msgid ""
"Server reached maximum number connections (%u), rejecting new connection\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:2125
+#: src/transport/plugin_transport_http_server.c:2186
msgid ""
"Could not create a new TLS certificate, program `gnunet-transport-"
"certificate-creation' could not be started!\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:2148
+#: src/transport/plugin_transport_http_server.c:2209
#, c-format
msgid "No usable TLS certificate found and creating one at `%s/%s' failed!\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:2275
+#: src/transport/plugin_transport_http_server.c:2338
msgid "Could not load or create server certificate! Loading plugin failed!\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:2587
+#: src/transport/plugin_transport_http_server.c:2650
msgid "Require valid port number for service in configuration!\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:2752
+#: src/transport/plugin_transport_http_server.c:2815
#, c-format
msgid "Found %u addresses to report to NAT service\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:2838
+#: src/transport/plugin_transport_http_server.c:2901
#: src/transport/plugin_transport_udp.c:3622
msgid "Disabling IPv6 since it is not supported on this system!\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:2944
+#: src/transport/plugin_transport_http_server.c:3007
#, c-format
msgid "IPv4 support is %s\n"
msgstr "Prise en charge d’IPv4 %s\n"
-#: src/transport/plugin_transport_http_server.c:2959
+#: src/transport/plugin_transport_http_server.c:3022
#, c-format
msgid "IPv6 support is %s\n"
msgstr "Prise en charge d’IPv6 %s\n"
-#: src/transport/plugin_transport_http_server.c:2965
+#: src/transport/plugin_transport_http_server.c:3028
msgid "Neither IPv4 nor IPv6 are enabled! Fix in configuration\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:2976
+#: src/transport/plugin_transport_http_server.c:3039
msgid "Port is required! Fix in configuration\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:2982
+#: src/transport/plugin_transport_http_server.c:3045
#, c-format
msgid "Using port %u\n"
msgstr "Utilisation du port %u\n"
-#: src/transport/plugin_transport_http_server.c:3001
+#: src/transport/plugin_transport_http_server.c:3064
#, c-format
msgid "Specific IPv4 address `%s' in configuration file is invalid!\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:3036
+#: src/transport/plugin_transport_http_server.c:3099
#, c-format
msgid "Specific IPv6 address `%s' in configuration file is invalid!\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:3111
+#: src/transport/plugin_transport_http_server.c:3174
#, c-format
msgid "Using external hostname `%s'\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:3132
+#: src/transport/plugin_transport_http_server.c:3195
#, c-format
msgid "Notifying transport only about hostname `%s'\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:3149
+#: src/transport/plugin_transport_http_server.c:3212
#, c-format
msgid "Maximum number of connections is %u\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:3475
+#: src/transport/plugin_transport_http_server.c:3538
msgid "Unable to compile URL regex\n"
msgstr ""
@@ -7393,20 +7563,6 @@ msgstr ""
msgid "TCP transport advertises itself as being on port %llu\n"
msgstr ""
-#: src/transport/plugin_transport_udp_broadcasting.c:168
-msgid "# Multicast HELLO beacons received via UDP"
-msgstr ""
-
-#: src/transport/plugin_transport_udp_broadcasting.c:548
-msgid ""
-"Disabling HELLO broadcasting due to friend-to-friend only configuration!\n"
-msgstr ""
-
-#: src/transport/plugin_transport_udp_broadcasting.c:565
-#, c-format
-msgid "Failed to set IPv4 broadcast option for broadcast socket on port %d\n"
-msgstr ""
-
#: src/transport/plugin_transport_udp.c:3366
#, c-format
msgid ""
@@ -7453,6 +7609,20 @@ msgstr "adresse invalide"
msgid "Failed to create UDP network sockets\n"
msgstr ""
+#: src/transport/plugin_transport_udp_broadcasting.c:168
+msgid "# Multicast HELLO beacons received via UDP"
+msgstr ""
+
+#: src/transport/plugin_transport_udp_broadcasting.c:548
+msgid ""
+"Disabling HELLO broadcasting due to friend-to-friend only configuration!\n"
+msgstr ""
+
+#: src/transport/plugin_transport_udp_broadcasting.c:565
+#, c-format
+msgid "Failed to set IPv4 broadcast option for broadcast socket on port %d\n"
+msgstr ""
+
#: src/transport/plugin_transport_unix.c:1403
#, c-format
msgid "Cannot create path to `%s'\n"
@@ -7557,7 +7727,7 @@ msgid ""
"`GNUNET_SERVER_receive_done' after %s\n"
msgstr ""
-#: src/transport/tcp_service_legacy.c:339 src/util/service.c:2337
+#: src/transport/tcp_service_legacy.c:339 src/util/service.c:2336
#, c-format
msgid "Unknown address family %d\n"
msgstr ""
@@ -7602,50 +7772,50 @@ msgstr ""
msgid "Service `%s' runs at %s\n"
msgstr ""
-#: src/transport/tcp_service_legacy.c:1251 src/util/service.c:1501
+#: src/transport/tcp_service_legacy.c:1251 src/util/service.c:1500
msgid "Service process failed to initialize\n"
msgstr ""
-#: src/transport/tcp_service_legacy.c:1255 src/util/service.c:1505
+#: src/transport/tcp_service_legacy.c:1255 src/util/service.c:1504
msgid "Service process could not initialize server function\n"
msgstr ""
-#: src/transport/tcp_service_legacy.c:1259 src/util/service.c:1509
+#: src/transport/tcp_service_legacy.c:1259 src/util/service.c:1508
msgid "Service process failed to report status\n"
msgstr ""
#: src/transport/tcp_service_legacy.c:1313 src/util/disk.c:1488
-#: src/util/service.c:1379
+#: src/util/service.c:1378
#, c-format
msgid "Cannot obtain information about user `%s': %s\n"
msgstr ""
-#: src/transport/tcp_service_legacy.c:1314 src/util/service.c:1381
+#: src/transport/tcp_service_legacy.c:1314 src/util/service.c:1380
msgid "No such user"
msgstr "Aucun utilisateur trouvé"
-#: src/transport/tcp_service_legacy.c:1327 src/util/service.c:1400
+#: src/transport/tcp_service_legacy.c:1327 src/util/service.c:1399
#, c-format
msgid "Cannot change user/group to `%s': %s\n"
msgstr ""
-#: src/transport/tcp_service_legacy.c:1398 src/util/service.c:1728
+#: src/transport/tcp_service_legacy.c:1398 src/util/service.c:1727
msgid "do daemonize (detach from terminal)"
msgstr ""
#: src/transport/tcp_service_legacy.c:1448 src/util/program.c:244
-#: src/util/service.c:1791
+#: src/util/service.c:1790
#, c-format
msgid "Malformed configuration file `%s', exit ...\n"
msgstr ""
#: src/transport/tcp_service_legacy.c:1458 src/util/program.c:261
-#: src/util/service.c:1802
+#: src/util/service.c:1801
msgid "Malformed configuration, exit ...\n"
msgstr ""
#: src/transport/tcp_service_legacy.c:1463 src/util/program.c:256
-#: src/util/service.c:1808
+#: src/util/service.c:1807
#, c-format
msgid "Could not access configuration file `%s'\n"
msgstr ""
@@ -7689,86 +7859,86 @@ msgstr ""
msgid "Need a non-empty hostname for service `%s'.\n"
msgstr ""
-#: src/util/common_logging.c:256 src/util/common_logging.c:1129
+#: src/util/common_logging.c:259 src/util/common_logging.c:1132
msgid "DEBUG"
msgstr "DEBUG"
-#: src/util/common_logging.c:258 src/util/common_logging.c:1127
+#: src/util/common_logging.c:261 src/util/common_logging.c:1130
msgid "INFO"
msgstr "INFO"
-#: src/util/common_logging.c:260 src/util/common_logging.c:1125
+#: src/util/common_logging.c:263 src/util/common_logging.c:1128
msgid "MESSAGE"
msgstr ""
-#: src/util/common_logging.c:262 src/util/common_logging.c:1123
+#: src/util/common_logging.c:265 src/util/common_logging.c:1126
msgid "WARNING"
msgstr "AVERTISSEMENT"
-#: src/util/common_logging.c:264 src/util/common_logging.c:1121
+#: src/util/common_logging.c:267 src/util/common_logging.c:1124
msgid "ERROR"
msgstr "ERREUR"
-#: src/util/common_logging.c:266 src/util/common_logging.c:1131
+#: src/util/common_logging.c:269 src/util/common_logging.c:1134
msgid "NONE"
msgstr "AUCUN"
-#: src/util/common_logging.c:879
+#: src/util/common_logging.c:882
#, c-format
msgid "Message `%.*s' repeated %u times in the last %s\n"
msgstr ""
-#: src/util/common_logging.c:1132
+#: src/util/common_logging.c:1135
msgid "INVALID"
msgstr "INVALIDE"
-#: src/util/common_logging.c:1302
+#: src/util/common_logging.c:1326
msgid "unknown address"
msgstr "adresse inconnue"
-#: src/util/common_logging.c:1344
+#: src/util/common_logging.c:1368
msgid "invalid address"
msgstr "adresse invalide"
-#: src/util/common_logging.c:1362
+#: src/util/common_logging.c:1386
#, c-format
msgid "Configuration fails to specify option `%s' in section `%s'!\n"
msgstr ""
-#: src/util/common_logging.c:1383
+#: src/util/common_logging.c:1407
#, c-format
msgid ""
"Configuration specifies invalid value for option `%s' in section `%s': %s\n"
msgstr ""
-#: src/util/configuration.c:286
+#: src/util/configuration.c:296
#, c-format
msgid "Syntax error while deserializing in line %u\n"
msgstr ""
-#: src/util/configuration.c:344
+#: src/util/configuration.c:355
#, fuzzy, c-format
msgid "Error while reading file `%s'\n"
msgstr "Erreur de lecture : « %s » : %s"
-#: src/util/configuration.c:1017
+#: src/util/configuration.c:1034
#, c-format
msgid ""
"Configuration value '%s' for '%s' in section '%s' is not in set of legal "
"choices\n"
msgstr ""
-#: src/util/configuration.c:1136
+#: src/util/configuration.c:1153
#, c-format
msgid "Recursive expansion suspected, aborting $-expansion for term `%s'\n"
msgstr ""
-#: src/util/configuration.c:1169
+#: src/util/configuration.c:1186
#, c-format
msgid "Missing closing `%s' in option `%s'\n"
msgstr ""
-#: src/util/configuration.c:1237
+#: src/util/configuration.c:1254
#, c-format
msgid ""
"Failed to expand `%s' in `%s' as it is neither found in [PATHS] nor defined "
@@ -7802,31 +7972,31 @@ msgstr ""
msgid "EdDSA signature verification failed at %s:%d: %s\n"
msgstr ""
-#: src/util/crypto_ecc_setup.c:122 src/util/crypto_ecc_setup.c:160
-#: src/util/crypto_ecc_setup.c:278 src/util/crypto_ecc_setup.c:316
+#: src/util/crypto_ecc_setup.c:122 src/util/crypto_ecc_setup.c:161
+#: src/util/crypto_ecc_setup.c:279 src/util/crypto_ecc_setup.c:317
#, c-format
msgid "Could not acquire lock on file `%s': %s...\n"
msgstr ""
-#: src/util/crypto_ecc_setup.c:127 src/util/crypto_ecc_setup.c:283
+#: src/util/crypto_ecc_setup.c:128 src/util/crypto_ecc_setup.c:284
msgid "Creating a new private key. This may take a while.\n"
msgstr ""
-#: src/util/crypto_ecc_setup.c:164 src/util/crypto_ecc_setup.c:320
+#: src/util/crypto_ecc_setup.c:165 src/util/crypto_ecc_setup.c:322
msgid "This may be ok if someone is currently generating a private key.\n"
msgstr ""
-#: src/util/crypto_ecc_setup.c:194 src/util/crypto_ecc_setup.c:350
+#: src/util/crypto_ecc_setup.c:195 src/util/crypto_ecc_setup.c:352
#, c-format
msgid ""
"When trying to read key file `%s' I found %u bytes but I need at least %u.\n"
msgstr ""
-#: src/util/crypto_ecc_setup.c:198 src/util/crypto_ecc_setup.c:354
+#: src/util/crypto_ecc_setup.c:199 src/util/crypto_ecc_setup.c:356
msgid "This may be ok if someone is currently generating a key.\n"
msgstr ""
-#: src/util/crypto_ecc_setup.c:413
+#: src/util/crypto_ecc_setup.c:415
msgid "Could not load peer's private key\n"
msgstr ""
@@ -8014,29 +8184,29 @@ msgstr ""
msgid "Manipulate GNUnet configuration files"
msgstr ""
-#: src/util/gnunet-ecc.c:84
+#: src/util/gnunet-ecc.c:89
#, c-format
msgid "Failed to open `%s': %s\n"
msgstr ""
-#: src/util/gnunet-ecc.c:120
+#: src/util/gnunet-ecc.c:125
#, c-format
msgid "Generating %u keys like %s, please wait"
msgstr ""
-#: src/util/gnunet-ecc.c:133
+#: src/util/gnunet-ecc.c:138
#, c-format
msgid "Generating %u keys, please wait"
msgstr ""
-#: src/util/gnunet-ecc.c:174
+#: src/util/gnunet-ecc.c:179
#, c-format
msgid ""
"\n"
"Failed to write to `%s': %s\n"
msgstr ""
-#: src/util/gnunet-ecc.c:184
+#: src/util/gnunet-ecc.c:189
#, c-format
msgid ""
"\n"
@@ -8045,53 +8215,57 @@ msgstr ""
"\n"
"Terminé !\n"
-#: src/util/gnunet-ecc.c:187
+#: src/util/gnunet-ecc.c:192
#, c-format
msgid ""
"\n"
"Error, %u keys not generated\n"
msgstr ""
-#: src/util/gnunet-ecc.c:280
+#: src/util/gnunet-ecc.c:283
#, c-format
msgid "Hostkeys file `%s' not found\n"
msgstr ""
-#: src/util/gnunet-ecc.c:291
+#: src/util/gnunet-ecc.c:294
#, c-format
msgid "Hostkeys file `%s' is empty\n"
msgstr ""
-#: src/util/gnunet-ecc.c:313
+#: src/util/gnunet-ecc.c:316
#, c-format
msgid "Could not read hostkey file: %s\n"
msgstr ""
-#: src/util/gnunet-ecc.c:364
+#: src/util/gnunet-ecc.c:367
msgid "No hostkey file specified on command line\n"
msgstr ""
-#: src/util/gnunet-ecc.c:416
+#: src/util/gnunet-ecc.c:425
msgid "list keys included in a file (for testing)"
msgstr ""
-#: src/util/gnunet-ecc.c:421
+#: src/util/gnunet-ecc.c:430
msgid "number of keys to list included in a file (for testing)"
msgstr ""
-#: src/util/gnunet-ecc.c:426
+#: src/util/gnunet-ecc.c:435
msgid "create COUNT public-private key pairs (for testing)"
msgstr ""
-#: src/util/gnunet-ecc.c:430
+#: src/util/gnunet-ecc.c:439
msgid "print the public key in ASCII format"
msgstr ""
-#: src/util/gnunet-ecc.c:434
+#: src/util/gnunet-ecc.c:443
+msgid "print the public key in HEX format"
+msgstr ""
+
+#: src/util/gnunet-ecc.c:447
msgid "print examples of ECC operations (used for compatibility testing)"
msgstr ""
-#: src/util/gnunet-ecc.c:449
+#: src/util/gnunet-ecc.c:463
msgid "Manipulate GNUnet private ECC key files"
msgstr ""
@@ -8183,7 +8357,7 @@ msgstr ""
msgid "Unable to shorten unix path `%s' while keeping name unique\n"
msgstr ""
-#: src/util/network.c:1793 src/util/network.c:1969
+#: src/util/network.c:1793 src/util/network.c:1977
#, c-format
msgid ""
"Fatal internal logic error, process hangs in `%s' (abort with CTRL-C)!\n"
@@ -8235,7 +8409,7 @@ msgstr ""
msgid "Could not determine plugin installation path.\n"
msgstr ""
-#: src/util/resolver_api.c:204
+#: src/util/resolver_api.c:203
#, c-format
msgid ""
"Missing `%s' for `%s' in configuration, DNS resolution will be unavailable.\n"
@@ -8248,32 +8422,32 @@ msgid ""
"resolution will be unavailable.\n"
msgstr ""
-#: src/util/resolver_api.c:815
+#: src/util/resolver_api.c:826
#, c-format
msgid "Timeout trying to resolve hostname `%s'.\n"
msgstr ""
-#: src/util/resolver_api.c:827
+#: src/util/resolver_api.c:839
#, c-format
msgid "Timeout trying to resolve IP address `%s'.\n"
msgstr ""
-#: src/util/resolver_api.c:1004
+#: src/util/resolver_api.c:1023
msgid "Resolver not configured correctly.\n"
msgstr ""
-#: src/util/resolver_api.c:1086 src/util/resolver_api.c:1107
-#: src/util/resolver_api.c:1121
+#: src/util/resolver_api.c:1109 src/util/resolver_api.c:1132
+#: src/util/resolver_api.c:1146
#, fuzzy, c-format
msgid "Could not resolve our FQDN: %s\n"
msgstr "Résolution de « %s » échouée : %s\n"
-#: src/util/service.c:1306
+#: src/util/service.c:1305
msgid ""
"Could not bind to any of the ports I was supposed to, refusing to run!\n"
msgstr ""
-#: src/util/service.c:2082
+#: src/util/service.c:2081
#, c-format
msgid ""
"Processing code for message of type %u did not call "
@@ -8348,63 +8522,63 @@ msgstr "jours"
msgid "end of time"
msgstr "fin du temps"
-#: src/util/strings.c:1269
+#: src/util/strings.c:1270
msgid "IPv6 address did not start with `['\n"
msgstr ""
-#: src/util/strings.c:1277
+#: src/util/strings.c:1278
msgid "IPv6 address did contain ':' to separate port number\n"
msgstr ""
-#: src/util/strings.c:1283
+#: src/util/strings.c:1284
msgid "IPv6 address did contain ']' before ':' to separate port number\n"
msgstr ""
-#: src/util/strings.c:1290
+#: src/util/strings.c:1291
msgid "IPv6 address did contain a valid port number after the last ':'\n"
msgstr ""
-#: src/util/strings.c:1299
+#: src/util/strings.c:1300
#, c-format
msgid "Invalid IPv6 address `%s': %s\n"
msgstr ""
-#: src/util/strings.c:1571 src/util/strings.c:1587
+#: src/util/strings.c:1572 src/util/strings.c:1588
msgid "Port not in range\n"
msgstr ""
-#: src/util/strings.c:1596
+#: src/util/strings.c:1597
#, c-format
msgid "Malformed port policy `%s'\n"
msgstr ""
-#: src/util/strings.c:1679 src/util/strings.c:1710 src/util/strings.c:1758
-#: src/util/strings.c:1779
+#: src/util/strings.c:1680 src/util/strings.c:1711 src/util/strings.c:1759
+#: src/util/strings.c:1780
#, c-format
msgid "Invalid format for IP: `%s'\n"
msgstr ""
-#: src/util/strings.c:1736
+#: src/util/strings.c:1737
#, c-format
msgid "Invalid network notation ('/%d' is not legal in IPv4 CIDR)."
msgstr ""
-#: src/util/strings.c:1788
+#: src/util/strings.c:1789
#, c-format
msgid "Invalid format: `%s'\n"
msgstr "fornat invalide : « %s »\n"
-#: src/util/strings.c:1840
+#: src/util/strings.c:1841
#, c-format
msgid "Invalid network notation (does not end with ';': `%s')\n"
msgstr ""
-#: src/util/strings.c:1890
+#: src/util/strings.c:1891
#, c-format
msgid "Wrong format `%s' for netmask\n"
msgstr ""
-#: src/util/strings.c:1921
+#: src/util/strings.c:1922
#, c-format
msgid "Wrong format `%s' for network\n"
msgstr ""
@@ -8573,26 +8747,30 @@ msgstr ""
msgid "Setup tunnels via VPN."
msgstr "Configurer des tunnels via VPN."
-#: src/zonemaster/gnunet-service-zonemaster.c:705
+#: src/zonemaster/gnunet-service-zonemaster.c:706
msgid "Failed to connect to the namestore!\n"
msgstr ""
-#: src/include/gnunet_common.h:674 src/include/gnunet_common.h:681
-#: src/include/gnunet_common.h:691 src/include/gnunet_common.h:699
+#: src/include/gnunet_common.h:689 src/include/gnunet_common.h:696
+#: src/include/gnunet_common.h:706 src/include/gnunet_common.h:714
#, c-format
msgid "Assertion failed at %s:%d.\n"
msgstr ""
-#: src/include/gnunet_common.h:711
+#: src/include/gnunet_common.h:726
#, c-format
msgid "External protocol violation detected at %s:%d.\n"
msgstr ""
-#: src/include/gnunet_common.h:738 src/include/gnunet_common.h:747
+#: src/include/gnunet_common.h:753 src/include/gnunet_common.h:762
#, c-format
msgid "`%s' failed on file `%s' at %s:%d with error: %s\n"
msgstr ""
+#, fuzzy
+#~ msgid "Unable to connect to Postgres database '%s': %s\n"
+#~ msgstr "Résolution de « %s » échouée\n"
+
#~ msgid "ARM API is busy"
#~ msgstr "API ARM occupé"
@@ -8670,10 +8848,6 @@ msgstr ""
#~ msgid "Failed to start resolver!\n"
#~ msgstr "Échec du démarrage de %s\n"
-#, fuzzy
-#~ msgid "Failed to start NAT test for plugin `%s'\n"
-#~ msgstr "Résolution de « %s » échouée\n"
-
#~ msgid "Benchmarking done\n"
#~ msgstr "Benchmark terminé\n"
diff --git a/po/sv.po b/po/sv.po
index 3120e65947..f03bfb2b95 100644
--- a/po/sv.po
+++ b/po/sv.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: GNUnet 0.7.0b\n"
"Report-Msgid-Bugs-To: gnunet-developers@mail.gnu.org\n"
-"POT-Creation-Date: 2017-03-31 19:22-0500\n"
+"POT-Creation-Date: 2017-10-20 15:14+0000\n"
"PO-Revision-Date: 2006-01-21 17:16+0100\n"
"Last-Translator: Daniel Nylander <po@danielnylander.se>\n"
"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"
msgstr ""
#: src/arm/gnunet-service-arm.c:513
-#: src/transport/plugin_transport_http_server.c:2621
+#: src/transport/plugin_transport_http_server.c:2684
#: src/transport/plugin_transport_tcp.c:1259
#: src/transport/tcp_service_legacy.c:696 src/util/service.c:782
#, fuzzy, c-format
@@ -281,7 +281,7 @@ msgid "Failed to resolve `%s': %s\n"
msgstr "Misslyckades att leverera \"%s\" meddelande.\n"
#: src/arm/gnunet-service-arm.c:532
-#: src/transport/plugin_transport_http_server.c:2639
+#: src/transport/plugin_transport_http_server.c:2702
#: src/transport/plugin_transport_tcp.c:1278
#: src/transport/tcp_service_legacy.c:715 src/util/service.c:802
#, fuzzy, c-format
@@ -355,134 +355,14 @@ msgstr ""
msgid "Initiating shutdown as requested by client.\n"
msgstr ""
-#: src/ats/gnunet-ats-solver-eval.c:2781 src/ats/gnunet-ats-solver-eval.c:2822
-#, c-format
-msgid ""
-"Could not load quota for network `%s': `%s', assigning default bandwidth "
-"%llu\n"
-msgstr ""
-
-#: src/ats/gnunet-ats-solver-eval.c:2799
-#, c-format
-msgid ""
-"No outbound quota configured for network `%s', assigning default bandwidth "
-"%llu\n"
-msgstr ""
-
-#: src/ats/gnunet-ats-solver-eval.c:2840
-#, c-format
-msgid ""
-"No outbound quota configure for network `%s', assigning default bandwidth "
-"%llu\n"
-msgstr ""
-
-#: src/ats/gnunet-ats-solver-eval.c:3294
-#: src/ats-tests/gnunet-solver-eval.c:939
-msgid "solver to use"
-msgstr ""
-
-#: src/ats/gnunet-ats-solver-eval.c:3299
-#: src/ats-tests/gnunet-solver-eval.c:945
-#: src/ats-tests/gnunet-solver-eval.c:950
-msgid "experiment to use"
-msgstr ""
-
-#: src/ats/gnunet-ats-solver-eval.c:3306
-#, fuzzy
-msgid "print logging"
-msgstr "Startade samling \"%s\".\n"
-
-#: src/ats/gnunet-ats-solver-eval.c:3311
-msgid "save logging to disk"
-msgstr ""
-
-#: src/ats/gnunet-ats-solver-eval.c:3316
-msgid "disable normalization"
-msgstr ""
-
-#: src/ats/gnunet-service-ats_plugins.c:304
-#, c-format
-msgid ""
-"Could not load %s quota for network `%s': `%s', assigning default bandwidth "
-"%llu\n"
-msgstr ""
-
-#: src/ats/gnunet-service-ats_plugins.c:314
-#, c-format
-msgid "%s quota configured for network `%s' is %llu\n"
-msgstr ""
-
-#: src/ats/gnunet-service-ats_plugins.c:359
-#, c-format
-msgid ""
-"No %s-quota configured for network `%s', assigning default bandwidth %llu\n"
-msgstr ""
-
-#: src/ats/gnunet-service-ats_plugins.c:451
-#, fuzzy, c-format
-msgid "Failed to initialize solver `%s'!\n"
-msgstr "Kunde inte initiera SQLite.\n"
-
-#: src/ats/plugin_ats_mlp.c:1274
-msgid "Problem size too large, cannot allocate memory!\n"
-msgstr ""
-
-#: src/ats/plugin_ats_mlp.c:1869
-#, fuzzy, c-format
-msgid "Adding address for peer `%s' multiple times\n"
-msgstr "Motpart \"%s\" med pålitlighet %8u och adress \"%s\"\n"
-
-#: src/ats/plugin_ats_mlp.c:1913
-#, fuzzy, c-format
-msgid "Updating address property for peer `%s' %p not added before\n"
-msgstr "Motpart \"%s\" med pålitlighet %8u och adress \"%s\"\n"
-
-#: src/ats/plugin_ats_mlp.c:2475
-msgid ""
-"MLP solver is not optimizing for anything, changing to feasibility check\n"
-msgstr ""
-
-#: src/ats/plugin_ats_mlp.c:2515 src/ats/plugin_ats_mlp.c:2532
-#: src/ats/plugin_ats_mlp.c:2564 src/ats/plugin_ats_mlp.c:2582
-#: src/ats/plugin_ats_mlp.c:2601 src/ats/plugin_ats_proportional.c:1141
-#: src/ats/plugin_ats_ril.c:2612 src/ats/plugin_ats_ril.c:2629
-#: src/ats/plugin_ats_ril.c:2646 src/ats/plugin_ats_ril.c:2663
-#: src/ats/plugin_ats_ril.c:2680 src/ats/plugin_ats_ril.c:2697
-#: src/ats/plugin_ats_ril.c:2714 src/ats/plugin_ats_ril.c:2731
-#, fuzzy, c-format
-msgid "Invalid %s configuration %f \n"
-msgstr "Kunde inte spara konfigurationsfil \"%s\":"
-
-#: src/ats/plugin_ats_mlp.c:2670
-#, c-format
-msgid ""
-"Adjusting inconsistent outbound quota configuration for network `%s', is "
-"%llu must be at least %llu\n"
-msgstr ""
-
-#: src/ats/plugin_ats_mlp.c:2679
-#, c-format
-msgid ""
-"Adjusting inconsistent inbound quota configuration for network `%s', is %llu "
-"must be at least %llu\n"
-msgstr ""
-
-#: src/ats/plugin_ats_mlp.c:2689
-#, c-format
-msgid ""
-"Adjusting outbound quota configuration for network `%s'from %llu to %.0f\n"
-msgstr ""
-
-#: src/ats/plugin_ats_mlp.c:2698
-#, c-format
-msgid ""
-"Adjusting inbound quota configuration for network `%s' from %llu to %.0f\n"
+#: src/ats-tests/ats-testing-log.c:837
+msgid "Stop logging\n"
msgstr ""
-#: src/ats/plugin_ats_proportional.c:1164
+#: src/ats-tests/ats-testing-log.c:892
#, fuzzy, c-format
-msgid "Invalid %s configuration %f\n"
-msgstr "Kunde inte spara konfigurationsfil \"%s\":"
+msgid "Start logging `%s'\n"
+msgstr "Startade samling \"%s\".\n"
#: src/ats-tests/ats-testing.c:422
#, c-format
@@ -494,15 +374,6 @@ msgstr ""
msgid "Failed to connect master peer [%u] with slave [%u]\n"
msgstr "Misslyckades att ansluta till gnunetd.\n"
-#: src/ats-tests/ats-testing-log.c:837
-msgid "Stop logging\n"
-msgstr ""
-
-#: src/ats-tests/ats-testing-log.c:892
-#, fuzzy, c-format
-msgid "Start logging `%s'\n"
-msgstr "Startade samling \"%s\".\n"
-
#: src/ats-tests/gnunet-ats-sim.c:90
#, c-format
msgid ""
@@ -510,6 +381,15 @@ msgid ""
"= %u KiB/s\n"
msgstr ""
+#: src/ats-tests/gnunet-solver-eval.c:939 src/ats/gnunet-ats-solver-eval.c:3294
+msgid "solver to use"
+msgstr ""
+
+#: src/ats-tests/gnunet-solver-eval.c:945
+#: src/ats-tests/gnunet-solver-eval.c:950 src/ats/gnunet-ats-solver-eval.c:3299
+msgid "experiment to use"
+msgstr ""
+
#: src/ats-tool/gnunet-ats.c:307
#, c-format
msgid "%u address resolutions had a timeout\n"
@@ -631,6 +511,124 @@ msgstr ""
msgid "Print information about ATS state"
msgstr "Skriv ut information om GNUnets motparter."
+#: src/ats/gnunet-ats-solver-eval.c:2781 src/ats/gnunet-ats-solver-eval.c:2822
+#, c-format
+msgid ""
+"Could not load quota for network `%s': `%s', assigning default bandwidth "
+"%llu\n"
+msgstr ""
+
+#: src/ats/gnunet-ats-solver-eval.c:2799
+#, c-format
+msgid ""
+"No outbound quota configured for network `%s', assigning default bandwidth "
+"%llu\n"
+msgstr ""
+
+#: src/ats/gnunet-ats-solver-eval.c:2840
+#, c-format
+msgid ""
+"No outbound quota configure for network `%s', assigning default bandwidth "
+"%llu\n"
+msgstr ""
+
+#: src/ats/gnunet-ats-solver-eval.c:3306
+#, fuzzy
+msgid "print logging"
+msgstr "Startade samling \"%s\".\n"
+
+#: src/ats/gnunet-ats-solver-eval.c:3311
+msgid "save logging to disk"
+msgstr ""
+
+#: src/ats/gnunet-ats-solver-eval.c:3316
+msgid "disable normalization"
+msgstr ""
+
+#: src/ats/gnunet-service-ats_plugins.c:304
+#, c-format
+msgid ""
+"Could not load %s quota for network `%s': `%s', assigning default bandwidth "
+"%llu\n"
+msgstr ""
+
+#: src/ats/gnunet-service-ats_plugins.c:314
+#, c-format
+msgid "%s quota configured for network `%s' is %llu\n"
+msgstr ""
+
+#: src/ats/gnunet-service-ats_plugins.c:359
+#, c-format
+msgid ""
+"No %s-quota configured for network `%s', assigning default bandwidth %llu\n"
+msgstr ""
+
+#: src/ats/gnunet-service-ats_plugins.c:451
+#, fuzzy, c-format
+msgid "Failed to initialize solver `%s'!\n"
+msgstr "Kunde inte initiera SQLite.\n"
+
+#: src/ats/plugin_ats_mlp.c:1274
+msgid "Problem size too large, cannot allocate memory!\n"
+msgstr ""
+
+#: src/ats/plugin_ats_mlp.c:1869
+#, fuzzy, c-format
+msgid "Adding address for peer `%s' multiple times\n"
+msgstr "Motpart \"%s\" med pålitlighet %8u och adress \"%s\"\n"
+
+#: src/ats/plugin_ats_mlp.c:1913
+#, fuzzy, c-format
+msgid "Updating address property for peer `%s' %p not added before\n"
+msgstr "Motpart \"%s\" med pålitlighet %8u och adress \"%s\"\n"
+
+#: src/ats/plugin_ats_mlp.c:2475
+msgid ""
+"MLP solver is not optimizing for anything, changing to feasibility check\n"
+msgstr ""
+
+#: src/ats/plugin_ats_mlp.c:2515 src/ats/plugin_ats_mlp.c:2532
+#: src/ats/plugin_ats_mlp.c:2564 src/ats/plugin_ats_mlp.c:2582
+#: src/ats/plugin_ats_mlp.c:2601 src/ats/plugin_ats_proportional.c:1141
+#: src/ats/plugin_ats_ril.c:2612 src/ats/plugin_ats_ril.c:2629
+#: src/ats/plugin_ats_ril.c:2646 src/ats/plugin_ats_ril.c:2663
+#: src/ats/plugin_ats_ril.c:2680 src/ats/plugin_ats_ril.c:2697
+#: src/ats/plugin_ats_ril.c:2714 src/ats/plugin_ats_ril.c:2731
+#, fuzzy, c-format
+msgid "Invalid %s configuration %f \n"
+msgstr "Kunde inte spara konfigurationsfil \"%s\":"
+
+#: src/ats/plugin_ats_mlp.c:2670
+#, c-format
+msgid ""
+"Adjusting inconsistent outbound quota configuration for network `%s', is "
+"%llu must be at least %llu\n"
+msgstr ""
+
+#: src/ats/plugin_ats_mlp.c:2679
+#, c-format
+msgid ""
+"Adjusting inconsistent inbound quota configuration for network `%s', is %llu "
+"must be at least %llu\n"
+msgstr ""
+
+#: src/ats/plugin_ats_mlp.c:2689
+#, c-format
+msgid ""
+"Adjusting outbound quota configuration for network `%s'from %llu to %.0f\n"
+msgstr ""
+
+#: src/ats/plugin_ats_mlp.c:2698
+#, c-format
+msgid ""
+"Adjusting inbound quota configuration for network `%s' from %llu to %.0f\n"
+msgstr ""
+
+#: src/ats/plugin_ats_proportional.c:1164
+#, fuzzy, c-format
+msgid "Invalid %s configuration %f\n"
+msgstr "Kunde inte spara konfigurationsfil \"%s\":"
+
#: src/auction/gnunet-auction-create.c:163
msgid "description of the item to be sold"
msgstr ""
@@ -779,6 +777,28 @@ msgstr ""
msgid "Connection to conversation service lost, trying to reconnect\n"
msgstr ""
+#: src/conversation/gnunet-conversation-test.c:119
+#, c-format
+msgid ""
+"\n"
+"End of transmission. Have a GNU day.\n"
+msgstr ""
+
+#: src/conversation/gnunet-conversation-test.c:145
+#, c-format
+msgid ""
+"\n"
+"We are now playing your recording back. If you can hear it, your audio "
+"settings are working..."
+msgstr ""
+
+#: src/conversation/gnunet-conversation-test.c:210
+#, c-format
+msgid ""
+"We will now be recording you for %s. After that time, the recording will be "
+"played back to you..."
+msgstr ""
+
#: src/conversation/gnunet-conversation.c:269
#, c-format
msgid "Incoming call from `%s'. Please /accept %u or /cancel %u the call.\n"
@@ -1036,30 +1056,8 @@ msgstr ""
msgid "Enables having a conversation with other GNUnet users."
msgstr ""
-#: src/conversation/gnunet-conversation-test.c:119
-#, c-format
-msgid ""
-"\n"
-"End of transmission. Have a GNU day.\n"
-msgstr ""
-
-#: src/conversation/gnunet-conversation-test.c:145
-#, c-format
-msgid ""
-"\n"
-"We are now playing your recording back. If you can hear it, your audio "
-"settings are working..."
-msgstr ""
-
-#: src/conversation/gnunet-conversation-test.c:210
-#, c-format
-msgid ""
-"We will now be recording you for %s. After that time, the recording will be "
-"played back to you..."
-msgstr ""
-
-#: src/conversation/gnunet_gst.c:622
#: src/conversation/gnunet-helper-audio-playback-gst.c:356
+#: src/conversation/gnunet_gst.c:622
#, c-format
msgid "Read error from STDIN: %d %s\n"
msgstr ""
@@ -1191,6 +1189,11 @@ msgstr "\"%s\" %s misslyckades: %s\n"
msgid "Failed to allocate %u bytes for second packet\n"
msgstr "Misslyckades att läsa kompislista från \"%s\"\n"
+#: src/conversation/gnunet-service-conversation.c:1276
+#, fuzzy, c-format
+msgid "Could not open line, port %s already in use!\n"
+msgstr "Kunde inte ansluta till gnunetd.\n"
+
#: src/conversation/microphone.c:119
#, fuzzy
msgid "Could not start record audio helper\n"
@@ -1490,8 +1493,140 @@ msgstr "# krypterade PONG-meddelanden mottagna"
msgid "# updates to my type map"
msgstr ""
+#: src/credential/credential_misc.c:88
+#, fuzzy, c-format
+msgid "Unable to parse CRED record string `%s'\n"
+msgstr "Misslyckades att läsa kompislista från \"%s\"\n"
+
+#: src/credential/gnunet-credential.c:278 src/namestore/gnunet-namestore.c:776
+#: src/namestore/plugin_rest_namestore.c:1009
+#, fuzzy, c-format
+msgid "Ego `%s' not known to identity service\n"
+msgstr "\"%s\": okänd tjänst: %s\n"
+
+#: src/credential/gnunet-credential.c:294
+#: src/credential/gnunet-credential.c:446
+#, fuzzy, c-format
+msgid "Issuer public key `%s' is not well-formed\n"
+msgstr "Ogiltigt argument: \"%s\"\n"
+
+#: src/credential/gnunet-credential.c:375
+#: src/credential/gnunet-credential.c:435
+#, fuzzy, c-format
+msgid "Issuer public key not well-formed\n"
+msgstr "Ogiltigt argument: \"%s\"\n"
+
+#: src/credential/gnunet-credential.c:386
+#: src/credential/gnunet-credential.c:455
+#, fuzzy, c-format
+msgid "Failed to connect to CREDENTIAL\n"
+msgstr "Misslyckades att ansluta till gnunetd.\n"
+
+#: src/credential/gnunet-credential.c:392
+#, c-format
+msgid "You must provide issuer the attribute\n"
+msgstr ""
+
+#: src/credential/gnunet-credential.c:399
+#, c-format
+msgid "ego required\n"
+msgstr ""
+
+#: src/credential/gnunet-credential.c:415
+#, c-format
+msgid "Subject public key needed\n"
+msgstr ""
+
+#: src/credential/gnunet-credential.c:426
+#, fuzzy, c-format
+msgid "Subject public key `%s' is not well-formed\n"
+msgstr "Ogiltigt argument: \"%s\"\n"
+
+#: src/credential/gnunet-credential.c:461
+#, c-format
+msgid "You must provide issuer and subject attributes\n"
+msgstr ""
+
+#: src/credential/gnunet-credential.c:511
+#, c-format
+msgid "Issuer ego required\n"
+msgstr ""
+
+#: src/credential/gnunet-credential.c:523
+#, c-format
+msgid "Please specify name to lookup, subject key and issuer key!\n"
+msgstr ""
+
+#: src/credential/gnunet-credential.c:543
+msgid "create credential"
+msgstr ""
+
+#: src/credential/gnunet-credential.c:547
+msgid "verify credential against attribute"
+msgstr ""
+
+#: src/credential/gnunet-credential.c:552
+#, fuzzy
+msgid "The public key of the subject to lookup the credential for"
+msgstr "ange prioritet för innehållet"
+
+#: src/credential/gnunet-credential.c:557
+msgid "The name of the credential presented by the subject"
+msgstr ""
+
+#: src/credential/gnunet-credential.c:562
+#, fuzzy
+msgid "The public key of the authority to verify the credential against"
+msgstr "ange prioritet för innehållet"
+
+#: src/credential/gnunet-credential.c:567
+#, fuzzy
+msgid "The ego to use"
+msgstr "meddelandestorlek"
+
+#: src/credential/gnunet-credential.c:572
+msgid "The issuer attribute to verify against or to issue"
+msgstr ""
+
+#: src/credential/gnunet-credential.c:577
+msgid "The time to live for the credential"
+msgstr ""
+
+#: src/credential/gnunet-credential.c:581
+msgid "collect credentials"
+msgstr ""
+
+#: src/credential/gnunet-credential.c:595
+#, fuzzy
+msgid "GNUnet credential resolver tool"
+msgstr "Spåra GNUnets nätverkstopologi."
+
+#: src/credential/gnunet-service-credential.c:1204
+#: src/gns/gnunet-gns-helper-service-w32.c:727 src/gns/gnunet-gns.c:355
+#, fuzzy, c-format
+msgid "Failed to connect to GNS\n"
+msgstr "Misslyckades att ansluta till gnunetd.\n"
+
+#: src/credential/gnunet-service-credential.c:1210
+#: src/namestore/gnunet-namestore-fcfsd.c:1034
+#: src/namestore/gnunet-namestore.c:802
+#: src/namestore/plugin_rest_namestore.c:1022
+#, fuzzy, c-format
+msgid "Failed to connect to namestore\n"
+msgstr "Misslyckades att ansluta till gnunetd.\n"
+
+#: src/credential/plugin_gnsrecord_credential.c:186
+#, fuzzy, c-format
+msgid "Unable to parse ATTR record string `%s'\n"
+msgstr "Misslyckades att läsa kompislista från \"%s\"\n"
+
+#: src/credential/plugin_rest_credential.c:1155 src/gns/plugin_rest_gns.c:668
+#, fuzzy
+msgid "GNS REST API initialized\n"
+msgstr " Anslutning misslyckades\n"
+
#: src/datacache/datacache.c:119 src/datacache/datacache.c:294
-#: src/datastore/gnunet-service-datastore.c:775
+#: src/datastore/gnunet-service-datastore.c:757
#, fuzzy
msgid "# bytes stored"
msgstr "# byte krypterade"
@@ -1536,13 +1671,12 @@ msgstr ""
#: src/datacache/plugin_datacache_sqlite.c:113
#: src/datacache/plugin_datacache_sqlite.c:122
-#: src/datastore/plugin_datastore_mysql.c:980
+#: src/datastore/plugin_datastore_mysql.c:892
#: src/datastore/plugin_datastore_sqlite.c:58
-#: src/datastore/plugin_datastore_sqlite.c:66 src/my/my.c:80 src/my/my.c:92
-#: src/mysql/mysql.c:42 src/mysql/mysql.c:49
-#: src/namecache/plugin_namecache_postgres.c:53
+#: src/datastore/plugin_datastore_sqlite.c:66
+#: src/identity-provider/plugin_identity_provider_sqlite.c:52 src/my/my.c:80
+#: src/my/my.c:92 src/mysql/mysql.c:42 src/mysql/mysql.c:49
#: src/namecache/plugin_namecache_sqlite.c:53
-#: src/namestore/plugin_namestore_postgres.c:53
#: src/namestore/plugin_namestore_sqlite.c:53
#: src/peerstore/plugin_peerstore_sqlite.c:52
#: src/psycstore/plugin_psycstore_mysql.c:62
@@ -1551,14 +1685,15 @@ msgstr ""
#: src/testbed/gnunet-daemon-testbed-underlay.c:56
#: src/testbed/testbed_api_hosts.c:69 src/util/crypto_ecc.c:52
#: src/util/crypto_ecc_setup.c:41 src/util/crypto_mpi.c:39
-#: src/include/gnunet_common.h:720 src/include/gnunet_common.h:729
+#: src/include/gnunet_common.h:735 src/include/gnunet_common.h:744
#: src/scalarproduct/scalarproduct.h:35
#, c-format
msgid "`%s' failed at %s:%d with error: %s\n"
msgstr "\"%s\" misslyckades vid %s:%d med fel: %s\n"
#: src/datacache/plugin_datacache_sqlite.c:817
-#: src/datastore/plugin_datastore_sqlite.c:475
+#: src/datastore/plugin_datastore_sqlite.c:456
+#: src/identity-provider/plugin_identity_provider_sqlite.c:336
#: src/namecache/plugin_namecache_sqlite.c:296
#: src/namestore/plugin_namestore_sqlite.c:355
msgid "Tried to close sqlite without finalizing all prepared statements.\n"
@@ -1626,23 +1761,75 @@ msgstr ""
msgid "# GET requests executed"
msgstr ""
-#: src/datastore/gnunet-datastore.c:113
+#: src/datastore/gnunet-datastore.c:189
+#, c-format
+msgid "Dumped %<PRIu64> records\n"
+msgstr ""
+
+#: src/datastore/gnunet-datastore.c:217 src/datastore/gnunet-datastore.c:229
+#, c-format
+msgid "Short write to file: %zd bytes expecting %zd\n"
+msgstr ""
+
+#: src/datastore/gnunet-datastore.c:261
+#, fuzzy
+msgid "Error queueing datastore GET operation\n"
+msgstr "Fel vid skapandet av användare"
+
+#: src/datastore/gnunet-datastore.c:287 src/datastore/gnunet-datastore.c:412
+#, fuzzy, c-format
+msgid "Unable to open dump file: %s\n"
+msgstr "Kunde inte skapa namnrymd \"%s\" (existerar?).\n"
+
+#: src/datastore/gnunet-datastore.c:326
#, fuzzy, c-format
msgid "Failed to store item: %s, aborting\n"
msgstr "Misslyckades att leverera \"%s\" meddelande.\n"
-#: src/datastore/gnunet-datastore.c:209
+#: src/datastore/gnunet-datastore.c:340
#, c-format
-msgid "Cannot use the same configuration for source and destination\n"
+msgid "Inserted %<PRIu64> records\n"
msgstr ""
-#: src/datastore/gnunet-datastore.c:256
-msgid ""
-"specifies the configuration to use to access an alternative datastore; will "
-"merge that datastore into our current datastore"
+#: src/datastore/gnunet-datastore.c:349 src/datastore/gnunet-datastore.c:363
+#, c-format
+msgid "Short read from file: %zd bytes expecting %zd\n"
msgstr ""
-#: src/datastore/gnunet-datastore.c:265
+#: src/datastore/gnunet-datastore.c:389
+#, fuzzy
+msgid "Error queueing datastore PUT operation\n"
+msgstr "Fel vid skapandet av användare"
+
+#: src/datastore/gnunet-datastore.c:432
+msgid "Input file is not of a supported format\n"
+msgstr ""
+
+#: src/datastore/gnunet-datastore.c:458
+#, fuzzy
+msgid "Failed connecting to the datastore.\n"
+msgstr "Misslyckades att ansluta till gnunetd.\n"
+
+#: src/datastore/gnunet-datastore.c:470
+#, c-format
+msgid "Please choose at least one operation: %s, %s\n"
+msgstr ""
+
+#: src/datastore/gnunet-datastore.c:493
+#, fuzzy
+msgid "Dump all records from the datastore"
+msgstr "Misslyckades att ta emot svar till \"%s\" meddelande från gnunetd\n"
+
+#: src/datastore/gnunet-datastore.c:497
+#, fuzzy
+msgid "Insert records into the datastore"
+msgstr "# byte krypterade"
+
+#: src/datastore/gnunet-datastore.c:502
+msgid "File to dump or insert"
+msgstr ""
+
+#: src/datastore/gnunet-datastore.c:511
#, fuzzy
msgid "Manipulate GNUnet datastore"
msgstr "skriv ut ett värde från konfigurationsfilen till standard ut"
@@ -1686,8 +1873,8 @@ msgstr ""
#: src/datastore/gnunet-service-datastore.c:634
#: src/datastore/gnunet-service-datastore.c:689
-#: src/datastore/gnunet-service-datastore.c:977
-#: src/datastore/gnunet-service-datastore.c:1633
+#: src/datastore/gnunet-service-datastore.c:837
+#: src/datastore/gnunet-service-datastore.c:1469
msgid "# reserved"
msgstr ""
@@ -1695,147 +1882,148 @@ msgstr ""
msgid "Could not find matching reservation"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:792
+#: src/datastore/gnunet-service-datastore.c:773
#, c-format
msgid "Need %llu bytes more space (%llu allowed, using %llu)\n"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1026
+#: src/datastore/gnunet-service-datastore.c:876
#, fuzzy
msgid "# GET requests received"
msgstr "# byte mottogs via TCP"
-#: src/datastore/gnunet-service-datastore.c:1058
+#: src/datastore/gnunet-service-datastore.c:907
#, fuzzy
msgid "# GET KEY requests received"
msgstr "# byte mottogs via TCP"
-#: src/datastore/gnunet-service-datastore.c:1071
+#: src/datastore/gnunet-service-datastore.c:920
msgid "# requests filtered by bloomfilter"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1108
+#: src/datastore/gnunet-service-datastore.c:956
msgid "# GET REPLICATION requests received"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1141
+#: src/datastore/gnunet-service-datastore.c:989
msgid "# GET ZERO ANONYMITY requests received"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1190
+#: src/datastore/gnunet-service-datastore.c:1036
#, fuzzy
msgid "Content not found"
msgstr "Kommando \"%s\" hittades inte!\n"
-#: src/datastore/gnunet-service-datastore.c:1199
+#: src/datastore/gnunet-service-datastore.c:1043
msgid "# bytes removed (explicit request)"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1246
+#: src/datastore/gnunet-service-datastore.c:1088
#, fuzzy
msgid "# REMOVE requests received"
msgstr "# byte mottogs via TCP"
-#: src/datastore/gnunet-service-datastore.c:1301
+#: src/datastore/gnunet-service-datastore.c:1137
#, c-format
msgid ""
"Datastore payload must have been inaccurate (%lld < %lld). Recomputing it.\n"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1307
-#: src/datastore/gnunet-service-datastore.c:1482
+#: src/datastore/gnunet-service-datastore.c:1143
+#: src/datastore/gnunet-service-datastore.c:1318
#, c-format
msgid "New payload: %lld\n"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1361
+#: src/datastore/gnunet-service-datastore.c:1197
#, c-format
msgid "Loading `%s' datastore plugin\n"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1373
+#: src/datastore/gnunet-service-datastore.c:1209
#, fuzzy, c-format
msgid "Failed to load datastore plugin for `%s'\n"
msgstr "Kunde inte slå upp \"%s\": %s\n"
-#: src/datastore/gnunet-service-datastore.c:1433
+#: src/datastore/gnunet-service-datastore.c:1269
msgid "Bloomfilter construction complete.\n"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1489
+#: src/datastore/gnunet-service-datastore.c:1325
msgid "Rebuilding bloomfilter. Please be patient.\n"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1500
+#: src/datastore/gnunet-service-datastore.c:1336
msgid "Plugin does not support get_keys function. Please fix!\n"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1670
+#: src/datastore/gnunet-service-datastore.c:1506
#, fuzzy, c-format
msgid "# bytes used in file-sharing datastore `%s'"
msgstr "# byte krypterade"
-#: src/datastore/gnunet-service-datastore.c:1686
+#: src/datastore/gnunet-service-datastore.c:1522
msgid "# quota"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1691
+#: src/datastore/gnunet-service-datastore.c:1527
msgid "# cache size"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1707
+#: src/datastore/gnunet-service-datastore.c:1543
#, c-format
msgid "Could not use specified filename `%s' for bloomfilter.\n"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1725
-#: src/datastore/gnunet-service-datastore.c:1741
+#: src/datastore/gnunet-service-datastore.c:1561
+#: src/datastore/gnunet-service-datastore.c:1577
#, fuzzy, c-format
msgid "Failed to remove bogus bloomfilter file `%s'\n"
msgstr "Kunde inte spara konfigurationsfil \"%s\":"
-#: src/datastore/gnunet-service-datastore.c:1773
+#: src/datastore/gnunet-service-datastore.c:1609
#, fuzzy
msgid "Failed to initialize bloomfilter.\n"
msgstr "Misslyckades att initiera tjänsten \"%s\".\n"
-#: src/datastore/plugin_datastore_heap.c:769
+#: src/datastore/plugin_datastore_heap.c:893
msgid "Heap database running\n"
msgstr ""
-#: src/datastore/plugin_datastore_mysql.c:377
-#: src/datastore/plugin_datastore_sqlite.c:590
+#: src/datastore/plugin_datastore_mysql.c:371
+#: src/datastore/plugin_datastore_mysql.c:423
+#: src/datastore/plugin_datastore_mysql.c:1075
+msgid "MySQL statement run failure"
+msgstr ""
+
+#: src/datastore/plugin_datastore_mysql.c:410
+#: src/datastore/plugin_datastore_sqlite.c:626
#, fuzzy
msgid "Data too large"
msgstr "antal iterationer"
-#: src/datastore/plugin_datastore_mysql.c:393
-msgid "MySQL statement run failure"
-msgstr ""
-
-#: src/datastore/plugin_datastore_mysql.c:936
+#: src/datastore/plugin_datastore_mysql.c:848
#, fuzzy, c-format
msgid "`%s' for `%s' failed at %s:%d with error: %s\n"
msgstr "\"%s\" till \"%s\" misslyckades vid %s:%d med fel: %s\n"
-#: src/datastore/plugin_datastore_mysql.c:1208
+#: src/datastore/plugin_datastore_mysql.c:1180
#: src/psycstore/plugin_psycstore_mysql.c:1936
msgid "Mysql database running\n"
msgstr ""
-#: src/datastore/plugin_datastore_postgres.c:345
+#: src/datastore/plugin_datastore_postgres.c:274
+#: src/datastore/plugin_datastore_postgres.c:891
msgid "Postgress exec failure"
msgstr ""
-#: src/datastore/plugin_datastore_postgres.c:866
+#: src/datastore/plugin_datastore_postgres.c:852
#, fuzzy
msgid "Failed to drop table from database.\n"
msgstr "Misslyckades att ta emot svar till \"%s\" meddelande från gnunetd\n"
-#: src/datastore/plugin_datastore_postgres.c:903
-#: src/namecache/plugin_namecache_postgres.c:398
-#: src/namestore/plugin_namestore_postgres.c:571
-#: src/psycstore/plugin_psycstore_postgres.c:1721
+#: src/datastore/plugin_datastore_postgres.c:950
+#: src/psycstore/plugin_psycstore_postgres.c:1506
msgid "Postgres database running\n"
msgstr ""
@@ -1847,7 +2035,8 @@ msgstr ""
msgid "`%s' failed at %s:%u with error: %s"
msgstr "\"%s\" misslyckades vid %s:%d med fel: %s\n"
-#: src/datastore/plugin_datastore_sqlite.c:281
+#: src/datastore/plugin_datastore_sqlite.c:271
+#: src/identity-provider/plugin_identity_provider_sqlite.c:212
#: src/namecache/plugin_namecache_sqlite.c:194
#: src/namestore/plugin_namestore_sqlite.c:222
#: src/peerstore/plugin_peerstore_sqlite.c:535
@@ -1856,24 +2045,29 @@ msgstr "\"%s\" misslyckades vid %s:%d med fel: %s\n"
msgid "Unable to initialize SQLite: %s.\n"
msgstr "Kunde inte initiera SQLite.\n"
-#: src/datastore/plugin_datastore_sqlite.c:1234
+#: src/datastore/plugin_datastore_sqlite.c:577
+msgid "sqlite bind failure"
+msgstr ""
+
+#: src/datastore/plugin_datastore_sqlite.c:1259
msgid "sqlite version to old to determine size, assuming zero\n"
msgstr ""
-#: src/datastore/plugin_datastore_sqlite.c:1268
+#: src/datastore/plugin_datastore_sqlite.c:1293
#, c-format
msgid ""
"Using sqlite page utilization to estimate payload (%llu pages of size %llu "
"bytes)\n"
msgstr ""
-#: src/datastore/plugin_datastore_sqlite.c:1312
+#: src/datastore/plugin_datastore_sqlite.c:1337
+#: src/identity-provider/plugin_identity_provider_sqlite.c:711
#: src/namecache/plugin_namecache_sqlite.c:603
#: src/namestore/plugin_namestore_sqlite.c:802
msgid "Sqlite database running\n"
msgstr ""
-#: src/datastore/plugin_datastore_template.c:259
+#: src/datastore/plugin_datastore_template.c:253
msgid "Template database running\n"
msgstr ""
@@ -1935,53 +2129,6 @@ msgstr ""
msgid "Prints all packets that go through the DHT."
msgstr ""
-#: src/dht/gnunet_dht_profiler.c:1161
-#: src/testbed/gnunet-testbed-profiler.c:255
-#, fuzzy, c-format
-msgid "Exiting as the number of peers is %u\n"
-msgstr "Maximalt antal chattklienter uppnått.\n"
-
-#: src/dht/gnunet_dht_profiler.c:1188
-#, fuzzy
-msgid "number of peers to start"
-msgstr "antal iterationer"
-
-#: src/dht/gnunet_dht_profiler.c:1194
-msgid ""
-"maximum number of times we try to search for successor circle formation (0 "
-"for R5N)"
-msgstr ""
-
-#: src/dht/gnunet_dht_profiler.c:1200 src/nse/gnunet-nse-profiler.c:853
-#: src/testbed/gnunet-testbed-profiler.c:305
-msgid "name of the file with the login information for the testbed"
-msgstr ""
-
-#: src/dht/gnunet_dht_profiler.c:1206
-msgid "delay between rounds for collecting statistics (default: 30 sec)"
-msgstr ""
-
-#: src/dht/gnunet_dht_profiler.c:1212
-msgid "delay to start doing PUTs (default: 1 sec)"
-msgstr ""
-
-#: src/dht/gnunet_dht_profiler.c:1218
-msgid "delay to start doing GETs (default: 5 min)"
-msgstr ""
-
-#: src/dht/gnunet_dht_profiler.c:1223
-msgid "replication degree for DHT PUTs"
-msgstr ""
-
-#: src/dht/gnunet_dht_profiler.c:1230
-msgid "timeout for DHT PUT and GET requests (default: 1 min)"
-msgstr ""
-
-#: src/dht/gnunet_dht_profiler.c:1248
-#, fuzzy
-msgid "Measure quality and performance of the DHT service."
-msgstr "Kan inte tillgå tjänsten"
-
#: src/dht/gnunet-dht-put.c:120
#, fuzzy
msgid "PUT request sent with key"
@@ -2258,6 +2405,52 @@ msgstr ""
msgid "# DHT requests combined"
msgstr "# byte mottogs via TCP"
+#: src/dht/gnunet_dht_profiler.c:1161 src/testbed/gnunet-testbed-profiler.c:255
+#, fuzzy, c-format
+msgid "Exiting as the number of peers is %u\n"
+msgstr "Maximalt antal chattklienter uppnått.\n"
+
+#: src/dht/gnunet_dht_profiler.c:1188
+#, fuzzy
+msgid "number of peers to start"
+msgstr "antal iterationer"
+
+#: src/dht/gnunet_dht_profiler.c:1194
+msgid ""
+"maximum number of times we try to search for successor circle formation (0 "
+"for R5N)"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:1200 src/nse/gnunet-nse-profiler.c:853
+#: src/testbed/gnunet-testbed-profiler.c:305
+msgid "name of the file with the login information for the testbed"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:1206
+msgid "delay between rounds for collecting statistics (default: 30 sec)"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:1212
+msgid "delay to start doing PUTs (default: 1 sec)"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:1218
+msgid "delay to start doing GETs (default: 5 min)"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:1223
+msgid "replication degree for DHT PUTs"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:1230
+msgid "timeout for DHT PUT and GET requests (default: 1 min)"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:1248
+#, fuzzy
+msgid "Measure quality and performance of the DHT service."
+msgstr "Kan inte tillgå tjänsten"
+
#: src/dht/plugin_block_dht.c:187
#, fuzzy, c-format
msgid "Block not of type %u\n"
@@ -2591,7 +2784,7 @@ msgstr ""
msgid "No useful service enabled. Exiting.\n"
msgstr ""
-#: src/exit/gnunet-daemon-exit.c:3969
+#: src/exit/gnunet-daemon-exit.c:3970
msgid "Daemon to run to provide an IP exit node for the VPN"
msgstr ""
@@ -3244,15 +3437,6 @@ msgid ""
"chk/...)"
msgstr ""
-#: src/fs/gnunet-fs.c:119
-msgid "print a list of all indexed files"
-msgstr ""
-
-#: src/fs/gnunet-fs.c:130
-#, fuzzy
-msgid "Special file-sharing operations"
-msgstr "Visa alla alternativ"
-
#: src/fs/gnunet-fs-profiler.c:211
msgid "run the experiment with COUNT peers"
msgstr ""
@@ -3269,6 +3453,15 @@ msgstr ""
msgid "run a testbed to measure file-sharing performance"
msgstr ""
+#: src/fs/gnunet-fs.c:119
+msgid "print a list of all indexed files"
+msgstr ""
+
+#: src/fs/gnunet-fs.c:130
+#, fuzzy
+msgid "Special file-sharing operations"
+msgstr "Visa alla alternativ"
+
#: src/fs/gnunet-publish.c:219 src/fs/gnunet-publish.c:231
#, c-format
msgid "Publishing `%s' at %llu/%llu (%s remaining)\n"
@@ -3956,22 +4149,11 @@ msgstr ""
msgid "GNUnet DNS-to-GNS proxy (a DNS server)"
msgstr ""
-#: src/gns/gnunet-gns.c:235 src/gns/plugin_rest_gns.c:346
-#, c-format
-msgid "Invalid typename specified, assuming `ANY'\n"
-msgstr ""
-
-#: src/gns/gnunet-gns.c:252
-#, c-format
-msgid "Please specify name to lookup!\n"
-msgstr ""
-
-#: src/gns/gnunet-gns.c:276
-#, c-format
-msgid "Ego for `%s' not found, cannot perform lookup.\n"
+#: src/gns/gnunet-gns-helper-service-w32.c:602
+msgid "Not ready to process requests, lacking ego data\n"
msgstr ""
-#: src/gns/gnunet-gns.c:315 src/gns/gnunet-gns-helper-service-w32.c:701
+#: src/gns/gnunet-gns-helper-service-w32.c:701 src/gns/gnunet-gns.c:315
#: src/gns/plugin_rest_gns.c:422
#, c-format
msgid ""
@@ -3979,59 +4161,12 @@ msgid ""
"gns-import.sh?\n"
msgstr ""
-#: src/gns/gnunet-gns.c:355 src/gns/gnunet-gns-helper-service-w32.c:727
-#, fuzzy, c-format
-msgid "Failed to connect to GNS\n"
-msgstr "Misslyckades att ansluta till gnunetd.\n"
-
-#: src/gns/gnunet-gns.c:374
-#, c-format
-msgid "Public key `%s' is not well-formed\n"
-msgstr ""
-
-#: src/gns/gnunet-gns.c:428
-msgid "Lookup a record for the given name"
-msgstr ""
-
-#: src/gns/gnunet-gns.c:434
-#, fuzzy
-msgid "Specify the type of the record to lookup"
-msgstr "ange prioritet för innehållet"
-
-#: src/gns/gnunet-gns.c:440
-#, fuzzy
-msgid "Specify timeout for the lookup"
-msgstr "ange prioritet för innehållet"
-
-#: src/gns/gnunet-gns.c:445
-msgid "No unneeded output"
-msgstr ""
-
-#: src/gns/gnunet-gns.c:451
-#, fuzzy
-msgid "Specify the public key of the zone to lookup the record in"
-msgstr "ange prioritet för innehållet"
-
-#: src/gns/gnunet-gns.c:457
-#, fuzzy
-msgid "Specify the name of the ego of the zone to lookup the record in"
-msgstr "ange prioritet för innehållet"
-
-#: src/gns/gnunet-gns.c:476
-#, fuzzy
-msgid "GNUnet GNS resolver tool"
-msgstr "Spåra GNUnets nätverkstopologi."
-
-#: src/gns/gnunet-gns-helper-service-w32.c:602
-msgid "Not ready to process requests, lacking ego data\n"
-msgstr ""
-
#: src/gns/gnunet-gns-helper-service-w32.c:739
#, fuzzy, c-format
msgid "Failed to connect to identity service\n"
msgstr "Misslyckades att ansluta till gnunetd.\n"
-#: src/gns/gnunet-gns-import.c:489
+#: src/gns/gnunet-gns-import.c:452
msgid "This program will import some GNS authorities into your GNS namestore."
msgstr ""
@@ -4156,13 +4291,66 @@ msgstr ""
msgid "GNUnet GNS proxy"
msgstr ""
+#: src/gns/gnunet-gns.c:235 src/gns/plugin_rest_gns.c:346
+#, c-format
+msgid "Invalid typename specified, assuming `ANY'\n"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:252
+#, c-format
+msgid "Please specify name to lookup!\n"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:276
+#, c-format
+msgid "Ego for `%s' not found, cannot perform lookup.\n"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:374
+#, c-format
+msgid "Public key `%s' is not well-formed\n"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:428
+msgid "Lookup a record for the given name"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:434
+#, fuzzy
+msgid "Specify the type of the record to lookup"
+msgstr "ange prioritet för innehållet"
+
+#: src/gns/gnunet-gns.c:440
+#, fuzzy
+msgid "Specify timeout for the lookup"
+msgstr "ange prioritet för innehållet"
+
+#: src/gns/gnunet-gns.c:445
+msgid "No unneeded output"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:451
+#, fuzzy
+msgid "Specify the public key of the zone to lookup the record in"
+msgstr "ange prioritet för innehållet"
+
+#: src/gns/gnunet-gns.c:457
+#, fuzzy
+msgid "Specify the name of the ego of the zone to lookup the record in"
+msgstr "ange prioritet för innehållet"
+
+#: src/gns/gnunet-gns.c:476
+#, fuzzy
+msgid "GNUnet GNS resolver tool"
+msgstr "Spåra GNUnets nätverkstopologi."
+
#: src/gns/gnunet-service-gns.c:442
#, fuzzy
msgid "Failed to connect to the namecache!\n"
msgstr "Misslyckades att ansluta till gnunetd.\n"
#: src/gns/gnunet-service-gns.c:461
-#: src/zonemaster/gnunet-service-zonemaster.c:741
+#: src/zonemaster/gnunet-service-zonemaster.c:742
#, fuzzy
msgid "Could not connect to DHT!\n"
msgstr "Kunde inte ansluta till gnunetd.\n"
@@ -4220,45 +4408,35 @@ msgstr ""
msgid "Hostname `%s' is not well-formed, resolution fails\n"
msgstr ""
-#: src/gns/plugin_gnsrecord_gns.c:203
+#: src/gns/plugin_gnsrecord_gns.c:179
#, fuzzy, c-format
msgid "Unable to parse PKEY record `%s'\n"
msgstr "Misslyckades att läsa kompislista från \"%s\"\n"
-#: src/gns/plugin_gnsrecord_gns.c:232
+#: src/gns/plugin_gnsrecord_gns.c:208
#, fuzzy, c-format
msgid "Unable to parse GNS2DNS record `%s'\n"
msgstr "Misslyckades att läsa kompislista från \"%s\"\n"
-#: src/gns/plugin_gnsrecord_gns.c:253
+#: src/gns/plugin_gnsrecord_gns.c:229
#, fuzzy, c-format
msgid "Failed to serialize GNS2DNS record with value `%s'\n"
msgstr "Kunde inte tolka konfigurationsfil \"%s\".\n"
-#: src/gns/plugin_gnsrecord_gns.c:276
+#: src/gns/plugin_gnsrecord_gns.c:252
#, fuzzy, c-format
msgid "Unable to parse VPN record string `%s'\n"
msgstr "Misslyckades att läsa kompislista från \"%s\"\n"
-#: src/gns/plugin_gnsrecord_gns.c:312
+#: src/gns/plugin_gnsrecord_gns.c:288
#, fuzzy, c-format
msgid "Unable to parse BOX record string `%s'\n"
msgstr "Misslyckades att läsa kompislista från \"%s\"\n"
-#: src/gns/plugin_gnsrecord_gns.c:360
-#, fuzzy, c-format
-msgid "Unable to parse REVERSE record string `%s'\n"
-msgstr "Misslyckades att läsa kompislista från \"%s\"\n"
-
#: src/gns/plugin_rest_gns.c:384
msgid "Ego for not found, cannot perform lookup.\n"
msgstr ""
-#: src/gns/plugin_rest_gns.c:668
-#, fuzzy
-msgid "GNS REST API initialized\n"
-msgstr " Anslutning misslyckades\n"
-
#: src/gnsrecord/plugin_gnsrecord_dns.c:359
#, fuzzy, c-format
msgid "Unable to parse IPv4 address `%s'\n"
@@ -4689,6 +4867,53 @@ msgstr "\"%s\" är inte tillgänglig."
msgid "Could not start hostlist HTTP server on port %u\n"
msgstr ""
+#: src/identity-provider/gnunet-idp.c:348
+#, fuzzy
+msgid "Ego is required\n"
+msgstr "%s: flagga \"%s\" är tvetydig\n"
+
+#: src/identity-provider/gnunet-idp.c:370
+msgid "Add attribute"
+msgstr ""
+
+#: src/identity-provider/gnunet-idp.c:376
+msgid "Attribute value"
+msgstr ""
+
+#: src/identity-provider/gnunet-idp.c:381
+msgid "Ego"
+msgstr ""
+
+#: src/identity-provider/gnunet-idp.c:386
+msgid "Audience (relying party)"
+msgstr ""
+
+#: src/identity-provider/gnunet-idp.c:390
+msgid "List attributes for Ego"
+msgstr ""
+
+#: src/identity-provider/gnunet-idp.c:395
+msgid "Issue a ticket"
+msgstr ""
+
+#: src/identity-provider/gnunet-idp.c:400
+msgid "Consume a ticket"
+msgstr ""
+
+#: src/identity-provider/gnunet-idp.c:405
+msgid "Revoke a ticket"
+msgstr ""
+
+#: src/identity-provider/identity_provider_api.c:429
+#, fuzzy
+msgid "failed to store record\n"
+msgstr "Misslyckades att starta samling.\n"
+
+#: src/identity-provider/plugin_rest_identity_provider.c:1175
+#, fuzzy
+msgid "Identity Provider REST API initialized\n"
+msgstr " Anslutning misslyckades\n"
+
#: src/identity/gnunet-identity.c:179
#, fuzzy, c-format
msgid "Failed to create ego: %s\n"
@@ -4776,34 +5001,11 @@ msgstr "Kunde inte spara konfigurationsfil \"%s\":"
msgid "Failed to create directory `%s' for storing egos\n"
msgstr "Misslyckades att läsa kompislista från \"%s\"\n"
-#: src/identity/plugin_rest_identity.c:967
+#: src/identity/plugin_rest_identity.c:964
#, fuzzy
msgid "Identity REST API initialized\n"
msgstr " Anslutning misslyckades\n"
-#: src/identity-provider/gnunet-identity-token.c:66
-#, fuzzy
-msgid "Option `-t' is required\n"
-msgstr "%s: flagga \"%s\" är tvetydig\n"
-
-#: src/identity-provider/gnunet-identity-token.c:77
-#, fuzzy, c-format
-msgid "Token `%s' is malformed\n"
-msgstr "Ogiltigt argument: \"%s\"\n"
-
-#: src/identity-provider/gnunet-identity-token.c:166
-msgid "GNUid token"
-msgstr ""
-
-#: src/identity-provider/gnunet-identity-token.c:171
-msgid "Print token contents"
-msgstr ""
-
-#: src/identity-provider/plugin_rest_identity_provider.c:1166
-#, fuzzy
-msgid "Identity Token REST API initialized\n"
-msgstr " Anslutning misslyckades\n"
-
#: src/json/json.c:119
#, fuzzy, c-format
msgid "Failed to parse JSON in option `%s': %s (%s)\n"
@@ -4904,12 +5106,66 @@ msgstr "Kunde inte skapa namnrymd \"%s\" (existerar?).\n"
msgid "flat plugin running\n"
msgstr ""
-#: src/namecache/plugin_namecache_postgres.c:90
-#: src/namestore/plugin_namestore_postgres.c:97
-#, fuzzy
-msgid "Failed to create indices\n"
+#: src/namestore/gnunet-namestore-fcfsd.c:508
+#, fuzzy, c-format
+msgid "Unsupported form value `%s'\n"
+msgstr "Kommando \"%s\" stöds ej. Avbryter.\n"
+
+#: src/namestore/gnunet-namestore-fcfsd.c:535
+#, fuzzy, c-format
+msgid "Failed to create record for domain `%s': %s\n"
+msgstr "Kunde inte tolka konfigurationsfil \"%s\".\n"
+
+#: src/namestore/gnunet-namestore-fcfsd.c:555
+msgid "Error when mapping zone to name\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:585
+#, c-format
+msgid "Found existing name `%s' for the given key\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:662
+#, c-format
+msgid "Found %u existing records for domain `%s'\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:718
+#, fuzzy, c-format
+msgid "Failed to create page for `%s'\n"
msgstr "Kunde inte skapa namnrymd \"%s\" (existerar?).\n"
+#: src/namestore/gnunet-namestore-fcfsd.c:734
+#, fuzzy, c-format
+msgid "Failed to setup post processor for `%s'\n"
+msgstr "Misslyckades att läsa kompislista från \"%s\"\n"
+
+#: src/namestore/gnunet-namestore-fcfsd.c:770
+msgid "Domain name must not contain `.'\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:778
+msgid "Domain name must not contain `+'\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:974
+msgid "No ego configured for `fcfsd` subsystem\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:1000
+#, fuzzy
+msgid "Failed to start HTTP server\n"
+msgstr "Misslyckades att starta samling.\n"
+
+#: src/namestore/gnunet-namestore-fcfsd.c:1042
+#, fuzzy
+msgid "Failed to connect to identity\n"
+msgstr "Misslyckades att ansluta till gnunetd.\n"
+
+#: src/namestore/gnunet-namestore-fcfsd.c:1074
+msgid "GNU Name System First Come First Serve name registration service"
+msgstr ""
+
#: src/namestore/gnunet-namestore.c:301
#, fuzzy, c-format
msgid "Adding record failed: %s\n"
@@ -4918,7 +5174,7 @@ msgstr ""
"Fel vid uppladdning av fil: %s\n"
#: src/namestore/gnunet-namestore.c:330
-#: src/namestore/plugin_rest_namestore.c:562
+#: src/namestore/plugin_rest_namestore.c:567
#, fuzzy, c-format
msgid "Deleting record failed, record does not exist%s%s\n"
msgstr ""
@@ -4926,7 +5182,7 @@ msgstr ""
"Fel vid uppladdning av fil: %s\n"
#: src/namestore/gnunet-namestore.c:337
-#: src/namestore/plugin_rest_namestore.c:571
+#: src/namestore/plugin_rest_namestore.c:576
#, fuzzy, c-format
msgid "Deleting record failed%s%s\n"
msgstr ""
@@ -4946,7 +5202,7 @@ msgid "Records already exist under `%s', cannot add `%s' record.\n"
msgstr ""
#: src/namestore/gnunet-namestore.c:698
-#: src/namestore/plugin_rest_namestore.c:597
+#: src/namestore/plugin_rest_namestore.c:602
#, c-format
msgid "There are no records under label `%s' that could be deleted.\n"
msgstr ""
@@ -4957,24 +5213,11 @@ msgid ""
"There are no records under label `%s' that match the request for deletion.\n"
msgstr ""
-#: src/namestore/gnunet-namestore.c:776
-#: src/namestore/plugin_rest_namestore.c:1004
-#, fuzzy, c-format
-msgid "Ego `%s' not known to identity service\n"
-msgstr "\"%s\": okänd tjänst: %s\n"
-
#: src/namestore/gnunet-namestore.c:791
#, c-format
msgid "No options given\n"
msgstr ""
-#: src/namestore/gnunet-namestore.c:802
-#: src/namestore/gnunet-namestore-fcfsd.c:1034
-#: src/namestore/plugin_rest_namestore.c:1017
-#, fuzzy
-msgid "Failed to connect to namestore\n"
-msgstr "Misslyckades att ansluta till gnunetd.\n"
-
#: src/namestore/gnunet-namestore.c:810 src/namestore/gnunet-namestore.c:819
#: src/namestore/gnunet-namestore.c:838 src/namestore/gnunet-namestore.c:861
#: src/namestore/gnunet-namestore.c:915
@@ -4988,14 +5231,14 @@ msgid "add"
msgstr ""
#: src/namestore/gnunet-namestore.c:829
-#: src/namestore/plugin_rest_namestore.c:671
+#: src/namestore/plugin_rest_namestore.c:676
#, fuzzy, c-format
msgid "Unsupported type `%s'\n"
msgstr "Kommando \"%s\" stöds ej. Avbryter.\n"
#: src/namestore/gnunet-namestore.c:851
-#: src/namestore/plugin_rest_namestore.c:689
-#: src/namestore/plugin_rest_namestore.c:729
+#: src/namestore/plugin_rest_namestore.c:694
+#: src/namestore/plugin_rest_namestore.c:734
#, fuzzy, c-format
msgid "Value `%s' invalid for record type `%s'\n"
msgstr "%s: symbolvärde \"%s\" ogiltigt för %s\n"
@@ -5014,8 +5257,7 @@ msgstr ""
msgid "Invalid public key for reverse lookup `%s'\n"
msgstr "Ogiltigt argument: \"%s\"\n"
-#: src/namestore/gnunet-namestore.c:979
-#: src/peerinfo-tool/gnunet-peerinfo.c:775
+#: src/namestore/gnunet-namestore.c:979 src/peerinfo-tool/gnunet-peerinfo.c:775
#, fuzzy, c-format
msgid "Invalid URI `%s'\n"
msgstr "Ogiltiga argument: "
@@ -5026,13 +5268,13 @@ msgid "Invalid nick `%s'\n"
msgstr "Ogiltiga argument: "
#: src/namestore/gnunet-namestore.c:1051
-#: src/namestore/plugin_rest_namestore.c:1047
+#: src/namestore/plugin_rest_namestore.c:1052
#, fuzzy, c-format
msgid "No default ego configured in identity service\n"
msgstr "\"%s\": okänd tjänst: %s\n"
#: src/namestore/gnunet-namestore.c:1108
-#: src/namestore/plugin_rest_namestore.c:1143
+#: src/namestore/plugin_rest_namestore.c:1148
#, fuzzy, c-format
msgid "Cannot connect to identity service\n"
msgstr "Kunde inte ansluta till gnunetd.\n"
@@ -5096,67 +5338,7 @@ msgstr ""
msgid "name of the ego controlling the zone"
msgstr "Visa värde av alternativet"
-#: src/namestore/gnunet-namestore-fcfsd.c:508
-#, fuzzy, c-format
-msgid "Unsupported form value `%s'\n"
-msgstr "Kommando \"%s\" stöds ej. Avbryter.\n"
-
-#: src/namestore/gnunet-namestore-fcfsd.c:535
-#, fuzzy, c-format
-msgid "Failed to create record for domain `%s': %s\n"
-msgstr "Kunde inte tolka konfigurationsfil \"%s\".\n"
-
-#: src/namestore/gnunet-namestore-fcfsd.c:555
-msgid "Error when mapping zone to name\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:585
-#, c-format
-msgid "Found existing name `%s' for the given key\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:662
-#, c-format
-msgid "Found %u existing records for domain `%s'\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:718
-#, fuzzy, c-format
-msgid "Failed to create page for `%s'\n"
-msgstr "Kunde inte skapa namnrymd \"%s\" (existerar?).\n"
-
-#: src/namestore/gnunet-namestore-fcfsd.c:734
-#, fuzzy, c-format
-msgid "Failed to setup post processor for `%s'\n"
-msgstr "Misslyckades att läsa kompislista från \"%s\"\n"
-
-#: src/namestore/gnunet-namestore-fcfsd.c:770
-msgid "Domain name must not contain `.'\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:778
-msgid "Domain name must not contain `+'\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:974
-msgid "No ego configured for `fcfsd` subsystem\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:1000
-#, fuzzy
-msgid "Failed to start HTTP server\n"
-msgstr "Misslyckades att starta samling.\n"
-
-#: src/namestore/gnunet-namestore-fcfsd.c:1042
-#, fuzzy
-msgid "Failed to connect to identity\n"
-msgstr "Misslyckades att ansluta till gnunetd.\n"
-
-#: src/namestore/gnunet-namestore-fcfsd.c:1074
-msgid "GNU Name System First Come First Serve name registration service"
-msgstr ""
-
-#: src/namestore/gnunet-service-namestore.c:612
+#: src/namestore/gnunet-service-namestore.c:615
#, fuzzy, c-format
msgid "Failed to replicate block in namecache: %s\n"
msgstr "Misslyckades att läsa kompislista från \"%s\"\n"
@@ -5169,7 +5351,7 @@ msgstr ""
msgid "flat file database running\n"
msgstr ""
-#: src/namestore/plugin_rest_namestore.c:1188
+#: src/namestore/plugin_rest_namestore.c:1193
#, fuzzy
msgid "Namestore REST API initialized\n"
msgstr " Anslutning misslyckades\n"
@@ -5460,11 +5642,6 @@ msgstr ""
msgid "`upnpc' command not found\n"
msgstr ""
-#: src/nse/gnunet-nse.c:122
-#, fuzzy
-msgid "Show network size estimates from NSE service."
-msgstr "# byte mottogs via TCP"
-
#: src/nse/gnunet-nse-profiler.c:842
#, fuzzy
msgid "limit to the number of connections to NSE services, 0 for none"
@@ -5491,66 +5668,16 @@ msgstr ""
msgid "Measure quality and performance of the NSE service."
msgstr "Kan inte tillgå tjänsten"
+#: src/nse/gnunet-nse.c:122
+#, fuzzy
+msgid "Show network size estimates from NSE service."
+msgstr "# byte mottogs via TCP"
+
#: src/nse/gnunet-service-nse.c:1534
#: src/revocation/gnunet-service-revocation.c:838 src/util/gnunet-scrypt.c:276
msgid "Value is too large.\n"
msgstr ""
-#: src/peerinfo/gnunet-service-peerinfo.c:178
-#, fuzzy, c-format
-msgid "Removing expired address of transport `%s'\n"
-msgstr "Tillgängliga transport(er): %s\n"
-
-#: src/peerinfo/gnunet-service-peerinfo.c:310
-#, fuzzy, c-format
-msgid "Failed to parse HELLO in file `%s': %s\n"
-msgstr "Misslyckades att läsa kompislista från \"%s\"\n"
-
-#: src/peerinfo/gnunet-service-peerinfo.c:331
-#: src/peerinfo/gnunet-service-peerinfo.c:362
-#, fuzzy, c-format
-msgid "Failed to parse HELLO in file `%s'\n"
-msgstr "Misslyckades att läsa kompislista från \"%s\"\n"
-
-#: src/peerinfo/gnunet-service-peerinfo.c:446
-msgid "# peers known"
-msgstr ""
-
-#: src/peerinfo/gnunet-service-peerinfo.c:489
-#, c-format
-msgid ""
-"File `%s' in directory `%s' does not match naming convention. Removed.\n"
-msgstr ""
-
-#: src/peerinfo/gnunet-service-peerinfo.c:655
-#, fuzzy, c-format
-msgid "Scanning directory `%s'\n"
-msgstr "Misslyckades att läsa kompislista från \"%s\"\n"
-
-#: src/peerinfo/gnunet-service-peerinfo.c:663
-#, c-format
-msgid "Still no peers found in `%s'!\n"
-msgstr ""
-
-#: src/peerinfo/gnunet-service-peerinfo.c:1076
-#, fuzzy, c-format
-msgid "Cleaning up directory `%s'\n"
-msgstr "Misslyckades att läsa kompislista från \"%s\"\n"
-
-#: src/peerinfo/gnunet-service-peerinfo.c:1405
-#, c-format
-msgid "Importing HELLOs from `%s'\n"
-msgstr ""
-
-#: src/peerinfo/gnunet-service-peerinfo.c:1418
-msgid "Skipping import of included HELLOs\n"
-msgstr ""
-
-#: src/peerinfo/peerinfo_api.c:220
-#, fuzzy
-msgid "Failed to receive response from `PEERINFO' service."
-msgstr "Misslyckades att ta emot svar till \"%s\" meddelande från gnunetd\n"
-
#: src/peerinfo-tool/gnunet-peerinfo.c:239
#, fuzzy, c-format
msgid "%sPeer `%s'\n"
@@ -5641,6 +5768,61 @@ msgstr "Testar transport(er) %s\n"
msgid "Failed to load transport plugin for `%s'\n"
msgstr "Kunde inte slå upp \"%s\": %s\n"
+#: src/peerinfo/gnunet-service-peerinfo.c:178
+#, fuzzy, c-format
+msgid "Removing expired address of transport `%s'\n"
+msgstr "Tillgängliga transport(er): %s\n"
+
+#: src/peerinfo/gnunet-service-peerinfo.c:310
+#, fuzzy, c-format
+msgid "Failed to parse HELLO in file `%s': %s\n"
+msgstr "Misslyckades att läsa kompislista från \"%s\"\n"
+
+#: src/peerinfo/gnunet-service-peerinfo.c:331
+#: src/peerinfo/gnunet-service-peerinfo.c:362
+#, fuzzy, c-format
+msgid "Failed to parse HELLO in file `%s'\n"
+msgstr "Misslyckades att läsa kompislista från \"%s\"\n"
+
+#: src/peerinfo/gnunet-service-peerinfo.c:446
+msgid "# peers known"
+msgstr ""
+
+#: src/peerinfo/gnunet-service-peerinfo.c:489
+#, c-format
+msgid ""
+"File `%s' in directory `%s' does not match naming convention. Removed.\n"
+msgstr ""
+
+#: src/peerinfo/gnunet-service-peerinfo.c:655
+#, fuzzy, c-format
+msgid "Scanning directory `%s'\n"
+msgstr "Misslyckades att läsa kompislista från \"%s\"\n"
+
+#: src/peerinfo/gnunet-service-peerinfo.c:663
+#, c-format
+msgid "Still no peers found in `%s'!\n"
+msgstr ""
+
+#: src/peerinfo/gnunet-service-peerinfo.c:1076
+#, fuzzy, c-format
+msgid "Cleaning up directory `%s'\n"
+msgstr "Misslyckades att läsa kompislista från \"%s\"\n"
+
+#: src/peerinfo/gnunet-service-peerinfo.c:1405
+#, c-format
+msgid "Importing HELLOs from `%s'\n"
+msgstr ""
+
+#: src/peerinfo/gnunet-service-peerinfo.c:1418
+msgid "Skipping import of included HELLOs\n"
+msgstr ""
+
+#: src/peerinfo/peerinfo_api.c:220
+#, fuzzy
+msgid "Failed to receive response from `PEERINFO' service."
+msgstr "Misslyckades att ta emot svar till \"%s\" meddelande från gnunetd\n"
+
#: src/peerstore/gnunet-peerstore.c:91
msgid "peerstore"
msgstr ""
@@ -5690,15 +5872,10 @@ msgstr "Fel vid skapandet av användare"
msgid "Unable to create indices: %s.\n"
msgstr "Kunde inte skapa namnrymd \"%s\" (existerar?).\n"
-#: src/postgres/postgres.c:67
+#: src/pq/pq_prepare.c:80
#, fuzzy, c-format
-msgid "`%s:%s' failed at %s:%d with error: %s\n"
-msgstr "\"%s\" misslyckades vid %s:%d med fel: %s\n"
-
-#: src/postgres/postgres.c:192
-#, fuzzy, c-format
-msgid "Unable to connect to Postgres database '%s': %s\n"
-msgstr "Kunde inte spara konfigurationsfil \"%s\":"
+msgid "PQprepare (`%s' as `%s') failed with error: %s\n"
+msgstr "\"%s\" till \"%s\" misslyckades vid %s:%d med fel: %s\n"
#: src/psycstore/gnunet-service-psycstore.c:249
#, fuzzy
@@ -5878,61 +6055,61 @@ msgstr "GNUnet-konfiguration"
msgid "Daemon to announce regular expressions for the peer using cadet."
msgstr ""
-#: src/regex/gnunet-regex-profiler.c:1314
+#: src/regex/gnunet-regex-profiler.c:1386
#, fuzzy
msgid "No configuration file given. Exiting\n"
msgstr "använd konfigurationsfil FILNAMN"
-#: src/regex/gnunet-regex-profiler.c:1355
+#: src/regex/gnunet-regex-profiler.c:1427
#: src/regex/gnunet-regex-simulation-profiler.c:630
#, c-format
msgid "No policy directory specified on command line. Exiting.\n"
msgstr ""
-#: src/regex/gnunet-regex-profiler.c:1361
+#: src/regex/gnunet-regex-profiler.c:1433
#: src/regex/gnunet-regex-simulation-profiler.c:638
#, c-format
msgid "Specified policies directory does not exist. Exiting.\n"
msgstr ""
-#: src/regex/gnunet-regex-profiler.c:1368
+#: src/regex/gnunet-regex-profiler.c:1440
#, fuzzy, c-format
msgid "No files found in `%s'\n"
msgstr "%d filer hittades i katalog.\n"
-#: src/regex/gnunet-regex-profiler.c:1377
+#: src/regex/gnunet-regex-profiler.c:1449
msgid "No search strings file given. Exiting.\n"
msgstr ""
-#: src/regex/gnunet-regex-profiler.c:1397
+#: src/regex/gnunet-regex-profiler.c:1469
#, fuzzy
msgid "Error loading search strings. Exiting.\n"
msgstr "Fel vid lämning av DHT.\n"
-#: src/regex/gnunet-regex-profiler.c:1485
+#: src/regex/gnunet-regex-profiler.c:1557
#, fuzzy
msgid "name of the file for writing statistics"
msgstr "Visa värde av alternativet"
-#: src/regex/gnunet-regex-profiler.c:1491
+#: src/regex/gnunet-regex-profiler.c:1563
msgid "wait TIMEOUT before ending the experiment"
msgstr ""
-#: src/regex/gnunet-regex-profiler.c:1497
+#: src/regex/gnunet-regex-profiler.c:1569
msgid "directory with policy files"
msgstr ""
-#: src/regex/gnunet-regex-profiler.c:1504
+#: src/regex/gnunet-regex-profiler.c:1576
#, fuzzy
msgid "name of file with input strings"
msgstr "Visa värde av alternativet"
-#: src/regex/gnunet-regex-profiler.c:1510
+#: src/regex/gnunet-regex-profiler.c:1582
#, fuzzy
msgid "name of file with hosts' names"
msgstr "Visa värde av alternativet"
-#: src/regex/gnunet-regex-profiler.c:1523
+#: src/regex/gnunet-regex-profiler.c:1595
msgid "Profiler for regex"
msgstr ""
@@ -6166,10 +6343,10 @@ msgstr ""
msgid "Calculate the Vectorproduct with a GNUnet peer."
msgstr ""
-#: src/scalarproduct/gnunet-service-scalarproduct_alice.c:1407
-#: src/scalarproduct/gnunet-service-scalarproduct_bob.c:1345
-#: src/scalarproduct/gnunet-service-scalarproduct-ecc_alice.c:1180
+#: src/scalarproduct/gnunet-service-scalarproduct-ecc_alice.c:1172
#: src/scalarproduct/gnunet-service-scalarproduct-ecc_bob.c:1063
+#: src/scalarproduct/gnunet-service-scalarproduct_alice.c:1401
+#: src/scalarproduct/gnunet-service-scalarproduct_bob.c:1345
#, fuzzy
msgid "Connect to CADET failed\n"
msgstr " Anslutning misslyckades (fel?)\n"
@@ -6194,7 +6371,7 @@ msgstr ""
msgid "also profile decryption"
msgstr ""
-#: src/set/gnunet-service-set.c:1948
+#: src/set/gnunet-service-set.c:1989
#, fuzzy
msgid "Could not connect to CADET service\n"
msgstr "Kunde inte ansluta till gnunetd.\n"
@@ -6254,116 +6431,116 @@ msgstr ""
msgid "say good-bye and leave somebody else's place"
msgstr ""
-#: src/social/gnunet-social.c:1227 src/social/gnunet-social.c:1232
+#: src/social/gnunet-social.c:1227
msgid "create a place"
msgstr ""
-#: src/social/gnunet-social.c:1237
+#: src/social/gnunet-social.c:1232
msgid "destroy a place we were hosting"
msgstr ""
-#: src/social/gnunet-social.c:1242
+#: src/social/gnunet-social.c:1237
msgid "enter somebody else's place"
msgstr ""
-#: src/social/gnunet-social.c:1248
+#: src/social/gnunet-social.c:1243
msgid "find state matching name prefix"
msgstr ""
-#: src/social/gnunet-social.c:1253
+#: src/social/gnunet-social.c:1248
msgid "replay history of messages up to the given --limit"
msgstr ""
-#: src/social/gnunet-social.c:1258
+#: src/social/gnunet-social.c:1253
msgid "reconnect to a previously created place"
msgstr ""
-#: src/social/gnunet-social.c:1263
+#: src/social/gnunet-social.c:1258
msgid "publish something to a place we are hosting"
msgstr ""
-#: src/social/gnunet-social.c:1268
+#: src/social/gnunet-social.c:1263
msgid "reconnect to a previously entered place"
msgstr ""
-#: src/social/gnunet-social.c:1273
+#: src/social/gnunet-social.c:1268
msgid "search for state matching exact name"
msgstr ""
-#: src/social/gnunet-social.c:1278
+#: src/social/gnunet-social.c:1273
msgid "submit something to somebody's place"
msgstr ""
-#: src/social/gnunet-social.c:1283
+#: src/social/gnunet-social.c:1278
msgid "list of egos and subscribed places"
msgstr ""
-#: src/social/gnunet-social.c:1288
+#: src/social/gnunet-social.c:1283
msgid "extract and replay history between message IDs --start and --until"
msgstr ""
-#: src/social/gnunet-social.c:1297
+#: src/social/gnunet-social.c:1292
msgid "application ID to use when connecting"
msgstr ""
-#: src/social/gnunet-social.c:1303
+#: src/social/gnunet-social.c:1298
msgid "message body or state value"
msgstr ""
-#: src/social/gnunet-social.c:1309
+#: src/social/gnunet-social.c:1304
#, fuzzy
msgid "name or public key of ego"
msgstr "Ogiltigt argument: \"%s\"\n"
-#: src/social/gnunet-social.c:1314
+#: src/social/gnunet-social.c:1309
#, fuzzy
msgid "wait for incoming messages"
msgstr "Misslyckades att leverera \"%s\" meddelande.\n"
-#: src/social/gnunet-social.c:1320
+#: src/social/gnunet-social.c:1315
#, fuzzy
msgid "GNS name"
msgstr "Visa _namn"
-#: src/social/gnunet-social.c:1326
+#: src/social/gnunet-social.c:1321
msgid "peer ID for --guest-enter"
msgstr ""
-#: src/social/gnunet-social.c:1332
+#: src/social/gnunet-social.c:1327
msgid "name (key) to query from state"
msgstr ""
-#: src/social/gnunet-social.c:1338
+#: src/social/gnunet-social.c:1333
#, fuzzy
msgid "method name"
msgstr "Visa _namn"
-#: src/social/gnunet-social.c:1344
+#: src/social/gnunet-social.c:1339
#, fuzzy
msgid "number of messages to replay from history"
msgstr "antal meddelanden att använda per iteration"
-#: src/social/gnunet-social.c:1350
+#: src/social/gnunet-social.c:1345
msgid "key address of place"
msgstr ""
-#: src/social/gnunet-social.c:1356
+#: src/social/gnunet-social.c:1351
msgid "start message ID for history replay"
msgstr ""
-#: src/social/gnunet-social.c:1361
+#: src/social/gnunet-social.c:1356
msgid "respond to entry requests by admitting all guests"
msgstr ""
-#: src/social/gnunet-social.c:1367
+#: src/social/gnunet-social.c:1362
msgid "end message ID for history replay"
msgstr ""
-#: src/social/gnunet-social.c:1372
+#: src/social/gnunet-social.c:1367
msgid "respond to entry requests by refusing all guests"
msgstr ""
-#: src/social/gnunet-social.c:1382
+#: src/social/gnunet-social.c:1377
msgid ""
"gnunet-social - Interact with the social service: enter/leave, send/receive "
"messages, access history and state.\n"
@@ -6556,7 +6733,7 @@ msgid ""
msgstr ""
#: src/testbed/gnunet-daemon-testbed-underlay.c:231 src/testing/list-keys.c:46
-#: src/testing/testing.c:288 src/util/gnunet-ecc.c:298
+#: src/testing/testing.c:288 src/util/gnunet-ecc.c:301
#, c-format
msgid "Incorrect hostkey file format: %s\n"
msgstr ""
@@ -6626,16 +6803,6 @@ msgstr ""
msgid "%.s Unknown result code."
msgstr ""
-#: src/testbed/gnunet_testbed_mpi_spawn.c:118
-#, fuzzy
-msgid "Waiting for child to exit.\n"
-msgstr "Väntar på att motparter ska ansluta (%u iterationer kvar)...\n"
-
-#: src/testbed/gnunet_testbed_mpi_spawn.c:241
-#, fuzzy, c-format
-msgid "Spawning process `%s'\n"
-msgstr "Startade samling \"%s\".\n"
-
#: src/testbed/gnunet-testbed-profiler.c:290
msgid "tolerate COUNT number of continious timeout failures"
msgstr ""
@@ -6647,6 +6814,16 @@ msgid ""
"signal is received"
msgstr ""
+#: src/testbed/gnunet_testbed_mpi_spawn.c:118
+#, fuzzy
+msgid "Waiting for child to exit.\n"
+msgstr "Väntar på att motparter ska ansluta (%u iterationer kvar)...\n"
+
+#: src/testbed/gnunet_testbed_mpi_spawn.c:241
+#, fuzzy, c-format
+msgid "Spawning process `%s'\n"
+msgstr "Startade samling \"%s\".\n"
+
#: src/testbed/testbed_api.c:410
#, fuzzy, c-format
msgid "Adding host %u failed with error: %s\n"
@@ -6943,10 +7120,6 @@ msgstr "# krypterade PONG-meddelanden mottagna"
msgid "GNUnet topology control"
msgstr ""
-#: src/transport/gnunet-service-transport_ats.c:141
-msgid "# Addresses given to ATS"
-msgstr ""
-
#: src/transport/gnunet-service-transport.c:448
msgid "# messages dropped due to slow client"
msgstr ""
@@ -6995,6 +7168,10 @@ msgstr ""
msgid "Transport service is lacking key configuration settings. Exiting.\n"
msgstr "GNUnet-konfiguration"
+#: src/transport/gnunet-service-transport_ats.c:141
+msgid "# Addresses given to ATS"
+msgstr ""
+
#: src/transport/gnunet-service-transport_hello.c:195
msgid "# refreshed my HELLO"
msgstr ""
@@ -7326,6 +7503,46 @@ msgstr ""
msgid "# validations succeeded"
msgstr ""
+#: src/transport/gnunet-transport-profiler.c:219
+#, c-format
+msgid "%llu B in %llu ms == %.2f KB/s!\n"
+msgstr ""
+
+#: src/transport/gnunet-transport-profiler.c:617
+msgid "send data to peer"
+msgstr ""
+
+#: src/transport/gnunet-transport-profiler.c:621
+#, fuzzy
+msgid "receive data from peer"
+msgstr "# byte mottagna av typen %d"
+
+#: src/transport/gnunet-transport-profiler.c:626
+#, fuzzy
+msgid "iterations"
+msgstr "Visa alla alternativ"
+
+#: src/transport/gnunet-transport-profiler.c:631
+#, fuzzy
+msgid "number of messages to send"
+msgstr "antal meddelanden att använda per iteration"
+
+#: src/transport/gnunet-transport-profiler.c:636
+#, fuzzy
+msgid "message size to use"
+msgstr "meddelandestorlek"
+
+#: src/transport/gnunet-transport-profiler.c:641
+#: src/transport/gnunet-transport.c:1462
+msgid "peer identity"
+msgstr ""
+
+#: src/transport/gnunet-transport-profiler.c:652
+#: src/transport/gnunet-transport.c:1482
+#, fuzzy
+msgid "Direct access to transport service."
+msgstr "Misslyckades att ansluta till gnunetd.\n"
+
#: src/transport/gnunet-transport.c:413
#, fuzzy, c-format
msgid "Transmitted %llu bytes/s (%llu bytes in %s)\n"
@@ -7465,11 +7682,6 @@ msgstr "Skriv ut information om GNUnets motparter."
msgid "do not resolve hostnames"
msgstr "Misslyckades att läsa kompislista från \"%s\"\n"
-#: src/transport/gnunet-transport.c:1462
-#: src/transport/gnunet-transport-profiler.c:641
-msgid "peer identity"
-msgstr ""
-
#: src/transport/gnunet-transport.c:1466
msgid "monitor plugin sessions"
msgstr ""
@@ -7478,44 +7690,9 @@ msgstr ""
msgid "send data for benchmarking to the other peer (until CTRL-C)"
msgstr ""
-#: src/transport/gnunet-transport.c:1482
-#: src/transport/gnunet-transport-profiler.c:652
-#, fuzzy
-msgid "Direct access to transport service."
-msgstr "Misslyckades att ansluta till gnunetd.\n"
-
-#: src/transport/gnunet-transport-profiler.c:219
-#, c-format
-msgid "%llu B in %llu ms == %.2f KB/s!\n"
-msgstr ""
-
-#: src/transport/gnunet-transport-profiler.c:617
-msgid "send data to peer"
-msgstr ""
-
-#: src/transport/gnunet-transport-profiler.c:621
-#, fuzzy
-msgid "receive data from peer"
-msgstr "# byte mottagna av typen %d"
-
-#: src/transport/gnunet-transport-profiler.c:626
-#, fuzzy
-msgid "iterations"
-msgstr "Visa alla alternativ"
-
-#: src/transport/gnunet-transport-profiler.c:631
-#, fuzzy
-msgid "number of messages to send"
-msgstr "antal meddelanden att använda per iteration"
-
-#: src/transport/gnunet-transport-profiler.c:636
-#, fuzzy
-msgid "message size to use"
-msgstr "meddelandestorlek"
-
#: src/transport/plugin_transport_http_client.c:1474
-#: src/transport/plugin_transport_http_server.c:2249
-#: src/transport/plugin_transport_http_server.c:3463
+#: src/transport/plugin_transport_http_server.c:2312
+#: src/transport/plugin_transport_http_server.c:3526
#: src/transport/plugin_transport_tcp.c:3890
#: src/transport/plugin_transport_tcp.c:3897
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"
msgstr ""
#: src/transport/plugin_transport_http_client.c:2164
-#: src/transport/plugin_transport_http_server.c:3178
+#: src/transport/plugin_transport_http_server.c:3241
#, fuzzy, c-format
msgid "Shutting down plugin `%s'\n"
msgstr "Testar transport(er) %s\n"
#: src/transport/plugin_transport_http_client.c:2181
-#: src/transport/plugin_transport_http_server.c:3248
+#: src/transport/plugin_transport_http_server.c:3311
#, fuzzy, c-format
msgid "Shutdown for plugin `%s' complete\n"
msgstr ""
@@ -7544,108 +7721,108 @@ msgstr ""
msgid "Maximum number of requests is %u\n"
msgstr "Maximalt antal chattklienter uppnått.\n"
-#: src/transport/plugin_transport_http_server.c:1727
+#: src/transport/plugin_transport_http_server.c:1756
#, c-format
msgid ""
"Access from connection %p (%u of %u) for `%s' `%s' url `%s' with upload data "
"size %u\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:1967
+#: src/transport/plugin_transport_http_server.c:2028
#, c-format
msgid "Accepting connection (%u of %u) from `%s'\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:1975
+#: src/transport/plugin_transport_http_server.c:2036
#, c-format
msgid ""
"Server reached maximum number connections (%u), rejecting new connection\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:2125
+#: src/transport/plugin_transport_http_server.c:2186
msgid ""
"Could not create a new TLS certificate, program `gnunet-transport-"
"certificate-creation' could not be started!\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:2148
+#: src/transport/plugin_transport_http_server.c:2209
#, c-format
msgid "No usable TLS certificate found and creating one at `%s/%s' failed!\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:2275
+#: src/transport/plugin_transport_http_server.c:2338
msgid "Could not load or create server certificate! Loading plugin failed!\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:2587
+#: src/transport/plugin_transport_http_server.c:2650
#, fuzzy
msgid "Require valid port number for service in configuration!\n"
msgstr "Inga applikationer definierade i konfiguration!\n"
-#: src/transport/plugin_transport_http_server.c:2752
+#: src/transport/plugin_transport_http_server.c:2815
#, c-format
msgid "Found %u addresses to report to NAT service\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:2838
+#: src/transport/plugin_transport_http_server.c:2901
#: src/transport/plugin_transport_udp.c:3622
msgid "Disabling IPv6 since it is not supported on this system!\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:2944
+#: src/transport/plugin_transport_http_server.c:3007
#, c-format
msgid "IPv4 support is %s\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:2959
+#: src/transport/plugin_transport_http_server.c:3022
#, c-format
msgid "IPv6 support is %s\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:2965
+#: src/transport/plugin_transport_http_server.c:3028
msgid "Neither IPv4 nor IPv6 are enabled! Fix in configuration\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:2976
+#: src/transport/plugin_transport_http_server.c:3039
#, fuzzy
msgid "Port is required! Fix in configuration\n"
msgstr " gconfig\tGTK-konfiguration\n"
-#: src/transport/plugin_transport_http_server.c:2982
+#: src/transport/plugin_transport_http_server.c:3045
#, fuzzy, c-format
msgid "Using port %u\n"
msgstr "Testar transport(er) %s\n"
-#: src/transport/plugin_transport_http_server.c:3001
+#: src/transport/plugin_transport_http_server.c:3064
#, fuzzy, c-format
msgid "Specific IPv4 address `%s' in configuration file is invalid!\n"
msgstr ""
"Du måste ange ett positivt nummer för \"%s\" i konfigurationen i sektion \"%s"
"\".\n"
-#: src/transport/plugin_transport_http_server.c:3036
+#: src/transport/plugin_transport_http_server.c:3099
#, fuzzy, c-format
msgid "Specific IPv6 address `%s' in configuration file is invalid!\n"
msgstr ""
"Du måste ange ett positivt nummer för \"%s\" i konfigurationen i sektion \"%s"
"\".\n"
-#: src/transport/plugin_transport_http_server.c:3111
+#: src/transport/plugin_transport_http_server.c:3174
#, fuzzy, c-format
msgid "Using external hostname `%s'\n"
msgstr "Startade samling \"%s\".\n"
-#: src/transport/plugin_transport_http_server.c:3132
+#: src/transport/plugin_transport_http_server.c:3195
#, fuzzy, c-format
msgid "Notifying transport only about hostname `%s'\n"
msgstr "Misslyckades att läsa kompislista från \"%s\"\n"
-#: src/transport/plugin_transport_http_server.c:3149
+#: src/transport/plugin_transport_http_server.c:3212
#, fuzzy, c-format
msgid "Maximum number of connections is %u\n"
msgstr "Maximalt antal chattklienter uppnått.\n"
-#: src/transport/plugin_transport_http_server.c:3475
+#: src/transport/plugin_transport_http_server.c:3538
#, fuzzy
msgid "Unable to compile URL regex\n"
msgstr "Kunde inte initiera SQLite.\n"
@@ -7800,21 +7977,6 @@ msgstr ""
msgid "TCP transport advertises itself as being on port %llu\n"
msgstr ""
-#: src/transport/plugin_transport_udp_broadcasting.c:168
-#, fuzzy
-msgid "# Multicast HELLO beacons received via UDP"
-msgstr "# krypterade PONG-meddelanden mottagna"
-
-#: src/transport/plugin_transport_udp_broadcasting.c:548
-msgid ""
-"Disabling HELLO broadcasting due to friend-to-friend only configuration!\n"
-msgstr ""
-
-#: src/transport/plugin_transport_udp_broadcasting.c:565
-#, c-format
-msgid "Failed to set IPv4 broadcast option for broadcast socket on port %d\n"
-msgstr ""
-
#: src/transport/plugin_transport_udp.c:3366
#, c-format
msgid ""
@@ -7863,6 +8025,21 @@ msgstr "\"%s\" är inte tillgänglig."
msgid "Failed to create UDP network sockets\n"
msgstr "Kunde inte skapa namnrymd \"%s\" (existerar?).\n"
+#: src/transport/plugin_transport_udp_broadcasting.c:168
+#, fuzzy
+msgid "# Multicast HELLO beacons received via UDP"
+msgstr "# krypterade PONG-meddelanden mottagna"
+
+#: src/transport/plugin_transport_udp_broadcasting.c:548
+msgid ""
+"Disabling HELLO broadcasting due to friend-to-friend only configuration!\n"
+msgstr ""
+
+#: src/transport/plugin_transport_udp_broadcasting.c:565
+#, c-format
+msgid "Failed to set IPv4 broadcast option for broadcast socket on port %d\n"
+msgstr ""
+
#: src/transport/plugin_transport_unix.c:1403
#, fuzzy, c-format
msgid "Cannot create path to `%s'\n"
@@ -7978,7 +8155,7 @@ msgid ""
"`GNUNET_SERVER_receive_done' after %s\n"
msgstr ""
-#: src/transport/tcp_service_legacy.c:339 src/util/service.c:2337
+#: src/transport/tcp_service_legacy.c:339 src/util/service.c:2336
#, fuzzy, c-format
msgid "Unknown address family %d\n"
msgstr "Okänd operation \"%s\"\n"
@@ -8023,51 +8200,51 @@ msgstr "Fel vid %s:%d.\n"
msgid "Service `%s' runs at %s\n"
msgstr "Motpart \"%s\" med pålitlighet %8u och adress \"%s\"\n"
-#: src/transport/tcp_service_legacy.c:1251 src/util/service.c:1501
+#: src/transport/tcp_service_legacy.c:1251 src/util/service.c:1500
msgid "Service process failed to initialize\n"
msgstr ""
-#: src/transport/tcp_service_legacy.c:1255 src/util/service.c:1505
+#: src/transport/tcp_service_legacy.c:1255 src/util/service.c:1504
msgid "Service process could not initialize server function\n"
msgstr ""
-#: src/transport/tcp_service_legacy.c:1259 src/util/service.c:1509
+#: src/transport/tcp_service_legacy.c:1259 src/util/service.c:1508
msgid "Service process failed to report status\n"
msgstr ""
#: src/transport/tcp_service_legacy.c:1313 src/util/disk.c:1488
-#: src/util/service.c:1379
+#: src/util/service.c:1378
#, fuzzy, c-format
msgid "Cannot obtain information about user `%s': %s\n"
msgstr "Kan inte öppna konfigurationsfil \"%s\".\n"
-#: src/transport/tcp_service_legacy.c:1314 src/util/service.c:1381
+#: src/transport/tcp_service_legacy.c:1314 src/util/service.c:1380
msgid "No such user"
msgstr ""
-#: src/transport/tcp_service_legacy.c:1327 src/util/service.c:1400
+#: src/transport/tcp_service_legacy.c:1327 src/util/service.c:1399
#, c-format
msgid "Cannot change user/group to `%s': %s\n"
msgstr "Kan inte ändra användare/grupp till \"%s\": %s\n"
-#: src/transport/tcp_service_legacy.c:1398 src/util/service.c:1728
+#: src/transport/tcp_service_legacy.c:1398 src/util/service.c:1727
msgid "do daemonize (detach from terminal)"
msgstr ""
#: src/transport/tcp_service_legacy.c:1448 src/util/program.c:244
-#: src/util/service.c:1791
+#: src/util/service.c:1790
#, fuzzy, c-format
msgid "Malformed configuration file `%s', exit ...\n"
msgstr "Kunde inte spara konfigurationsfil \"%s\":"
#: src/transport/tcp_service_legacy.c:1458 src/util/program.c:261
-#: src/util/service.c:1802
+#: src/util/service.c:1801
#, fuzzy
msgid "Malformed configuration, exit ...\n"
msgstr "Kunde inte spara konfigurationsfil \"%s\":"
#: src/transport/tcp_service_legacy.c:1463 src/util/program.c:256
-#: src/util/service.c:1808
+#: src/util/service.c:1807
#, fuzzy, c-format
msgid "Could not access configuration file `%s'\n"
msgstr "Kunde inte tolka konfigurationsfil \"%s\".\n"
@@ -8112,86 +8289,86 @@ msgstr ""
msgid "Need a non-empty hostname for service `%s'.\n"
msgstr ""
-#: src/util/common_logging.c:256 src/util/common_logging.c:1129
+#: src/util/common_logging.c:259 src/util/common_logging.c:1132
msgid "DEBUG"
msgstr "FELSÖKNING"
-#: src/util/common_logging.c:258 src/util/common_logging.c:1127
+#: src/util/common_logging.c:261 src/util/common_logging.c:1130
msgid "INFO"
msgstr "INFO"
-#: src/util/common_logging.c:260 src/util/common_logging.c:1125
+#: src/util/common_logging.c:263 src/util/common_logging.c:1128
msgid "MESSAGE"
msgstr "MEDDELANDE"
-#: src/util/common_logging.c:262 src/util/common_logging.c:1123
+#: src/util/common_logging.c:265 src/util/common_logging.c:1126
msgid "WARNING"
msgstr "VARNING"
-#: src/util/common_logging.c:264 src/util/common_logging.c:1121
+#: src/util/common_logging.c:267 src/util/common_logging.c:1124
msgid "ERROR"
msgstr "FEL"
-#: src/util/common_logging.c:266 src/util/common_logging.c:1131
+#: src/util/common_logging.c:269 src/util/common_logging.c:1134
msgid "NONE"
msgstr ""
-#: src/util/common_logging.c:879
+#: src/util/common_logging.c:882
#, c-format
msgid "Message `%.*s' repeated %u times in the last %s\n"
msgstr ""
-#: src/util/common_logging.c:1132
+#: src/util/common_logging.c:1135
msgid "INVALID"
msgstr ""
-#: src/util/common_logging.c:1302
+#: src/util/common_logging.c:1326
msgid "unknown address"
msgstr ""
-#: src/util/common_logging.c:1344
+#: src/util/common_logging.c:1368
msgid "invalid address"
msgstr ""
-#: src/util/common_logging.c:1362
+#: src/util/common_logging.c:1386
#, fuzzy, c-format
msgid "Configuration fails to specify option `%s' in section `%s'!\n"
msgstr "Konfigurationsfil \"%s\" skapad.\n"
-#: src/util/common_logging.c:1383
+#: src/util/common_logging.c:1407
#, fuzzy, c-format
msgid ""
"Configuration specifies invalid value for option `%s' in section `%s': %s\n"
msgstr "Konfigurationsfil \"%s\" hittades inte. Kör \"gnunet-setup -d\"!\n"
-#: src/util/configuration.c:286
+#: src/util/configuration.c:296
#, fuzzy, c-format
msgid "Syntax error while deserializing in line %u\n"
msgstr "Syntaxfel i konfigurationsfil \"%s\" på rad %d.\n"
-#: src/util/configuration.c:344
+#: src/util/configuration.c:355
#, fuzzy, c-format
msgid "Error while reading file `%s'\n"
msgstr "Fel vid nedladdning: %s\n"
-#: src/util/configuration.c:1017
+#: src/util/configuration.c:1034
#, c-format
msgid ""
"Configuration value '%s' for '%s' in section '%s' is not in set of legal "
"choices\n"
msgstr ""
-#: src/util/configuration.c:1136
+#: src/util/configuration.c:1153
#, c-format
msgid "Recursive expansion suspected, aborting $-expansion for term `%s'\n"
msgstr ""
-#: src/util/configuration.c:1169
+#: src/util/configuration.c:1186
#, fuzzy, c-format
msgid "Missing closing `%s' in option `%s'\n"
msgstr "Konfigurationsfil \"%s\" skapad.\n"
-#: src/util/configuration.c:1237
+#: src/util/configuration.c:1254
#, c-format
msgid ""
"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"
msgid "EdDSA signature verification failed at %s:%d: %s\n"
msgstr "\"%s\" misslyckades vid %s:%d med fel: \"%s\".\n"
-#: src/util/crypto_ecc_setup.c:122 src/util/crypto_ecc_setup.c:160
-#: src/util/crypto_ecc_setup.c:278 src/util/crypto_ecc_setup.c:316
+#: src/util/crypto_ecc_setup.c:122 src/util/crypto_ecc_setup.c:161
+#: src/util/crypto_ecc_setup.c:279 src/util/crypto_ecc_setup.c:317
#, fuzzy, c-format
msgid "Could not acquire lock on file `%s': %s...\n"
msgstr "Kunde inte slå upp \"%s\": %s\n"
-#: src/util/crypto_ecc_setup.c:127 src/util/crypto_ecc_setup.c:283
+#: src/util/crypto_ecc_setup.c:128 src/util/crypto_ecc_setup.c:284
#, fuzzy
msgid "Creating a new private key. This may take a while.\n"
msgstr "Skapar ny värdnyckel (det här kan ta en stund).\n"
-#: src/util/crypto_ecc_setup.c:164 src/util/crypto_ecc_setup.c:320
+#: src/util/crypto_ecc_setup.c:165 src/util/crypto_ecc_setup.c:322
msgid "This may be ok if someone is currently generating a private key.\n"
msgstr ""
-#: src/util/crypto_ecc_setup.c:194 src/util/crypto_ecc_setup.c:350
+#: src/util/crypto_ecc_setup.c:195 src/util/crypto_ecc_setup.c:352
#, c-format
msgid ""
"When trying to read key file `%s' I found %u bytes but I need at least %u.\n"
msgstr ""
-#: src/util/crypto_ecc_setup.c:198 src/util/crypto_ecc_setup.c:354
+#: src/util/crypto_ecc_setup.c:199 src/util/crypto_ecc_setup.c:356
msgid "This may be ok if someone is currently generating a key.\n"
msgstr ""
-#: src/util/crypto_ecc_setup.c:413
+#: src/util/crypto_ecc_setup.c:415
#, fuzzy
msgid "Could not load peer's private key\n"
msgstr "Kunde inte tolka konfigurationsfil \"%s\".\n"
@@ -8444,82 +8621,86 @@ msgstr ""
msgid "Manipulate GNUnet configuration files"
msgstr "skriv ut ett värde från konfigurationsfilen till standard ut"
-#: src/util/gnunet-ecc.c:84
+#: src/util/gnunet-ecc.c:89
#, fuzzy, c-format
msgid "Failed to open `%s': %s\n"
msgstr "Misslyckades att leverera \"%s\" meddelande.\n"
-#: src/util/gnunet-ecc.c:120
+#: src/util/gnunet-ecc.c:125
#, c-format
msgid "Generating %u keys like %s, please wait"
msgstr ""
-#: src/util/gnunet-ecc.c:133
+#: src/util/gnunet-ecc.c:138
#, c-format
msgid "Generating %u keys, please wait"
msgstr ""
-#: src/util/gnunet-ecc.c:174
+#: src/util/gnunet-ecc.c:179
#, fuzzy, c-format
msgid ""
"\n"
"Failed to write to `%s': %s\n"
msgstr "Fel vid %s:%d.\n"
-#: src/util/gnunet-ecc.c:184
+#: src/util/gnunet-ecc.c:189
#, fuzzy, c-format
msgid ""
"\n"
"Finished!\n"
msgstr "Slutför"
-#: src/util/gnunet-ecc.c:187
+#: src/util/gnunet-ecc.c:192
#, c-format
msgid ""
"\n"
"Error, %u keys not generated\n"
msgstr ""
-#: src/util/gnunet-ecc.c:280
+#: src/util/gnunet-ecc.c:283
#, fuzzy, c-format
msgid "Hostkeys file `%s' not found\n"
msgstr "\"%s\" misslyckades: tabell hittades inte!\n"
-#: src/util/gnunet-ecc.c:291
+#: src/util/gnunet-ecc.c:294
#, fuzzy, c-format
msgid "Hostkeys file `%s' is empty\n"
msgstr "antal meddelanden att använda per iteration"
-#: src/util/gnunet-ecc.c:313
+#: src/util/gnunet-ecc.c:316
#, fuzzy, c-format
msgid "Could not read hostkey file: %s\n"
msgstr "Kunde inte skapa värdnyckel!\n"
-#: src/util/gnunet-ecc.c:364
+#: src/util/gnunet-ecc.c:367
msgid "No hostkey file specified on command line\n"
msgstr ""
-#: src/util/gnunet-ecc.c:416
+#: src/util/gnunet-ecc.c:425
msgid "list keys included in a file (for testing)"
msgstr ""
-#: src/util/gnunet-ecc.c:421
+#: src/util/gnunet-ecc.c:430
msgid "number of keys to list included in a file (for testing)"
msgstr ""
-#: src/util/gnunet-ecc.c:426
+#: src/util/gnunet-ecc.c:435
msgid "create COUNT public-private key pairs (for testing)"
msgstr ""
-#: src/util/gnunet-ecc.c:430
+#: src/util/gnunet-ecc.c:439
msgid "print the public key in ASCII format"
msgstr ""
-#: src/util/gnunet-ecc.c:434
+#: src/util/gnunet-ecc.c:443
+msgid "print the public key in HEX format"
+msgstr ""
+
+#: src/util/gnunet-ecc.c:447
msgid "print examples of ECC operations (used for compatibility testing)"
msgstr ""
-#: src/util/gnunet-ecc.c:449
+#: src/util/gnunet-ecc.c:463
#, fuzzy
msgid "Manipulate GNUnet private ECC key files"
msgstr "skriv ut ett värde från konfigurationsfilen till standard ut"
@@ -8613,7 +8794,7 @@ msgstr "Fel vid skapandet av användare"
msgid "Unable to shorten unix path `%s' while keeping name unique\n"
msgstr ""
-#: src/util/network.c:1793 src/util/network.c:1969
+#: src/util/network.c:1793 src/util/network.c:1977
#, c-format
msgid ""
"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"
msgid "Could not determine plugin installation path.\n"
msgstr "Kunde inte fastställa min publika IPv6-adress.\n"
-#: src/util/resolver_api.c:204
+#: src/util/resolver_api.c:203
#, c-format
msgid ""
"Missing `%s' for `%s' in configuration, DNS resolution will be unavailable.\n"
@@ -8682,32 +8863,32 @@ msgstr ""
"Du måste ange ett positivt nummer för \"%s\" i konfigurationen i sektion \"%s"
"\".\n"
-#: src/util/resolver_api.c:815
+#: src/util/resolver_api.c:826
#, fuzzy, c-format
msgid "Timeout trying to resolve hostname `%s'.\n"
msgstr "Misslyckades att läsa kompislista från \"%s\"\n"
-#: src/util/resolver_api.c:827
+#: src/util/resolver_api.c:839
#, c-format
msgid "Timeout trying to resolve IP address `%s'.\n"
msgstr ""
-#: src/util/resolver_api.c:1004
+#: src/util/resolver_api.c:1023
msgid "Resolver not configured correctly.\n"
msgstr ""
-#: src/util/resolver_api.c:1086 src/util/resolver_api.c:1107
-#: src/util/resolver_api.c:1121
+#: src/util/resolver_api.c:1109 src/util/resolver_api.c:1132
+#: src/util/resolver_api.c:1146
#, fuzzy, c-format
msgid "Could not resolve our FQDN: %s\n"
msgstr "Kunde inte slå upp \"%s\": %s\n"
-#: src/util/service.c:1306
+#: src/util/service.c:1305
msgid ""
"Could not bind to any of the ports I was supposed to, refusing to run!\n"
msgstr ""
-#: src/util/service.c:2082
+#: src/util/service.c:2081
#, c-format
msgid ""
"Processing code for message of type %u did not call "
@@ -8784,63 +8965,63 @@ msgstr " dagar"
msgid "end of time"
msgstr ""
-#: src/util/strings.c:1269
+#: src/util/strings.c:1270
msgid "IPv6 address did not start with `['\n"
msgstr ""
-#: src/util/strings.c:1277
+#: src/util/strings.c:1278
msgid "IPv6 address did contain ':' to separate port number\n"
msgstr ""
-#: src/util/strings.c:1283
+#: src/util/strings.c:1284
msgid "IPv6 address did contain ']' before ':' to separate port number\n"
msgstr ""
-#: src/util/strings.c:1290
+#: src/util/strings.c:1291
msgid "IPv6 address did contain a valid port number after the last ':'\n"
msgstr ""
-#: src/util/strings.c:1299
+#: src/util/strings.c:1300
#, fuzzy, c-format
msgid "Invalid IPv6 address `%s': %s\n"
msgstr "Ogiltigt svar på \"%s\".\n"
-#: src/util/strings.c:1571 src/util/strings.c:1587
+#: src/util/strings.c:1572 src/util/strings.c:1588
msgid "Port not in range\n"
msgstr ""
-#: src/util/strings.c:1596
+#: src/util/strings.c:1597
#, fuzzy, c-format
msgid "Malformed port policy `%s'\n"
msgstr "Misslyckades att starta samling.\n"
-#: src/util/strings.c:1679 src/util/strings.c:1710 src/util/strings.c:1758
-#: src/util/strings.c:1779
+#: src/util/strings.c:1680 src/util/strings.c:1711 src/util/strings.c:1759
+#: src/util/strings.c:1780
#, c-format
msgid "Invalid format for IP: `%s'\n"
msgstr "Ogiltigt format för IP: \"%s\"\n"
-#: src/util/strings.c:1736
+#: src/util/strings.c:1737
#, c-format
msgid "Invalid network notation ('/%d' is not legal in IPv4 CIDR)."
msgstr "Ogiltig nätverksnotation (\"/%d\" är inte giltig i IPv4 CIDR)."
-#: src/util/strings.c:1788
+#: src/util/strings.c:1789
#, fuzzy, c-format
msgid "Invalid format: `%s'\n"
msgstr "Ogiltigt format för IP: \"%s\"\n"
-#: src/util/strings.c:1840
+#: src/util/strings.c:1841
#, c-format
msgid "Invalid network notation (does not end with ';': `%s')\n"
msgstr "Ogiltig nätverksnotation (slutar inte med \";\": \"%s\")\n"
-#: src/util/strings.c:1890
+#: src/util/strings.c:1891
#, fuzzy, c-format
msgid "Wrong format `%s' for netmask\n"
msgstr "Fel format \"%s\" för nätmask: %s\n"
-#: src/util/strings.c:1921
+#: src/util/strings.c:1922
#, fuzzy, c-format
msgid "Wrong format `%s' for network\n"
msgstr "Fel format \"%s\" för nätverk: %s\n"
@@ -9023,28 +9204,44 @@ msgstr "# byte mottagna via UDP"
msgid "Setup tunnels via VPN."
msgstr ""
-#: src/zonemaster/gnunet-service-zonemaster.c:705
+#: src/zonemaster/gnunet-service-zonemaster.c:706
#, fuzzy
msgid "Failed to connect to the namestore!\n"
msgstr "Misslyckades att ansluta till gnunetd.\n"
-#: src/include/gnunet_common.h:674 src/include/gnunet_common.h:681
-#: src/include/gnunet_common.h:691 src/include/gnunet_common.h:699
+#: src/include/gnunet_common.h:689 src/include/gnunet_common.h:696
+#: src/include/gnunet_common.h:706 src/include/gnunet_common.h:714
#, fuzzy, c-format
msgid "Assertion failed at %s:%d.\n"
msgstr "\"%s\" misslyckades vid %s:%d med fel: \"%s\".\n"
-#: src/include/gnunet_common.h:711
+#: src/include/gnunet_common.h:726
#, c-format
msgid "External protocol violation detected at %s:%d.\n"
msgstr ""
-#: src/include/gnunet_common.h:738 src/include/gnunet_common.h:747
+#: src/include/gnunet_common.h:753 src/include/gnunet_common.h:762
#, c-format
msgid "`%s' failed on file `%s' at %s:%d with error: %s\n"
msgstr "\"%s\" misslyckades för fil \"%s\" vid %s:%d med fel: %s\n"
#, fuzzy
+#~ msgid "Token `%s' is malformed\n"
+#~ msgstr "Ogiltigt argument: \"%s\"\n"
+
+#, fuzzy
+#~ msgid "Failed to create indices\n"
+#~ msgstr "Kunde inte skapa namnrymd \"%s\" (existerar?).\n"
+
+#, fuzzy
+#~ msgid "`%s:%s' failed at %s:%d with error: %s\n"
+#~ msgstr "\"%s\" misslyckades vid %s:%d med fel: %s\n"
+
+#, fuzzy
+#~ msgid "Unable to connect to Postgres database '%s': %s\n"
+#~ msgstr "Kunde inte spara konfigurationsfil \"%s\":"
+
+#, fuzzy
#~ msgid "Misconfiguration (can not connect to the ARM service)"
#~ msgstr "Misslyckades att ansluta till gnunetd.\n"
@@ -9153,10 +9350,6 @@ msgstr "\"%s\" misslyckades för fil \"%s\" vid %s:%d med fel: %s\n"
#~ msgstr "# klartext PONG-meddelanden mottagna"
#, fuzzy
-#~ msgid "# bytes sent to datastore"
-#~ msgstr "# byte krypterade"
-
-#, fuzzy
#~ msgid "Failed to receive status response from database."
#~ msgstr "Misslyckades att ta emot svar till \"%s\" meddelande från gnunetd\n"
@@ -9446,10 +9639,6 @@ msgstr "\"%s\" misslyckades för fil \"%s\" vid %s:%d med fel: %s\n"
#~ msgstr "Misslyckades att initiera tjänsten \"%s\".\n"
#, fuzzy
-#~ msgid "Error reading sensor version\n"
-#~ msgstr "Fel vid skapandet av användare"
-
-#, fuzzy
#~ msgid "Error reading sensor category\n"
#~ msgstr "Fel vid skapandet av användare"
@@ -10005,10 +10194,6 @@ msgstr "\"%s\" misslyckades för fil \"%s\" vid %s:%d med fel: %s\n"
#~ msgstr "Misslyckades att skicka HTTP-begäran till värd \"%s\": %s\n"
#, fuzzy
-#~ msgid "Failed to remove records from database"
-#~ msgstr "Misslyckades att ta emot svar till \"%s\" meddelande från gnunetd\n"
-
-#, fuzzy
#~ msgid "Failed to access database"
#~ msgstr "Misslyckades att leverera \"%s\" meddelande.\n"
diff --git a/po/vi.po b/po/vi.po
index a9f00a20d3..05b1f1381b 100644
--- a/po/vi.po
+++ b/po/vi.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gnunet 0.8.0a\n"
"Report-Msgid-Bugs-To: gnunet-developers@mail.gnu.org\n"
-"POT-Creation-Date: 2017-03-31 19:22-0500\n"
+"POT-Creation-Date: 2017-10-20 15:14+0000\n"
"PO-Revision-Date: 2008-09-10 22:05+0930\n"
"Last-Translator: Clytie Siddall <clytie@riverland.net.au>\n"
"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"
msgstr ""
#: src/arm/gnunet-service-arm.c:513
-#: src/transport/plugin_transport_http_server.c:2621
+#: src/transport/plugin_transport_http_server.c:2684
#: src/transport/plugin_transport_tcp.c:1259
#: src/transport/tcp_service_legacy.c:696 src/util/service.c:782
#, fuzzy, c-format
@@ -288,7 +288,7 @@ msgid "Failed to resolve `%s': %s\n"
msgstr "Lỗi mở tập tin ghi sự kiện « %s »: %s\n"
#: src/arm/gnunet-service-arm.c:532
-#: src/transport/plugin_transport_http_server.c:2639
+#: src/transport/plugin_transport_http_server.c:2702
#: src/transport/plugin_transport_tcp.c:1278
#: src/transport/tcp_service_legacy.c:715 src/util/service.c:802
#, fuzzy, c-format
@@ -362,134 +362,15 @@ msgstr ""
msgid "Initiating shutdown as requested by client.\n"
msgstr ""
-#: src/ats/gnunet-ats-solver-eval.c:2781 src/ats/gnunet-ats-solver-eval.c:2822
-#, c-format
-msgid ""
-"Could not load quota for network `%s': `%s', assigning default bandwidth "
-"%llu\n"
-msgstr ""
-
-#: src/ats/gnunet-ats-solver-eval.c:2799
-#, c-format
-msgid ""
-"No outbound quota configured for network `%s', assigning default bandwidth "
-"%llu\n"
-msgstr ""
-
-#: src/ats/gnunet-ats-solver-eval.c:2840
-#, c-format
-msgid ""
-"No outbound quota configure for network `%s', assigning default bandwidth "
-"%llu\n"
-msgstr ""
-
-#: src/ats/gnunet-ats-solver-eval.c:3294
-#: src/ats-tests/gnunet-solver-eval.c:939
-msgid "solver to use"
-msgstr ""
-
-#: src/ats/gnunet-ats-solver-eval.c:3299
-#: src/ats-tests/gnunet-solver-eval.c:945
-#: src/ats-tests/gnunet-solver-eval.c:950
-msgid "experiment to use"
-msgstr ""
-
-#: src/ats/gnunet-ats-solver-eval.c:3306
+#: src/ats-tests/ats-testing-log.c:837
#, fuzzy
-msgid "print logging"
+msgid "Stop logging\n"
msgstr "Theo dõi"
-#: src/ats/gnunet-ats-solver-eval.c:3311
-msgid "save logging to disk"
-msgstr ""
-
-#: src/ats/gnunet-ats-solver-eval.c:3316
-msgid "disable normalization"
-msgstr ""
-
-#: src/ats/gnunet-service-ats_plugins.c:304
-#, c-format
-msgid ""
-"Could not load %s quota for network `%s': `%s', assigning default bandwidth "
-"%llu\n"
-msgstr ""
-
-#: src/ats/gnunet-service-ats_plugins.c:314
-#, c-format
-msgid "%s quota configured for network `%s' is %llu\n"
-msgstr ""
-
-#: src/ats/gnunet-service-ats_plugins.c:359
-#, c-format
-msgid ""
-"No %s-quota configured for network `%s', assigning default bandwidth %llu\n"
-msgstr ""
-
-#: src/ats/gnunet-service-ats_plugins.c:451
-#, fuzzy, c-format
-msgid "Failed to initialize solver `%s'!\n"
-msgstr "Không thể sơ khởi SQLite: %s.\n"
-
-#: src/ats/plugin_ats_mlp.c:1274
-msgid "Problem size too large, cannot allocate memory!\n"
-msgstr ""
-
-#: src/ats/plugin_ats_mlp.c:1869
-#, fuzzy, c-format
-msgid "Adding address for peer `%s' multiple times\n"
-msgstr "Không thể lấy địa chỉ của đồng đẳng « %s ».\n"
-
-#: src/ats/plugin_ats_mlp.c:1913
-#, fuzzy, c-format
-msgid "Updating address property for peer `%s' %p not added before\n"
-msgstr "Không thể lấy địa chỉ của đồng đẳng « %s ».\n"
-
-#: src/ats/plugin_ats_mlp.c:2475
-msgid ""
-"MLP solver is not optimizing for anything, changing to feasibility check\n"
-msgstr ""
-
-#: src/ats/plugin_ats_mlp.c:2515 src/ats/plugin_ats_mlp.c:2532
-#: src/ats/plugin_ats_mlp.c:2564 src/ats/plugin_ats_mlp.c:2582
-#: src/ats/plugin_ats_mlp.c:2601 src/ats/plugin_ats_proportional.c:1141
-#: src/ats/plugin_ats_ril.c:2612 src/ats/plugin_ats_ril.c:2629
-#: src/ats/plugin_ats_ril.c:2646 src/ats/plugin_ats_ril.c:2663
-#: src/ats/plugin_ats_ril.c:2680 src/ats/plugin_ats_ril.c:2697
-#: src/ats/plugin_ats_ril.c:2714 src/ats/plugin_ats_ril.c:2731
-#, fuzzy, c-format
-msgid "Invalid %s configuration %f \n"
-msgstr "Không thể lưu tập tin cấu hình « %s »:"
-
-#: src/ats/plugin_ats_mlp.c:2670
-#, c-format
-msgid ""
-"Adjusting inconsistent outbound quota configuration for network `%s', is "
-"%llu must be at least %llu\n"
-msgstr ""
-
-#: src/ats/plugin_ats_mlp.c:2679
-#, c-format
-msgid ""
-"Adjusting inconsistent inbound quota configuration for network `%s', is %llu "
-"must be at least %llu\n"
-msgstr ""
-
-#: src/ats/plugin_ats_mlp.c:2689
-#, c-format
-msgid ""
-"Adjusting outbound quota configuration for network `%s'from %llu to %.0f\n"
-msgstr ""
-
-#: src/ats/plugin_ats_mlp.c:2698
-#, c-format
-msgid ""
-"Adjusting inbound quota configuration for network `%s' from %llu to %.0f\n"
-msgstr ""
-
-#: src/ats/plugin_ats_proportional.c:1164
+#: src/ats-tests/ats-testing-log.c:892
#, fuzzy, c-format
-msgid "Invalid %s configuration %f\n"
-msgstr "Không thể lưu tập tin cấu hình « %s »:"
+msgid "Start logging `%s'\n"
+msgstr "Đang bắt đầu tài về « %s »\n"
#: src/ats-tests/ats-testing.c:422
#, c-format
@@ -501,16 +382,6 @@ msgstr ""
msgid "Failed to connect master peer [%u] with slave [%u]\n"
msgstr "Lỗi kết nối đến gnunetd.\n"
-#: src/ats-tests/ats-testing-log.c:837
-#, fuzzy
-msgid "Stop logging\n"
-msgstr "Theo dõi"
-
-#: src/ats-tests/ats-testing-log.c:892
-#, fuzzy, c-format
-msgid "Start logging `%s'\n"
-msgstr "Đang bắt đầu tài về « %s »\n"
-
#: src/ats-tests/gnunet-ats-sim.c:90
#, c-format
msgid ""
@@ -518,6 +389,15 @@ msgid ""
"= %u KiB/s\n"
msgstr ""
+#: src/ats-tests/gnunet-solver-eval.c:939 src/ats/gnunet-ats-solver-eval.c:3294
+msgid "solver to use"
+msgstr ""
+
+#: src/ats-tests/gnunet-solver-eval.c:945
+#: src/ats-tests/gnunet-solver-eval.c:950 src/ats/gnunet-ats-solver-eval.c:3299
+msgid "experiment to use"
+msgstr ""
+
#: src/ats-tool/gnunet-ats.c:307
#, c-format
msgid "%u address resolutions had a timeout\n"
@@ -640,6 +520,124 @@ msgstr ""
msgid "Print information about ATS state"
msgstr "In ra thông tin về các đồng đẳng GNUnet."
+#: src/ats/gnunet-ats-solver-eval.c:2781 src/ats/gnunet-ats-solver-eval.c:2822
+#, c-format
+msgid ""
+"Could not load quota for network `%s': `%s', assigning default bandwidth "
+"%llu\n"
+msgstr ""
+
+#: src/ats/gnunet-ats-solver-eval.c:2799
+#, c-format
+msgid ""
+"No outbound quota configured for network `%s', assigning default bandwidth "
+"%llu\n"
+msgstr ""
+
+#: src/ats/gnunet-ats-solver-eval.c:2840
+#, c-format
+msgid ""
+"No outbound quota configure for network `%s', assigning default bandwidth "
+"%llu\n"
+msgstr ""
+
+#: src/ats/gnunet-ats-solver-eval.c:3306
+#, fuzzy
+msgid "print logging"
+msgstr "Theo dõi"
+
+#: src/ats/gnunet-ats-solver-eval.c:3311
+msgid "save logging to disk"
+msgstr ""
+
+#: src/ats/gnunet-ats-solver-eval.c:3316
+msgid "disable normalization"
+msgstr ""
+
+#: src/ats/gnunet-service-ats_plugins.c:304
+#, c-format
+msgid ""
+"Could not load %s quota for network `%s': `%s', assigning default bandwidth "
+"%llu\n"
+msgstr ""
+
+#: src/ats/gnunet-service-ats_plugins.c:314
+#, c-format
+msgid "%s quota configured for network `%s' is %llu\n"
+msgstr ""
+
+#: src/ats/gnunet-service-ats_plugins.c:359
+#, c-format
+msgid ""
+"No %s-quota configured for network `%s', assigning default bandwidth %llu\n"
+msgstr ""
+
+#: src/ats/gnunet-service-ats_plugins.c:451
+#, fuzzy, c-format
+msgid "Failed to initialize solver `%s'!\n"
+msgstr "Không thể sơ khởi SQLite: %s.\n"
+
+#: src/ats/plugin_ats_mlp.c:1274
+msgid "Problem size too large, cannot allocate memory!\n"
+msgstr ""
+
+#: src/ats/plugin_ats_mlp.c:1869
+#, fuzzy, c-format
+msgid "Adding address for peer `%s' multiple times\n"
+msgstr "Không thể lấy địa chỉ của đồng đẳng « %s ».\n"
+
+#: src/ats/plugin_ats_mlp.c:1913
+#, fuzzy, c-format
+msgid "Updating address property for peer `%s' %p not added before\n"
+msgstr "Không thể lấy địa chỉ của đồng đẳng « %s ».\n"
+
+#: src/ats/plugin_ats_mlp.c:2475
+msgid ""
+"MLP solver is not optimizing for anything, changing to feasibility check\n"
+msgstr ""
+
+#: src/ats/plugin_ats_mlp.c:2515 src/ats/plugin_ats_mlp.c:2532
+#: src/ats/plugin_ats_mlp.c:2564 src/ats/plugin_ats_mlp.c:2582
+#: src/ats/plugin_ats_mlp.c:2601 src/ats/plugin_ats_proportional.c:1141
+#: src/ats/plugin_ats_ril.c:2612 src/ats/plugin_ats_ril.c:2629
+#: src/ats/plugin_ats_ril.c:2646 src/ats/plugin_ats_ril.c:2663
+#: src/ats/plugin_ats_ril.c:2680 src/ats/plugin_ats_ril.c:2697
+#: src/ats/plugin_ats_ril.c:2714 src/ats/plugin_ats_ril.c:2731
+#, fuzzy, c-format
+msgid "Invalid %s configuration %f \n"
+msgstr "Không thể lưu tập tin cấu hình « %s »:"
+
+#: src/ats/plugin_ats_mlp.c:2670
+#, c-format
+msgid ""
+"Adjusting inconsistent outbound quota configuration for network `%s', is "
+"%llu must be at least %llu\n"
+msgstr ""
+
+#: src/ats/plugin_ats_mlp.c:2679
+#, c-format
+msgid ""
+"Adjusting inconsistent inbound quota configuration for network `%s', is %llu "
+"must be at least %llu\n"
+msgstr ""
+
+#: src/ats/plugin_ats_mlp.c:2689
+#, c-format
+msgid ""
+"Adjusting outbound quota configuration for network `%s'from %llu to %.0f\n"
+msgstr ""
+
+#: src/ats/plugin_ats_mlp.c:2698
+#, c-format
+msgid ""
+"Adjusting inbound quota configuration for network `%s' from %llu to %.0f\n"
+msgstr ""
+
+#: src/ats/plugin_ats_proportional.c:1164
+#, fuzzy, c-format
+msgid "Invalid %s configuration %f\n"
+msgstr "Không thể lưu tập tin cấu hình « %s »:"
+
#: src/auction/gnunet-auction-create.c:163
msgid "description of the item to be sold"
msgstr ""
@@ -788,6 +786,28 @@ msgstr ""
msgid "Connection to conversation service lost, trying to reconnect\n"
msgstr ""
+#: src/conversation/gnunet-conversation-test.c:119
+#, c-format
+msgid ""
+"\n"
+"End of transmission. Have a GNU day.\n"
+msgstr ""
+
+#: src/conversation/gnunet-conversation-test.c:145
+#, c-format
+msgid ""
+"\n"
+"We are now playing your recording back. If you can hear it, your audio "
+"settings are working..."
+msgstr ""
+
+#: src/conversation/gnunet-conversation-test.c:210
+#, c-format
+msgid ""
+"We will now be recording you for %s. After that time, the recording will be "
+"played back to you..."
+msgstr ""
+
#: src/conversation/gnunet-conversation.c:269
#, c-format
msgid "Incoming call from `%s'. Please /accept %u or /cancel %u the call.\n"
@@ -1045,30 +1065,8 @@ msgstr ""
msgid "Enables having a conversation with other GNUnet users."
msgstr ""
-#: src/conversation/gnunet-conversation-test.c:119
-#, c-format
-msgid ""
-"\n"
-"End of transmission. Have a GNU day.\n"
-msgstr ""
-
-#: src/conversation/gnunet-conversation-test.c:145
-#, c-format
-msgid ""
-"\n"
-"We are now playing your recording back. If you can hear it, your audio "
-"settings are working..."
-msgstr ""
-
-#: src/conversation/gnunet-conversation-test.c:210
-#, c-format
-msgid ""
-"We will now be recording you for %s. After that time, the recording will be "
-"played back to you..."
-msgstr ""
-
-#: src/conversation/gnunet_gst.c:622
#: src/conversation/gnunet-helper-audio-playback-gst.c:356
+#: src/conversation/gnunet_gst.c:622
#, c-format
msgid "Read error from STDIN: %d %s\n"
msgstr ""
@@ -1198,6 +1196,11 @@ msgstr "SMTP: « %s » bị lỗi: %s\n"
msgid "Failed to allocate %u bytes for second packet\n"
msgstr "Lỗi tạo thư mục tạm thời."
+#: src/conversation/gnunet-service-conversation.c:1276
+#, fuzzy, c-format
+msgid "Could not open line, port %s already in use!\n"
+msgstr "Không thể kết nối tới %s:%u: %s\n"
+
#: src/conversation/microphone.c:119
#, fuzzy
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"
msgid "# updates to my type map"
msgstr ""
+#: src/credential/credential_misc.c:88
+#, fuzzy, c-format
+msgid "Unable to parse CRED record string `%s'\n"
+msgstr "Lỗi đọc danh sách bạn bè từ « %s »\n"
+
+#: src/credential/gnunet-credential.c:278 src/namestore/gnunet-namestore.c:776
+#: src/namestore/plugin_rest_namestore.c:1009
+#, c-format
+msgid "Ego `%s' not known to identity service\n"
+msgstr ""
+
+#: src/credential/gnunet-credential.c:294
+#: src/credential/gnunet-credential.c:446
+#, fuzzy, c-format
+msgid "Issuer public key `%s' is not well-formed\n"
+msgstr "Đối số không hợp lệ cho « %s ».\n"
+
+#: src/credential/gnunet-credential.c:375
+#: src/credential/gnunet-credential.c:435
+#, fuzzy, c-format
+msgid "Issuer public key not well-formed\n"
+msgstr "Đối số không hợp lệ cho « %s ».\n"
+
+#: src/credential/gnunet-credential.c:386
+#: src/credential/gnunet-credential.c:455
+#, fuzzy, c-format
+msgid "Failed to connect to CREDENTIAL\n"
+msgstr "Lỗi kết nối đến gnunetd.\n"
+
+#: src/credential/gnunet-credential.c:392
+#, c-format
+msgid "You must provide issuer the attribute\n"
+msgstr ""
+
+#: src/credential/gnunet-credential.c:399
+#, c-format
+msgid "ego required\n"
+msgstr ""
+
+#: src/credential/gnunet-credential.c:415
+#, c-format
+msgid "Subject public key needed\n"
+msgstr ""
+
+#: src/credential/gnunet-credential.c:426
+#, fuzzy, c-format
+msgid "Subject public key `%s' is not well-formed\n"
+msgstr "Đối số không hợp lệ cho « %s ».\n"
+
+#: src/credential/gnunet-credential.c:461
+#, c-format
+msgid "You must provide issuer and subject attributes\n"
+msgstr ""
+
+#: src/credential/gnunet-credential.c:511
+#, c-format
+msgid "Issuer ego required\n"
+msgstr ""
+
+#: src/credential/gnunet-credential.c:523
+#, c-format
+msgid "Please specify name to lookup, subject key and issuer key!\n"
+msgstr ""
+
+#: src/credential/gnunet-credential.c:543
+msgid "create credential"
+msgstr ""
+
+#: src/credential/gnunet-credential.c:547
+msgid "verify credential against attribute"
+msgstr ""
+
+#: src/credential/gnunet-credential.c:552
+#, fuzzy
+msgid "The public key of the subject to lookup the credential for"
+msgstr "xác định mức ưu tiên của nội dung"
+
+#: src/credential/gnunet-credential.c:557
+msgid "The name of the credential presented by the subject"
+msgstr ""
+
+#: src/credential/gnunet-credential.c:562
+#, fuzzy
+msgid "The public key of the authority to verify the credential against"
+msgstr "xác định mức ưu tiên của nội dung"
+
+#: src/credential/gnunet-credential.c:567
+#, fuzzy
+msgid "The ego to use"
+msgstr "kích cỡ tin nhắn"
+
+#: src/credential/gnunet-credential.c:572
+msgid "The issuer attribute to verify against or to issue"
+msgstr ""
+
+#: src/credential/gnunet-credential.c:577
+msgid "The time to live for the credential"
+msgstr ""
+
+#: src/credential/gnunet-credential.c:581
+msgid "collect credentials"
+msgstr ""
+
+#: src/credential/gnunet-credential.c:595
+#, fuzzy
+msgid "GNUnet credential resolver tool"
+msgstr "Bản ghi lỗi GNUnet"
+
+#: src/credential/gnunet-service-credential.c:1204
+#: src/gns/gnunet-gns-helper-service-w32.c:727 src/gns/gnunet-gns.c:355
+#, fuzzy, c-format
+msgid "Failed to connect to GNS\n"
+msgstr "Lỗi kết nối đến gnunetd.\n"
+
+#: src/credential/gnunet-service-credential.c:1210
+#: src/namestore/gnunet-namestore-fcfsd.c:1034
+#: src/namestore/gnunet-namestore.c:802
+#: src/namestore/plugin_rest_namestore.c:1022
+#, fuzzy, c-format
+msgid "Failed to connect to namestore\n"
+msgstr "Không kết nối được đến trình nền gnunetd."
+
+#: src/credential/plugin_gnsrecord_credential.c:186
+#, fuzzy, c-format
+msgid "Unable to parse ATTR record string `%s'\n"
+msgstr "Lỗi đọc danh sách bạn bè từ « %s »\n"
+
+#: src/credential/plugin_rest_credential.c:1155 src/gns/plugin_rest_gns.c:668
+#, fuzzy
+msgid "GNS REST API initialized\n"
+msgstr "Lỗi sơ khởi lõi.\n"
+
#: src/datacache/datacache.c:119 src/datacache/datacache.c:294
-#: src/datastore/gnunet-service-datastore.c:775
+#: src/datastore/gnunet-service-datastore.c:757
#, fuzzy
msgid "# bytes stored"
msgstr "# các byte trong kho dữ liệu"
@@ -1546,13 +1681,12 @@ msgstr "kho dữ liệu sqlite"
#: src/datacache/plugin_datacache_sqlite.c:113
#: src/datacache/plugin_datacache_sqlite.c:122
-#: src/datastore/plugin_datastore_mysql.c:980
+#: src/datastore/plugin_datastore_mysql.c:892
#: src/datastore/plugin_datastore_sqlite.c:58
-#: src/datastore/plugin_datastore_sqlite.c:66 src/my/my.c:80 src/my/my.c:92
-#: src/mysql/mysql.c:42 src/mysql/mysql.c:49
-#: src/namecache/plugin_namecache_postgres.c:53
+#: src/datastore/plugin_datastore_sqlite.c:66
+#: src/identity-provider/plugin_identity_provider_sqlite.c:52 src/my/my.c:80
+#: src/my/my.c:92 src/mysql/mysql.c:42 src/mysql/mysql.c:49
#: src/namecache/plugin_namecache_sqlite.c:53
-#: src/namestore/plugin_namestore_postgres.c:53
#: src/namestore/plugin_namestore_sqlite.c:53
#: src/peerstore/plugin_peerstore_sqlite.c:52
#: src/psycstore/plugin_psycstore_mysql.c:62
@@ -1561,14 +1695,15 @@ msgstr "kho dữ liệu sqlite"
#: src/testbed/gnunet-daemon-testbed-underlay.c:56
#: src/testbed/testbed_api_hosts.c:69 src/util/crypto_ecc.c:52
#: src/util/crypto_ecc_setup.c:41 src/util/crypto_mpi.c:39
-#: src/include/gnunet_common.h:720 src/include/gnunet_common.h:729
+#: src/include/gnunet_common.h:735 src/include/gnunet_common.h:744
#: src/scalarproduct/scalarproduct.h:35
#, c-format
msgid "`%s' failed at %s:%d with error: %s\n"
msgstr "« %s » bị lỗi tại %s:%d với lỗi: %s\n"
#: src/datacache/plugin_datacache_sqlite.c:817
-#: src/datastore/plugin_datastore_sqlite.c:475
+#: src/datastore/plugin_datastore_sqlite.c:456
+#: src/identity-provider/plugin_identity_provider_sqlite.c:336
#: src/namecache/plugin_namecache_sqlite.c:296
#: src/namestore/plugin_namestore_sqlite.c:355
msgid "Tried to close sqlite without finalizing all prepared statements.\n"
@@ -1640,23 +1775,77 @@ msgstr ""
msgid "# GET requests executed"
msgstr "# các yêu cầu dht được định tuyến"
-#: src/datastore/gnunet-datastore.c:113
+#: src/datastore/gnunet-datastore.c:189
+#, c-format
+msgid "Dumped %<PRIu64> records\n"
+msgstr ""
+
+#: src/datastore/gnunet-datastore.c:217 src/datastore/gnunet-datastore.c:229
+#, c-format
+msgid "Short write to file: %zd bytes expecting %zd\n"
+msgstr ""
+
+#: src/datastore/gnunet-datastore.c:261
+#, fuzzy
+msgid "Error queueing datastore GET operation\n"
+msgstr "Gặp lỗi khi tạo người dùng"
+
+#: src/datastore/gnunet-datastore.c:287 src/datastore/gnunet-datastore.c:412
+#, fuzzy, c-format
+msgid "Unable to open dump file: %s\n"
+msgstr "Không thể tạo miền tên.\n"
+
+#: src/datastore/gnunet-datastore.c:326
#, fuzzy, c-format
msgid "Failed to store item: %s, aborting\n"
msgstr "Lỗi mở tập tin ghi sự kiện « %s »: %s\n"
-#: src/datastore/gnunet-datastore.c:209
+#: src/datastore/gnunet-datastore.c:340
#, c-format
-msgid "Cannot use the same configuration for source and destination\n"
+msgid "Inserted %<PRIu64> records\n"
msgstr ""
-#: src/datastore/gnunet-datastore.c:256
-msgid ""
-"specifies the configuration to use to access an alternative datastore; will "
-"merge that datastore into our current datastore"
+#: src/datastore/gnunet-datastore.c:349 src/datastore/gnunet-datastore.c:363
+#, c-format
+msgid "Short read from file: %zd bytes expecting %zd\n"
+msgstr ""
+
+#: src/datastore/gnunet-datastore.c:389
+#, fuzzy
+msgid "Error queueing datastore PUT operation\n"
+msgstr "Gặp lỗi khi tạo người dùng"
+
+#: src/datastore/gnunet-datastore.c:432
+msgid "Input file is not of a supported format\n"
+msgstr ""
+
+#: src/datastore/gnunet-datastore.c:458
+#, fuzzy
+msgid "Failed connecting to the datastore.\n"
+msgstr "Không kết nối được đến trình nền gnunetd."
+
+#: src/datastore/gnunet-datastore.c:470
+#, c-format
+msgid "Please choose at least one operation: %s, %s\n"
+msgstr ""
+
+#: src/datastore/gnunet-datastore.c:493
+#, fuzzy
+msgid "Dump all records from the datastore"
+msgstr ""
+"\n"
+"Không nhận được đáp ứng từ gnunetd.\n"
+
+#: src/datastore/gnunet-datastore.c:497
+#, fuzzy
+msgid "Insert records into the datastore"
+msgstr "# các byte trong kho dữ liệu"
+
+#: src/datastore/gnunet-datastore.c:502
+msgid "File to dump or insert"
msgstr ""
-#: src/datastore/gnunet-datastore.c:265
+#: src/datastore/gnunet-datastore.c:511
#, fuzzy
msgid "Manipulate GNUnet datastore"
msgstr "cập nhật một giá trị trong tập tin cấu hình"
@@ -1700,8 +1889,8 @@ msgstr ""
#: src/datastore/gnunet-service-datastore.c:634
#: src/datastore/gnunet-service-datastore.c:689
-#: src/datastore/gnunet-service-datastore.c:977
-#: src/datastore/gnunet-service-datastore.c:1633
+#: src/datastore/gnunet-service-datastore.c:837
+#: src/datastore/gnunet-service-datastore.c:1469
msgid "# reserved"
msgstr ""
@@ -1709,152 +1898,153 @@ msgstr ""
msgid "Could not find matching reservation"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:792
+#: src/datastore/gnunet-service-datastore.c:773
#, c-format
msgid "Need %llu bytes more space (%llu allowed, using %llu)\n"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1026
+#: src/datastore/gnunet-service-datastore.c:876
#, fuzzy
msgid "# GET requests received"
msgstr "# các yêu cầu get (lấy) dht được nhận"
-#: src/datastore/gnunet-service-datastore.c:1058
+#: src/datastore/gnunet-service-datastore.c:907
#, fuzzy
msgid "# GET KEY requests received"
msgstr "# các yêu cầu get (lấy) dht được nhận"
-#: src/datastore/gnunet-service-datastore.c:1071
+#: src/datastore/gnunet-service-datastore.c:920
#, fuzzy
msgid "# requests filtered by bloomfilter"
msgstr "# các yêu cầu được lọc theo bộ lọc bloom"
-#: src/datastore/gnunet-service-datastore.c:1108
+#: src/datastore/gnunet-service-datastore.c:956
#, fuzzy
msgid "# GET REPLICATION requests received"
msgstr "# các yêu cầu get (lấy) dht được nhận"
-#: src/datastore/gnunet-service-datastore.c:1141
+#: src/datastore/gnunet-service-datastore.c:989
#, fuzzy
msgid "# GET ZERO ANONYMITY requests received"
msgstr "# các yêu cầu get (lấy) dht được nhận"
-#: src/datastore/gnunet-service-datastore.c:1190
+#: src/datastore/gnunet-service-datastore.c:1036
msgid "Content not found"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1199
+#: src/datastore/gnunet-service-datastore.c:1043
msgid "# bytes removed (explicit request)"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1246
+#: src/datastore/gnunet-service-datastore.c:1088
#, fuzzy
msgid "# REMOVE requests received"
msgstr "# các yêu cầu get (lấy) dht được nhận"
-#: src/datastore/gnunet-service-datastore.c:1301
+#: src/datastore/gnunet-service-datastore.c:1137
#, c-format
msgid ""
"Datastore payload must have been inaccurate (%lld < %lld). Recomputing it.\n"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1307
-#: src/datastore/gnunet-service-datastore.c:1482
+#: src/datastore/gnunet-service-datastore.c:1143
+#: src/datastore/gnunet-service-datastore.c:1318
#, c-format
msgid "New payload: %lld\n"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1361
+#: src/datastore/gnunet-service-datastore.c:1197
#, c-format
msgid "Loading `%s' datastore plugin\n"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1373
+#: src/datastore/gnunet-service-datastore.c:1209
#, fuzzy, c-format
msgid "Failed to load datastore plugin for `%s'\n"
msgstr "Không thể nạp phần bổ sung truyền tải « %s »\n"
-#: src/datastore/gnunet-service-datastore.c:1433
+#: src/datastore/gnunet-service-datastore.c:1269
msgid "Bloomfilter construction complete.\n"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1489
+#: src/datastore/gnunet-service-datastore.c:1325
msgid "Rebuilding bloomfilter. Please be patient.\n"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1500
+#: src/datastore/gnunet-service-datastore.c:1336
msgid "Plugin does not support get_keys function. Please fix!\n"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1670
+#: src/datastore/gnunet-service-datastore.c:1506
#, fuzzy, c-format
msgid "# bytes used in file-sharing datastore `%s'"
msgstr "# các byte được phép trong kho dữ liệu"
-#: src/datastore/gnunet-service-datastore.c:1686
+#: src/datastore/gnunet-service-datastore.c:1522
msgid "# quota"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1691
+#: src/datastore/gnunet-service-datastore.c:1527
msgid "# cache size"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1707
+#: src/datastore/gnunet-service-datastore.c:1543
#, c-format
msgid "Could not use specified filename `%s' for bloomfilter.\n"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1725
-#: src/datastore/gnunet-service-datastore.c:1741
+#: src/datastore/gnunet-service-datastore.c:1561
+#: src/datastore/gnunet-service-datastore.c:1577
#, fuzzy, c-format
msgid "Failed to remove bogus bloomfilter file `%s'\n"
msgstr "Không thể lưu tập tin cấu hình « %s »:"
-#: src/datastore/gnunet-service-datastore.c:1773
+#: src/datastore/gnunet-service-datastore.c:1609
#, fuzzy
msgid "Failed to initialize bloomfilter.\n"
msgstr "Lỗi sơ khởi dịch vụ « %s ».\n"
-#: src/datastore/plugin_datastore_heap.c:769
+#: src/datastore/plugin_datastore_heap.c:893
#, fuzzy
msgid "Heap database running\n"
msgstr "kho dữ liệu sqlite"
-#: src/datastore/plugin_datastore_mysql.c:377
-#: src/datastore/plugin_datastore_sqlite.c:590
+#: src/datastore/plugin_datastore_mysql.c:371
+#: src/datastore/plugin_datastore_mysql.c:423
+#: src/datastore/plugin_datastore_mysql.c:1075
+msgid "MySQL statement run failure"
+msgstr ""
+
+#: src/datastore/plugin_datastore_mysql.c:410
+#: src/datastore/plugin_datastore_sqlite.c:626
#, fuzzy
msgid "Data too large"
msgstr "số lần lặp lại"
-#: src/datastore/plugin_datastore_mysql.c:393
-msgid "MySQL statement run failure"
-msgstr ""
-
-#: src/datastore/plugin_datastore_mysql.c:936
+#: src/datastore/plugin_datastore_mysql.c:848
#, fuzzy, c-format
msgid "`%s' for `%s' failed at %s:%d with error: %s\n"
msgstr "« %s » bị lỗi tại %s:%d với lỗi: %s\n"
-#: src/datastore/plugin_datastore_mysql.c:1208
+#: src/datastore/plugin_datastore_mysql.c:1180
#: src/psycstore/plugin_psycstore_mysql.c:1936
msgid "Mysql database running\n"
msgstr ""
-#: src/datastore/plugin_datastore_postgres.c:345
+#: src/datastore/plugin_datastore_postgres.c:274
+#: src/datastore/plugin_datastore_postgres.c:891
msgid "Postgress exec failure"
msgstr ""
-#: src/datastore/plugin_datastore_postgres.c:866
+#: src/datastore/plugin_datastore_postgres.c:852
#, fuzzy
msgid "Failed to drop table from database.\n"
msgstr ""
"\n"
"Không nhận được đáp ứng từ gnunetd.\n"
-#: src/datastore/plugin_datastore_postgres.c:903
-#: src/namecache/plugin_namecache_postgres.c:398
-#: src/namestore/plugin_namestore_postgres.c:571
-#: src/psycstore/plugin_psycstore_postgres.c:1721
+#: src/datastore/plugin_datastore_postgres.c:950
+#: src/psycstore/plugin_psycstore_postgres.c:1506
msgid "Postgres database running\n"
msgstr ""
@@ -1866,7 +2056,8 @@ msgstr ""
msgid "`%s' failed at %s:%u with error: %s"
msgstr "« %s » bị lỗi tại %s:%d với lỗi: %s"
-#: src/datastore/plugin_datastore_sqlite.c:281
+#: src/datastore/plugin_datastore_sqlite.c:271
+#: src/identity-provider/plugin_identity_provider_sqlite.c:212
#: src/namecache/plugin_namecache_sqlite.c:194
#: src/namestore/plugin_namestore_sqlite.c:222
#: 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"
msgid "Unable to initialize SQLite: %s.\n"
msgstr "Không thể sơ khởi SQLite: %s.\n"
-#: src/datastore/plugin_datastore_sqlite.c:1234
+#: src/datastore/plugin_datastore_sqlite.c:577
+msgid "sqlite bind failure"
+msgstr ""
+
+#: src/datastore/plugin_datastore_sqlite.c:1259
msgid "sqlite version to old to determine size, assuming zero\n"
msgstr ""
-#: src/datastore/plugin_datastore_sqlite.c:1268
+#: src/datastore/plugin_datastore_sqlite.c:1293
#, c-format
msgid ""
"Using sqlite page utilization to estimate payload (%llu pages of size %llu "
"bytes)\n"
msgstr ""
-#: src/datastore/plugin_datastore_sqlite.c:1312
+#: src/datastore/plugin_datastore_sqlite.c:1337
+#: src/identity-provider/plugin_identity_provider_sqlite.c:711
#: src/namecache/plugin_namecache_sqlite.c:603
#: src/namestore/plugin_namestore_sqlite.c:802
#, fuzzy
msgid "Sqlite database running\n"
msgstr "kho dữ liệu sqlite"
-#: src/datastore/plugin_datastore_template.c:259
+#: src/datastore/plugin_datastore_template.c:253
msgid "Template database running\n"
msgstr ""
@@ -1955,53 +2151,6 @@ msgstr ""
msgid "Prints all packets that go through the DHT."
msgstr ""
-#: src/dht/gnunet_dht_profiler.c:1161
-#: src/testbed/gnunet-testbed-profiler.c:255
-#, fuzzy, c-format
-msgid "Exiting as the number of peers is %u\n"
-msgstr "tăng sổ tối đa các kết nối TCP/IP"
-
-#: src/dht/gnunet_dht_profiler.c:1188
-#, fuzzy
-msgid "number of peers to start"
-msgstr "số lần lặp lại"
-
-#: src/dht/gnunet_dht_profiler.c:1194
-msgid ""
-"maximum number of times we try to search for successor circle formation (0 "
-"for R5N)"
-msgstr ""
-
-#: src/dht/gnunet_dht_profiler.c:1200 src/nse/gnunet-nse-profiler.c:853
-#: src/testbed/gnunet-testbed-profiler.c:305
-msgid "name of the file with the login information for the testbed"
-msgstr ""
-
-#: src/dht/gnunet_dht_profiler.c:1206
-msgid "delay between rounds for collecting statistics (default: 30 sec)"
-msgstr ""
-
-#: src/dht/gnunet_dht_profiler.c:1212
-msgid "delay to start doing PUTs (default: 1 sec)"
-msgstr ""
-
-#: src/dht/gnunet_dht_profiler.c:1218
-msgid "delay to start doing GETs (default: 5 min)"
-msgstr ""
-
-#: src/dht/gnunet_dht_profiler.c:1223
-msgid "replication degree for DHT PUTs"
-msgstr ""
-
-#: src/dht/gnunet_dht_profiler.c:1230
-msgid "timeout for DHT PUT and GET requests (default: 1 min)"
-msgstr ""
-
-#: src/dht/gnunet_dht_profiler.c:1248
-#, fuzzy
-msgid "Measure quality and performance of the DHT service."
-msgstr "Không thể truy cập đến dịch vụ"
-
#: src/dht/gnunet-dht-put.c:120
#, fuzzy
msgid "PUT request sent with key"
@@ -2279,6 +2428,52 @@ msgstr ""
msgid "# DHT requests combined"
msgstr "# các yêu cầu get (lấy) dht được nhận"
+#: src/dht/gnunet_dht_profiler.c:1161 src/testbed/gnunet-testbed-profiler.c:255
+#, fuzzy, c-format
+msgid "Exiting as the number of peers is %u\n"
+msgstr "tăng sổ tối đa các kết nối TCP/IP"
+
+#: src/dht/gnunet_dht_profiler.c:1188
+#, fuzzy
+msgid "number of peers to start"
+msgstr "số lần lặp lại"
+
+#: src/dht/gnunet_dht_profiler.c:1194
+msgid ""
+"maximum number of times we try to search for successor circle formation (0 "
+"for R5N)"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:1200 src/nse/gnunet-nse-profiler.c:853
+#: src/testbed/gnunet-testbed-profiler.c:305
+msgid "name of the file with the login information for the testbed"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:1206
+msgid "delay between rounds for collecting statistics (default: 30 sec)"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:1212
+msgid "delay to start doing PUTs (default: 1 sec)"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:1218
+msgid "delay to start doing GETs (default: 5 min)"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:1223
+msgid "replication degree for DHT PUTs"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:1230
+msgid "timeout for DHT PUT and GET requests (default: 1 min)"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:1248
+#, fuzzy
+msgid "Measure quality and performance of the DHT service."
+msgstr "Không thể truy cập đến dịch vụ"
+
#: src/dht/plugin_block_dht.c:187
#, fuzzy, c-format
msgid "Block not of type %u\n"
@@ -2612,7 +2807,7 @@ msgstr ""
msgid "No useful service enabled. Exiting.\n"
msgstr ""
-#: src/exit/gnunet-daemon-exit.c:3969
+#: src/exit/gnunet-daemon-exit.c:3970
msgid "Daemon to run to provide an IP exit node for the VPN"
msgstr ""
@@ -3265,15 +3460,6 @@ msgid ""
"chk/...)"
msgstr ""
-#: src/fs/gnunet-fs.c:119
-msgid "print a list of all indexed files"
-msgstr ""
-
-#: src/fs/gnunet-fs.c:130
-#, fuzzy
-msgid "Special file-sharing operations"
-msgstr "Tùy chọn chia sẻ tập tin"
-
#: src/fs/gnunet-fs-profiler.c:211
msgid "run the experiment with COUNT peers"
msgstr ""
@@ -3290,6 +3476,15 @@ msgstr ""
msgid "run a testbed to measure file-sharing performance"
msgstr ""
+#: src/fs/gnunet-fs.c:119
+msgid "print a list of all indexed files"
+msgstr ""
+
+#: src/fs/gnunet-fs.c:130
+#, fuzzy
+msgid "Special file-sharing operations"
+msgstr "Tùy chọn chia sẻ tập tin"
+
#: src/fs/gnunet-publish.c:219 src/fs/gnunet-publish.c:231
#, c-format
msgid "Publishing `%s' at %llu/%llu (%s remaining)\n"
@@ -4000,22 +4195,11 @@ msgstr ""
msgid "GNUnet DNS-to-GNS proxy (a DNS server)"
msgstr ""
-#: src/gns/gnunet-gns.c:235 src/gns/plugin_rest_gns.c:346
-#, c-format
-msgid "Invalid typename specified, assuming `ANY'\n"
-msgstr ""
-
-#: src/gns/gnunet-gns.c:252
-#, c-format
-msgid "Please specify name to lookup!\n"
-msgstr ""
-
-#: src/gns/gnunet-gns.c:276
-#, c-format
-msgid "Ego for `%s' not found, cannot perform lookup.\n"
+#: src/gns/gnunet-gns-helper-service-w32.c:602
+msgid "Not ready to process requests, lacking ego data\n"
msgstr ""
-#: src/gns/gnunet-gns.c:315 src/gns/gnunet-gns-helper-service-w32.c:701
+#: src/gns/gnunet-gns-helper-service-w32.c:701 src/gns/gnunet-gns.c:315
#: src/gns/plugin_rest_gns.c:422
#, c-format
msgid ""
@@ -4023,59 +4207,12 @@ msgid ""
"gns-import.sh?\n"
msgstr ""
-#: src/gns/gnunet-gns.c:355 src/gns/gnunet-gns-helper-service-w32.c:727
-#, fuzzy, c-format
-msgid "Failed to connect to GNS\n"
-msgstr "Lỗi kết nối đến gnunetd.\n"
-
-#: src/gns/gnunet-gns.c:374
-#, c-format
-msgid "Public key `%s' is not well-formed\n"
-msgstr ""
-
-#: src/gns/gnunet-gns.c:428
-msgid "Lookup a record for the given name"
-msgstr ""
-
-#: src/gns/gnunet-gns.c:434
-#, fuzzy
-msgid "Specify the type of the record to lookup"
-msgstr "xác định mức ưu tiên của nội dung"
-
-#: src/gns/gnunet-gns.c:440
-#, fuzzy
-msgid "Specify timeout for the lookup"
-msgstr "xác định mức ưu tiên của nội dung"
-
-#: src/gns/gnunet-gns.c:445
-msgid "No unneeded output"
-msgstr ""
-
-#: src/gns/gnunet-gns.c:451
-#, fuzzy
-msgid "Specify the public key of the zone to lookup the record in"
-msgstr "xác định mức ưu tiên của nội dung"
-
-#: src/gns/gnunet-gns.c:457
-#, fuzzy
-msgid "Specify the name of the ego of the zone to lookup the record in"
-msgstr "xác định mức ưu tiên của nội dung"
-
-#: src/gns/gnunet-gns.c:476
-#, fuzzy
-msgid "GNUnet GNS resolver tool"
-msgstr "Bản ghi lỗi GNUnet"
-
-#: src/gns/gnunet-gns-helper-service-w32.c:602
-msgid "Not ready to process requests, lacking ego data\n"
-msgstr ""
-
#: src/gns/gnunet-gns-helper-service-w32.c:739
#, fuzzy, c-format
msgid "Failed to connect to identity service\n"
msgstr "Lỗi kết nối đến gnunetd.\n"
-#: src/gns/gnunet-gns-import.c:489
+#: src/gns/gnunet-gns-import.c:452
msgid "This program will import some GNS authorities into your GNS namestore."
msgstr ""
@@ -4200,13 +4337,66 @@ msgstr ""
msgid "GNUnet GNS proxy"
msgstr ""
+#: src/gns/gnunet-gns.c:235 src/gns/plugin_rest_gns.c:346
+#, c-format
+msgid "Invalid typename specified, assuming `ANY'\n"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:252
+#, c-format
+msgid "Please specify name to lookup!\n"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:276
+#, c-format
+msgid "Ego for `%s' not found, cannot perform lookup.\n"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:374
+#, c-format
+msgid "Public key `%s' is not well-formed\n"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:428
+msgid "Lookup a record for the given name"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:434
+#, fuzzy
+msgid "Specify the type of the record to lookup"
+msgstr "xác định mức ưu tiên của nội dung"
+
+#: src/gns/gnunet-gns.c:440
+#, fuzzy
+msgid "Specify timeout for the lookup"
+msgstr "xác định mức ưu tiên của nội dung"
+
+#: src/gns/gnunet-gns.c:445
+msgid "No unneeded output"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:451
+#, fuzzy
+msgid "Specify the public key of the zone to lookup the record in"
+msgstr "xác định mức ưu tiên của nội dung"
+
+#: src/gns/gnunet-gns.c:457
+#, fuzzy
+msgid "Specify the name of the ego of the zone to lookup the record in"
+msgstr "xác định mức ưu tiên của nội dung"
+
+#: src/gns/gnunet-gns.c:476
+#, fuzzy
+msgid "GNUnet GNS resolver tool"
+msgstr "Bản ghi lỗi GNUnet"
+
#: src/gns/gnunet-service-gns.c:442
#, fuzzy
msgid "Failed to connect to the namecache!\n"
msgstr "Không kết nối được đến trình nền gnunetd."
#: src/gns/gnunet-service-gns.c:461
-#: src/zonemaster/gnunet-service-zonemaster.c:741
+#: src/zonemaster/gnunet-service-zonemaster.c:742
#, fuzzy
msgid "Could not connect to DHT!\n"
msgstr "Không thể kết nối tới %s:%u: %s\n"
@@ -4265,45 +4455,35 @@ msgstr ""
msgid "Hostname `%s' is not well-formed, resolution fails\n"
msgstr ""
-#: src/gns/plugin_gnsrecord_gns.c:203
+#: src/gns/plugin_gnsrecord_gns.c:179
#, fuzzy, c-format
msgid "Unable to parse PKEY record `%s'\n"
msgstr "Lỗi đọc danh sách bạn bè từ « %s »\n"
-#: src/gns/plugin_gnsrecord_gns.c:232
+#: src/gns/plugin_gnsrecord_gns.c:208
#, fuzzy, c-format
msgid "Unable to parse GNS2DNS record `%s'\n"
msgstr "Lỗi đọc danh sách bạn bè từ « %s »\n"
-#: src/gns/plugin_gnsrecord_gns.c:253
+#: src/gns/plugin_gnsrecord_gns.c:229
#, fuzzy, c-format
msgid "Failed to serialize GNS2DNS record with value `%s'\n"
msgstr "Không thể truy cập đến tập tin gnunet-directory « %s »\n"
-#: src/gns/plugin_gnsrecord_gns.c:276
+#: src/gns/plugin_gnsrecord_gns.c:252
#, fuzzy, c-format
msgid "Unable to parse VPN record string `%s'\n"
msgstr "Lỗi đọc danh sách bạn bè từ « %s »\n"
-#: src/gns/plugin_gnsrecord_gns.c:312
+#: src/gns/plugin_gnsrecord_gns.c:288
#, fuzzy, c-format
msgid "Unable to parse BOX record string `%s'\n"
msgstr "Lỗi đọc danh sách bạn bè từ « %s »\n"
-#: src/gns/plugin_gnsrecord_gns.c:360
-#, fuzzy, c-format
-msgid "Unable to parse REVERSE record string `%s'\n"
-msgstr "Lỗi đọc danh sách bạn bè từ « %s »\n"
-
#: src/gns/plugin_rest_gns.c:384
msgid "Ego for not found, cannot perform lookup.\n"
msgstr ""
-#: src/gns/plugin_rest_gns.c:668
-#, fuzzy
-msgid "GNS REST API initialized\n"
-msgstr "Lỗi sơ khởi lõi.\n"
-
#: src/gnsrecord/plugin_gnsrecord_dns.c:359
#, fuzzy, c-format
msgid "Unable to parse IPv4 address `%s'\n"
@@ -4746,6 +4926,53 @@ msgstr "« %s » không sẵn sàng.\n"
msgid "Could not start hostlist HTTP server on port %u\n"
msgstr "Cổng cho trình phục vụ HTTP danh sách máy chủ thống nhất"
+#: src/identity-provider/gnunet-idp.c:348
+#, fuzzy
+msgid "Ego is required\n"
+msgstr "Bị từ chối đặt tùy chọn « %s » trong phần « %s » thành « %s ».\n"
+
+#: src/identity-provider/gnunet-idp.c:370
+msgid "Add attribute"
+msgstr ""
+
+#: src/identity-provider/gnunet-idp.c:376
+msgid "Attribute value"
+msgstr ""
+
+#: src/identity-provider/gnunet-idp.c:381
+msgid "Ego"
+msgstr ""
+
+#: src/identity-provider/gnunet-idp.c:386
+msgid "Audience (relying party)"
+msgstr ""
+
+#: src/identity-provider/gnunet-idp.c:390
+msgid "List attributes for Ego"
+msgstr ""
+
+#: src/identity-provider/gnunet-idp.c:395
+msgid "Issue a ticket"
+msgstr ""
+
+#: src/identity-provider/gnunet-idp.c:400
+msgid "Consume a ticket"
+msgstr ""
+
+#: src/identity-provider/gnunet-idp.c:405
+msgid "Revoke a ticket"
+msgstr ""
+
+#: src/identity-provider/identity_provider_api.c:429
+#, fuzzy
+msgid "failed to store record\n"
+msgstr "Lỗi bắt đầu thu thập.\n"
+
+#: src/identity-provider/plugin_rest_identity_provider.c:1175
+#, fuzzy
+msgid "Identity Provider REST API initialized\n"
+msgstr "Lỗi sơ khởi lõi.\n"
+
#: src/identity/gnunet-identity.c:179
#, fuzzy, c-format
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 »:"
msgid "Failed to create directory `%s' for storing egos\n"
msgstr "Lỗi đọc danh sách bạn bè từ « %s »\n"
-#: src/identity/plugin_rest_identity.c:967
+#: src/identity/plugin_rest_identity.c:964
#, fuzzy
msgid "Identity REST API initialized\n"
msgstr "Lỗi sơ khởi lõi.\n"
-#: src/identity-provider/gnunet-identity-token.c:66
-#, fuzzy
-msgid "Option `-t' is required\n"
-msgstr "Bị từ chối đặt tùy chọn « %s » trong phần « %s » thành « %s ».\n"
-
-#: src/identity-provider/gnunet-identity-token.c:77
-#, fuzzy, c-format
-msgid "Token `%s' is malformed\n"
-msgstr "Đối số không hợp lệ cho « %s ».\n"
-
-#: src/identity-provider/gnunet-identity-token.c:166
-msgid "GNUid token"
-msgstr ""
-
-#: src/identity-provider/gnunet-identity-token.c:171
-msgid "Print token contents"
-msgstr ""
-
-#: src/identity-provider/plugin_rest_identity_provider.c:1166
-#, fuzzy
-msgid "Identity Token REST API initialized\n"
-msgstr "Lỗi sơ khởi lõi.\n"
-
#: src/json/json.c:119
#, fuzzy, c-format
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"
msgid "flat plugin running\n"
msgstr "kho dữ liệu sqlite"
-#: src/namecache/plugin_namecache_postgres.c:90
-#: src/namestore/plugin_namestore_postgres.c:97
-#, fuzzy
-msgid "Failed to create indices\n"
+#: src/namestore/gnunet-namestore-fcfsd.c:508
+#, fuzzy, c-format
+msgid "Unsupported form value `%s'\n"
+msgstr "Lệnh không được hỗ trợ « %s ». Đang hủy bỏ.\n"
+
+#: src/namestore/gnunet-namestore-fcfsd.c:535
+#, fuzzy, c-format
+msgid "Failed to create record for domain `%s': %s\n"
+msgstr "Không thể truy cập đến tập tin gnunet-directory « %s »\n"
+
+#: src/namestore/gnunet-namestore-fcfsd.c:555
+msgid "Error when mapping zone to name\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:585
+#, c-format
+msgid "Found existing name `%s' for the given key\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:662
+#, c-format
+msgid "Found %u existing records for domain `%s'\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:718
+#, fuzzy, c-format
+msgid "Failed to create page for `%s'\n"
msgstr "Không thể tạo miền tên.\n"
+#: src/namestore/gnunet-namestore-fcfsd.c:734
+#, fuzzy, c-format
+msgid "Failed to setup post processor for `%s'\n"
+msgstr "Lỗi cập nhật dữ liệu cho mô-đun « %s »\n"
+
+#: src/namestore/gnunet-namestore-fcfsd.c:770
+msgid "Domain name must not contain `.'\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:778
+msgid "Domain name must not contain `+'\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:974
+msgid "No ego configured for `fcfsd` subsystem\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:1000
+#, fuzzy
+msgid "Failed to start HTTP server\n"
+msgstr "Lỗi bắt đầu thu thập.\n"
+
+#: src/namestore/gnunet-namestore-fcfsd.c:1042
+#, fuzzy
+msgid "Failed to connect to identity\n"
+msgstr "Lỗi kết nối đến gnunetd.\n"
+
+#: src/namestore/gnunet-namestore-fcfsd.c:1074
+msgid "GNU Name System First Come First Serve name registration service"
+msgstr ""
+
#: src/namestore/gnunet-namestore.c:301
#, fuzzy, c-format
msgid "Adding record failed: %s\n"
msgstr "Gặp lỗi khi tải lên tập tin: %s\n"
#: src/namestore/gnunet-namestore.c:330
-#: src/namestore/plugin_rest_namestore.c:562
+#: src/namestore/plugin_rest_namestore.c:567
#, fuzzy, c-format
msgid "Deleting record failed, record does not exist%s%s\n"
msgstr "Gặp lỗi khi tải lên tập tin: %s\n"
#: src/namestore/gnunet-namestore.c:337
-#: src/namestore/plugin_rest_namestore.c:571
+#: src/namestore/plugin_rest_namestore.c:576
#, fuzzy, c-format
msgid "Deleting record failed%s%s\n"
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"
msgstr ""
#: src/namestore/gnunet-namestore.c:698
-#: src/namestore/plugin_rest_namestore.c:597
+#: src/namestore/plugin_rest_namestore.c:602
#, c-format
msgid "There are no records under label `%s' that could be deleted.\n"
msgstr ""
@@ -5009,24 +5267,11 @@ msgid ""
"There are no records under label `%s' that match the request for deletion.\n"
msgstr ""
-#: src/namestore/gnunet-namestore.c:776
-#: src/namestore/plugin_rest_namestore.c:1004
-#, c-format
-msgid "Ego `%s' not known to identity service\n"
-msgstr ""
-
#: src/namestore/gnunet-namestore.c:791
#, fuzzy, c-format
msgid "No options given\n"
msgstr "chưa đưa ra tên"
-#: src/namestore/gnunet-namestore.c:802
-#: src/namestore/gnunet-namestore-fcfsd.c:1034
-#: src/namestore/plugin_rest_namestore.c:1017
-#, fuzzy
-msgid "Failed to connect to namestore\n"
-msgstr "Không kết nối được đến trình nền gnunetd."
-
#: src/namestore/gnunet-namestore.c:810 src/namestore/gnunet-namestore.c:819
#: src/namestore/gnunet-namestore.c:838 src/namestore/gnunet-namestore.c:861
#: src/namestore/gnunet-namestore.c:915
@@ -5040,14 +5285,14 @@ msgid "add"
msgstr ""
#: src/namestore/gnunet-namestore.c:829
-#: src/namestore/plugin_rest_namestore.c:671
+#: src/namestore/plugin_rest_namestore.c:676
#, fuzzy, c-format
msgid "Unsupported type `%s'\n"
msgstr "Lệnh không được hỗ trợ « %s ». Đang hủy bỏ.\n"
#: src/namestore/gnunet-namestore.c:851
-#: src/namestore/plugin_rest_namestore.c:689
-#: src/namestore/plugin_rest_namestore.c:729
+#: src/namestore/plugin_rest_namestore.c:694
+#: src/namestore/plugin_rest_namestore.c:734
#, c-format
msgid "Value `%s' invalid for record type `%s'\n"
msgstr ""
@@ -5066,8 +5311,7 @@ msgstr ""
msgid "Invalid public key for reverse lookup `%s'\n"
msgstr "Đối số không hợp lệ cho « %s ».\n"
-#: src/namestore/gnunet-namestore.c:979
-#: src/peerinfo-tool/gnunet-peerinfo.c:775
+#: src/namestore/gnunet-namestore.c:979 src/peerinfo-tool/gnunet-peerinfo.c:775
#, fuzzy, c-format
msgid "Invalid URI `%s'\n"
msgstr "Dữ liệu nhập không hợp lệ.\n"
@@ -5078,13 +5322,13 @@ msgid "Invalid nick `%s'\n"
msgstr "Dữ liệu nhập không hợp lệ.\n"
#: src/namestore/gnunet-namestore.c:1051
-#: src/namestore/plugin_rest_namestore.c:1047
+#: src/namestore/plugin_rest_namestore.c:1052
#, c-format
msgid "No default ego configured in identity service\n"
msgstr ""
#: src/namestore/gnunet-namestore.c:1108
-#: src/namestore/plugin_rest_namestore.c:1143
+#: src/namestore/plugin_rest_namestore.c:1148
#, fuzzy, c-format
msgid "Cannot connect to identity service\n"
msgstr "Không thể kết nối tới %s:%u: %s\n"
@@ -5147,67 +5391,7 @@ msgstr ""
msgid "name of the ego controlling the zone"
msgstr ""
-#: src/namestore/gnunet-namestore-fcfsd.c:508
-#, fuzzy, c-format
-msgid "Unsupported form value `%s'\n"
-msgstr "Lệnh không được hỗ trợ « %s ». Đang hủy bỏ.\n"
-
-#: src/namestore/gnunet-namestore-fcfsd.c:535
-#, fuzzy, c-format
-msgid "Failed to create record for domain `%s': %s\n"
-msgstr "Không thể truy cập đến tập tin gnunet-directory « %s »\n"
-
-#: src/namestore/gnunet-namestore-fcfsd.c:555
-msgid "Error when mapping zone to name\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:585
-#, c-format
-msgid "Found existing name `%s' for the given key\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:662
-#, c-format
-msgid "Found %u existing records for domain `%s'\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:718
-#, fuzzy, c-format
-msgid "Failed to create page for `%s'\n"
-msgstr "Không thể tạo miền tên.\n"
-
-#: src/namestore/gnunet-namestore-fcfsd.c:734
-#, fuzzy, c-format
-msgid "Failed to setup post processor for `%s'\n"
-msgstr "Lỗi cập nhật dữ liệu cho mô-đun « %s »\n"
-
-#: src/namestore/gnunet-namestore-fcfsd.c:770
-msgid "Domain name must not contain `.'\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:778
-msgid "Domain name must not contain `+'\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:974
-msgid "No ego configured for `fcfsd` subsystem\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:1000
-#, fuzzy
-msgid "Failed to start HTTP server\n"
-msgstr "Lỗi bắt đầu thu thập.\n"
-
-#: src/namestore/gnunet-namestore-fcfsd.c:1042
-#, fuzzy
-msgid "Failed to connect to identity\n"
-msgstr "Lỗi kết nối đến gnunetd.\n"
-
-#: src/namestore/gnunet-namestore-fcfsd.c:1074
-msgid "GNU Name System First Come First Serve name registration service"
-msgstr ""
-
-#: src/namestore/gnunet-service-namestore.c:612
+#: src/namestore/gnunet-service-namestore.c:615
#, fuzzy, c-format
msgid "Failed to replicate block in namecache: %s\n"
msgstr "Lỗi cập nhật dữ liệu cho mô-đun « %s »\n"
@@ -5221,7 +5405,7 @@ msgstr ""
msgid "flat file database running\n"
msgstr "kho dữ liệu sqlite"
-#: src/namestore/plugin_rest_namestore.c:1188
+#: src/namestore/plugin_rest_namestore.c:1193
#, fuzzy
msgid "Namestore REST API initialized\n"
msgstr "Lỗi sơ khởi lõi.\n"
@@ -5508,11 +5692,6 @@ msgstr ""
msgid "`upnpc' command not found\n"
msgstr ""
-#: src/nse/gnunet-nse.c:122
-#, fuzzy
-msgid "Show network size estimates from NSE service."
-msgstr "# các yêu cầu get (lấy) dht được nhận"
-
#: src/nse/gnunet-nse-profiler.c:842
#, fuzzy
msgid "limit to the number of connections to NSE services, 0 for none"
@@ -5539,71 +5718,17 @@ msgstr ""
msgid "Measure quality and performance of the NSE service."
msgstr "Không thể truy cập đến dịch vụ"
+#: src/nse/gnunet-nse.c:122
+#, fuzzy
+msgid "Show network size estimates from NSE service."
+msgstr "# các yêu cầu get (lấy) dht được nhận"
+
#: src/nse/gnunet-service-nse.c:1534
#: src/revocation/gnunet-service-revocation.c:838 src/util/gnunet-scrypt.c:276
#, fuzzy
msgid "Value is too large.\n"
msgstr "Giá trị không nằm trong phạm vi được phép."
-#: src/peerinfo/gnunet-service-peerinfo.c:178
-#, fuzzy, c-format
-msgid "Removing expired address of transport `%s'\n"
-msgstr "Đã nạp truyền tải « %s »\n"
-
-#: src/peerinfo/gnunet-service-peerinfo.c:310
-#, fuzzy, c-format
-msgid "Failed to parse HELLO in file `%s': %s\n"
-msgstr "Lỗi đọc danh sách bạn bè từ « %s »\n"
-
-#: src/peerinfo/gnunet-service-peerinfo.c:331
-#: src/peerinfo/gnunet-service-peerinfo.c:362
-#, fuzzy, c-format
-msgid "Failed to parse HELLO in file `%s'\n"
-msgstr "Lỗi đọc danh sách bạn bè từ « %s »\n"
-
-#: src/peerinfo/gnunet-service-peerinfo.c:446
-msgid "# peers known"
-msgstr ""
-
-#: src/peerinfo/gnunet-service-peerinfo.c:489
-#, c-format
-msgid ""
-"File `%s' in directory `%s' does not match naming convention. Removed.\n"
-msgstr ""
-"Tập tin « %s » trong thư mục « %s » không tùy theo quy ước đặt tên. Bị gỡ "
-"bỏ.\n"
-
-#: src/peerinfo/gnunet-service-peerinfo.c:655
-#, fuzzy, c-format
-msgid "Scanning directory `%s'\n"
-msgstr "Lỗi đọc danh sách bạn bè từ « %s »\n"
-
-#: src/peerinfo/gnunet-service-peerinfo.c:663
-#, c-format
-msgid "Still no peers found in `%s'!\n"
-msgstr "Vẫn còn không tìm thấy đồng đẳng trong « %s ».\n"
-
-#: src/peerinfo/gnunet-service-peerinfo.c:1076
-#, fuzzy, c-format
-msgid "Cleaning up directory `%s'\n"
-msgstr "Lỗi đọc danh sách bạn bè từ « %s »\n"
-
-#: src/peerinfo/gnunet-service-peerinfo.c:1405
-#, c-format
-msgid "Importing HELLOs from `%s'\n"
-msgstr ""
-
-#: src/peerinfo/gnunet-service-peerinfo.c:1418
-msgid "Skipping import of included HELLOs\n"
-msgstr ""
-
-#: src/peerinfo/peerinfo_api.c:220
-#, fuzzy
-msgid "Failed to receive response from `PEERINFO' service."
-msgstr ""
-"\n"
-"Không nhận được đáp ứng từ gnunetd.\n"
-
#: src/peerinfo-tool/gnunet-peerinfo.c:239
#, fuzzy, c-format
msgid "%sPeer `%s'\n"
@@ -5695,6 +5820,65 @@ msgstr "Đang nạp các truyền tải « %s »\n"
msgid "Failed to load transport plugin for `%s'\n"
msgstr "Không thể nạp phần bổ sung truyền tải « %s »\n"
+#: src/peerinfo/gnunet-service-peerinfo.c:178
+#, fuzzy, c-format
+msgid "Removing expired address of transport `%s'\n"
+msgstr "Đã nạp truyền tải « %s »\n"
+
+#: src/peerinfo/gnunet-service-peerinfo.c:310
+#, fuzzy, c-format
+msgid "Failed to parse HELLO in file `%s': %s\n"
+msgstr "Lỗi đọc danh sách bạn bè từ « %s »\n"
+
+#: src/peerinfo/gnunet-service-peerinfo.c:331
+#: src/peerinfo/gnunet-service-peerinfo.c:362
+#, fuzzy, c-format
+msgid "Failed to parse HELLO in file `%s'\n"
+msgstr "Lỗi đọc danh sách bạn bè từ « %s »\n"
+
+#: src/peerinfo/gnunet-service-peerinfo.c:446
+msgid "# peers known"
+msgstr ""
+
+#: src/peerinfo/gnunet-service-peerinfo.c:489
+#, c-format
+msgid ""
+"File `%s' in directory `%s' does not match naming convention. Removed.\n"
+msgstr ""
+"Tập tin « %s » trong thư mục « %s » không tùy theo quy ước đặt tên. Bị gỡ "
+"bỏ.\n"
+
+#: src/peerinfo/gnunet-service-peerinfo.c:655
+#, fuzzy, c-format
+msgid "Scanning directory `%s'\n"
+msgstr "Lỗi đọc danh sách bạn bè từ « %s »\n"
+
+#: src/peerinfo/gnunet-service-peerinfo.c:663
+#, c-format
+msgid "Still no peers found in `%s'!\n"
+msgstr "Vẫn còn không tìm thấy đồng đẳng trong « %s ».\n"
+
+#: src/peerinfo/gnunet-service-peerinfo.c:1076
+#, fuzzy, c-format
+msgid "Cleaning up directory `%s'\n"
+msgstr "Lỗi đọc danh sách bạn bè từ « %s »\n"
+
+#: src/peerinfo/gnunet-service-peerinfo.c:1405
+#, c-format
+msgid "Importing HELLOs from `%s'\n"
+msgstr ""
+
+#: src/peerinfo/gnunet-service-peerinfo.c:1418
+msgid "Skipping import of included HELLOs\n"
+msgstr ""
+
+#: src/peerinfo/peerinfo_api.c:220
+#, fuzzy
+msgid "Failed to receive response from `PEERINFO' service."
+msgstr ""
+"\n"
+"Không nhận được đáp ứng từ gnunetd.\n"
+
#: src/peerstore/gnunet-peerstore.c:91
msgid "peerstore"
msgstr ""
@@ -5744,15 +5928,10 @@ msgstr "Gặp lỗi khi tạo người dùng"
msgid "Unable to create indices: %s.\n"
msgstr "Không thể tạo miền tên.\n"
-#: src/postgres/postgres.c:67
-#, fuzzy, c-format
-msgid "`%s:%s' failed at %s:%d with error: %s\n"
-msgstr "« %s » bị lỗi tại %s:%d với lỗi: %s"
-
-#: src/postgres/postgres.c:192
+#: src/pq/pq_prepare.c:80
#, fuzzy, c-format
-msgid "Unable to connect to Postgres database '%s': %s\n"
-msgstr "Không thể lưu tập tin cấu hình « %s »:"
+msgid "PQprepare (`%s' as `%s') failed with error: %s\n"
+msgstr "« %s » bị lỗi tại %s:%d với lỗi: %s\n"
#: src/psycstore/gnunet-service-psycstore.c:249
#, fuzzy
@@ -5932,61 +6111,61 @@ msgstr "Lưu cấu hình ngay bây giờ không?"
msgid "Daemon to announce regular expressions for the peer using cadet."
msgstr ""
-#: src/regex/gnunet-regex-profiler.c:1314
+#: src/regex/gnunet-regex-profiler.c:1386
#, fuzzy
msgid "No configuration file given. Exiting\n"
msgstr "dùng tập tin cấu hình TÊN_TẬP_TIN"
-#: src/regex/gnunet-regex-profiler.c:1355
+#: src/regex/gnunet-regex-profiler.c:1427
#: src/regex/gnunet-regex-simulation-profiler.c:630
#, c-format
msgid "No policy directory specified on command line. Exiting.\n"
msgstr ""
-#: src/regex/gnunet-regex-profiler.c:1361
+#: src/regex/gnunet-regex-profiler.c:1433
#: src/regex/gnunet-regex-simulation-profiler.c:638
#, c-format
msgid "Specified policies directory does not exist. Exiting.\n"
msgstr ""
-#: src/regex/gnunet-regex-profiler.c:1368
+#: src/regex/gnunet-regex-profiler.c:1440
#, fuzzy, c-format
msgid "No files found in `%s'\n"
msgstr "Vẫn còn không tìm thấy đồng đẳng trong « %s ».\n"
-#: src/regex/gnunet-regex-profiler.c:1377
+#: src/regex/gnunet-regex-profiler.c:1449
msgid "No search strings file given. Exiting.\n"
msgstr ""
-#: src/regex/gnunet-regex-profiler.c:1397
+#: src/regex/gnunet-regex-profiler.c:1469
#, fuzzy
msgid "Error loading search strings. Exiting.\n"
msgstr "Gặp lỗi khi tải xuống: %s\n"
-#: src/regex/gnunet-regex-profiler.c:1485
+#: src/regex/gnunet-regex-profiler.c:1557
#, fuzzy
msgid "name of the file for writing statistics"
msgstr "Lỗi lấy thông kê về truyền tải.\n"
-#: src/regex/gnunet-regex-profiler.c:1491
+#: src/regex/gnunet-regex-profiler.c:1563
msgid "wait TIMEOUT before ending the experiment"
msgstr ""
-#: src/regex/gnunet-regex-profiler.c:1497
+#: src/regex/gnunet-regex-profiler.c:1569
msgid "directory with policy files"
msgstr ""
-#: src/regex/gnunet-regex-profiler.c:1504
+#: src/regex/gnunet-regex-profiler.c:1576
#, fuzzy
msgid "name of file with input strings"
msgstr "Lỗi lấy thông kê về truyền tải.\n"
-#: src/regex/gnunet-regex-profiler.c:1510
+#: src/regex/gnunet-regex-profiler.c:1582
#, fuzzy
msgid "name of file with hosts' names"
msgstr "Lỗi lấy thông kê về truyền tải.\n"
-#: src/regex/gnunet-regex-profiler.c:1523
+#: src/regex/gnunet-regex-profiler.c:1595
msgid "Profiler for regex"
msgstr ""
@@ -6219,10 +6398,10 @@ msgstr ""
msgid "Calculate the Vectorproduct with a GNUnet peer."
msgstr ""
-#: src/scalarproduct/gnunet-service-scalarproduct_alice.c:1407
-#: src/scalarproduct/gnunet-service-scalarproduct_bob.c:1345
-#: src/scalarproduct/gnunet-service-scalarproduct-ecc_alice.c:1180
+#: src/scalarproduct/gnunet-service-scalarproduct-ecc_alice.c:1172
#: src/scalarproduct/gnunet-service-scalarproduct-ecc_bob.c:1063
+#: src/scalarproduct/gnunet-service-scalarproduct_alice.c:1401
+#: src/scalarproduct/gnunet-service-scalarproduct_bob.c:1345
#, fuzzy
msgid "Connect to CADET failed\n"
msgstr " Không kết nối được (lỗi ?)\n"
@@ -6247,7 +6426,7 @@ msgstr ""
msgid "also profile decryption"
msgstr ""
-#: src/set/gnunet-service-set.c:1948
+#: src/set/gnunet-service-set.c:1989
#, fuzzy
msgid "Could not connect to CADET service\n"
msgstr "Không thể kết nối tới %s:%u: %s\n"
@@ -6307,114 +6486,114 @@ msgstr ""
msgid "say good-bye and leave somebody else's place"
msgstr ""
-#: src/social/gnunet-social.c:1227 src/social/gnunet-social.c:1232
+#: src/social/gnunet-social.c:1227
msgid "create a place"
msgstr ""
-#: src/social/gnunet-social.c:1237
+#: src/social/gnunet-social.c:1232
msgid "destroy a place we were hosting"
msgstr ""
-#: src/social/gnunet-social.c:1242
+#: src/social/gnunet-social.c:1237
msgid "enter somebody else's place"
msgstr ""
-#: src/social/gnunet-social.c:1248
+#: src/social/gnunet-social.c:1243
msgid "find state matching name prefix"
msgstr ""
-#: src/social/gnunet-social.c:1253
+#: src/social/gnunet-social.c:1248
msgid "replay history of messages up to the given --limit"
msgstr ""
-#: src/social/gnunet-social.c:1258
+#: src/social/gnunet-social.c:1253
msgid "reconnect to a previously created place"
msgstr ""
-#: src/social/gnunet-social.c:1263
+#: src/social/gnunet-social.c:1258
msgid "publish something to a place we are hosting"
msgstr ""
-#: src/social/gnunet-social.c:1268
+#: src/social/gnunet-social.c:1263
msgid "reconnect to a previously entered place"
msgstr ""
-#: src/social/gnunet-social.c:1273
+#: src/social/gnunet-social.c:1268
msgid "search for state matching exact name"
msgstr ""
-#: src/social/gnunet-social.c:1278
+#: src/social/gnunet-social.c:1273
msgid "submit something to somebody's place"
msgstr ""
-#: src/social/gnunet-social.c:1283
+#: src/social/gnunet-social.c:1278
msgid "list of egos and subscribed places"
msgstr ""
-#: src/social/gnunet-social.c:1288
+#: src/social/gnunet-social.c:1283
msgid "extract and replay history between message IDs --start and --until"
msgstr ""
-#: src/social/gnunet-social.c:1297
+#: src/social/gnunet-social.c:1292
msgid "application ID to use when connecting"
msgstr ""
-#: src/social/gnunet-social.c:1303
+#: src/social/gnunet-social.c:1298
msgid "message body or state value"
msgstr ""
-#: src/social/gnunet-social.c:1309
+#: src/social/gnunet-social.c:1304
#, fuzzy
msgid "name or public key of ego"
msgstr "Đối số không hợp lệ cho « %s ».\n"
-#: src/social/gnunet-social.c:1314
+#: src/social/gnunet-social.c:1309
#, fuzzy
msgid "wait for incoming messages"
msgstr "Lỗi gửi tin nhẳn.\n"
-#: src/social/gnunet-social.c:1320
+#: src/social/gnunet-social.c:1315
msgid "GNS name"
msgstr ""
-#: src/social/gnunet-social.c:1326
+#: src/social/gnunet-social.c:1321
msgid "peer ID for --guest-enter"
msgstr ""
-#: src/social/gnunet-social.c:1332
+#: src/social/gnunet-social.c:1327
msgid "name (key) to query from state"
msgstr ""
-#: src/social/gnunet-social.c:1338
+#: src/social/gnunet-social.c:1333
msgid "method name"
msgstr ""
-#: src/social/gnunet-social.c:1344
+#: src/social/gnunet-social.c:1339
#, fuzzy
msgid "number of messages to replay from history"
msgstr "số tin nhắn cần dùng mỗi lần lặp"
-#: src/social/gnunet-social.c:1350
+#: src/social/gnunet-social.c:1345
msgid "key address of place"
msgstr ""
-#: src/social/gnunet-social.c:1356
+#: src/social/gnunet-social.c:1351
msgid "start message ID for history replay"
msgstr ""
-#: src/social/gnunet-social.c:1361
+#: src/social/gnunet-social.c:1356
msgid "respond to entry requests by admitting all guests"
msgstr ""
-#: src/social/gnunet-social.c:1367
+#: src/social/gnunet-social.c:1362
msgid "end message ID for history replay"
msgstr ""
-#: src/social/gnunet-social.c:1372
+#: src/social/gnunet-social.c:1367
msgid "respond to entry requests by refusing all guests"
msgstr ""
-#: src/social/gnunet-social.c:1382
+#: src/social/gnunet-social.c:1377
msgid ""
"gnunet-social - Interact with the social service: enter/leave, send/receive "
"messages, access history and state.\n"
@@ -6607,7 +6786,7 @@ msgid ""
msgstr ""
#: src/testbed/gnunet-daemon-testbed-underlay.c:231 src/testing/list-keys.c:46
-#: src/testing/testing.c:288 src/util/gnunet-ecc.c:298
+#: src/testing/testing.c:288 src/util/gnunet-ecc.c:301
#, c-format
msgid "Incorrect hostkey file format: %s\n"
msgstr ""
@@ -6677,16 +6856,6 @@ msgstr "« %s » đang tắt.\n"
msgid "%.s Unknown result code."
msgstr ""
-#: src/testbed/gnunet_testbed_mpi_spawn.c:118
-#, fuzzy
-msgid "Waiting for child to exit.\n"
-msgstr "Đang đợi các đồng đẳng kết nối"
-
-#: src/testbed/gnunet_testbed_mpi_spawn.c:241
-#, fuzzy, c-format
-msgid "Spawning process `%s'\n"
-msgstr "Đang bắt đầu tài về « %s »\n"
-
#: src/testbed/gnunet-testbed-profiler.c:290
msgid "tolerate COUNT number of continious timeout failures"
msgstr ""
@@ -6698,6 +6867,16 @@ msgid ""
"signal is received"
msgstr ""
+#: src/testbed/gnunet_testbed_mpi_spawn.c:118
+#, fuzzy
+msgid "Waiting for child to exit.\n"
+msgstr "Đang đợi các đồng đẳng kết nối"
+
+#: src/testbed/gnunet_testbed_mpi_spawn.c:241
+#, fuzzy, c-format
+msgid "Spawning process `%s'\n"
+msgstr "Đang bắt đầu tài về « %s »\n"
+
#: src/testbed/testbed_api.c:410
#, fuzzy, c-format
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"
msgid "GNUnet topology control"
msgstr ""
-#: src/transport/gnunet-service-transport_ats.c:141
-msgid "# Addresses given to ATS"
-msgstr ""
-
#: src/transport/gnunet-service-transport.c:448
#, fuzzy
msgid "# messages dropped due to slow client"
@@ -7053,6 +7228,10 @@ msgstr ""
msgid "Transport service is lacking key configuration settings. Exiting.\n"
msgstr "Lưu cấu hình ngay bây giờ không?"
+#: src/transport/gnunet-service-transport_ats.c:141
+msgid "# Addresses given to ATS"
+msgstr ""
+
#: src/transport/gnunet-service-transport_hello.c:195
msgid "# refreshed my HELLO"
msgstr ""
@@ -7387,6 +7566,46 @@ msgstr ""
msgid "# validations succeeded"
msgstr ""
+#: src/transport/gnunet-transport-profiler.c:219
+#, c-format
+msgid "%llu B in %llu ms == %.2f KB/s!\n"
+msgstr ""
+
+#: src/transport/gnunet-transport-profiler.c:617
+msgid "send data to peer"
+msgstr ""
+
+#: src/transport/gnunet-transport-profiler.c:621
+#, fuzzy
+msgid "receive data from peer"
+msgstr "Yêu cầu cấp %d từ đồng đẳng %d\n"
+
+#: src/transport/gnunet-transport-profiler.c:626
+#, fuzzy
+msgid "iterations"
+msgstr "Tùy chọn chung"
+
+#: src/transport/gnunet-transport-profiler.c:631
+#, fuzzy
+msgid "number of messages to send"
+msgstr "số tin nhắn cần dùng mỗi lần lặp"
+
+#: src/transport/gnunet-transport-profiler.c:636
+#, fuzzy
+msgid "message size to use"
+msgstr "kích cỡ tin nhắn"
+
+#: src/transport/gnunet-transport-profiler.c:641
+#: src/transport/gnunet-transport.c:1462
+msgid "peer identity"
+msgstr ""
+
+#: src/transport/gnunet-transport-profiler.c:652
+#: src/transport/gnunet-transport.c:1482
+#, fuzzy
+msgid "Direct access to transport service."
+msgstr "Lỗi kết nối đến gnunetd.\n"
+
#: src/transport/gnunet-transport.c:413
#, fuzzy, c-format
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."
msgid "do not resolve hostnames"
msgstr "không quyết định các tên máy"
-#: src/transport/gnunet-transport.c:1462
-#: src/transport/gnunet-transport-profiler.c:641
-msgid "peer identity"
-msgstr ""
-
#: src/transport/gnunet-transport.c:1466
msgid "monitor plugin sessions"
msgstr ""
@@ -7539,44 +7753,9 @@ msgstr ""
msgid "send data for benchmarking to the other peer (until CTRL-C)"
msgstr ""
-#: src/transport/gnunet-transport.c:1482
-#: src/transport/gnunet-transport-profiler.c:652
-#, fuzzy
-msgid "Direct access to transport service."
-msgstr "Lỗi kết nối đến gnunetd.\n"
-
-#: src/transport/gnunet-transport-profiler.c:219
-#, c-format
-msgid "%llu B in %llu ms == %.2f KB/s!\n"
-msgstr ""
-
-#: src/transport/gnunet-transport-profiler.c:617
-msgid "send data to peer"
-msgstr ""
-
-#: src/transport/gnunet-transport-profiler.c:621
-#, fuzzy
-msgid "receive data from peer"
-msgstr "Yêu cầu cấp %d từ đồng đẳng %d\n"
-
-#: src/transport/gnunet-transport-profiler.c:626
-#, fuzzy
-msgid "iterations"
-msgstr "Tùy chọn chung"
-
-#: src/transport/gnunet-transport-profiler.c:631
-#, fuzzy
-msgid "number of messages to send"
-msgstr "số tin nhắn cần dùng mỗi lần lặp"
-
-#: src/transport/gnunet-transport-profiler.c:636
-#, fuzzy
-msgid "message size to use"
-msgstr "kích cỡ tin nhắn"
-
#: src/transport/plugin_transport_http_client.c:1474
-#: src/transport/plugin_transport_http_server.c:2249
-#: src/transport/plugin_transport_http_server.c:3463
+#: src/transport/plugin_transport_http_server.c:2312
+#: src/transport/plugin_transport_http_server.c:3526
#: src/transport/plugin_transport_tcp.c:3890
#: src/transport/plugin_transport_tcp.c:3897
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"
msgstr ""
#: src/transport/plugin_transport_http_client.c:2164
-#: src/transport/plugin_transport_http_server.c:3178
+#: src/transport/plugin_transport_http_server.c:3241
#, fuzzy, c-format
msgid "Shutting down plugin `%s'\n"
msgstr "Đang nạp các truyền tải « %s »\n"
#: src/transport/plugin_transport_http_client.c:2181
-#: src/transport/plugin_transport_http_server.c:3248
+#: src/transport/plugin_transport_http_server.c:3311
#, fuzzy, c-format
msgid "Shutdown for plugin `%s' complete\n"
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"
msgid "Maximum number of requests is %u\n"
msgstr "tăng sổ tối đa các kết nối TCP/IP"
-#: src/transport/plugin_transport_http_server.c:1727
+#: src/transport/plugin_transport_http_server.c:1756
#, c-format
msgid ""
"Access from connection %p (%u of %u) for `%s' `%s' url `%s' with upload data "
"size %u\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:1967
+#: src/transport/plugin_transport_http_server.c:2028
#, c-format
msgid "Accepting connection (%u of %u) from `%s'\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:1975
+#: src/transport/plugin_transport_http_server.c:2036
#, c-format
msgid ""
"Server reached maximum number connections (%u), rejecting new connection\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:2125
+#: src/transport/plugin_transport_http_server.c:2186
msgid ""
"Could not create a new TLS certificate, program `gnunet-transport-"
"certificate-creation' could not be started!\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:2148
+#: src/transport/plugin_transport_http_server.c:2209
#, c-format
msgid "No usable TLS certificate found and creating one at `%s/%s' failed!\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:2275
+#: src/transport/plugin_transport_http_server.c:2338
msgid "Could not load or create server certificate! Loading plugin failed!\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:2587
+#: src/transport/plugin_transport_http_server.c:2650
#, fuzzy
msgid "Require valid port number for service in configuration!\n"
msgstr "Lỗi lưu cấu hình."
-#: src/transport/plugin_transport_http_server.c:2752
+#: src/transport/plugin_transport_http_server.c:2815
#, c-format
msgid "Found %u addresses to report to NAT service\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:2838
+#: src/transport/plugin_transport_http_server.c:2901
#: src/transport/plugin_transport_udp.c:3622
msgid "Disabling IPv6 since it is not supported on this system!\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:2944
+#: src/transport/plugin_transport_http_server.c:3007
#, c-format
msgid "IPv4 support is %s\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:2959
+#: src/transport/plugin_transport_http_server.c:3022
#, c-format
msgid "IPv6 support is %s\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:2965
+#: src/transport/plugin_transport_http_server.c:3028
msgid "Neither IPv4 nor IPv6 are enabled! Fix in configuration\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:2976
+#: src/transport/plugin_transport_http_server.c:3039
#, fuzzy
msgid "Port is required! Fix in configuration\n"
msgstr ""
"\n"
"Kết thúc cấu hình.\n"
-#: src/transport/plugin_transport_http_server.c:2982
+#: src/transport/plugin_transport_http_server.c:3045
#, fuzzy, c-format
msgid "Using port %u\n"
msgstr "Đang thử nghiệm (các) truyền tải %s\n"
-#: src/transport/plugin_transport_http_server.c:3001
+#: src/transport/plugin_transport_http_server.c:3064
#, fuzzy, c-format
msgid "Specific IPv4 address `%s' in configuration file is invalid!\n"
msgstr "Đang thử dùng tập tin « %s » cho cấu hình MySQL.\n"
-#: src/transport/plugin_transport_http_server.c:3036
+#: src/transport/plugin_transport_http_server.c:3099
#, fuzzy, c-format
msgid "Specific IPv6 address `%s' in configuration file is invalid!\n"
msgstr "Đang thử dùng tập tin « %s » cho cấu hình MySQL.\n"
-#: src/transport/plugin_transport_http_server.c:3111
+#: src/transport/plugin_transport_http_server.c:3174
#, fuzzy, c-format
msgid "Using external hostname `%s'\n"
msgstr "Đang bắt đầu tài về « %s »\n"
-#: src/transport/plugin_transport_http_server.c:3132
+#: src/transport/plugin_transport_http_server.c:3195
#, fuzzy, c-format
msgid "Notifying transport only about hostname `%s'\n"
msgstr "không quyết định các tên máy"
-#: src/transport/plugin_transport_http_server.c:3149
+#: src/transport/plugin_transport_http_server.c:3212
#, fuzzy, c-format
msgid "Maximum number of connections is %u\n"
msgstr "tăng sổ tối đa các kết nối TCP/IP"
-#: src/transport/plugin_transport_http_server.c:3475
+#: src/transport/plugin_transport_http_server.c:3538
#, fuzzy
msgid "Unable to compile URL regex\n"
msgstr "Không thể sơ khởi SQLite: %s.\n"
@@ -7852,21 +8031,6 @@ msgstr ""
msgid "TCP transport advertises itself as being on port %llu\n"
msgstr ""
-#: src/transport/plugin_transport_udp_broadcasting.c:168
-#, fuzzy
-msgid "# Multicast HELLO beacons received via UDP"
-msgstr "# các thông báo PONG đã mật mã được nhận"
-
-#: src/transport/plugin_transport_udp_broadcasting.c:548
-msgid ""
-"Disabling HELLO broadcasting due to friend-to-friend only configuration!\n"
-msgstr ""
-
-#: src/transport/plugin_transport_udp_broadcasting.c:565
-#, c-format
-msgid "Failed to set IPv4 broadcast option for broadcast socket on port %d\n"
-msgstr ""
-
#: src/transport/plugin_transport_udp.c:3366
#, c-format
msgid ""
@@ -7915,6 +8079,21 @@ msgstr "« %s » không sẵn sàng.\n"
msgid "Failed to create UDP network sockets\n"
msgstr "Không thể tạo miền tên.\n"
+#: src/transport/plugin_transport_udp_broadcasting.c:168
+#, fuzzy
+msgid "# Multicast HELLO beacons received via UDP"
+msgstr "# các thông báo PONG đã mật mã được nhận"
+
+#: src/transport/plugin_transport_udp_broadcasting.c:548
+msgid ""
+"Disabling HELLO broadcasting due to friend-to-friend only configuration!\n"
+msgstr ""
+
+#: src/transport/plugin_transport_udp_broadcasting.c:565
+#, c-format
+msgid "Failed to set IPv4 broadcast option for broadcast socket on port %d\n"
+msgstr ""
+
#: src/transport/plugin_transport_unix.c:1403
#, fuzzy, c-format
msgid "Cannot create path to `%s'\n"
@@ -8029,7 +8208,7 @@ msgid ""
"`GNUNET_SERVER_receive_done' after %s\n"
msgstr ""
-#: src/transport/tcp_service_legacy.c:339 src/util/service.c:2337
+#: src/transport/tcp_service_legacy.c:339 src/util/service.c:2336
#, fuzzy, c-format
msgid "Unknown address family %d\n"
msgstr "\tKhông rõ miền tên « %s »\n"
@@ -8074,51 +8253,51 @@ msgstr "Lỗi chạy %s: %s %d\n"
msgid "Service `%s' runs at %s\n"
msgstr "Đồng đẳng « %s » có mức tin cậy %8u\n"
-#: src/transport/tcp_service_legacy.c:1251 src/util/service.c:1501
+#: src/transport/tcp_service_legacy.c:1251 src/util/service.c:1500
msgid "Service process failed to initialize\n"
msgstr ""
-#: src/transport/tcp_service_legacy.c:1255 src/util/service.c:1505
+#: src/transport/tcp_service_legacy.c:1255 src/util/service.c:1504
msgid "Service process could not initialize server function\n"
msgstr ""
-#: src/transport/tcp_service_legacy.c:1259 src/util/service.c:1509
+#: src/transport/tcp_service_legacy.c:1259 src/util/service.c:1508
msgid "Service process failed to report status\n"
msgstr ""
#: src/transport/tcp_service_legacy.c:1313 src/util/disk.c:1488
-#: src/util/service.c:1379
+#: src/util/service.c:1378
#, c-format
msgid "Cannot obtain information about user `%s': %s\n"
msgstr "Không thể lấy thông tin về người dùng « %s »: %s\n"
-#: src/transport/tcp_service_legacy.c:1314 src/util/service.c:1381
+#: src/transport/tcp_service_legacy.c:1314 src/util/service.c:1380
msgid "No such user"
msgstr "Không có người dùng như vậy"
-#: src/transport/tcp_service_legacy.c:1327 src/util/service.c:1400
+#: src/transport/tcp_service_legacy.c:1327 src/util/service.c:1399
#, c-format
msgid "Cannot change user/group to `%s': %s\n"
msgstr "Không thể thay đổi người dùng/nhóm thành « %s »: %s\n"
-#: src/transport/tcp_service_legacy.c:1398 src/util/service.c:1728
+#: src/transport/tcp_service_legacy.c:1398 src/util/service.c:1727
msgid "do daemonize (detach from terminal)"
msgstr ""
#: src/transport/tcp_service_legacy.c:1448 src/util/program.c:244
-#: src/util/service.c:1791
+#: src/util/service.c:1790
#, fuzzy, c-format
msgid "Malformed configuration file `%s', exit ...\n"
msgstr "Không thể lưu tập tin cấu hình « %s »:"
#: src/transport/tcp_service_legacy.c:1458 src/util/program.c:261
-#: src/util/service.c:1802
+#: src/util/service.c:1801
#, fuzzy
msgid "Malformed configuration, exit ...\n"
msgstr "Không thể lưu tập tin cấu hình « %s »:"
#: src/transport/tcp_service_legacy.c:1463 src/util/program.c:256
-#: src/util/service.c:1808
+#: src/util/service.c:1807
#, fuzzy, c-format
msgid "Could not access configuration file `%s'\n"
msgstr "Không thể truy cập đến tập tin gnunet-directory « %s »\n"
@@ -8162,71 +8341,71 @@ msgstr ""
msgid "Need a non-empty hostname for service `%s'.\n"
msgstr ""
-#: src/util/common_logging.c:256 src/util/common_logging.c:1129
+#: src/util/common_logging.c:259 src/util/common_logging.c:1132
msgid "DEBUG"
msgstr "GỠ LỖI"
-#: src/util/common_logging.c:258 src/util/common_logging.c:1127
+#: src/util/common_logging.c:261 src/util/common_logging.c:1130
msgid "INFO"
msgstr "TIN"
-#: src/util/common_logging.c:260 src/util/common_logging.c:1125
+#: src/util/common_logging.c:263 src/util/common_logging.c:1128
msgid "MESSAGE"
msgstr ""
-#: src/util/common_logging.c:262 src/util/common_logging.c:1123
+#: src/util/common_logging.c:265 src/util/common_logging.c:1126
msgid "WARNING"
msgstr "CẢNH BÁO"
-#: src/util/common_logging.c:264 src/util/common_logging.c:1121
+#: src/util/common_logging.c:267 src/util/common_logging.c:1124
msgid "ERROR"
msgstr "LỖI"
-#: src/util/common_logging.c:266 src/util/common_logging.c:1131
+#: src/util/common_logging.c:269 src/util/common_logging.c:1134
msgid "NONE"
msgstr ""
-#: src/util/common_logging.c:879
+#: src/util/common_logging.c:882
#, fuzzy, c-format
msgid "Message `%.*s' repeated %u times in the last %s\n"
msgstr "Thông điệp « %.*s » đã lặp lại %u lần trong %llu giây trước\n"
-#: src/util/common_logging.c:1132
+#: src/util/common_logging.c:1135
msgid "INVALID"
msgstr ""
-#: src/util/common_logging.c:1302
+#: src/util/common_logging.c:1326
msgid "unknown address"
msgstr ""
-#: src/util/common_logging.c:1344
+#: src/util/common_logging.c:1368
msgid "invalid address"
msgstr ""
-#: src/util/common_logging.c:1362
+#: src/util/common_logging.c:1386
#, fuzzy, c-format
msgid "Configuration fails to specify option `%s' in section `%s'!\n"
msgstr ""
"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"
-#: src/util/common_logging.c:1383
+#: src/util/common_logging.c:1407
#, fuzzy, c-format
msgid ""
"Configuration specifies invalid value for option `%s' in section `%s': %s\n"
msgstr ""
"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"
-#: src/util/configuration.c:286
+#: src/util/configuration.c:296
#, fuzzy, c-format
msgid "Syntax error while deserializing in line %u\n"
msgstr "Gặp lỗi cú pháp trong tập tin cấu hình « %s » tại dòng %d.\n"
-#: src/util/configuration.c:344
+#: src/util/configuration.c:355
#, fuzzy, c-format
msgid "Error while reading file `%s'\n"
msgstr "Gặp lỗi khi tải xuống: %s\n"
-#: src/util/configuration.c:1017
+#: src/util/configuration.c:1034
#, c-format
msgid ""
"Configuration value '%s' for '%s' in section '%s' is not in set of legal "
@@ -8235,17 +8414,17 @@ msgstr ""
"Giá trị cấu hình « %s » cho « %s » trong phần « %s » không phải nằm trong "
"tập hợp các sự chọn được phép\n"
-#: src/util/configuration.c:1136
+#: src/util/configuration.c:1153
#, c-format
msgid "Recursive expansion suspected, aborting $-expansion for term `%s'\n"
msgstr ""
-#: src/util/configuration.c:1169
+#: src/util/configuration.c:1186
#, fuzzy, c-format
msgid "Missing closing `%s' in option `%s'\n"
msgstr "Giá trị cấu hình « %s » cho « %s » trong phần « %s » nên là con số\n"
-#: src/util/configuration.c:1237
+#: src/util/configuration.c:1254
#, c-format
msgid ""
"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"
msgid "EdDSA signature verification failed at %s:%d: %s\n"
msgstr "Lỗi thẩm tra chữ ký RSA tại %s:%d: %s\n"
-#: src/util/crypto_ecc_setup.c:122 src/util/crypto_ecc_setup.c:160
-#: src/util/crypto_ecc_setup.c:278 src/util/crypto_ecc_setup.c:316
+#: src/util/crypto_ecc_setup.c:122 src/util/crypto_ecc_setup.c:161
+#: src/util/crypto_ecc_setup.c:279 src/util/crypto_ecc_setup.c:317
#, fuzzy, c-format
msgid "Could not acquire lock on file `%s': %s...\n"
msgstr "Lỗi mở tập tin theo dõi « %s »: %s\n"
-#: src/util/crypto_ecc_setup.c:127 src/util/crypto_ecc_setup.c:283
+#: src/util/crypto_ecc_setup.c:128 src/util/crypto_ecc_setup.c:284
#, fuzzy
msgid "Creating a new private key. This may take a while.\n"
msgstr "Đang tạo khoá máy mới (có thể hơi lâu).\n"
-#: src/util/crypto_ecc_setup.c:164 src/util/crypto_ecc_setup.c:320
+#: src/util/crypto_ecc_setup.c:165 src/util/crypto_ecc_setup.c:322
msgid "This may be ok if someone is currently generating a private key.\n"
msgstr ""
-#: src/util/crypto_ecc_setup.c:194 src/util/crypto_ecc_setup.c:350
+#: src/util/crypto_ecc_setup.c:195 src/util/crypto_ecc_setup.c:352
#, c-format
msgid ""
"When trying to read key file `%s' I found %u bytes but I need at least %u.\n"
msgstr ""
-#: src/util/crypto_ecc_setup.c:198 src/util/crypto_ecc_setup.c:354
+#: src/util/crypto_ecc_setup.c:199 src/util/crypto_ecc_setup.c:356
msgid "This may be ok if someone is currently generating a key.\n"
msgstr ""
-#: src/util/crypto_ecc_setup.c:413
+#: src/util/crypto_ecc_setup.c:415
#, fuzzy
msgid "Could not load peer's private key\n"
msgstr "Không thể truy cập đến tập tin gnunet-directory « %s »\n"
@@ -8499,82 +8678,86 @@ msgstr ""
msgid "Manipulate GNUnet configuration files"
msgstr "cập nhật một giá trị trong tập tin cấu hình"
-#: src/util/gnunet-ecc.c:84
+#: src/util/gnunet-ecc.c:89
#, fuzzy, c-format
msgid "Failed to open `%s': %s\n"
msgstr "Lỗi mở tập tin ghi sự kiện « %s »: %s\n"
-#: src/util/gnunet-ecc.c:120
+#: src/util/gnunet-ecc.c:125
#, c-format
msgid "Generating %u keys like %s, please wait"
msgstr ""
-#: src/util/gnunet-ecc.c:133
+#: src/util/gnunet-ecc.c:138
#, c-format
msgid "Generating %u keys, please wait"
msgstr ""
-#: src/util/gnunet-ecc.c:174
+#: src/util/gnunet-ecc.c:179
#, fuzzy, c-format
msgid ""
"\n"
"Failed to write to `%s': %s\n"
msgstr "Lỗi chạy %s: %s %d\n"
-#: src/util/gnunet-ecc.c:184
+#: src/util/gnunet-ecc.c:189
#, c-format
msgid ""
"\n"
"Finished!\n"
msgstr ""
-#: src/util/gnunet-ecc.c:187
+#: src/util/gnunet-ecc.c:192
#, c-format
msgid ""
"\n"
"Error, %u keys not generated\n"
msgstr ""
-#: src/util/gnunet-ecc.c:280
+#: src/util/gnunet-ecc.c:283
#, fuzzy, c-format
msgid "Hostkeys file `%s' not found\n"
msgstr "Khoá phiên chạy từ đồng đẳng « %s » không thể được thẩm tra.\n"
-#: src/util/gnunet-ecc.c:291
+#: src/util/gnunet-ecc.c:294
#, fuzzy, c-format
msgid "Hostkeys file `%s' is empty\n"
msgstr "Định dạng của tập tin « %s » là không hợp lệ.\n"
-#: src/util/gnunet-ecc.c:313
+#: src/util/gnunet-ecc.c:316
#, fuzzy, c-format
msgid "Could not read hostkey file: %s\n"
msgstr "Không thể đọc danh sách bạn bè « %s »\n"
-#: src/util/gnunet-ecc.c:364
+#: src/util/gnunet-ecc.c:367
msgid "No hostkey file specified on command line\n"
msgstr ""
-#: src/util/gnunet-ecc.c:416
+#: src/util/gnunet-ecc.c:425
msgid "list keys included in a file (for testing)"
msgstr ""
-#: src/util/gnunet-ecc.c:421
+#: src/util/gnunet-ecc.c:430
msgid "number of keys to list included in a file (for testing)"
msgstr ""
-#: src/util/gnunet-ecc.c:426
+#: src/util/gnunet-ecc.c:435
msgid "create COUNT public-private key pairs (for testing)"
msgstr ""
-#: src/util/gnunet-ecc.c:430
+#: src/util/gnunet-ecc.c:439
msgid "print the public key in ASCII format"
msgstr ""
-#: src/util/gnunet-ecc.c:434
+#: src/util/gnunet-ecc.c:443
+msgid "print the public key in HEX format"
+msgstr ""
+
+#: src/util/gnunet-ecc.c:447
msgid "print examples of ECC operations (used for compatibility testing)"
msgstr ""
-#: src/util/gnunet-ecc.c:449
+#: src/util/gnunet-ecc.c:463
#, fuzzy
msgid "Manipulate GNUnet private ECC key files"
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"
msgid "Unable to shorten unix path `%s' while keeping name unique\n"
msgstr ""
-#: src/util/network.c:1793 src/util/network.c:1969
+#: src/util/network.c:1793 src/util/network.c:1977
#, c-format
msgid ""
"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"
msgid "Could not determine plugin installation path.\n"
msgstr "Không thể truy cập đến thông tin về không gian tên.\n"
-#: src/util/resolver_api.c:204
+#: src/util/resolver_api.c:203
#, c-format
msgid ""
"Missing `%s' for `%s' in configuration, DNS resolution will be unavailable.\n"
@@ -8734,32 +8917,32 @@ msgid ""
"resolution will be unavailable.\n"
msgstr ""
-#: src/util/resolver_api.c:815
+#: src/util/resolver_api.c:826
#, fuzzy, c-format
msgid "Timeout trying to resolve hostname `%s'.\n"
msgstr "không quyết định các tên máy"
-#: src/util/resolver_api.c:827
+#: src/util/resolver_api.c:839
#, fuzzy, c-format
msgid "Timeout trying to resolve IP address `%s'.\n"
msgstr "GNUnet bây giờ sử dụng địa chỉ IP %s.\n"
-#: src/util/resolver_api.c:1004
+#: src/util/resolver_api.c:1023
msgid "Resolver not configured correctly.\n"
msgstr ""
-#: src/util/resolver_api.c:1086 src/util/resolver_api.c:1107
-#: src/util/resolver_api.c:1121
+#: src/util/resolver_api.c:1109 src/util/resolver_api.c:1132
+#: src/util/resolver_api.c:1146
#, fuzzy, c-format
msgid "Could not resolve our FQDN: %s\n"
msgstr "Không thể giải quyết « %s » (%s): %s\n"
-#: src/util/service.c:1306
+#: src/util/service.c:1305
msgid ""
"Could not bind to any of the ports I was supposed to, refusing to run!\n"
msgstr ""
-#: src/util/service.c:2082
+#: src/util/service.c:2081
#, c-format
msgid ""
"Processing code for message of type %u did not call "
@@ -8837,63 +9020,63 @@ msgstr " ngày"
msgid "end of time"
msgstr ""
-#: src/util/strings.c:1269
+#: src/util/strings.c:1270
msgid "IPv6 address did not start with `['\n"
msgstr ""
-#: src/util/strings.c:1277
+#: src/util/strings.c:1278
msgid "IPv6 address did contain ':' to separate port number\n"
msgstr ""
-#: src/util/strings.c:1283
+#: src/util/strings.c:1284
msgid "IPv6 address did contain ']' before ':' to separate port number\n"
msgstr ""
-#: src/util/strings.c:1290
+#: src/util/strings.c:1291
msgid "IPv6 address did contain a valid port number after the last ':'\n"
msgstr ""
-#: src/util/strings.c:1299
+#: src/util/strings.c:1300
#, fuzzy, c-format
msgid "Invalid IPv6 address `%s': %s\n"
msgstr "Mức ưu tiên tiến trình không hợp lê « %s ».\n"
-#: src/util/strings.c:1571 src/util/strings.c:1587
+#: src/util/strings.c:1572 src/util/strings.c:1588
msgid "Port not in range\n"
msgstr ""
-#: src/util/strings.c:1596
+#: src/util/strings.c:1597
#, fuzzy, c-format
msgid "Malformed port policy `%s'\n"
msgstr "Lỗi bắt đầu thu thập.\n"
-#: src/util/strings.c:1679 src/util/strings.c:1710 src/util/strings.c:1758
-#: src/util/strings.c:1779
+#: src/util/strings.c:1680 src/util/strings.c:1711 src/util/strings.c:1759
+#: src/util/strings.c:1780
#, c-format
msgid "Invalid format for IP: `%s'\n"
msgstr "Địa chỉ IP định dạng sai: %s\n"
-#: src/util/strings.c:1736
+#: src/util/strings.c:1737
#, c-format
msgid "Invalid network notation ('/%d' is not legal in IPv4 CIDR)."
msgstr "Ký hiệu mạng sai (« /%d » không hợp lệ trong CIDR IPv4)."
-#: src/util/strings.c:1788
+#: src/util/strings.c:1789
#, fuzzy, c-format
msgid "Invalid format: `%s'\n"
msgstr "Địa chỉ IP định dạng sai: %s\n"
-#: src/util/strings.c:1840
+#: src/util/strings.c:1841
#, c-format
msgid "Invalid network notation (does not end with ';': `%s')\n"
msgstr "Ký hiệu mạng sai (không kết thúc với « ; »: « %s »)\n"
-#: src/util/strings.c:1890
+#: src/util/strings.c:1891
#, fuzzy, c-format
msgid "Wrong format `%s' for netmask\n"
msgstr "Mặt nạ mạng có định dạng sai « %s »: %s\n"
-#: src/util/strings.c:1921
+#: src/util/strings.c:1922
#, fuzzy, c-format
msgid "Wrong format `%s' for network\n"
msgstr "Mạng có định dạng sai « %s »: %s\n"
@@ -9076,28 +9259,44 @@ msgstr "# các byte đã nhận qua UDP"
msgid "Setup tunnels via VPN."
msgstr ""
-#: src/zonemaster/gnunet-service-zonemaster.c:705
+#: src/zonemaster/gnunet-service-zonemaster.c:706
#, fuzzy
msgid "Failed to connect to the namestore!\n"
msgstr "Không kết nối được đến trình nền gnunetd."
-#: src/include/gnunet_common.h:674 src/include/gnunet_common.h:681
-#: src/include/gnunet_common.h:691 src/include/gnunet_common.h:699
+#: src/include/gnunet_common.h:689 src/include/gnunet_common.h:696
+#: src/include/gnunet_common.h:706 src/include/gnunet_common.h:714
#, fuzzy, c-format
msgid "Assertion failed at %s:%d.\n"
msgstr "Lỗi nội bộ : khẳng định không thành công tại %s:%d.\n"
-#: src/include/gnunet_common.h:711
+#: src/include/gnunet_common.h:726
#, fuzzy, c-format
msgid "External protocol violation detected at %s:%d.\n"
msgstr "Lỗi nội bộ : khẳng định không thành công tại %s:%d.\n"
-#: src/include/gnunet_common.h:738 src/include/gnunet_common.h:747
+#: src/include/gnunet_common.h:753 src/include/gnunet_common.h:762
#, c-format
msgid "`%s' failed on file `%s' at %s:%d with error: %s\n"
msgstr "« %s » thất bại ở tập tin « %s » tại %s:%d với lỗi: %s\n"
#, fuzzy
+#~ msgid "Token `%s' is malformed\n"
+#~ msgstr "Đối số không hợp lệ cho « %s ».\n"
+
+#, fuzzy
+#~ msgid "Failed to create indices\n"
+#~ msgstr "Không thể tạo miền tên.\n"
+
+#, fuzzy
+#~ msgid "`%s:%s' failed at %s:%d with error: %s\n"
+#~ msgstr "« %s » bị lỗi tại %s:%d với lỗi: %s"
+
+#, fuzzy
+#~ msgid "Unable to connect to Postgres database '%s': %s\n"
+#~ msgstr "Không thể lưu tập tin cấu hình « %s »:"
+
+#, fuzzy
#~ msgid "Misconfiguration (can not connect to the ARM service)"
#~ msgstr "Lỗi kết nối đến gnunetd.\n"
@@ -9206,10 +9405,6 @@ msgstr "« %s » thất bại ở tập tin « %s » tại %s:%d với lỗi: %s
#~ msgstr "# các sự truyền PONG bị lỗi"
#, fuzzy
-#~ msgid "# bytes sent to datastore"
-#~ msgstr "# các byte trong kho dữ liệu"
-
-#, fuzzy
#~ msgid "Failed to receive status response from database."
#~ msgstr ""
#~ "\n"
@@ -9526,10 +9721,6 @@ msgstr "« %s » thất bại ở tập tin « %s » tại %s:%d với lỗi: %s
#~ msgstr "Lỗi sơ khởi dịch vụ « %s ».\n"
#, fuzzy
-#~ msgid "Error reading sensor version\n"
-#~ msgstr "Gặp lỗi khi tạo người dùng"
-
-#, fuzzy
#~ msgid "Error reading sensor category\n"
#~ msgstr "Gặp lỗi khi tạo người dùng"
@@ -10134,12 +10325,6 @@ msgstr "« %s » thất bại ở tập tin « %s » tại %s:%d với lỗi: %s
#~ "Không nhận được đáp ứng từ gnunetd.\n"
#, fuzzy
-#~ msgid "Failed to remove records from database"
-#~ msgstr ""
-#~ "\n"
-#~ "Không nhận được đáp ứng từ gnunetd.\n"
-
-#, fuzzy
#~ msgid "Failed to access database"
#~ msgstr "Lỗi mở tập tin ghi sự kiện « %s »: %s\n"
diff --git a/po/zh_CN.po b/po/zh_CN.po
index fee065a9df..2539296c28 100644
--- a/po/zh_CN.po
+++ b/po/zh_CN.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gnunet-0.8.1\n"
"Report-Msgid-Bugs-To: gnunet-developers@mail.gnu.org\n"
-"POT-Creation-Date: 2017-03-31 19:22-0500\n"
+"POT-Creation-Date: 2017-10-20 15:14+0000\n"
"PO-Revision-Date: 2011-07-09 12:12+0800\n"
"Last-Translator: Wylmer Wang <wantinghard@gmail.com>\n"
"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"
msgstr ""
#: src/arm/gnunet-service-arm.c:513
-#: src/transport/plugin_transport_http_server.c:2621
+#: src/transport/plugin_transport_http_server.c:2684
#: src/transport/plugin_transport_tcp.c:1259
#: src/transport/tcp_service_legacy.c:696 src/util/service.c:782
#, fuzzy, c-format
@@ -275,7 +275,7 @@ msgid "Failed to resolve `%s': %s\n"
msgstr "打开日志文件“%s”失败:%s\n"
#: src/arm/gnunet-service-arm.c:532
-#: src/transport/plugin_transport_http_server.c:2639
+#: src/transport/plugin_transport_http_server.c:2702
#: src/transport/plugin_transport_tcp.c:1278
#: src/transport/tcp_service_legacy.c:715 src/util/service.c:802
#, fuzzy, c-format
@@ -349,134 +349,14 @@ msgstr ""
msgid "Initiating shutdown as requested by client.\n"
msgstr ""
-#: src/ats/gnunet-ats-solver-eval.c:2781 src/ats/gnunet-ats-solver-eval.c:2822
-#, c-format
-msgid ""
-"Could not load quota for network `%s': `%s', assigning default bandwidth "
-"%llu\n"
-msgstr ""
-
-#: src/ats/gnunet-ats-solver-eval.c:2799
-#, c-format
-msgid ""
-"No outbound quota configured for network `%s', assigning default bandwidth "
-"%llu\n"
-msgstr ""
-
-#: src/ats/gnunet-ats-solver-eval.c:2840
-#, c-format
-msgid ""
-"No outbound quota configure for network `%s', assigning default bandwidth "
-"%llu\n"
-msgstr ""
-
-#: src/ats/gnunet-ats-solver-eval.c:3294
-#: src/ats-tests/gnunet-solver-eval.c:939
-msgid "solver to use"
-msgstr ""
-
-#: src/ats/gnunet-ats-solver-eval.c:3299
-#: src/ats-tests/gnunet-solver-eval.c:945
-#: src/ats-tests/gnunet-solver-eval.c:950
-msgid "experiment to use"
-msgstr ""
-
-#: src/ats/gnunet-ats-solver-eval.c:3306
-#, fuzzy
-msgid "print logging"
-msgstr "未知的命令“%s”。\n"
-
-#: src/ats/gnunet-ats-solver-eval.c:3311
-msgid "save logging to disk"
-msgstr ""
-
-#: src/ats/gnunet-ats-solver-eval.c:3316
-msgid "disable normalization"
-msgstr ""
-
-#: src/ats/gnunet-service-ats_plugins.c:304
-#, c-format
-msgid ""
-"Could not load %s quota for network `%s': `%s', assigning default bandwidth "
-"%llu\n"
-msgstr ""
-
-#: src/ats/gnunet-service-ats_plugins.c:314
-#, c-format
-msgid "%s quota configured for network `%s' is %llu\n"
-msgstr ""
-
-#: src/ats/gnunet-service-ats_plugins.c:359
-#, c-format
-msgid ""
-"No %s-quota configured for network `%s', assigning default bandwidth %llu\n"
-msgstr ""
-
-#: src/ats/gnunet-service-ats_plugins.c:451
-#, fuzzy, c-format
-msgid "Failed to initialize solver `%s'!\n"
-msgstr "无法初始化 SQLite:%s。\n"
-
-#: src/ats/plugin_ats_mlp.c:1274
-msgid "Problem size too large, cannot allocate memory!\n"
-msgstr ""
-
-#: src/ats/plugin_ats_mlp.c:1869
-#, c-format
-msgid "Adding address for peer `%s' multiple times\n"
-msgstr ""
-
-#: src/ats/plugin_ats_mlp.c:1913
-#, c-format
-msgid "Updating address property for peer `%s' %p not added before\n"
-msgstr ""
-
-#: src/ats/plugin_ats_mlp.c:2475
-msgid ""
-"MLP solver is not optimizing for anything, changing to feasibility check\n"
-msgstr ""
-
-#: src/ats/plugin_ats_mlp.c:2515 src/ats/plugin_ats_mlp.c:2532
-#: src/ats/plugin_ats_mlp.c:2564 src/ats/plugin_ats_mlp.c:2582
-#: src/ats/plugin_ats_mlp.c:2601 src/ats/plugin_ats_proportional.c:1141
-#: src/ats/plugin_ats_ril.c:2612 src/ats/plugin_ats_ril.c:2629
-#: src/ats/plugin_ats_ril.c:2646 src/ats/plugin_ats_ril.c:2663
-#: src/ats/plugin_ats_ril.c:2680 src/ats/plugin_ats_ril.c:2697
-#: src/ats/plugin_ats_ril.c:2714 src/ats/plugin_ats_ril.c:2731
-#, fuzzy, c-format
-msgid "Invalid %s configuration %f \n"
-msgstr "解析配置文件“%s”失败\n"
-
-#: src/ats/plugin_ats_mlp.c:2670
-#, c-format
-msgid ""
-"Adjusting inconsistent outbound quota configuration for network `%s', is "
-"%llu must be at least %llu\n"
-msgstr ""
-
-#: src/ats/plugin_ats_mlp.c:2679
-#, c-format
-msgid ""
-"Adjusting inconsistent inbound quota configuration for network `%s', is %llu "
-"must be at least %llu\n"
-msgstr ""
-
-#: src/ats/plugin_ats_mlp.c:2689
-#, c-format
-msgid ""
-"Adjusting outbound quota configuration for network `%s'from %llu to %.0f\n"
-msgstr ""
-
-#: src/ats/plugin_ats_mlp.c:2698
-#, c-format
-msgid ""
-"Adjusting inbound quota configuration for network `%s' from %llu to %.0f\n"
+#: src/ats-tests/ats-testing-log.c:837
+msgid "Stop logging\n"
msgstr ""
-#: src/ats/plugin_ats_proportional.c:1164
+#: src/ats-tests/ats-testing-log.c:892
#, fuzzy, c-format
-msgid "Invalid %s configuration %f\n"
-msgstr "解析配置文件“%s”失败\n"
+msgid "Start logging `%s'\n"
+msgstr "未知的命令“%s”。\n"
#: src/ats-tests/ats-testing.c:422
#, c-format
@@ -488,15 +368,6 @@ msgstr ""
msgid "Failed to connect master peer [%u] with slave [%u]\n"
msgstr "初始化“%s”服务失败。\n"
-#: src/ats-tests/ats-testing-log.c:837
-msgid "Stop logging\n"
-msgstr ""
-
-#: src/ats-tests/ats-testing-log.c:892
-#, fuzzy, c-format
-msgid "Start logging `%s'\n"
-msgstr "未知的命令“%s”。\n"
-
#: src/ats-tests/gnunet-ats-sim.c:90
#, c-format
msgid ""
@@ -504,6 +375,15 @@ msgid ""
"= %u KiB/s\n"
msgstr ""
+#: src/ats-tests/gnunet-solver-eval.c:939 src/ats/gnunet-ats-solver-eval.c:3294
+msgid "solver to use"
+msgstr ""
+
+#: src/ats-tests/gnunet-solver-eval.c:945
+#: src/ats-tests/gnunet-solver-eval.c:950 src/ats/gnunet-ats-solver-eval.c:3299
+msgid "experiment to use"
+msgstr ""
+
#: src/ats-tool/gnunet-ats.c:307
#, c-format
msgid "%u address resolutions had a timeout\n"
@@ -625,6 +505,124 @@ msgstr ""
msgid "Print information about ATS state"
msgstr "无法获取有关用户“%s”的信息:%s\n"
+#: src/ats/gnunet-ats-solver-eval.c:2781 src/ats/gnunet-ats-solver-eval.c:2822
+#, c-format
+msgid ""
+"Could not load quota for network `%s': `%s', assigning default bandwidth "
+"%llu\n"
+msgstr ""
+
+#: src/ats/gnunet-ats-solver-eval.c:2799
+#, c-format
+msgid ""
+"No outbound quota configured for network `%s', assigning default bandwidth "
+"%llu\n"
+msgstr ""
+
+#: src/ats/gnunet-ats-solver-eval.c:2840
+#, c-format
+msgid ""
+"No outbound quota configure for network `%s', assigning default bandwidth "
+"%llu\n"
+msgstr ""
+
+#: src/ats/gnunet-ats-solver-eval.c:3306
+#, fuzzy
+msgid "print logging"
+msgstr "未知的命令“%s”。\n"
+
+#: src/ats/gnunet-ats-solver-eval.c:3311
+msgid "save logging to disk"
+msgstr ""
+
+#: src/ats/gnunet-ats-solver-eval.c:3316
+msgid "disable normalization"
+msgstr ""
+
+#: src/ats/gnunet-service-ats_plugins.c:304
+#, c-format
+msgid ""
+"Could not load %s quota for network `%s': `%s', assigning default bandwidth "
+"%llu\n"
+msgstr ""
+
+#: src/ats/gnunet-service-ats_plugins.c:314
+#, c-format
+msgid "%s quota configured for network `%s' is %llu\n"
+msgstr ""
+
+#: src/ats/gnunet-service-ats_plugins.c:359
+#, c-format
+msgid ""
+"No %s-quota configured for network `%s', assigning default bandwidth %llu\n"
+msgstr ""
+
+#: src/ats/gnunet-service-ats_plugins.c:451
+#, fuzzy, c-format
+msgid "Failed to initialize solver `%s'!\n"
+msgstr "无法初始化 SQLite:%s。\n"
+
+#: src/ats/plugin_ats_mlp.c:1274
+msgid "Problem size too large, cannot allocate memory!\n"
+msgstr ""
+
+#: src/ats/plugin_ats_mlp.c:1869
+#, c-format
+msgid "Adding address for peer `%s' multiple times\n"
+msgstr ""
+
+#: src/ats/plugin_ats_mlp.c:1913
+#, c-format
+msgid "Updating address property for peer `%s' %p not added before\n"
+msgstr ""
+
+#: src/ats/plugin_ats_mlp.c:2475
+msgid ""
+"MLP solver is not optimizing for anything, changing to feasibility check\n"
+msgstr ""
+
+#: src/ats/plugin_ats_mlp.c:2515 src/ats/plugin_ats_mlp.c:2532
+#: src/ats/plugin_ats_mlp.c:2564 src/ats/plugin_ats_mlp.c:2582
+#: src/ats/plugin_ats_mlp.c:2601 src/ats/plugin_ats_proportional.c:1141
+#: src/ats/plugin_ats_ril.c:2612 src/ats/plugin_ats_ril.c:2629
+#: src/ats/plugin_ats_ril.c:2646 src/ats/plugin_ats_ril.c:2663
+#: src/ats/plugin_ats_ril.c:2680 src/ats/plugin_ats_ril.c:2697
+#: src/ats/plugin_ats_ril.c:2714 src/ats/plugin_ats_ril.c:2731
+#, fuzzy, c-format
+msgid "Invalid %s configuration %f \n"
+msgstr "解析配置文件“%s”失败\n"
+
+#: src/ats/plugin_ats_mlp.c:2670
+#, c-format
+msgid ""
+"Adjusting inconsistent outbound quota configuration for network `%s', is "
+"%llu must be at least %llu\n"
+msgstr ""
+
+#: src/ats/plugin_ats_mlp.c:2679
+#, c-format
+msgid ""
+"Adjusting inconsistent inbound quota configuration for network `%s', is %llu "
+"must be at least %llu\n"
+msgstr ""
+
+#: src/ats/plugin_ats_mlp.c:2689
+#, c-format
+msgid ""
+"Adjusting outbound quota configuration for network `%s'from %llu to %.0f\n"
+msgstr ""
+
+#: src/ats/plugin_ats_mlp.c:2698
+#, c-format
+msgid ""
+"Adjusting inbound quota configuration for network `%s' from %llu to %.0f\n"
+msgstr ""
+
+#: src/ats/plugin_ats_proportional.c:1164
+#, fuzzy, c-format
+msgid "Invalid %s configuration %f\n"
+msgstr "解析配置文件“%s”失败\n"
+
#: src/auction/gnunet-auction-create.c:163
msgid "description of the item to be sold"
msgstr ""
@@ -770,6 +768,28 @@ msgstr ""
msgid "Connection to conversation service lost, trying to reconnect\n"
msgstr ""
+#: src/conversation/gnunet-conversation-test.c:119
+#, c-format
+msgid ""
+"\n"
+"End of transmission. Have a GNU day.\n"
+msgstr ""
+
+#: src/conversation/gnunet-conversation-test.c:145
+#, c-format
+msgid ""
+"\n"
+"We are now playing your recording back. If you can hear it, your audio "
+"settings are working..."
+msgstr ""
+
+#: src/conversation/gnunet-conversation-test.c:210
+#, c-format
+msgid ""
+"We will now be recording you for %s. After that time, the recording will be "
+"played back to you..."
+msgstr ""
+
#: src/conversation/gnunet-conversation.c:269
#, c-format
msgid "Incoming call from `%s'. Please /accept %u or /cancel %u the call.\n"
@@ -1026,30 +1046,8 @@ msgstr ""
msgid "Enables having a conversation with other GNUnet users."
msgstr ""
-#: src/conversation/gnunet-conversation-test.c:119
-#, c-format
-msgid ""
-"\n"
-"End of transmission. Have a GNU day.\n"
-msgstr ""
-
-#: src/conversation/gnunet-conversation-test.c:145
-#, c-format
-msgid ""
-"\n"
-"We are now playing your recording back. If you can hear it, your audio "
-"settings are working..."
-msgstr ""
-
-#: src/conversation/gnunet-conversation-test.c:210
-#, c-format
-msgid ""
-"We will now be recording you for %s. After that time, the recording will be "
-"played back to you..."
-msgstr ""
-
-#: src/conversation/gnunet_gst.c:622
#: src/conversation/gnunet-helper-audio-playback-gst.c:356
+#: src/conversation/gnunet_gst.c:622
#, c-format
msgid "Read error from STDIN: %d %s\n"
msgstr ""
@@ -1175,6 +1173,11 @@ msgstr "“%s”说:%s\n"
msgid "Failed to allocate %u bytes for second packet\n"
msgstr "初始化“%s”服务失败。\n"
+#: src/conversation/gnunet-service-conversation.c:1276
+#, fuzzy, c-format
+msgid "Could not open line, port %s already in use!\n"
+msgstr "无法连接到 %s:%u:%s\n"
+
#: src/conversation/microphone.c:119
#, fuzzy
msgid "Could not start record audio helper\n"
@@ -1448,8 +1451,137 @@ msgstr ""
msgid "# updates to my type map"
msgstr ""
+#: src/credential/credential_misc.c:88
+#, fuzzy, c-format
+msgid "Unable to parse CRED record string `%s'\n"
+msgstr "解析配置文件“%s”失败\n"
+
+#: src/credential/gnunet-credential.c:278 src/namestore/gnunet-namestore.c:776
+#: src/namestore/plugin_rest_namestore.c:1009
+#, c-format
+msgid "Ego `%s' not known to identity service\n"
+msgstr ""
+
+#: src/credential/gnunet-credential.c:294
+#: src/credential/gnunet-credential.c:446
+#, fuzzy, c-format
+msgid "Issuer public key `%s' is not well-formed\n"
+msgstr "“%s”的参数无效。\n"
+
+#: src/credential/gnunet-credential.c:375
+#: src/credential/gnunet-credential.c:435
+#, fuzzy, c-format
+msgid "Issuer public key not well-formed\n"
+msgstr "“%s”的参数无效。\n"
+
+#: src/credential/gnunet-credential.c:386
+#: src/credential/gnunet-credential.c:455
+#, fuzzy, c-format
+msgid "Failed to connect to CREDENTIAL\n"
+msgstr "初始化“%s”服务失败。\n"
+
+#: src/credential/gnunet-credential.c:392
+#, c-format
+msgid "You must provide issuer the attribute\n"
+msgstr ""
+
+#: src/credential/gnunet-credential.c:399
+#, c-format
+msgid "ego required\n"
+msgstr ""
+
+#: src/credential/gnunet-credential.c:415
+#, c-format
+msgid "Subject public key needed\n"
+msgstr ""
+
+#: src/credential/gnunet-credential.c:426
+#, fuzzy, c-format
+msgid "Subject public key `%s' is not well-formed\n"
+msgstr "“%s”的参数无效。\n"
+
+#: src/credential/gnunet-credential.c:461
+#, c-format
+msgid "You must provide issuer and subject attributes\n"
+msgstr ""
+
+#: src/credential/gnunet-credential.c:511
+#, c-format
+msgid "Issuer ego required\n"
+msgstr ""
+
+#: src/credential/gnunet-credential.c:523
+#, c-format
+msgid "Please specify name to lookup, subject key and issuer key!\n"
+msgstr ""
+
+#: src/credential/gnunet-credential.c:543
+msgid "create credential"
+msgstr ""
+
+#: src/credential/gnunet-credential.c:547
+msgid "verify credential against attribute"
+msgstr ""
+
+#: src/credential/gnunet-credential.c:552
+msgid "The public key of the subject to lookup the credential for"
+msgstr ""
+
+#: src/credential/gnunet-credential.c:557
+msgid "The name of the credential presented by the subject"
+msgstr ""
+
+#: src/credential/gnunet-credential.c:562
+msgid "The public key of the authority to verify the credential against"
+msgstr ""
+
+#: src/credential/gnunet-credential.c:567
+#, fuzzy
+msgid "The ego to use"
+msgstr "消息尺寸"
+
+#: src/credential/gnunet-credential.c:572
+msgid "The issuer attribute to verify against or to issue"
+msgstr ""
+
+#: src/credential/gnunet-credential.c:577
+msgid "The time to live for the credential"
+msgstr ""
+
+#: src/credential/gnunet-credential.c:581
+msgid "collect credentials"
+msgstr ""
+
+#: src/credential/gnunet-credential.c:595
+#, fuzzy
+msgid "GNUnet credential resolver tool"
+msgstr "GNUnet 错误日志"
+
+#: src/credential/gnunet-service-credential.c:1204
+#: src/gns/gnunet-gns-helper-service-w32.c:727 src/gns/gnunet-gns.c:355
+#, fuzzy, c-format
+msgid "Failed to connect to GNS\n"
+msgstr "初始化“%s”服务失败。\n"
+
+#: src/credential/gnunet-service-credential.c:1210
+#: src/namestore/gnunet-namestore-fcfsd.c:1034
+#: src/namestore/gnunet-namestore.c:802
+#: src/namestore/plugin_rest_namestore.c:1022
+#, fuzzy, c-format
+msgid "Failed to connect to namestore\n"
+msgstr "初始化“%s”服务失败。\n"
+
+#: src/credential/plugin_gnsrecord_credential.c:186
+#, fuzzy, c-format
+msgid "Unable to parse ATTR record string `%s'\n"
+msgstr "解析配置文件“%s”失败\n"
+
+#: src/credential/plugin_rest_credential.c:1155 src/gns/plugin_rest_gns.c:668
+msgid "GNS REST API initialized\n"
+msgstr ""
+
#: src/datacache/datacache.c:119 src/datacache/datacache.c:294
-#: src/datastore/gnunet-service-datastore.c:775
+#: src/datastore/gnunet-service-datastore.c:757
msgid "# bytes stored"
msgstr ""
@@ -1490,13 +1622,12 @@ msgstr "sqlite 数据仓库"
#: src/datacache/plugin_datacache_sqlite.c:113
#: src/datacache/plugin_datacache_sqlite.c:122
-#: src/datastore/plugin_datastore_mysql.c:980
+#: src/datastore/plugin_datastore_mysql.c:892
#: src/datastore/plugin_datastore_sqlite.c:58
-#: src/datastore/plugin_datastore_sqlite.c:66 src/my/my.c:80 src/my/my.c:92
-#: src/mysql/mysql.c:42 src/mysql/mysql.c:49
-#: src/namecache/plugin_namecache_postgres.c:53
+#: src/datastore/plugin_datastore_sqlite.c:66
+#: src/identity-provider/plugin_identity_provider_sqlite.c:52 src/my/my.c:80
+#: src/my/my.c:92 src/mysql/mysql.c:42 src/mysql/mysql.c:49
#: src/namecache/plugin_namecache_sqlite.c:53
-#: src/namestore/plugin_namestore_postgres.c:53
#: src/namestore/plugin_namestore_sqlite.c:53
#: src/peerstore/plugin_peerstore_sqlite.c:52
#: src/psycstore/plugin_psycstore_mysql.c:62
@@ -1505,14 +1636,15 @@ msgstr "sqlite 数据仓库"
#: src/testbed/gnunet-daemon-testbed-underlay.c:56
#: src/testbed/testbed_api_hosts.c:69 src/util/crypto_ecc.c:52
#: src/util/crypto_ecc_setup.c:41 src/util/crypto_mpi.c:39
-#: src/include/gnunet_common.h:720 src/include/gnunet_common.h:729
+#: src/include/gnunet_common.h:735 src/include/gnunet_common.h:744
#: src/scalarproduct/scalarproduct.h:35
#, fuzzy, c-format
msgid "`%s' failed at %s:%d with error: %s\n"
msgstr "“%s”于 %s:%d 处失败,错误为:%s\n"
#: src/datacache/plugin_datacache_sqlite.c:817
-#: src/datastore/plugin_datastore_sqlite.c:475
+#: src/datastore/plugin_datastore_sqlite.c:456
+#: src/identity-provider/plugin_identity_provider_sqlite.c:336
#: src/namecache/plugin_namecache_sqlite.c:296
#: src/namestore/plugin_namestore_sqlite.c:355
msgid "Tried to close sqlite without finalizing all prepared statements.\n"
@@ -1576,23 +1708,74 @@ msgstr ""
msgid "# GET requests executed"
msgstr ""
-#: src/datastore/gnunet-datastore.c:113
+#: src/datastore/gnunet-datastore.c:189
+#, c-format
+msgid "Dumped %<PRIu64> records\n"
+msgstr ""
+
+#: src/datastore/gnunet-datastore.c:217 src/datastore/gnunet-datastore.c:229
+#, c-format
+msgid "Short write to file: %zd bytes expecting %zd\n"
+msgstr ""
+
+#: src/datastore/gnunet-datastore.c:261
+#, fuzzy
+msgid "Error queueing datastore GET operation\n"
+msgstr "创建用户出错"
+
+#: src/datastore/gnunet-datastore.c:287 src/datastore/gnunet-datastore.c:412
+#, fuzzy, c-format
+msgid "Unable to open dump file: %s\n"
+msgstr "发送消息失败。\n"
+
+#: src/datastore/gnunet-datastore.c:326
#, fuzzy, c-format
msgid "Failed to store item: %s, aborting\n"
msgstr "打开日志文件“%s”失败:%s\n"
-#: src/datastore/gnunet-datastore.c:209
+#: src/datastore/gnunet-datastore.c:340
#, c-format
-msgid "Cannot use the same configuration for source and destination\n"
+msgid "Inserted %<PRIu64> records\n"
msgstr ""
-#: src/datastore/gnunet-datastore.c:256
-msgid ""
-"specifies the configuration to use to access an alternative datastore; will "
-"merge that datastore into our current datastore"
+#: src/datastore/gnunet-datastore.c:349 src/datastore/gnunet-datastore.c:363
+#, c-format
+msgid "Short read from file: %zd bytes expecting %zd\n"
+msgstr ""
+
+#: src/datastore/gnunet-datastore.c:389
+#, fuzzy
+msgid "Error queueing datastore PUT operation\n"
+msgstr "创建用户出错"
+
+#: src/datastore/gnunet-datastore.c:432
+msgid "Input file is not of a supported format\n"
+msgstr ""
+
+#: src/datastore/gnunet-datastore.c:458
+#, fuzzy
+msgid "Failed connecting to the datastore.\n"
+msgstr "初始化“%s”服务失败。\n"
+
+#: src/datastore/gnunet-datastore.c:470
+#, c-format
+msgid "Please choose at least one operation: %s, %s\n"
+msgstr ""
+
+#: src/datastore/gnunet-datastore.c:493
+#, fuzzy
+msgid "Dump all records from the datastore"
+msgstr "发送消息失败。\n"
+
+#: src/datastore/gnunet-datastore.c:497
+msgid "Insert records into the datastore"
+msgstr ""
+
+#: src/datastore/gnunet-datastore.c:502
+msgid "File to dump or insert"
msgstr ""
-#: src/datastore/gnunet-datastore.c:265
+#: src/datastore/gnunet-datastore.c:511
#, fuzzy
msgid "Manipulate GNUnet datastore"
msgstr "更改配置文件中的一个值"
@@ -1635,8 +1818,8 @@ msgstr ""
#: src/datastore/gnunet-service-datastore.c:634
#: src/datastore/gnunet-service-datastore.c:689
-#: src/datastore/gnunet-service-datastore.c:977
-#: src/datastore/gnunet-service-datastore.c:1633
+#: src/datastore/gnunet-service-datastore.c:837
+#: src/datastore/gnunet-service-datastore.c:1469
msgid "# reserved"
msgstr ""
@@ -1644,144 +1827,145 @@ msgstr ""
msgid "Could not find matching reservation"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:792
+#: src/datastore/gnunet-service-datastore.c:773
#, c-format
msgid "Need %llu bytes more space (%llu allowed, using %llu)\n"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1026
+#: src/datastore/gnunet-service-datastore.c:876
msgid "# GET requests received"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1058
+#: src/datastore/gnunet-service-datastore.c:907
msgid "# GET KEY requests received"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1071
+#: src/datastore/gnunet-service-datastore.c:920
msgid "# requests filtered by bloomfilter"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1108
+#: src/datastore/gnunet-service-datastore.c:956
msgid "# GET REPLICATION requests received"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1141
+#: src/datastore/gnunet-service-datastore.c:989
msgid "# GET ZERO ANONYMITY requests received"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1190
+#: src/datastore/gnunet-service-datastore.c:1036
msgid "Content not found"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1199
+#: src/datastore/gnunet-service-datastore.c:1043
msgid "# bytes removed (explicit request)"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1246
+#: src/datastore/gnunet-service-datastore.c:1088
msgid "# REMOVE requests received"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1301
+#: src/datastore/gnunet-service-datastore.c:1137
#, c-format
msgid ""
"Datastore payload must have been inaccurate (%lld < %lld). Recomputing it.\n"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1307
-#: src/datastore/gnunet-service-datastore.c:1482
+#: src/datastore/gnunet-service-datastore.c:1143
+#: src/datastore/gnunet-service-datastore.c:1318
#, c-format
msgid "New payload: %lld\n"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1361
+#: src/datastore/gnunet-service-datastore.c:1197
#, c-format
msgid "Loading `%s' datastore plugin\n"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1373
+#: src/datastore/gnunet-service-datastore.c:1209
#, fuzzy, c-format
msgid "Failed to load datastore plugin for `%s'\n"
msgstr "解析配置文件“%s”失败\n"
-#: src/datastore/gnunet-service-datastore.c:1433
+#: src/datastore/gnunet-service-datastore.c:1269
msgid "Bloomfilter construction complete.\n"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1489
+#: src/datastore/gnunet-service-datastore.c:1325
msgid "Rebuilding bloomfilter. Please be patient.\n"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1500
+#: src/datastore/gnunet-service-datastore.c:1336
msgid "Plugin does not support get_keys function. Please fix!\n"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1670
+#: src/datastore/gnunet-service-datastore.c:1506
#, c-format
msgid "# bytes used in file-sharing datastore `%s'"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1686
+#: src/datastore/gnunet-service-datastore.c:1522
msgid "# quota"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1691
+#: src/datastore/gnunet-service-datastore.c:1527
msgid "# cache size"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1707
+#: src/datastore/gnunet-service-datastore.c:1543
#, c-format
msgid "Could not use specified filename `%s' for bloomfilter.\n"
msgstr ""
-#: src/datastore/gnunet-service-datastore.c:1725
-#: src/datastore/gnunet-service-datastore.c:1741
+#: src/datastore/gnunet-service-datastore.c:1561
+#: src/datastore/gnunet-service-datastore.c:1577
#, fuzzy, c-format
msgid "Failed to remove bogus bloomfilter file `%s'\n"
msgstr "解析配置文件“%s”失败\n"
-#: src/datastore/gnunet-service-datastore.c:1773
+#: src/datastore/gnunet-service-datastore.c:1609
#, fuzzy
msgid "Failed to initialize bloomfilter.\n"
msgstr "初始化“%s”服务失败。\n"
-#: src/datastore/plugin_datastore_heap.c:769
+#: src/datastore/plugin_datastore_heap.c:893
#, fuzzy
msgid "Heap database running\n"
msgstr "sqlite 数据仓库"
-#: src/datastore/plugin_datastore_mysql.c:377
-#: src/datastore/plugin_datastore_sqlite.c:590
+#: src/datastore/plugin_datastore_mysql.c:371
+#: src/datastore/plugin_datastore_mysql.c:423
+#: src/datastore/plugin_datastore_mysql.c:1075
+msgid "MySQL statement run failure"
+msgstr ""
+
+#: src/datastore/plugin_datastore_mysql.c:410
+#: src/datastore/plugin_datastore_sqlite.c:626
#, fuzzy
msgid "Data too large"
msgstr "迭代次数"
-#: src/datastore/plugin_datastore_mysql.c:393
-msgid "MySQL statement run failure"
-msgstr ""
-
-#: src/datastore/plugin_datastore_mysql.c:936
+#: src/datastore/plugin_datastore_mysql.c:848
#, fuzzy, c-format
msgid "`%s' for `%s' failed at %s:%d with error: %s\n"
msgstr "“%s”于 %s:%d 处失败,错误为:%s\n"
-#: src/datastore/plugin_datastore_mysql.c:1208
+#: src/datastore/plugin_datastore_mysql.c:1180
#: src/psycstore/plugin_psycstore_mysql.c:1936
msgid "Mysql database running\n"
msgstr ""
-#: src/datastore/plugin_datastore_postgres.c:345
+#: src/datastore/plugin_datastore_postgres.c:274
+#: src/datastore/plugin_datastore_postgres.c:891
msgid "Postgress exec failure"
msgstr ""
-#: src/datastore/plugin_datastore_postgres.c:866
+#: src/datastore/plugin_datastore_postgres.c:852
#, fuzzy
msgid "Failed to drop table from database.\n"
msgstr "发送消息失败。\n"
-#: src/datastore/plugin_datastore_postgres.c:903
-#: src/namecache/plugin_namecache_postgres.c:398
-#: src/namestore/plugin_namestore_postgres.c:571
-#: src/psycstore/plugin_psycstore_postgres.c:1721
+#: src/datastore/plugin_datastore_postgres.c:950
+#: src/psycstore/plugin_psycstore_postgres.c:1506
msgid "Postgres database running\n"
msgstr ""
@@ -1793,7 +1977,8 @@ msgstr ""
msgid "`%s' failed at %s:%u with error: %s"
msgstr "“%s”于 %s:%d 处失败,错误为:%s\n"
-#: src/datastore/plugin_datastore_sqlite.c:281
+#: src/datastore/plugin_datastore_sqlite.c:271
+#: src/identity-provider/plugin_identity_provider_sqlite.c:212
#: src/namecache/plugin_namecache_sqlite.c:194
#: src/namestore/plugin_namestore_sqlite.c:222
#: src/peerstore/plugin_peerstore_sqlite.c:535
@@ -1802,25 +1987,30 @@ msgstr "“%s”于 %s:%d 处失败,错误为:%s\n"
msgid "Unable to initialize SQLite: %s.\n"
msgstr "无法初始化 SQLite:%s。\n"
-#: src/datastore/plugin_datastore_sqlite.c:1234
+#: src/datastore/plugin_datastore_sqlite.c:577
+msgid "sqlite bind failure"
+msgstr ""
+
+#: src/datastore/plugin_datastore_sqlite.c:1259
msgid "sqlite version to old to determine size, assuming zero\n"
msgstr ""
-#: src/datastore/plugin_datastore_sqlite.c:1268
+#: src/datastore/plugin_datastore_sqlite.c:1293
#, c-format
msgid ""
"Using sqlite page utilization to estimate payload (%llu pages of size %llu "
"bytes)\n"
msgstr ""
-#: src/datastore/plugin_datastore_sqlite.c:1312
+#: src/datastore/plugin_datastore_sqlite.c:1337
+#: src/identity-provider/plugin_identity_provider_sqlite.c:711
#: src/namecache/plugin_namecache_sqlite.c:603
#: src/namestore/plugin_namestore_sqlite.c:802
#, fuzzy
msgid "Sqlite database running\n"
msgstr "sqlite 数据仓库"
-#: src/datastore/plugin_datastore_template.c:259
+#: src/datastore/plugin_datastore_template.c:253
msgid "Template database running\n"
msgstr ""
@@ -1882,53 +2072,6 @@ msgstr ""
msgid "Prints all packets that go through the DHT."
msgstr ""
-#: src/dht/gnunet_dht_profiler.c:1161
-#: src/testbed/gnunet-testbed-profiler.c:255
-#, fuzzy, c-format
-msgid "Exiting as the number of peers is %u\n"
-msgstr "增加 TCP/IP 的最大连接数"
-
-#: src/dht/gnunet_dht_profiler.c:1188
-#, fuzzy
-msgid "number of peers to start"
-msgstr "迭代次数"
-
-#: src/dht/gnunet_dht_profiler.c:1194
-msgid ""
-"maximum number of times we try to search for successor circle formation (0 "
-"for R5N)"
-msgstr ""
-
-#: src/dht/gnunet_dht_profiler.c:1200 src/nse/gnunet-nse-profiler.c:853
-#: src/testbed/gnunet-testbed-profiler.c:305
-msgid "name of the file with the login information for the testbed"
-msgstr ""
-
-#: src/dht/gnunet_dht_profiler.c:1206
-msgid "delay between rounds for collecting statistics (default: 30 sec)"
-msgstr ""
-
-#: src/dht/gnunet_dht_profiler.c:1212
-msgid "delay to start doing PUTs (default: 1 sec)"
-msgstr ""
-
-#: src/dht/gnunet_dht_profiler.c:1218
-msgid "delay to start doing GETs (default: 5 min)"
-msgstr ""
-
-#: src/dht/gnunet_dht_profiler.c:1223
-msgid "replication degree for DHT PUTs"
-msgstr ""
-
-#: src/dht/gnunet_dht_profiler.c:1230
-msgid "timeout for DHT PUT and GET requests (default: 1 min)"
-msgstr ""
-
-#: src/dht/gnunet_dht_profiler.c:1248
-#, fuzzy
-msgid "Measure quality and performance of the DHT service."
-msgstr "无法访问该服务"
-
#: src/dht/gnunet-dht-put.c:120
msgid "PUT request sent with key"
msgstr ""
@@ -2178,6 +2321,52 @@ msgstr ""
msgid "# DHT requests combined"
msgstr ""
+#: src/dht/gnunet_dht_profiler.c:1161 src/testbed/gnunet-testbed-profiler.c:255
+#, fuzzy, c-format
+msgid "Exiting as the number of peers is %u\n"
+msgstr "增加 TCP/IP 的最大连接数"
+
+#: src/dht/gnunet_dht_profiler.c:1188
+#, fuzzy
+msgid "number of peers to start"
+msgstr "迭代次数"
+
+#: src/dht/gnunet_dht_profiler.c:1194
+msgid ""
+"maximum number of times we try to search for successor circle formation (0 "
+"for R5N)"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:1200 src/nse/gnunet-nse-profiler.c:853
+#: src/testbed/gnunet-testbed-profiler.c:305
+msgid "name of the file with the login information for the testbed"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:1206
+msgid "delay between rounds for collecting statistics (default: 30 sec)"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:1212
+msgid "delay to start doing PUTs (default: 1 sec)"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:1218
+msgid "delay to start doing GETs (default: 5 min)"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:1223
+msgid "replication degree for DHT PUTs"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:1230
+msgid "timeout for DHT PUT and GET requests (default: 1 min)"
+msgstr ""
+
+#: src/dht/gnunet_dht_profiler.c:1248
+#, fuzzy
+msgid "Measure quality and performance of the DHT service."
+msgstr "无法访问该服务"
+
#: src/dht/plugin_block_dht.c:187
#, c-format
msgid "Block not of type %u\n"
@@ -2500,7 +2689,7 @@ msgstr ""
msgid "No useful service enabled. Exiting.\n"
msgstr ""
-#: src/exit/gnunet-daemon-exit.c:3969
+#: src/exit/gnunet-daemon-exit.c:3970
msgid "Daemon to run to provide an IP exit node for the VPN"
msgstr ""
@@ -3132,14 +3321,6 @@ msgid ""
"chk/...)"
msgstr ""
-#: src/fs/gnunet-fs.c:119
-msgid "print a list of all indexed files"
-msgstr ""
-
-#: src/fs/gnunet-fs.c:130
-msgid "Special file-sharing operations"
-msgstr ""
-
#: src/fs/gnunet-fs-profiler.c:211
msgid "run the experiment with COUNT peers"
msgstr ""
@@ -3156,6 +3337,14 @@ msgstr ""
msgid "run a testbed to measure file-sharing performance"
msgstr ""
+#: src/fs/gnunet-fs.c:119
+msgid "print a list of all indexed files"
+msgstr ""
+
+#: src/fs/gnunet-fs.c:130
+msgid "Special file-sharing operations"
+msgstr ""
+
#: src/fs/gnunet-publish.c:219 src/fs/gnunet-publish.c:231
#, c-format
msgid "Publishing `%s' at %llu/%llu (%s remaining)\n"
@@ -3810,22 +3999,11 @@ msgstr ""
msgid "GNUnet DNS-to-GNS proxy (a DNS server)"
msgstr ""
-#: src/gns/gnunet-gns.c:235 src/gns/plugin_rest_gns.c:346
-#, c-format
-msgid "Invalid typename specified, assuming `ANY'\n"
-msgstr ""
-
-#: src/gns/gnunet-gns.c:252
-#, c-format
-msgid "Please specify name to lookup!\n"
-msgstr ""
-
-#: src/gns/gnunet-gns.c:276
-#, c-format
-msgid "Ego for `%s' not found, cannot perform lookup.\n"
+#: src/gns/gnunet-gns-helper-service-w32.c:602
+msgid "Not ready to process requests, lacking ego data\n"
msgstr ""
-#: src/gns/gnunet-gns.c:315 src/gns/gnunet-gns-helper-service-w32.c:701
+#: src/gns/gnunet-gns-helper-service-w32.c:701 src/gns/gnunet-gns.c:315
#: src/gns/plugin_rest_gns.c:422
#, c-format
msgid ""
@@ -3833,55 +4011,12 @@ msgid ""
"gns-import.sh?\n"
msgstr ""
-#: src/gns/gnunet-gns.c:355 src/gns/gnunet-gns-helper-service-w32.c:727
-#, fuzzy, c-format
-msgid "Failed to connect to GNS\n"
-msgstr "初始化“%s”服务失败。\n"
-
-#: src/gns/gnunet-gns.c:374
-#, c-format
-msgid "Public key `%s' is not well-formed\n"
-msgstr ""
-
-#: src/gns/gnunet-gns.c:428
-msgid "Lookup a record for the given name"
-msgstr ""
-
-#: src/gns/gnunet-gns.c:434
-msgid "Specify the type of the record to lookup"
-msgstr ""
-
-#: src/gns/gnunet-gns.c:440
-msgid "Specify timeout for the lookup"
-msgstr ""
-
-#: src/gns/gnunet-gns.c:445
-msgid "No unneeded output"
-msgstr ""
-
-#: src/gns/gnunet-gns.c:451
-msgid "Specify the public key of the zone to lookup the record in"
-msgstr ""
-
-#: src/gns/gnunet-gns.c:457
-msgid "Specify the name of the ego of the zone to lookup the record in"
-msgstr ""
-
-#: src/gns/gnunet-gns.c:476
-#, fuzzy
-msgid "GNUnet GNS resolver tool"
-msgstr "GNUnet 错误日志"
-
-#: src/gns/gnunet-gns-helper-service-w32.c:602
-msgid "Not ready to process requests, lacking ego data\n"
-msgstr ""
-
#: src/gns/gnunet-gns-helper-service-w32.c:739
#, fuzzy, c-format
msgid "Failed to connect to identity service\n"
msgstr "初始化“%s”服务失败。\n"
-#: src/gns/gnunet-gns-import.c:489
+#: src/gns/gnunet-gns-import.c:452
msgid "This program will import some GNS authorities into your GNS namestore."
msgstr ""
@@ -4006,13 +4141,62 @@ msgstr ""
msgid "GNUnet GNS proxy"
msgstr ""
+#: src/gns/gnunet-gns.c:235 src/gns/plugin_rest_gns.c:346
+#, c-format
+msgid "Invalid typename specified, assuming `ANY'\n"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:252
+#, c-format
+msgid "Please specify name to lookup!\n"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:276
+#, c-format
+msgid "Ego for `%s' not found, cannot perform lookup.\n"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:374
+#, c-format
+msgid "Public key `%s' is not well-formed\n"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:428
+msgid "Lookup a record for the given name"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:434
+msgid "Specify the type of the record to lookup"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:440
+msgid "Specify timeout for the lookup"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:445
+msgid "No unneeded output"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:451
+msgid "Specify the public key of the zone to lookup the record in"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:457
+msgid "Specify the name of the ego of the zone to lookup the record in"
+msgstr ""
+
+#: src/gns/gnunet-gns.c:476
+#, fuzzy
+msgid "GNUnet GNS resolver tool"
+msgstr "GNUnet 错误日志"
+
#: src/gns/gnunet-service-gns.c:442
#, fuzzy
msgid "Failed to connect to the namecache!\n"
msgstr "初始化“%s”服务失败。\n"
#: src/gns/gnunet-service-gns.c:461
-#: src/zonemaster/gnunet-service-zonemaster.c:741
+#: src/zonemaster/gnunet-service-zonemaster.c:742
#, fuzzy
msgid "Could not connect to DHT!\n"
msgstr "无法连接到 %s:%u:%s\n"
@@ -4070,44 +4254,35 @@ msgstr ""
msgid "Hostname `%s' is not well-formed, resolution fails\n"
msgstr ""
-#: src/gns/plugin_gnsrecord_gns.c:203
+#: src/gns/plugin_gnsrecord_gns.c:179
#, fuzzy, c-format
msgid "Unable to parse PKEY record `%s'\n"
msgstr "解析配置文件“%s”失败\n"
-#: src/gns/plugin_gnsrecord_gns.c:232
+#: src/gns/plugin_gnsrecord_gns.c:208
#, fuzzy, c-format
msgid "Unable to parse GNS2DNS record `%s'\n"
msgstr "解析配置文件“%s”失败\n"
-#: src/gns/plugin_gnsrecord_gns.c:253
+#: src/gns/plugin_gnsrecord_gns.c:229
#, fuzzy, c-format
msgid "Failed to serialize GNS2DNS record with value `%s'\n"
msgstr "解析配置文件“%s”失败\n"
-#: src/gns/plugin_gnsrecord_gns.c:276
+#: src/gns/plugin_gnsrecord_gns.c:252
#, fuzzy, c-format
msgid "Unable to parse VPN record string `%s'\n"
msgstr "解析配置文件“%s”失败\n"
-#: src/gns/plugin_gnsrecord_gns.c:312
+#: src/gns/plugin_gnsrecord_gns.c:288
#, fuzzy, c-format
msgid "Unable to parse BOX record string `%s'\n"
msgstr "解析配置文件“%s”失败\n"
-#: src/gns/plugin_gnsrecord_gns.c:360
-#, fuzzy, c-format
-msgid "Unable to parse REVERSE record string `%s'\n"
-msgstr "解析配置文件“%s”失败\n"
-
#: src/gns/plugin_rest_gns.c:384
msgid "Ego for not found, cannot perform lookup.\n"
msgstr ""
-#: src/gns/plugin_rest_gns.c:668
-msgid "GNS REST API initialized\n"
-msgstr ""
-
#: src/gnsrecord/plugin_gnsrecord_dns.c:359
#, fuzzy, c-format
msgid "Unable to parse IPv4 address `%s'\n"
@@ -4532,6 +4707,52 @@ msgstr "“%s”不可用。\n"
msgid "Could not start hostlist HTTP server on port %u\n"
msgstr ""
+#: src/identity-provider/gnunet-idp.c:348
+#, fuzzy
+msgid "Ego is required\n"
+msgstr "%s:选项“%s”有歧义\n"
+
+#: src/identity-provider/gnunet-idp.c:370
+msgid "Add attribute"
+msgstr ""
+
+#: src/identity-provider/gnunet-idp.c:376
+msgid "Attribute value"
+msgstr ""
+
+#: src/identity-provider/gnunet-idp.c:381
+msgid "Ego"
+msgstr ""
+
+#: src/identity-provider/gnunet-idp.c:386
+msgid "Audience (relying party)"
+msgstr ""
+
+#: src/identity-provider/gnunet-idp.c:390
+msgid "List attributes for Ego"
+msgstr ""
+
+#: src/identity-provider/gnunet-idp.c:395
+msgid "Issue a ticket"
+msgstr ""
+
+#: src/identity-provider/gnunet-idp.c:400
+msgid "Consume a ticket"
+msgstr ""
+
+#: src/identity-provider/gnunet-idp.c:405
+msgid "Revoke a ticket"
+msgstr ""
+
+#: src/identity-provider/identity_provider_api.c:429
+#, fuzzy
+msgid "failed to store record\n"
+msgstr "运行 %s失败:%s %d\n"
+
+#: src/identity-provider/plugin_rest_identity_provider.c:1175
+msgid "Identity Provider REST API initialized\n"
+msgstr ""
+
#: src/identity/gnunet-identity.c:179
#, fuzzy, c-format
msgid "Failed to create ego: %s\n"
@@ -4619,32 +4840,10 @@ msgstr "解析配置文件“%s”失败\n"
msgid "Failed to create directory `%s' for storing egos\n"
msgstr "解析配置文件“%s”失败\n"
-#: src/identity/plugin_rest_identity.c:967
+#: src/identity/plugin_rest_identity.c:964
msgid "Identity REST API initialized\n"
msgstr ""
-#: src/identity-provider/gnunet-identity-token.c:66
-#, fuzzy
-msgid "Option `-t' is required\n"
-msgstr "%s:选项“%s”有歧义\n"
-
-#: src/identity-provider/gnunet-identity-token.c:77
-#, fuzzy, c-format
-msgid "Token `%s' is malformed\n"
-msgstr "“%s”的参数无效。\n"
-
-#: src/identity-provider/gnunet-identity-token.c:166
-msgid "GNUid token"
-msgstr ""
-
-#: src/identity-provider/gnunet-identity-token.c:171
-msgid "Print token contents"
-msgstr ""
-
-#: src/identity-provider/plugin_rest_identity_provider.c:1166
-msgid "Identity Token REST API initialized\n"
-msgstr ""
-
#: src/json/json.c:119
#, fuzzy, c-format
msgid "Failed to parse JSON in option `%s': %s (%s)\n"
@@ -4745,25 +4944,79 @@ msgstr "发送消息失败。\n"
msgid "flat plugin running\n"
msgstr "sqlite 数据仓库"
-#: src/namecache/plugin_namecache_postgres.c:90
-#: src/namestore/plugin_namestore_postgres.c:97
-#, fuzzy
-msgid "Failed to create indices\n"
+#: src/namestore/gnunet-namestore-fcfsd.c:508
+#, fuzzy, c-format
+msgid "Unsupported form value `%s'\n"
+msgstr "未知的命令“%s”。\n"
+
+#: src/namestore/gnunet-namestore-fcfsd.c:535
+#, fuzzy, c-format
+msgid "Failed to create record for domain `%s': %s\n"
+msgstr "解析配置文件“%s”失败\n"
+
+#: src/namestore/gnunet-namestore-fcfsd.c:555
+msgid "Error when mapping zone to name\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:585
+#, c-format
+msgid "Found existing name `%s' for the given key\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:662
+#, c-format
+msgid "Found %u existing records for domain `%s'\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:718
+#, fuzzy, c-format
+msgid "Failed to create page for `%s'\n"
msgstr "发送消息失败。\n"
+#: src/namestore/gnunet-namestore-fcfsd.c:734
+#, fuzzy, c-format
+msgid "Failed to setup post processor for `%s'\n"
+msgstr "解析配置文件“%s”失败\n"
+
+#: src/namestore/gnunet-namestore-fcfsd.c:770
+msgid "Domain name must not contain `.'\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:778
+msgid "Domain name must not contain `+'\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:974
+msgid "No ego configured for `fcfsd` subsystem\n"
+msgstr ""
+
+#: src/namestore/gnunet-namestore-fcfsd.c:1000
+#, fuzzy
+msgid "Failed to start HTTP server\n"
+msgstr "初始化“%s”服务失败。\n"
+
+#: src/namestore/gnunet-namestore-fcfsd.c:1042
+#, fuzzy
+msgid "Failed to connect to identity\n"
+msgstr "初始化“%s”服务失败。\n"
+
+#: src/namestore/gnunet-namestore-fcfsd.c:1074
+msgid "GNU Name System First Come First Serve name registration service"
+msgstr ""
+
#: src/namestore/gnunet-namestore.c:301
#, c-format
msgid "Adding record failed: %s\n"
msgstr ""
#: src/namestore/gnunet-namestore.c:330
-#: src/namestore/plugin_rest_namestore.c:562
+#: src/namestore/plugin_rest_namestore.c:567
#, c-format
msgid "Deleting record failed, record does not exist%s%s\n"
msgstr ""
#: src/namestore/gnunet-namestore.c:337
-#: src/namestore/plugin_rest_namestore.c:571
+#: src/namestore/plugin_rest_namestore.c:576
#, c-format
msgid "Deleting record failed%s%s\n"
msgstr ""
@@ -4781,7 +5034,7 @@ msgid "Records already exist under `%s', cannot add `%s' record.\n"
msgstr ""
#: src/namestore/gnunet-namestore.c:698
-#: src/namestore/plugin_rest_namestore.c:597
+#: src/namestore/plugin_rest_namestore.c:602
#, c-format
msgid "There are no records under label `%s' that could be deleted.\n"
msgstr ""
@@ -4792,24 +5045,11 @@ msgid ""
"There are no records under label `%s' that match the request for deletion.\n"
msgstr ""
-#: src/namestore/gnunet-namestore.c:776
-#: src/namestore/plugin_rest_namestore.c:1004
-#, c-format
-msgid "Ego `%s' not known to identity service\n"
-msgstr ""
-
#: src/namestore/gnunet-namestore.c:791
#, c-format
msgid "No options given\n"
msgstr ""
-#: src/namestore/gnunet-namestore.c:802
-#: src/namestore/gnunet-namestore-fcfsd.c:1034
-#: src/namestore/plugin_rest_namestore.c:1017
-#, fuzzy
-msgid "Failed to connect to namestore\n"
-msgstr "初始化“%s”服务失败。\n"
-
#: src/namestore/gnunet-namestore.c:810 src/namestore/gnunet-namestore.c:819
#: src/namestore/gnunet-namestore.c:838 src/namestore/gnunet-namestore.c:861
#: src/namestore/gnunet-namestore.c:915
@@ -4823,14 +5063,14 @@ msgid "add"
msgstr ""
#: src/namestore/gnunet-namestore.c:829
-#: src/namestore/plugin_rest_namestore.c:671
+#: src/namestore/plugin_rest_namestore.c:676
#, fuzzy, c-format
msgid "Unsupported type `%s'\n"
msgstr "未知的命令“%s”。\n"
#: src/namestore/gnunet-namestore.c:851
-#: src/namestore/plugin_rest_namestore.c:689
-#: src/namestore/plugin_rest_namestore.c:729
+#: src/namestore/plugin_rest_namestore.c:694
+#: src/namestore/plugin_rest_namestore.c:734
#, c-format
msgid "Value `%s' invalid for record type `%s'\n"
msgstr ""
@@ -4849,8 +5089,7 @@ msgstr ""
msgid "Invalid public key for reverse lookup `%s'\n"
msgstr "“%s”的参数无效。\n"
-#: src/namestore/gnunet-namestore.c:979
-#: src/peerinfo-tool/gnunet-peerinfo.c:775
+#: src/namestore/gnunet-namestore.c:979 src/peerinfo-tool/gnunet-peerinfo.c:775
#, fuzzy, c-format
msgid "Invalid URI `%s'\n"
msgstr "无效条目。\n"
@@ -4861,13 +5100,13 @@ msgid "Invalid nick `%s'\n"
msgstr "无效条目。\n"
#: src/namestore/gnunet-namestore.c:1051
-#: src/namestore/plugin_rest_namestore.c:1047
+#: src/namestore/plugin_rest_namestore.c:1052
#, c-format
msgid "No default ego configured in identity service\n"
msgstr ""
#: src/namestore/gnunet-namestore.c:1108
-#: src/namestore/plugin_rest_namestore.c:1143
+#: src/namestore/plugin_rest_namestore.c:1148
#, fuzzy, c-format
msgid "Cannot connect to identity service\n"
msgstr "无法连接到 %s:%u:%s\n"
@@ -4930,67 +5169,7 @@ msgstr ""
msgid "name of the ego controlling the zone"
msgstr ""
-#: src/namestore/gnunet-namestore-fcfsd.c:508
-#, fuzzy, c-format
-msgid "Unsupported form value `%s'\n"
-msgstr "未知的命令“%s”。\n"
-
-#: src/namestore/gnunet-namestore-fcfsd.c:535
-#, fuzzy, c-format
-msgid "Failed to create record for domain `%s': %s\n"
-msgstr "解析配置文件“%s”失败\n"
-
-#: src/namestore/gnunet-namestore-fcfsd.c:555
-msgid "Error when mapping zone to name\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:585
-#, c-format
-msgid "Found existing name `%s' for the given key\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:662
-#, c-format
-msgid "Found %u existing records for domain `%s'\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:718
-#, fuzzy, c-format
-msgid "Failed to create page for `%s'\n"
-msgstr "发送消息失败。\n"
-
-#: src/namestore/gnunet-namestore-fcfsd.c:734
-#, fuzzy, c-format
-msgid "Failed to setup post processor for `%s'\n"
-msgstr "解析配置文件“%s”失败\n"
-
-#: src/namestore/gnunet-namestore-fcfsd.c:770
-msgid "Domain name must not contain `.'\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:778
-msgid "Domain name must not contain `+'\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:974
-msgid "No ego configured for `fcfsd` subsystem\n"
-msgstr ""
-
-#: src/namestore/gnunet-namestore-fcfsd.c:1000
-#, fuzzy
-msgid "Failed to start HTTP server\n"
-msgstr "初始化“%s”服务失败。\n"
-
-#: src/namestore/gnunet-namestore-fcfsd.c:1042
-#, fuzzy
-msgid "Failed to connect to identity\n"
-msgstr "初始化“%s”服务失败。\n"
-
-#: src/namestore/gnunet-namestore-fcfsd.c:1074
-msgid "GNU Name System First Come First Serve name registration service"
-msgstr ""
-
-#: src/namestore/gnunet-service-namestore.c:612
+#: src/namestore/gnunet-service-namestore.c:615
#, fuzzy, c-format
msgid "Failed to replicate block in namecache: %s\n"
msgstr "发送消息失败。\n"
@@ -5004,7 +5183,7 @@ msgstr ""
msgid "flat file database running\n"
msgstr "sqlite 数据仓库"
-#: src/namestore/plugin_rest_namestore.c:1188
+#: src/namestore/plugin_rest_namestore.c:1193
msgid "Namestore REST API initialized\n"
msgstr ""
@@ -5287,10 +5466,6 @@ msgstr ""
msgid "`upnpc' command not found\n"
msgstr ""
-#: src/nse/gnunet-nse.c:122
-msgid "Show network size estimates from NSE service."
-msgstr ""
-
#: src/nse/gnunet-nse-profiler.c:842
msgid "limit to the number of connections to NSE services, 0 for none"
msgstr ""
@@ -5316,66 +5491,16 @@ msgstr ""
msgid "Measure quality and performance of the NSE service."
msgstr "无法访问该服务"
+#: src/nse/gnunet-nse.c:122
+msgid "Show network size estimates from NSE service."
+msgstr ""
+
#: src/nse/gnunet-service-nse.c:1534
#: src/revocation/gnunet-service-revocation.c:838 src/util/gnunet-scrypt.c:276
#, fuzzy
msgid "Value is too large.\n"
msgstr "值不在合法范围内。"
-#: src/peerinfo/gnunet-service-peerinfo.c:178
-#, c-format
-msgid "Removing expired address of transport `%s'\n"
-msgstr ""
-
-#: src/peerinfo/gnunet-service-peerinfo.c:310
-#, fuzzy, c-format
-msgid "Failed to parse HELLO in file `%s': %s\n"
-msgstr "解析配置文件“%s”失败\n"
-
-#: src/peerinfo/gnunet-service-peerinfo.c:331
-#: src/peerinfo/gnunet-service-peerinfo.c:362
-#, fuzzy, c-format
-msgid "Failed to parse HELLO in file `%s'\n"
-msgstr "解析配置文件“%s”失败\n"
-
-#: src/peerinfo/gnunet-service-peerinfo.c:446
-msgid "# peers known"
-msgstr ""
-
-#: src/peerinfo/gnunet-service-peerinfo.c:489
-#, c-format
-msgid ""
-"File `%s' in directory `%s' does not match naming convention. Removed.\n"
-msgstr ""
-
-#: src/peerinfo/gnunet-service-peerinfo.c:655
-#, fuzzy, c-format
-msgid "Scanning directory `%s'\n"
-msgstr "解析配置文件“%s”失败\n"
-
-#: src/peerinfo/gnunet-service-peerinfo.c:663
-#, c-format
-msgid "Still no peers found in `%s'!\n"
-msgstr ""
-
-#: src/peerinfo/gnunet-service-peerinfo.c:1076
-#, fuzzy, c-format
-msgid "Cleaning up directory `%s'\n"
-msgstr "解析配置文件“%s”失败\n"
-
-#: src/peerinfo/gnunet-service-peerinfo.c:1405
-#, c-format
-msgid "Importing HELLOs from `%s'\n"
-msgstr ""
-
-#: src/peerinfo/gnunet-service-peerinfo.c:1418
-msgid "Skipping import of included HELLOs\n"
-msgstr ""
-
-#: src/peerinfo/peerinfo_api.c:220
-msgid "Failed to receive response from `PEERINFO' service."
-msgstr ""
-
#: src/peerinfo-tool/gnunet-peerinfo.c:239
#, fuzzy, c-format
msgid "%sPeer `%s'\n"
@@ -5467,6 +5592,60 @@ msgstr ""
msgid "Failed to load transport plugin for `%s'\n"
msgstr "解析配置文件“%s”失败\n"
+#: src/peerinfo/gnunet-service-peerinfo.c:178
+#, c-format
+msgid "Removing expired address of transport `%s'\n"
+msgstr ""
+
+#: src/peerinfo/gnunet-service-peerinfo.c:310
+#, fuzzy, c-format
+msgid "Failed to parse HELLO in file `%s': %s\n"
+msgstr "解析配置文件“%s”失败\n"
+
+#: src/peerinfo/gnunet-service-peerinfo.c:331
+#: src/peerinfo/gnunet-service-peerinfo.c:362
+#, fuzzy, c-format
+msgid "Failed to parse HELLO in file `%s'\n"
+msgstr "解析配置文件“%s”失败\n"
+
+#: src/peerinfo/gnunet-service-peerinfo.c:446
+msgid "# peers known"
+msgstr ""
+
+#: src/peerinfo/gnunet-service-peerinfo.c:489
+#, c-format
+msgid ""
+"File `%s' in directory `%s' does not match naming convention. Removed.\n"
+msgstr ""
+
+#: src/peerinfo/gnunet-service-peerinfo.c:655
+#, fuzzy, c-format
+msgid "Scanning directory `%s'\n"
+msgstr "解析配置文件“%s”失败\n"
+
+#: src/peerinfo/gnunet-service-peerinfo.c:663
+#, c-format
+msgid "Still no peers found in `%s'!\n"
+msgstr ""
+
+#: src/peerinfo/gnunet-service-peerinfo.c:1076
+#, fuzzy, c-format
+msgid "Cleaning up directory `%s'\n"
+msgstr "解析配置文件“%s”失败\n"
+
+#: src/peerinfo/gnunet-service-peerinfo.c:1405
+#, c-format
+msgid "Importing HELLOs from `%s'\n"
+msgstr ""
+
+#: src/peerinfo/gnunet-service-peerinfo.c:1418
+msgid "Skipping import of included HELLOs\n"
+msgstr ""
+
+#: src/peerinfo/peerinfo_api.c:220
+msgid "Failed to receive response from `PEERINFO' service."
+msgstr ""
+
#: src/peerstore/gnunet-peerstore.c:91
msgid "peerstore"
msgstr ""
@@ -5516,16 +5695,11 @@ msgstr "创建用户出错"
msgid "Unable to create indices: %s.\n"
msgstr "发送消息失败。\n"
-#: src/postgres/postgres.c:67
+#: src/pq/pq_prepare.c:80
#, fuzzy, c-format
-msgid "`%s:%s' failed at %s:%d with error: %s\n"
+msgid "PQprepare (`%s' as `%s') failed with error: %s\n"
msgstr "“%s”于 %s:%d 处失败,错误为:%s\n"
-#: src/postgres/postgres.c:192
-#, fuzzy, c-format
-msgid "Unable to connect to Postgres database '%s': %s\n"
-msgstr "无法保存配置文件“%s”:"
-
#: src/psycstore/gnunet-service-psycstore.c:249
#, fuzzy
msgid "Failed to store membership information!\n"
@@ -5696,60 +5870,60 @@ msgstr "立即保存配置?"
msgid "Daemon to announce regular expressions for the peer using cadet."
msgstr ""
-#: src/regex/gnunet-regex-profiler.c:1314
+#: src/regex/gnunet-regex-profiler.c:1386
msgid "No configuration file given. Exiting\n"
msgstr ""
-#: src/regex/gnunet-regex-profiler.c:1355
+#: src/regex/gnunet-regex-profiler.c:1427
#: src/regex/gnunet-regex-simulation-profiler.c:630
#, c-format
msgid "No policy directory specified on command line. Exiting.\n"
msgstr ""
-#: src/regex/gnunet-regex-profiler.c:1361
+#: src/regex/gnunet-regex-profiler.c:1433
#: src/regex/gnunet-regex-simulation-profiler.c:638
#, c-format
msgid "Specified policies directory does not exist. Exiting.\n"
msgstr ""
-#: src/regex/gnunet-regex-profiler.c:1368
+#: src/regex/gnunet-regex-profiler.c:1440
#, fuzzy, c-format
msgid "No files found in `%s'\n"
msgstr "运行 %s失败:%s %d\n"
-#: src/regex/gnunet-regex-profiler.c:1377
+#: src/regex/gnunet-regex-profiler.c:1449
msgid "No search strings file given. Exiting.\n"
msgstr ""
-#: src/regex/gnunet-regex-profiler.c:1397
+#: src/regex/gnunet-regex-profiler.c:1469
#, fuzzy
msgid "Error loading search strings. Exiting.\n"
msgstr "创建用户出错"
-#: src/regex/gnunet-regex-profiler.c:1485
+#: src/regex/gnunet-regex-profiler.c:1557
#, fuzzy
msgid "name of the file for writing statistics"
msgstr "初始化“%s”服务失败。\n"
-#: src/regex/gnunet-regex-profiler.c:1491
+#: src/regex/gnunet-regex-profiler.c:1563
msgid "wait TIMEOUT before ending the experiment"
msgstr ""
-#: src/regex/gnunet-regex-profiler.c:1497
+#: src/regex/gnunet-regex-profiler.c:1569
msgid "directory with policy files"
msgstr ""
-#: src/regex/gnunet-regex-profiler.c:1504
+#: src/regex/gnunet-regex-profiler.c:1576
#, fuzzy
msgid "name of file with input strings"
msgstr "初始化“%s”服务失败。\n"
-#: src/regex/gnunet-regex-profiler.c:1510
+#: src/regex/gnunet-regex-profiler.c:1582
#, fuzzy
msgid "name of file with hosts' names"
msgstr "初始化“%s”服务失败。\n"
-#: src/regex/gnunet-regex-profiler.c:1523
+#: src/regex/gnunet-regex-profiler.c:1595
msgid "Profiler for regex"
msgstr ""
@@ -5980,10 +6154,10 @@ msgstr ""
msgid "Calculate the Vectorproduct with a GNUnet peer."
msgstr ""
-#: src/scalarproduct/gnunet-service-scalarproduct_alice.c:1407
-#: src/scalarproduct/gnunet-service-scalarproduct_bob.c:1345
-#: src/scalarproduct/gnunet-service-scalarproduct-ecc_alice.c:1180
+#: src/scalarproduct/gnunet-service-scalarproduct-ecc_alice.c:1172
#: src/scalarproduct/gnunet-service-scalarproduct-ecc_bob.c:1063
+#: src/scalarproduct/gnunet-service-scalarproduct_alice.c:1401
+#: src/scalarproduct/gnunet-service-scalarproduct_bob.c:1345
#, fuzzy
msgid "Connect to CADET failed\n"
msgstr "“%s”已连接到“%s”。\n"
@@ -6008,7 +6182,7 @@ msgstr ""
msgid "also profile decryption"
msgstr ""
-#: src/set/gnunet-service-set.c:1948
+#: src/set/gnunet-service-set.c:1989
#, fuzzy
msgid "Could not connect to CADET service\n"
msgstr "无法连接到 %s:%u:%s\n"
@@ -6068,114 +6242,114 @@ msgstr ""
msgid "say good-bye and leave somebody else's place"
msgstr ""
-#: src/social/gnunet-social.c:1227 src/social/gnunet-social.c:1232
+#: src/social/gnunet-social.c:1227
msgid "create a place"
msgstr ""
-#: src/social/gnunet-social.c:1237
+#: src/social/gnunet-social.c:1232
msgid "destroy a place we were hosting"
msgstr ""
-#: src/social/gnunet-social.c:1242
+#: src/social/gnunet-social.c:1237
msgid "enter somebody else's place"
msgstr ""
-#: src/social/gnunet-social.c:1248
+#: src/social/gnunet-social.c:1243
msgid "find state matching name prefix"
msgstr ""
-#: src/social/gnunet-social.c:1253
+#: src/social/gnunet-social.c:1248
msgid "replay history of messages up to the given --limit"
msgstr ""
-#: src/social/gnunet-social.c:1258
+#: src/social/gnunet-social.c:1253
msgid "reconnect to a previously created place"
msgstr ""
-#: src/social/gnunet-social.c:1263
+#: src/social/gnunet-social.c:1258
msgid "publish something to a place we are hosting"
msgstr ""
-#: src/social/gnunet-social.c:1268
+#: src/social/gnunet-social.c:1263
msgid "reconnect to a previously entered place"
msgstr ""
-#: src/social/gnunet-social.c:1273
+#: src/social/gnunet-social.c:1268
msgid "search for state matching exact name"
msgstr ""
-#: src/social/gnunet-social.c:1278
+#: src/social/gnunet-social.c:1273
msgid "submit something to somebody's place"
msgstr ""
-#: src/social/gnunet-social.c:1283
+#: src/social/gnunet-social.c:1278
msgid "list of egos and subscribed places"
msgstr ""
-#: src/social/gnunet-social.c:1288
+#: src/social/gnunet-social.c:1283
msgid "extract and replay history between message IDs --start and --until"
msgstr ""
-#: src/social/gnunet-social.c:1297
+#: src/social/gnunet-social.c:1292
msgid "application ID to use when connecting"
msgstr ""
-#: src/social/gnunet-social.c:1303
+#: src/social/gnunet-social.c:1298
msgid "message body or state value"
msgstr ""
-#: src/social/gnunet-social.c:1309
+#: src/social/gnunet-social.c:1304
#, fuzzy
msgid "name or public key of ego"
msgstr "“%s”的参数无效。\n"
-#: src/social/gnunet-social.c:1314
+#: src/social/gnunet-social.c:1309
#, fuzzy
msgid "wait for incoming messages"
msgstr "发送消息失败。\n"
-#: src/social/gnunet-social.c:1320
+#: src/social/gnunet-social.c:1315
msgid "GNS name"
msgstr ""
-#: src/social/gnunet-social.c:1326
+#: src/social/gnunet-social.c:1321
msgid "peer ID for --guest-enter"
msgstr ""
-#: src/social/gnunet-social.c:1332
+#: src/social/gnunet-social.c:1327
msgid "name (key) to query from state"
msgstr ""
-#: src/social/gnunet-social.c:1338
+#: src/social/gnunet-social.c:1333
msgid "method name"
msgstr ""
-#: src/social/gnunet-social.c:1344
+#: src/social/gnunet-social.c:1339
#, fuzzy
msgid "number of messages to replay from history"
msgstr "每次迭代所使用的消息数量"
-#: src/social/gnunet-social.c:1350
+#: src/social/gnunet-social.c:1345
msgid "key address of place"
msgstr ""
-#: src/social/gnunet-social.c:1356
+#: src/social/gnunet-social.c:1351
msgid "start message ID for history replay"
msgstr ""
-#: src/social/gnunet-social.c:1361
+#: src/social/gnunet-social.c:1356
msgid "respond to entry requests by admitting all guests"
msgstr ""
-#: src/social/gnunet-social.c:1367
+#: src/social/gnunet-social.c:1362
msgid "end message ID for history replay"
msgstr ""
-#: src/social/gnunet-social.c:1372
+#: src/social/gnunet-social.c:1367
msgid "respond to entry requests by refusing all guests"
msgstr ""
-#: src/social/gnunet-social.c:1382
+#: src/social/gnunet-social.c:1377
msgid ""
"gnunet-social - Interact with the social service: enter/leave, send/receive "
"messages, access history and state.\n"
@@ -6368,7 +6542,7 @@ msgid ""
msgstr ""
#: src/testbed/gnunet-daemon-testbed-underlay.c:231 src/testing/list-keys.c:46
-#: src/testing/testing.c:288 src/util/gnunet-ecc.c:298
+#: src/testing/testing.c:288 src/util/gnunet-ecc.c:301
#, c-format
msgid "Incorrect hostkey file format: %s\n"
msgstr ""
@@ -6438,15 +6612,6 @@ msgstr ""
msgid "%.s Unknown result code."
msgstr ""
-#: src/testbed/gnunet_testbed_mpi_spawn.c:118
-msgid "Waiting for child to exit.\n"
-msgstr ""
-
-#: src/testbed/gnunet_testbed_mpi_spawn.c:241
-#, fuzzy, c-format
-msgid "Spawning process `%s'\n"
-msgstr "卸载 GNUnet 服务"
-
#: src/testbed/gnunet-testbed-profiler.c:290
msgid "tolerate COUNT number of continious timeout failures"
msgstr ""
@@ -6458,6 +6623,15 @@ msgid ""
"signal is received"
msgstr ""
+#: src/testbed/gnunet_testbed_mpi_spawn.c:118
+msgid "Waiting for child to exit.\n"
+msgstr ""
+
+#: src/testbed/gnunet_testbed_mpi_spawn.c:241
+#, fuzzy, c-format
+msgid "Spawning process `%s'\n"
+msgstr "卸载 GNUnet 服务"
+
#: src/testbed/testbed_api.c:410
#, fuzzy, c-format
msgid "Adding host %u failed with error: %s\n"
@@ -6754,10 +6928,6 @@ msgstr ""
msgid "GNUnet topology control"
msgstr ""
-#: src/transport/gnunet-service-transport_ats.c:141
-msgid "# Addresses given to ATS"
-msgstr ""
-
#: src/transport/gnunet-service-transport.c:448
msgid "# messages dropped due to slow client"
msgstr ""
@@ -6803,6 +6973,10 @@ msgstr ""
msgid "Transport service is lacking key configuration settings. Exiting.\n"
msgstr "立即保存配置?"
+#: src/transport/gnunet-service-transport_ats.c:141
+msgid "# Addresses given to ATS"
+msgstr ""
+
#: src/transport/gnunet-service-transport_hello.c:195
msgid "# refreshed my HELLO"
msgstr ""
@@ -7107,6 +7281,44 @@ msgstr ""
msgid "# validations succeeded"
msgstr ""
+#: src/transport/gnunet-transport-profiler.c:219
+#, c-format
+msgid "%llu B in %llu ms == %.2f KB/s!\n"
+msgstr ""
+
+#: src/transport/gnunet-transport-profiler.c:617
+msgid "send data to peer"
+msgstr ""
+
+#: src/transport/gnunet-transport-profiler.c:621
+msgid "receive data from peer"
+msgstr ""
+
+#: src/transport/gnunet-transport-profiler.c:626
+msgid "iterations"
+msgstr ""
+
+#: src/transport/gnunet-transport-profiler.c:631
+#, fuzzy
+msgid "number of messages to send"
+msgstr "每次迭代所使用的消息数量"
+
+#: src/transport/gnunet-transport-profiler.c:636
+#, fuzzy
+msgid "message size to use"
+msgstr "消息尺寸"
+
+#: src/transport/gnunet-transport-profiler.c:641
+#: src/transport/gnunet-transport.c:1462
+msgid "peer identity"
+msgstr ""
+
+#: src/transport/gnunet-transport-profiler.c:652
+#: src/transport/gnunet-transport.c:1482
+#, fuzzy
+msgid "Direct access to transport service."
+msgstr "初始化“%s”服务失败。\n"
+
#: src/transport/gnunet-transport.c:413
#, c-format
msgid "Transmitted %llu bytes/s (%llu bytes in %s)\n"
@@ -7243,11 +7455,6 @@ msgstr ""
msgid "do not resolve hostnames"
msgstr ""
-#: src/transport/gnunet-transport.c:1462
-#: src/transport/gnunet-transport-profiler.c:641
-msgid "peer identity"
-msgstr ""
-
#: src/transport/gnunet-transport.c:1466
msgid "monitor plugin sessions"
msgstr ""
@@ -7256,42 +7463,9 @@ msgstr ""
msgid "send data for benchmarking to the other peer (until CTRL-C)"
msgstr ""
-#: src/transport/gnunet-transport.c:1482
-#: src/transport/gnunet-transport-profiler.c:652
-#, fuzzy
-msgid "Direct access to transport service."
-msgstr "初始化“%s”服务失败。\n"
-
-#: src/transport/gnunet-transport-profiler.c:219
-#, c-format
-msgid "%llu B in %llu ms == %.2f KB/s!\n"
-msgstr ""
-
-#: src/transport/gnunet-transport-profiler.c:617
-msgid "send data to peer"
-msgstr ""
-
-#: src/transport/gnunet-transport-profiler.c:621
-msgid "receive data from peer"
-msgstr ""
-
-#: src/transport/gnunet-transport-profiler.c:626
-msgid "iterations"
-msgstr ""
-
-#: src/transport/gnunet-transport-profiler.c:631
-#, fuzzy
-msgid "number of messages to send"
-msgstr "每次迭代所使用的消息数量"
-
-#: src/transport/gnunet-transport-profiler.c:636
-#, fuzzy
-msgid "message size to use"
-msgstr "消息尺寸"
-
#: src/transport/plugin_transport_http_client.c:1474
-#: src/transport/plugin_transport_http_server.c:2249
-#: src/transport/plugin_transport_http_server.c:3463
+#: src/transport/plugin_transport_http_server.c:2312
+#: src/transport/plugin_transport_http_server.c:3526
#: src/transport/plugin_transport_tcp.c:3890
#: src/transport/plugin_transport_tcp.c:3897
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"
msgstr ""
#: src/transport/plugin_transport_http_client.c:2164
-#: src/transport/plugin_transport_http_server.c:3178
+#: src/transport/plugin_transport_http_server.c:3241
#, fuzzy, c-format
msgid "Shutting down plugin `%s'\n"
msgstr "未知的命令“%s”。\n"
#: src/transport/plugin_transport_http_client.c:2181
-#: src/transport/plugin_transport_http_server.c:3248
+#: src/transport/plugin_transport_http_server.c:3311
#, c-format
msgid "Shutdown for plugin `%s' complete\n"
msgstr ""
@@ -7319,106 +7493,106 @@ msgstr ""
msgid "Maximum number of requests is %u\n"
msgstr "增加 TCP/IP 的最大连接数"
-#: src/transport/plugin_transport_http_server.c:1727
+#: src/transport/plugin_transport_http_server.c:1756
#, c-format
msgid ""
"Access from connection %p (%u of %u) for `%s' `%s' url `%s' with upload data "
"size %u\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:1967
+#: src/transport/plugin_transport_http_server.c:2028
#, c-format
msgid "Accepting connection (%u of %u) from `%s'\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:1975
+#: src/transport/plugin_transport_http_server.c:2036
#, c-format
msgid ""
"Server reached maximum number connections (%u), rejecting new connection\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:2125
+#: src/transport/plugin_transport_http_server.c:2186
msgid ""
"Could not create a new TLS certificate, program `gnunet-transport-"
"certificate-creation' could not be started!\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:2148
+#: src/transport/plugin_transport_http_server.c:2209
#, c-format
msgid "No usable TLS certificate found and creating one at `%s/%s' failed!\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:2275
+#: src/transport/plugin_transport_http_server.c:2338
msgid "Could not load or create server certificate! Loading plugin failed!\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:2587
+#: src/transport/plugin_transport_http_server.c:2650
#, fuzzy
msgid "Require valid port number for service in configuration!\n"
msgstr "保存配置失败。"
-#: src/transport/plugin_transport_http_server.c:2752
+#: src/transport/plugin_transport_http_server.c:2815
#, c-format
msgid "Found %u addresses to report to NAT service\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:2838
+#: src/transport/plugin_transport_http_server.c:2901
#: src/transport/plugin_transport_udp.c:3622
msgid "Disabling IPv6 since it is not supported on this system!\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:2944
+#: src/transport/plugin_transport_http_server.c:3007
#, c-format
msgid "IPv4 support is %s\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:2959
+#: src/transport/plugin_transport_http_server.c:3022
#, c-format
msgid "IPv6 support is %s\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:2965
+#: src/transport/plugin_transport_http_server.c:3028
msgid "Neither IPv4 nor IPv6 are enabled! Fix in configuration\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:2976
+#: src/transport/plugin_transport_http_server.c:3039
#, fuzzy
msgid "Port is required! Fix in configuration\n"
msgstr ""
"\n"
"结束配置。\n"
-#: src/transport/plugin_transport_http_server.c:2982
+#: src/transport/plugin_transport_http_server.c:3045
#, c-format
msgid "Using port %u\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:3001
+#: src/transport/plugin_transport_http_server.c:3064
#, c-format
msgid "Specific IPv4 address `%s' in configuration file is invalid!\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:3036
+#: src/transport/plugin_transport_http_server.c:3099
#, c-format
msgid "Specific IPv6 address `%s' in configuration file is invalid!\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:3111
+#: src/transport/plugin_transport_http_server.c:3174
#, fuzzy, c-format
msgid "Using external hostname `%s'\n"
msgstr "卸载 GNUnet 服务"
-#: src/transport/plugin_transport_http_server.c:3132
+#: src/transport/plugin_transport_http_server.c:3195
#, c-format
msgid "Notifying transport only about hostname `%s'\n"
msgstr ""
-#: src/transport/plugin_transport_http_server.c:3149
+#: src/transport/plugin_transport_http_server.c:3212
#, fuzzy, c-format
msgid "Maximum number of connections is %u\n"
msgstr "增加 TCP/IP 的最大连接数"
-#: src/transport/plugin_transport_http_server.c:3475
+#: src/transport/plugin_transport_http_server.c:3538
#, fuzzy
msgid "Unable to compile URL regex\n"
msgstr "无法初始化 SQLite:%s。\n"
@@ -7565,20 +7739,6 @@ msgstr ""
msgid "TCP transport advertises itself as being on port %llu\n"
msgstr ""
-#: src/transport/plugin_transport_udp_broadcasting.c:168
-msgid "# Multicast HELLO beacons received via UDP"
-msgstr ""
-
-#: src/transport/plugin_transport_udp_broadcasting.c:548
-msgid ""
-"Disabling HELLO broadcasting due to friend-to-friend only configuration!\n"
-msgstr ""
-
-#: src/transport/plugin_transport_udp_broadcasting.c:565
-#, c-format
-msgid "Failed to set IPv4 broadcast option for broadcast socket on port %d\n"
-msgstr ""
-
#: src/transport/plugin_transport_udp.c:3366
#, c-format
msgid ""
@@ -7627,6 +7787,20 @@ msgstr "“%s”不可用。\n"
msgid "Failed to create UDP network sockets\n"
msgstr "发送消息失败。\n"
+#: src/transport/plugin_transport_udp_broadcasting.c:168
+msgid "# Multicast HELLO beacons received via UDP"
+msgstr ""
+
+#: src/transport/plugin_transport_udp_broadcasting.c:548
+msgid ""
+"Disabling HELLO broadcasting due to friend-to-friend only configuration!\n"
+msgstr ""
+
+#: src/transport/plugin_transport_udp_broadcasting.c:565
+#, c-format
+msgid "Failed to set IPv4 broadcast option for broadcast socket on port %d\n"
+msgstr ""
+
#: src/transport/plugin_transport_unix.c:1403
#, fuzzy, c-format
msgid "Cannot create path to `%s'\n"
@@ -7731,7 +7905,7 @@ msgid ""
"`GNUNET_SERVER_receive_done' after %s\n"
msgstr ""
-#: src/transport/tcp_service_legacy.c:339 src/util/service.c:2337
+#: src/transport/tcp_service_legacy.c:339 src/util/service.c:2336
#, c-format
msgid "Unknown address family %d\n"
msgstr ""
@@ -7776,51 +7950,51 @@ msgstr "运行 %s失败:%s %d\n"
msgid "Service `%s' runs at %s\n"
msgstr ""
-#: src/transport/tcp_service_legacy.c:1251 src/util/service.c:1501
+#: src/transport/tcp_service_legacy.c:1251 src/util/service.c:1500
msgid "Service process failed to initialize\n"
msgstr ""
-#: src/transport/tcp_service_legacy.c:1255 src/util/service.c:1505
+#: src/transport/tcp_service_legacy.c:1255 src/util/service.c:1504
msgid "Service process could not initialize server function\n"
msgstr ""
-#: src/transport/tcp_service_legacy.c:1259 src/util/service.c:1509
+#: src/transport/tcp_service_legacy.c:1259 src/util/service.c:1508
msgid "Service process failed to report status\n"
msgstr ""
#: src/transport/tcp_service_legacy.c:1313 src/util/disk.c:1488
-#: src/util/service.c:1379
+#: src/util/service.c:1378
#, c-format
msgid "Cannot obtain information about user `%s': %s\n"
msgstr "无法获取有关用户“%s”的信息:%s\n"
-#: src/transport/tcp_service_legacy.c:1314 src/util/service.c:1381
+#: src/transport/tcp_service_legacy.c:1314 src/util/service.c:1380
msgid "No such user"
msgstr "无此用户"
-#: src/transport/tcp_service_legacy.c:1327 src/util/service.c:1400
+#: src/transport/tcp_service_legacy.c:1327 src/util/service.c:1399
#, c-format
msgid "Cannot change user/group to `%s': %s\n"
msgstr "无法更改用户/组为“%s”:%s\n"
-#: src/transport/tcp_service_legacy.c:1398 src/util/service.c:1728
+#: src/transport/tcp_service_legacy.c:1398 src/util/service.c:1727
msgid "do daemonize (detach from terminal)"
msgstr ""
#: src/transport/tcp_service_legacy.c:1448 src/util/program.c:244
-#: src/util/service.c:1791
+#: src/util/service.c:1790
#, fuzzy, c-format
msgid "Malformed configuration file `%s', exit ...\n"
msgstr "解析配置文件“%s”失败\n"
#: src/transport/tcp_service_legacy.c:1458 src/util/program.c:261
-#: src/util/service.c:1802
+#: src/util/service.c:1801
#, fuzzy
msgid "Malformed configuration, exit ...\n"
msgstr "解析配置文件“%s”失败\n"
#: src/transport/tcp_service_legacy.c:1463 src/util/program.c:256
-#: src/util/service.c:1808
+#: src/util/service.c:1807
#, fuzzy, c-format
msgid "Could not access configuration file `%s'\n"
msgstr "找不到接口“%s”的一个 IP 地址。\n"
@@ -7864,86 +8038,86 @@ msgstr ""
msgid "Need a non-empty hostname for service `%s'.\n"
msgstr ""
-#: src/util/common_logging.c:256 src/util/common_logging.c:1129
+#: src/util/common_logging.c:259 src/util/common_logging.c:1132
msgid "DEBUG"
msgstr "调试"
-#: src/util/common_logging.c:258 src/util/common_logging.c:1127
+#: src/util/common_logging.c:261 src/util/common_logging.c:1130
msgid "INFO"
msgstr "信息"
-#: src/util/common_logging.c:260 src/util/common_logging.c:1125
+#: src/util/common_logging.c:263 src/util/common_logging.c:1128
msgid "MESSAGE"
msgstr ""
-#: src/util/common_logging.c:262 src/util/common_logging.c:1123
+#: src/util/common_logging.c:265 src/util/common_logging.c:1126
msgid "WARNING"
msgstr "警告"
-#: src/util/common_logging.c:264 src/util/common_logging.c:1121
+#: src/util/common_logging.c:267 src/util/common_logging.c:1124
msgid "ERROR"
msgstr "错误"
-#: src/util/common_logging.c:266 src/util/common_logging.c:1131
+#: src/util/common_logging.c:269 src/util/common_logging.c:1134
msgid "NONE"
msgstr ""
-#: src/util/common_logging.c:879
+#: src/util/common_logging.c:882
#, fuzzy, c-format
msgid "Message `%.*s' repeated %u times in the last %s\n"
msgstr "消息“%.*s”重复了 %u 次,在最近 %llu 秒内\n"
-#: src/util/common_logging.c:1132
+#: src/util/common_logging.c:1135
msgid "INVALID"
msgstr ""
-#: src/util/common_logging.c:1302
+#: src/util/common_logging.c:1326
msgid "unknown address"
msgstr ""
-#: src/util/common_logging.c:1344
+#: src/util/common_logging.c:1368
msgid "invalid address"
msgstr ""
-#: src/util/common_logging.c:1362
+#: src/util/common_logging.c:1386
#, fuzzy, c-format
msgid "Configuration fails to specify option `%s' in section `%s'!\n"
msgstr "配置不满足配置规范文件“%s”的约束!\n"
-#: src/util/common_logging.c:1383
+#: src/util/common_logging.c:1407
#, fuzzy, c-format
msgid ""
"Configuration specifies invalid value for option `%s' in section `%s': %s\n"
msgstr "配置不满足配置规范文件“%s”的约束!\n"
-#: src/util/configuration.c:286
+#: src/util/configuration.c:296
#, fuzzy, c-format
msgid "Syntax error while deserializing in line %u\n"
msgstr "配置文件“%s”第 %d 行有语法错误。\n"
-#: src/util/configuration.c:344
+#: src/util/configuration.c:355
#, fuzzy, c-format
msgid "Error while reading file `%s'\n"
msgstr "解析 dscl 输出时出错。\n"
-#: src/util/configuration.c:1017
+#: src/util/configuration.c:1034
#, c-format
msgid ""
"Configuration value '%s' for '%s' in section '%s' is not in set of legal "
"choices\n"
msgstr ""
-#: src/util/configuration.c:1136
+#: src/util/configuration.c:1153
#, c-format
msgid "Recursive expansion suspected, aborting $-expansion for term `%s'\n"
msgstr ""
-#: src/util/configuration.c:1169
+#: src/util/configuration.c:1186
#, fuzzy, c-format
msgid "Missing closing `%s' in option `%s'\n"
msgstr "配置文件“%s”已写入。\n"
-#: src/util/configuration.c:1237
+#: src/util/configuration.c:1254
#, c-format
msgid ""
"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"
msgid "EdDSA signature verification failed at %s:%d: %s\n"
msgstr "对驱动器“%2$s”的“%1$s”操作失败:%3$u\n"
-#: src/util/crypto_ecc_setup.c:122 src/util/crypto_ecc_setup.c:160
-#: src/util/crypto_ecc_setup.c:278 src/util/crypto_ecc_setup.c:316
+#: src/util/crypto_ecc_setup.c:122 src/util/crypto_ecc_setup.c:161
+#: src/util/crypto_ecc_setup.c:279 src/util/crypto_ecc_setup.c:317
#, fuzzy, c-format
msgid "Could not acquire lock on file `%s': %s...\n"
msgstr "无法解析“%s”(%s):%s\n"
-#: src/util/crypto_ecc_setup.c:127 src/util/crypto_ecc_setup.c:283
+#: src/util/crypto_ecc_setup.c:128 src/util/crypto_ecc_setup.c:284
#, fuzzy
msgid "Creating a new private key. This may take a while.\n"
msgstr "正在启动数据仓库转换(可能需要一段时间)。\n"
-#: src/util/crypto_ecc_setup.c:164 src/util/crypto_ecc_setup.c:320
+#: src/util/crypto_ecc_setup.c:165 src/util/crypto_ecc_setup.c:322
msgid "This may be ok if someone is currently generating a private key.\n"
msgstr ""
-#: src/util/crypto_ecc_setup.c:194 src/util/crypto_ecc_setup.c:350
+#: src/util/crypto_ecc_setup.c:195 src/util/crypto_ecc_setup.c:352
#, c-format
msgid ""
"When trying to read key file `%s' I found %u bytes but I need at least %u.\n"
msgstr ""
-#: src/util/crypto_ecc_setup.c:198 src/util/crypto_ecc_setup.c:354
+#: src/util/crypto_ecc_setup.c:199 src/util/crypto_ecc_setup.c:356
msgid "This may be ok if someone is currently generating a key.\n"
msgstr ""
-#: src/util/crypto_ecc_setup.c:413
+#: src/util/crypto_ecc_setup.c:415
#, fuzzy
msgid "Could not load peer's private key\n"
msgstr "找不到接口“%s”的一个 IP 地址。\n"
@@ -8193,82 +8367,86 @@ msgstr ""
msgid "Manipulate GNUnet configuration files"
msgstr "更改配置文件中的一个值"
-#: src/util/gnunet-ecc.c:84
+#: src/util/gnunet-ecc.c:89
#, fuzzy, c-format
msgid "Failed to open `%s': %s\n"
msgstr "打开日志文件“%s”失败:%s\n"
-#: src/util/gnunet-ecc.c:120
+#: src/util/gnunet-ecc.c:125
#, c-format
msgid "Generating %u keys like %s, please wait"
msgstr ""
-#: src/util/gnunet-ecc.c:133
+#: src/util/gnunet-ecc.c:138
#, c-format
msgid "Generating %u keys, please wait"
msgstr ""
-#: src/util/gnunet-ecc.c:174
+#: src/util/gnunet-ecc.c:179
#, fuzzy, c-format
msgid ""
"\n"
"Failed to write to `%s': %s\n"
msgstr "运行 %s失败:%s %d\n"
-#: src/util/gnunet-ecc.c:184
+#: src/util/gnunet-ecc.c:189
#, c-format
msgid ""
"\n"
"Finished!\n"
msgstr ""
-#: src/util/gnunet-ecc.c:187
+#: src/util/gnunet-ecc.c:192
#, c-format
msgid ""
"\n"
"Error, %u keys not generated\n"
msgstr ""
-#: src/util/gnunet-ecc.c:280
+#: src/util/gnunet-ecc.c:283
#, c-format
msgid "Hostkeys file `%s' not found\n"
msgstr ""
-#: src/util/gnunet-ecc.c:291
+#: src/util/gnunet-ecc.c:294
#, fuzzy, c-format
msgid "Hostkeys file `%s' is empty\n"
msgstr "找不到接口“%s”的一个 IP 地址。\n"
-#: src/util/gnunet-ecc.c:313
+#: src/util/gnunet-ecc.c:316
#, fuzzy, c-format
msgid "Could not read hostkey file: %s\n"
msgstr "找不到接口“%s”的一个 IP 地址。\n"
-#: src/util/gnunet-ecc.c:364
+#: src/util/gnunet-ecc.c:367
msgid "No hostkey file specified on command line\n"
msgstr ""
-#: src/util/gnunet-ecc.c:416
+#: src/util/gnunet-ecc.c:425
msgid "list keys included in a file (for testing)"
msgstr ""
-#: src/util/gnunet-ecc.c:421
+#: src/util/gnunet-ecc.c:430
msgid "number of keys to list included in a file (for testing)"
msgstr ""
-#: src/util/gnunet-ecc.c:426
+#: src/util/gnunet-ecc.c:435
msgid "create COUNT public-private key pairs (for testing)"
msgstr ""
-#: src/util/gnunet-ecc.c:430
+#: src/util/gnunet-ecc.c:439
msgid "print the public key in ASCII format"
msgstr ""
-#: src/util/gnunet-ecc.c:434
+#: src/util/gnunet-ecc.c:443
+msgid "print the public key in HEX format"
+msgstr ""
+
+#: src/util/gnunet-ecc.c:447
msgid "print examples of ECC operations (used for compatibility testing)"
msgstr ""
-#: src/util/gnunet-ecc.c:449
+#: src/util/gnunet-ecc.c:463
#, fuzzy
msgid "Manipulate GNUnet private ECC key files"
msgstr "更改配置文件中的一个值"
@@ -8362,7 +8540,7 @@ msgstr "创建用户出错"
msgid "Unable to shorten unix path `%s' while keeping name unique\n"
msgstr ""
-#: src/util/network.c:1793 src/util/network.c:1969
+#: src/util/network.c:1793 src/util/network.c:1977
#, c-format
msgid ""
"Fatal internal logic error, process hangs in `%s' (abort with CTRL-C)!\n"
@@ -8415,7 +8593,7 @@ msgstr ""
msgid "Could not determine plugin installation path.\n"
msgstr "无法确定用户界面定义文件。"
-#: src/util/resolver_api.c:204
+#: src/util/resolver_api.c:203
#, c-format
msgid ""
"Missing `%s' for `%s' in configuration, DNS resolution will be unavailable.\n"
@@ -8428,32 +8606,32 @@ msgid ""
"resolution will be unavailable.\n"
msgstr ""
-#: src/util/resolver_api.c:815
+#: src/util/resolver_api.c:826
#, c-format
msgid "Timeout trying to resolve hostname `%s'.\n"
msgstr ""
-#: src/util/resolver_api.c:827
+#: src/util/resolver_api.c:839
#, fuzzy, c-format
msgid "Timeout trying to resolve IP address `%s'.\n"
msgstr "GNUnet 现在使用 IP 地址 %s。\n"
-#: src/util/resolver_api.c:1004
+#: src/util/resolver_api.c:1023
msgid "Resolver not configured correctly.\n"
msgstr ""
-#: src/util/resolver_api.c:1086 src/util/resolver_api.c:1107
-#: src/util/resolver_api.c:1121
+#: src/util/resolver_api.c:1109 src/util/resolver_api.c:1132
+#: src/util/resolver_api.c:1146
#, fuzzy, c-format
msgid "Could not resolve our FQDN: %s\n"
msgstr "无法解析“%s”(%s):%s\n"
-#: src/util/service.c:1306
+#: src/util/service.c:1305
msgid ""
"Could not bind to any of the ports I was supposed to, refusing to run!\n"
msgstr ""
-#: src/util/service.c:2082
+#: src/util/service.c:2081
#, c-format
msgid ""
"Processing code for message of type %u did not call "
@@ -8530,63 +8708,63 @@ msgstr " 天"
msgid "end of time"
msgstr ""
-#: src/util/strings.c:1269
+#: src/util/strings.c:1270
msgid "IPv6 address did not start with `['\n"
msgstr ""
-#: src/util/strings.c:1277
+#: src/util/strings.c:1278
msgid "IPv6 address did contain ':' to separate port number\n"
msgstr ""
-#: src/util/strings.c:1283
+#: src/util/strings.c:1284
msgid "IPv6 address did contain ']' before ':' to separate port number\n"
msgstr ""
-#: src/util/strings.c:1290
+#: src/util/strings.c:1291
msgid "IPv6 address did contain a valid port number after the last ':'\n"
msgstr ""
-#: src/util/strings.c:1299
+#: src/util/strings.c:1300
#, fuzzy, c-format
msgid "Invalid IPv6 address `%s': %s\n"
msgstr "无效的进程优先级“%s”\n"
-#: src/util/strings.c:1571 src/util/strings.c:1587
+#: src/util/strings.c:1572 src/util/strings.c:1588
msgid "Port not in range\n"
msgstr ""
-#: src/util/strings.c:1596
+#: src/util/strings.c:1597
#, fuzzy, c-format
msgid "Malformed port policy `%s'\n"
msgstr "解析配置文件“%s”失败\n"
-#: src/util/strings.c:1679 src/util/strings.c:1710 src/util/strings.c:1758
-#: src/util/strings.c:1779
+#: src/util/strings.c:1680 src/util/strings.c:1711 src/util/strings.c:1759
+#: src/util/strings.c:1780
#, c-format
msgid "Invalid format for IP: `%s'\n"
msgstr "IP 格式无效:“%s”\n"
-#: src/util/strings.c:1736
+#: src/util/strings.c:1737
#, c-format
msgid "Invalid network notation ('/%d' is not legal in IPv4 CIDR)."
msgstr "网络表示法无效(“/%d” 在 IPv4 CIDR 中是非法的)。"
-#: src/util/strings.c:1788
+#: src/util/strings.c:1789
#, fuzzy, c-format
msgid "Invalid format: `%s'\n"
msgstr "IP 格式无效:“%s”\n"
-#: src/util/strings.c:1840
+#: src/util/strings.c:1841
#, c-format
msgid "Invalid network notation (does not end with ';': `%s')\n"
msgstr "无效的网络表示法(没有以“;”结尾:“%s”)\n"
-#: src/util/strings.c:1890
+#: src/util/strings.c:1891
#, c-format
msgid "Wrong format `%s' for netmask\n"
msgstr "网络掩码的格式“%s”错误\n"
-#: src/util/strings.c:1921
+#: src/util/strings.c:1922
#, c-format
msgid "Wrong format `%s' for network\n"
msgstr "网络的格式“%s”错误\n"
@@ -8761,28 +8939,44 @@ msgstr ""
msgid "Setup tunnels via VPN."
msgstr ""
-#: src/zonemaster/gnunet-service-zonemaster.c:705
+#: src/zonemaster/gnunet-service-zonemaster.c:706
#, fuzzy
msgid "Failed to connect to the namestore!\n"
msgstr "初始化“%s”服务失败。\n"
-#: src/include/gnunet_common.h:674 src/include/gnunet_common.h:681
-#: src/include/gnunet_common.h:691 src/include/gnunet_common.h:699
+#: src/include/gnunet_common.h:689 src/include/gnunet_common.h:696
+#: src/include/gnunet_common.h:706 src/include/gnunet_common.h:714
#, c-format
msgid "Assertion failed at %s:%d.\n"
msgstr ""
-#: src/include/gnunet_common.h:711
+#: src/include/gnunet_common.h:726
#, c-format
msgid "External protocol violation detected at %s:%d.\n"
msgstr ""
-#: src/include/gnunet_common.h:738 src/include/gnunet_common.h:747
+#: src/include/gnunet_common.h:753 src/include/gnunet_common.h:762
#, c-format
msgid "`%s' failed on file `%s' at %s:%d with error: %s\n"
msgstr ""
#, fuzzy
+#~ msgid "Token `%s' is malformed\n"
+#~ msgstr "“%s”的参数无效。\n"
+
+#, fuzzy
+#~ msgid "Failed to create indices\n"
+#~ msgstr "发送消息失败。\n"
+
+#, fuzzy
+#~ msgid "`%s:%s' failed at %s:%d with error: %s\n"
+#~ msgstr "“%s”于 %s:%d 处失败,错误为:%s\n"
+
+#, fuzzy
+#~ msgid "Unable to connect to Postgres database '%s': %s\n"
+#~ msgstr "无法保存配置文件“%s”:"
+
+#, fuzzy
#~ msgid "Misconfiguration (can not connect to the ARM service)"
#~ msgstr "初始化“%s”服务失败。\n"
@@ -9079,10 +9273,6 @@ msgstr ""
#~ msgstr "初始化“%s”服务失败。\n"
#, fuzzy
-#~ msgid "Error reading sensor version\n"
-#~ msgstr "创建用户出错"
-
-#, fuzzy
#~ msgid "Error reading sensor category\n"
#~ msgstr "创建用户出错"
@@ -9405,10 +9595,6 @@ msgstr ""
#~ msgstr "找不到接口“%s”的一个 IP 地址。\n"
#, fuzzy
-#~ msgid "Failed to remove records from database"
-#~ msgstr "发送消息失败。\n"
-
-#, fuzzy
#~ msgid "Failed to access database"
#~ msgstr "打开日志文件“%s”失败:%s\n"
diff --git a/src/Makefile.am b/src/Makefile.am
index 14c66c5f70..68878b5a01 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -17,6 +17,7 @@ endif
if HAVE_JSON
if HAVE_MHD
+ ATTRIBUTE_DIR = identity-attribute
PROVIDER_DIR = identity-provider
endif
endif
@@ -116,6 +117,7 @@ SUBDIRS = \
revocation \
vpn \
gns \
+ credential \
zonemaster \
$(CONVERSATION_DIR) \
fs \
@@ -130,6 +132,7 @@ SUBDIRS = \
social \
$(AUCTION_DIR) \
$(EXP_DIR) \
+ $(ATTRIBUTE_DIR) \
$(PROVIDER_DIR)
endif
diff --git a/src/credential/Makefile.am b/src/credential/Makefile.am
new file mode 100644
index 0000000000..ca11c5e4fa
--- /dev/null
+++ b/src/credential/Makefile.am
@@ -0,0 +1,112 @@
+# This Makefile.am is in the public domain
+AM_CPPFLAGS = -I$(top_srcdir)/src/include
+
+EXTRA_DIST = \
+ test_credential_defaults.conf \
+ test_credential_lookup.conf
+
+
+if USE_COVERAGE
+ AM_CFLAGS = --coverage -O0
+endif
+
+pkgcfgdir = $(pkgdatadir)/config.d/
+
+libexecdir= $(pkglibdir)/libexec/
+
+plugindir = $(libdir)/gnunet
+
+pkgcfg_DATA = \
+ credential.conf
+
+
+# /usr/lib - compiles a layer which can be used to be communicagte with the service
+lib_LTLIBRARIES = \
+ libgnunetcredential.la
+
+# /usr/lib/gnunet/libexec - Business logic . Separate process
+libexec_PROGRAMS = \
+ gnunet-service-credential
+
+bin_PROGRAMS = \
+ gnunet-credential
+
+plugin_LTLIBRARIES = \
+ libgnunet_plugin_gnsrecord_credential.la
+
+
+if HAVE_MHD
+if HAVE_JSON
+plugin_LTLIBRARIES += libgnunet_plugin_rest_credential.la
+endif
+endif
+
+
+gnunet_credential_SOURCES = \
+ gnunet-credential.c
+gnunet_credential_LDADD = \
+ libgnunetcredential.la \
+ $(top_builddir)/src/util/libgnunetutil.la \
+ $(top_builddir)/src/gnsrecord/libgnunetgnsrecord.la \
+ $(top_builddir)/src/identity/libgnunetidentity.la \
+ $(GN_LIBINTL)
+
+
+libgnunet_plugin_gnsrecord_credential_la_SOURCES = \
+ plugin_gnsrecord_credential.c
+libgnunet_plugin_gnsrecord_credential_la_LIBADD = \
+ libgnunetcredential.la \
+ $(top_builddir)/src/util/libgnunetutil.la \
+ $(LTLIBINTL)
+libgnunet_plugin_gnsrecord_credential_la_LDFLAGS = \
+ $(GN_PLUGIN_LDFLAGS)
+
+
+
+gnunet_service_credential_SOURCES = \
+ gnunet-service-credential.c
+gnunet_service_credential_LDADD = \
+ libgnunetcredential.la \
+ $(top_builddir)/src/util/libgnunetutil.la \
+ $(top_builddir)/src/gns/libgnunetgns.la \
+ $(top_builddir)/src/namestore/libgnunetnamestore.la \
+ $(top_builddir)/src/statistics/libgnunetstatistics.la \
+ $(GN_LIBINTL)
+
+
+libgnunetcredential_la_SOURCES = \
+ credential_api.c \
+ credential_serialization.c \
+ credential_misc.c
+libgnunetcredential_la_LIBADD = \
+ $(top_builddir)/src/util/libgnunetutil.la $(XLIB)
+libgnunetcredential_la_LDFLAGS = \
+ $(GN_LIB_LDFLAGS)
+
+
+libgnunet_plugin_rest_credential_la_SOURCES = \
+ plugin_rest_credential.c
+libgnunet_plugin_rest_credential_la_LIBADD = \
+ libgnunetcredential.la \
+ $(top_builddir)/src/rest/libgnunetrest.la \
+ $(top_builddir)/src/identity/libgnunetidentity.la \
+ $(top_builddir)/src/jsonapi/libgnunetjsonapi.la \
+ $(top_builddir)/src/jsonapi/libgnunetjsonapiutils.la \
+ $(top_builddir)/src/util/libgnunetutil.la $(XLIBS) \
+ $(LTLIBINTL) -ljansson -lmicrohttpd
+libgnunet_plugin_rest_credential_la_LDFLAGS = \
+ $(GN_PLUGIN_LDFLAGS)
+
+
+check_SCRIPTS = \
+ test_credential_issue.sh \
+ test_credential_verify_simple.sh \
+ test_credential_verify.sh \
+ test_credential_verify_and.sh
+
+if ENABLE_TEST_RUN
+if HAVE_SQLITE
+ AM_TESTS_ENVIRONMENT=export GNUNET_PREFIX=$${GNUNET_PREFIX:-@libdir@};export PATH=$${GNUNET_PREFIX:-@prefix@}/bin:$$PATH;
+ TESTS = $(check_SCRIPTS)
+endif
+endif
diff --git a/src/credential/credential.conf.in b/src/credential/credential.conf.in
new file mode 100644
index 0000000000..71f3066ca9
--- /dev/null
+++ b/src/credential/credential.conf.in
@@ -0,0 +1,5 @@
+[credential]
+BINARY = gnunet-service-credential
+UNIXPATH = $GNUNET_USER_RUNTIME_DIR/gnunet-service-credential.sock
+USER_SERVICE = YES
+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 0000000000..f16249c1b4
--- /dev/null
+++ b/src/credential/credential.h
@@ -0,0 +1,221 @@
+/*
+ This file is part of GNUnet
+ Copyright (C) 2012-2013 GNUnet e.V.
+
+ GNUnet is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published
+ by the Free Software Foundation; either version 3, or (at your
+ option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GNUnet; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+ */
+/**
+ * @file credential/credential.h
+ * @brief IPC messages between CREDENTIAL API and CREDENTIAL service
+ * @author Adnan Husain
+ */
+#ifndef CREDENTIAL_H
+#define CREDENTIAL_H
+
+#include "gnunet_credential_service.h"
+
+GNUNET_NETWORK_STRUCT_BEGIN
+
+/**
+ * Message from client to Credential service to collect credentials.
+ */
+struct CollectMessage
+{
+ /**
+ * Header of type #GNUNET_MESSAGE_TYPE_CREDENTIAL_VERIFY
+ */
+ struct GNUNET_MessageHeader header;
+
+ /**
+ * Subject public key
+ */
+ struct GNUNET_CRYPTO_EcdsaPrivateKey subject_key;
+
+ /**
+ * Trust anchor
+ */
+ struct GNUNET_CRYPTO_EcdsaPublicKey issuer_key;
+
+ /**
+ * Length of the issuer attribute
+ */
+ uint16_t issuer_attribute_len;
+
+ /**
+ * Unique identifier for this request (for key collisions).
+ */
+ uint32_t id GNUNET_PACKED;
+
+ /* Followed by the zero-terminated attribute */
+
+};
+
+
+/**
+ * Message from client to Credential service to verify attributes.
+ */
+struct VerifyMessage
+{
+ /**
+ * Header of type #GNUNET_MESSAGE_TYPE_CREDENTIAL_VERIFY
+ */
+ struct GNUNET_MessageHeader header;
+
+ /**
+ * Subject public key
+ */
+ struct GNUNET_CRYPTO_EcdsaPublicKey subject_key;
+
+ /**
+ * Trust anchor
+ */
+ struct GNUNET_CRYPTO_EcdsaPublicKey issuer_key;
+
+ /**
+ * Number of credentials
+ */
+ uint32_t c_count;
+
+ /**
+ * Length of the issuer attribute
+ */
+ uint16_t issuer_attribute_len;
+
+ /**
+ * Unique identifier for this request (for key collisions).
+ */
+ uint32_t id GNUNET_PACKED;
+
+ /* Followed by the zero-terminated attribute and credentials to look up */
+
+};
+
+
+/**
+ * Message from CREDENTIAL service to client: new results.
+ */
+struct DelegationChainResultMessage
+{
+ /**
+ * Header of type #GNUNET_MESSAGE_TYPE_CREDENTIAL_VERIFY_RESULT
+ */
+ struct GNUNET_MessageHeader header;
+
+ /**
+ * Unique identifier for this request (for key collisions).
+ */
+ uint32_t id GNUNET_PACKED;
+
+ /**
+ * Indicates if credential has been found at all
+ */
+ uint32_t cred_found GNUNET_PACKED;
+
+ /**
+ * The number of delegations in the response
+ */
+ uint32_t d_count GNUNET_PACKED;
+
+ /**
+ * The number of credentials in the response
+ */
+ uint32_t c_count GNUNET_PACKED;
+
+ /* followed by ad_count GNUNET_CREDENTIAL_RecordData structs*/
+
+};
+
+struct DelegationRecordData
+{
+ /**
+ * Subject key
+ */
+ struct GNUNET_CRYPTO_EcdsaPublicKey subject_key;
+
+ /**
+ * Subject attributes
+ */
+ uint32_t subject_attribute_len GNUNET_PACKED;
+};
+
+
+struct ChainEntry
+{
+ /**
+ * Issuer key
+ */
+ struct GNUNET_CRYPTO_EcdsaPublicKey issuer_key;
+
+ /**
+ * Subject key
+ */
+ struct GNUNET_CRYPTO_EcdsaPublicKey subject_key;
+
+ /**
+ * Issuer attributes
+ */
+ uint32_t issuer_attribute_len GNUNET_PACKED;
+
+ /**
+ * Subject attributes
+ */
+ uint32_t subject_attribute_len GNUNET_PACKED;
+};
+
+
+struct CredentialEntry
+{
+
+ /**
+ * The signature for this credential by the issuer
+ */
+ struct GNUNET_CRYPTO_EcdsaSignature signature;
+
+ /**
+ * Signature meta
+ */
+ struct GNUNET_CRYPTO_EccSignaturePurpose purpose;
+
+ /**
+ * Public key of the issuer
+ */
+ struct GNUNET_CRYPTO_EcdsaPublicKey issuer_key;
+
+ /**
+ * Public key of the subject this credential was issued to
+ */
+ struct GNUNET_CRYPTO_EcdsaPublicKey subject_key;
+
+ /**
+ * Expiration time of this credential
+ */
+ uint64_t expiration GNUNET_PACKED;
+
+ /**
+ * Issuer attribute length
+ */
+ uint32_t issuer_attribute_len;
+
+ /**
+ * Followed by the attribute string
+ */
+};
+
+
+GNUNET_NETWORK_STRUCT_END
+
+#endif
+
diff --git a/src/credential/credential_api.c b/src/credential/credential_api.c
new file mode 100644
index 0000000000..ca54137add
--- /dev/null
+++ b/src/credential/credential_api.c
@@ -0,0 +1,513 @@
+/*
+ This file is part of GNUnet.
+ Copyright (C) 2009-2013, 2016 GNUnet e.V.
+
+ GNUnet is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published
+ by the Free Software Foundation; either version 3, or (at your
+ option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GNUnet; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+/**
+ * @file credential/credential_api.c
+ * @brief library to access the CREDENTIAL service
+ * @author Adnan Husain
+ */
+#include "platform.h"
+#include "gnunet_util_lib.h"
+#include "gnunet_constants.h"
+#include "gnunet_arm_service.h"
+#include "gnunet_hello_lib.h"
+#include "gnunet_protocols.h"
+#include "gnunet_signatures.h"
+#include "credential.h"
+#include "credential_serialization.h"
+#include "gnunet_credential_service.h"
+#include "gnunet_identity_service.h"
+
+
+#define LOG(kind,...) GNUNET_log_from (kind, "credential-api",__VA_ARGS__)
+
+/**
+ * Handle to a verify request
+ */
+struct GNUNET_CREDENTIAL_Request
+{
+
+ /**
+ * DLL
+ */
+ struct GNUNET_CREDENTIAL_Request *next;
+
+ /**
+ * DLL
+ */
+ struct GNUNET_CREDENTIAL_Request *prev;
+
+ /**
+ * handle to credential service
+ */
+ struct GNUNET_CREDENTIAL_Handle *credential_handle;
+
+ /**
+ * processor to call on verify result
+ */
+ GNUNET_CREDENTIAL_CredentialResultProcessor verify_proc;
+
+ /**
+ * @e verify_proc closure
+ */
+ void *proc_cls;
+
+ /**
+ * Envelope with the message for this queue entry.
+ */
+ struct GNUNET_MQ_Envelope *env;
+
+ /**
+ * request id
+ */
+ uint32_t r_id;
+
+};
+
+
+/**
+ * Connection to the CREDENTIAL service.
+ */
+struct GNUNET_CREDENTIAL_Handle
+{
+
+ /**
+ * Configuration to use.
+ */
+ const struct GNUNET_CONFIGURATION_Handle *cfg;
+
+ /**
+ * Connection to service (if available).
+ */
+ struct GNUNET_MQ_Handle *mq;
+
+ /**
+ * Head of linked list of active verify requests.
+ */
+ struct GNUNET_CREDENTIAL_Request *request_head;
+
+ /**
+ * Tail of linked list of active verify requests.
+ */
+ struct GNUNET_CREDENTIAL_Request *request_tail;
+
+ /**
+ * Reconnect task
+ */
+ struct GNUNET_SCHEDULER_Task *reconnect_task;
+
+ /**
+ * How long do we wait until we try to reconnect?
+ */
+ struct GNUNET_TIME_Relative reconnect_backoff;
+
+ /**
+ * Request Id generator. Incremented by one for each request.
+ */
+ uint32_t r_id_gen;
+
+};
+
+
+/**
+ * Reconnect to CREDENTIAL service.
+ *
+ * @param handle the handle to the CREDENTIAL service
+ */
+static void
+reconnect (struct GNUNET_CREDENTIAL_Handle *handle);
+
+
+/**
+ * Reconnect to CREDENTIAL
+ *
+ * @param cls the handle
+ */
+static void
+reconnect_task (void *cls)
+{
+ struct GNUNET_CREDENTIAL_Handle *handle = cls;
+
+ handle->reconnect_task = NULL;
+ reconnect (handle);
+}
+
+
+/**
+ * Disconnect from service and then reconnect.
+ *
+ * @param handle our handle
+ */
+static void
+force_reconnect (struct GNUNET_CREDENTIAL_Handle *handle)
+{
+ GNUNET_MQ_destroy (handle->mq);
+ handle->mq = NULL;
+ handle->reconnect_backoff
+ = GNUNET_TIME_STD_BACKOFF (handle->reconnect_backoff);
+ handle->reconnect_task
+ = GNUNET_SCHEDULER_add_delayed (handle->reconnect_backoff,
+ &reconnect_task,
+ handle);
+}
+
+
+/**
+ * Generic error handler, called with the appropriate error code and
+ * the same closure specified at the creation of the message queue.
+ * Not every message queue implementation supports an error handler.
+ *
+ * @param cls closure with the `struct GNUNET_CREDENTIAL_Handle *`
+ * @param error error code
+ */
+static void
+mq_error_handler (void *cls,
+ enum GNUNET_MQ_Error error)
+{
+ struct GNUNET_CREDENTIAL_Handle *handle = cls;
+
+ force_reconnect (handle);
+}
+
+/**
+ * Check validity of message received from the CREDENTIAL service
+ *
+ * @param cls the `struct GNUNET_CREDENTIAL_Handle *`
+ * @param loookup_msg the incoming message
+ */
+static int
+check_result (void *cls,
+ const struct DelegationChainResultMessage *vr_msg)
+{
+ //TODO
+ return GNUNET_OK;
+}
+
+
+/**
+ * Handler for messages received from the CREDENTIAL service
+ *
+ * @param cls the `struct GNUNET_CREDENTIAL_Handle *`
+ * @param loookup_msg the incoming message
+ */
+static void
+handle_result (void *cls,
+ const struct DelegationChainResultMessage *vr_msg)
+{
+ struct GNUNET_CREDENTIAL_Handle *handle = cls;
+ uint32_t r_id = ntohl (vr_msg->id);
+ struct GNUNET_CREDENTIAL_Request *vr;
+ size_t mlen = ntohs (vr_msg->header.size) - sizeof (*vr_msg);
+ uint32_t d_count = ntohl (vr_msg->d_count);
+ uint32_t c_count = ntohl (vr_msg->c_count);
+ struct GNUNET_CREDENTIAL_Delegation d_chain[d_count];
+ struct GNUNET_CREDENTIAL_Credential creds[c_count];
+ GNUNET_CREDENTIAL_CredentialResultProcessor proc;
+ void *proc_cls;
+
+ LOG (GNUNET_ERROR_TYPE_DEBUG,
+ "Received verify reply from CREDENTIAL service\n");
+ for (vr = handle->request_head; NULL != vr; vr = vr->next)
+ if (vr->r_id == r_id)
+ break;
+ if (NULL == vr)
+ return;
+ proc = vr->verify_proc;
+ proc_cls = vr->proc_cls;
+ GNUNET_CONTAINER_DLL_remove (handle->request_head,
+ handle->request_tail,
+ vr);
+ GNUNET_MQ_discard (vr->env);
+ GNUNET_free (vr);
+ GNUNET_assert (GNUNET_OK ==
+ GNUNET_CREDENTIAL_delegation_chain_deserialize (mlen,
+ (const char*) &vr_msg[1],
+ d_count,
+ d_chain,
+ c_count,
+ creds));
+ if (GNUNET_NO == ntohl (vr_msg->cred_found))
+ {
+ proc (proc_cls,
+ 0,
+ NULL,
+ 0,
+ NULL); // TODO
+ } else {
+ proc (proc_cls,
+ d_count,
+ d_chain,
+ c_count,
+ creds);
+ }
+}
+
+
+/**
+ * Reconnect to CREDENTIAL service.
+ *
+ * @param handle the handle to the CREDENTIAL service
+ */
+static void
+reconnect (struct GNUNET_CREDENTIAL_Handle *handle)
+{
+ struct GNUNET_MQ_MessageHandler handlers[] = {
+ GNUNET_MQ_hd_var_size (result,
+ GNUNET_MESSAGE_TYPE_CREDENTIAL_VERIFY_RESULT,
+ struct DelegationChainResultMessage,
+ handle),
+ GNUNET_MQ_hd_var_size (result,
+ GNUNET_MESSAGE_TYPE_CREDENTIAL_COLLECT_RESULT,
+ struct DelegationChainResultMessage,
+ handle),
+ GNUNET_MQ_handler_end ()
+ };
+ struct GNUNET_CREDENTIAL_Request *vr;
+
+ GNUNET_assert (NULL == handle->mq);
+ LOG (GNUNET_ERROR_TYPE_DEBUG,
+ "Trying to connect to CREDENTIAL\n");
+ handle->mq = GNUNET_CLIENT_connect (handle->cfg,
+ "credential",
+ handlers,
+ &mq_error_handler,
+ handle);
+ if (NULL == handle->mq)
+ return;
+ for (vr = handle->request_head; NULL != vr; vr = vr->next)
+ GNUNET_MQ_send_copy (handle->mq,
+ vr->env);
+}
+
+
+/**
+ * Initialize the connection with the CREDENTIAL service.
+ *
+ * @param cfg configuration to use
+ * @return handle to the CREDENTIAL service, or NULL on error
+ */
+struct GNUNET_CREDENTIAL_Handle *
+GNUNET_CREDENTIAL_connect (const struct GNUNET_CONFIGURATION_Handle *cfg)
+{
+ struct GNUNET_CREDENTIAL_Handle *handle;
+
+ handle = GNUNET_new (struct GNUNET_CREDENTIAL_Handle);
+ handle->cfg = cfg;
+ reconnect (handle);
+ if (NULL == handle->mq)
+ {
+ GNUNET_free (handle);
+ return NULL;
+ }
+ return handle;
+}
+
+
+/**
+ * Shutdown connection with the CREDENTIAL service.
+ *
+ * @param handle handle of the CREDENTIAL connection to stop
+ */
+void
+GNUNET_CREDENTIAL_disconnect (struct GNUNET_CREDENTIAL_Handle *handle)
+{
+ if (NULL != handle->mq)
+ {
+ GNUNET_MQ_destroy (handle->mq);
+ handle->mq = NULL;
+ }
+ if (NULL != handle->reconnect_task)
+ {
+ GNUNET_SCHEDULER_cancel (handle->reconnect_task);
+ handle->reconnect_task = NULL;
+ }
+ GNUNET_assert (NULL == handle->request_head);
+ GNUNET_free (handle);
+}
+
+
+/**
+ * Cancel pending verify request
+ *
+ * @param lr the verify request to cancel
+ */
+void
+GNUNET_CREDENTIAL_request_cancel (struct GNUNET_CREDENTIAL_Request *vr)
+{
+ struct GNUNET_CREDENTIAL_Handle *handle = vr->credential_handle;
+
+ GNUNET_CONTAINER_DLL_remove (handle->request_head,
+ handle->request_tail,
+ vr);
+ GNUNET_MQ_discard (vr->env);
+ GNUNET_free (vr);
+}
+
+
+/**
+ * Performs attribute collection.
+ * Collects all credentials of subject to fulfill the
+ * attribute, if possible
+ *
+ * @param handle handle to the Credential service
+ * @param issuer_key the issuer public key
+ * @param issuer_attribute the issuer attribute
+ * @param subject_key the subject public key
+ * @param credential_count number of credentials provided
+ * @param credentials subject credentials
+ * @param proc function to call on result
+ * @param proc_cls closure for processor
+ * @return handle to the queued request
+ */
+struct GNUNET_CREDENTIAL_Request*
+GNUNET_CREDENTIAL_collect (struct GNUNET_CREDENTIAL_Handle *handle,
+ const struct GNUNET_CRYPTO_EcdsaPublicKey *issuer_key,
+ const char *issuer_attribute,
+ const struct GNUNET_CRYPTO_EcdsaPrivateKey *subject_key,
+ GNUNET_CREDENTIAL_CredentialResultProcessor proc,
+ void *proc_cls)
+{
+ /* IPC to shorten credential names, return shorten_handle */
+ struct CollectMessage *c_msg;
+ struct GNUNET_CREDENTIAL_Request *vr;
+ size_t nlen;
+
+ if (NULL == issuer_attribute)
+ {
+ GNUNET_break (0);
+ return NULL;
+ }
+
+ //DEBUG LOG
+ LOG (GNUNET_ERROR_TYPE_DEBUG,
+ "Trying to collect `%s' in CREDENTIAL\n",
+ issuer_attribute);
+ nlen = strlen (issuer_attribute) + 1;
+ if (nlen >= GNUNET_MAX_MESSAGE_SIZE - sizeof (*vr))
+ {
+ GNUNET_break (0);
+ return NULL;
+ }
+ vr = GNUNET_new (struct GNUNET_CREDENTIAL_Request);
+ vr->credential_handle = handle;
+ vr->verify_proc = proc;
+ vr->proc_cls = proc_cls;
+ vr->r_id = handle->r_id_gen++;
+ vr->env = GNUNET_MQ_msg_extra (c_msg,
+ nlen,
+ GNUNET_MESSAGE_TYPE_CREDENTIAL_COLLECT);
+ c_msg->id = htonl (vr->r_id);
+ c_msg->subject_key = *subject_key;
+ c_msg->issuer_key = *issuer_key;
+ c_msg->issuer_attribute_len = htons(strlen(issuer_attribute));
+ GNUNET_memcpy (&c_msg[1],
+ issuer_attribute,
+ strlen (issuer_attribute));
+ GNUNET_CONTAINER_DLL_insert (handle->request_head,
+ handle->request_tail,
+ vr);
+ if (NULL != handle->mq)
+ GNUNET_MQ_send_copy (handle->mq,
+ vr->env);
+ return vr;
+}
+/**
+ * Performs attribute verification.
+ * Checks if there is a delegation chain from
+ * attribute ``issuer_attribute'' issued by the issuer
+ * with public key ``issuer_key'' maps to the attribute
+ * ``subject_attribute'' claimed by the subject with key
+ * ``subject_key''
+ *
+ * @param handle handle to the Credential service
+ * @param issuer_key the issuer public key
+ * @param issuer_attribute the issuer attribute
+ * @param subject_key the subject public key
+ * @param credential_count number of credentials provided
+ * @param credentials subject credentials
+ * @param proc function to call on result
+ * @param proc_cls closure for processor
+ * @return handle to the queued request
+ */
+struct GNUNET_CREDENTIAL_Request*
+GNUNET_CREDENTIAL_verify (struct GNUNET_CREDENTIAL_Handle *handle,
+ const struct GNUNET_CRYPTO_EcdsaPublicKey *issuer_key,
+ const char *issuer_attribute,
+ const struct GNUNET_CRYPTO_EcdsaPublicKey *subject_key,
+ uint32_t credential_count,
+ const struct GNUNET_CREDENTIAL_Credential *credentials,
+ GNUNET_CREDENTIAL_CredentialResultProcessor proc,
+ void *proc_cls)
+{
+ /* IPC to shorten credential names, return shorten_handle */
+ struct VerifyMessage *v_msg;
+ struct GNUNET_CREDENTIAL_Request *vr;
+ size_t nlen;
+ size_t clen;
+
+ if (NULL == issuer_attribute || NULL == credentials)
+ {
+ GNUNET_break (0);
+ return NULL;
+ }
+
+ clen = GNUNET_CREDENTIAL_credentials_get_size (credential_count,
+ credentials);
+
+ //DEBUG LOG
+ LOG (GNUNET_ERROR_TYPE_DEBUG,
+ "Trying to verify `%s' in CREDENTIAL\n",
+ issuer_attribute);
+ nlen = strlen (issuer_attribute) + 1 + clen;
+ if (nlen >= GNUNET_MAX_MESSAGE_SIZE - sizeof (*vr))
+ {
+ GNUNET_break (0);
+ return NULL;
+ }
+ vr = GNUNET_new (struct GNUNET_CREDENTIAL_Request);
+ vr->credential_handle = handle;
+ vr->verify_proc = proc;
+ vr->proc_cls = proc_cls;
+ vr->r_id = handle->r_id_gen++;
+ vr->env = GNUNET_MQ_msg_extra (v_msg,
+ nlen,
+ GNUNET_MESSAGE_TYPE_CREDENTIAL_VERIFY);
+ v_msg->id = htonl (vr->r_id);
+ v_msg->subject_key = *subject_key;
+ v_msg->c_count = htonl(credential_count);
+ v_msg->issuer_key = *issuer_key;
+ v_msg->issuer_attribute_len = htons(strlen(issuer_attribute));
+ GNUNET_memcpy (&v_msg[1],
+ issuer_attribute,
+ strlen (issuer_attribute));
+ GNUNET_CREDENTIAL_credentials_serialize (credential_count,
+ credentials,
+ clen,
+ ((char*)&v_msg[1])
+ + strlen (issuer_attribute) + 1);
+ GNUNET_CONTAINER_DLL_insert (handle->request_head,
+ handle->request_tail,
+ vr);
+ if (NULL != handle->mq)
+ GNUNET_MQ_send_copy (handle->mq,
+ vr->env);
+ return vr;
+}
+
+/* end of credential_api.c */
diff --git a/src/credential/credential_misc.c b/src/credential/credential_misc.c
new file mode 100644
index 0000000000..7849e81e64
--- /dev/null
+++ b/src/credential/credential_misc.c
@@ -0,0 +1,169 @@
+/*
+ This file is part of GNUnet.
+ Copyright (C) 2009-2013, 2016 GNUnet e.V.
+
+ GNUnet is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published
+ by the Free Software Foundation; either version 3, or (at your
+ option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GNUnet; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+
+/**
+ * @file credential/credential_mic.c
+ * @brief Misc API for credentials
+ *
+ * @author Martin Schanzenbach
+ */
+#include "platform.h"
+#include "gnunet_util_lib.h"
+#include "gnunet_constants.h"
+#include "gnunet_credential_service.h"
+#include "gnunet_signatures.h"
+#include "credential.h"
+#include <inttypes.h>
+
+char*
+GNUNET_CREDENTIAL_credential_to_string (const struct GNUNET_CREDENTIAL_Credential *cred)
+{
+ char *cred_str;
+ char *subject_pkey;
+ char *issuer_pkey;
+ char *signature;
+
+
+ subject_pkey = GNUNET_CRYPTO_ecdsa_public_key_to_string (&cred->subject_key);
+ issuer_pkey = GNUNET_CRYPTO_ecdsa_public_key_to_string (&cred->issuer_key);
+ GNUNET_STRINGS_base64_encode ((char*)&cred->signature,
+ sizeof (struct GNUNET_CRYPTO_EcdsaSignature),
+ &signature);
+ GNUNET_asprintf (&cred_str,
+ "%s.%s -> %s | %s | %"SCNu64,
+ issuer_pkey,
+ cred->issuer_attribute,
+ subject_pkey,
+ signature,
+ cred->expiration.abs_value_us);
+ GNUNET_free (subject_pkey);
+ GNUNET_free (issuer_pkey);
+ GNUNET_free (signature);
+ return cred_str;
+}
+
+struct GNUNET_CREDENTIAL_Credential*
+GNUNET_CREDENTIAL_credential_from_string (const char* s)
+{
+ struct GNUNET_CREDENTIAL_Credential *cred;
+ size_t enclen = (sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey)) * 8;
+ if (enclen % 5 > 0)
+ enclen += 5 - enclen % 5;
+ enclen /= 5; /* 260/5 = 52 */
+ char subject_pkey[enclen + 1];
+ char issuer_pkey[enclen + 1];
+ char name[253 + 1];
+ char signature[256]; //TODO max payload size
+
+ struct GNUNET_CRYPTO_EcdsaSignature *sig;
+ struct GNUNET_TIME_Absolute etime_abs;
+
+ if (5 != SSCANF (s,
+ "%52s.%253s -> %52s | %s | %"SCNu64,
+ issuer_pkey,
+ name,
+ subject_pkey,
+ signature,
+ &etime_abs.abs_value_us))
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ _("Unable to parse CRED record string `%s'\n"),
+ s);
+ return NULL;
+ }
+ cred = GNUNET_malloc (sizeof (struct GNUNET_CREDENTIAL_Credential) + strlen (name) + 1);
+ GNUNET_CRYPTO_ecdsa_public_key_from_string (subject_pkey,
+ strlen (subject_pkey),
+ &cred->subject_key);
+ GNUNET_CRYPTO_ecdsa_public_key_from_string (issuer_pkey,
+ strlen (issuer_pkey),
+ &cred->issuer_key);
+ GNUNET_assert (sizeof (struct GNUNET_CRYPTO_EcdsaSignature) == GNUNET_STRINGS_base64_decode (signature,
+ strlen (signature),
+ (char**)&sig));
+ cred->signature = *sig;
+ cred->expiration = etime_abs;
+ GNUNET_free (sig);
+ GNUNET_memcpy (&cred[1],
+ name,
+ strlen (name)+1);
+ cred->issuer_attribute_len = strlen ((char*)&cred[1]);
+ cred->issuer_attribute = (char*)&cred[1];
+ return cred;
+}
+
+/**
+ * Issue an attribute to a subject
+ *
+ * @param handle handle to the Credential service
+ * @param issuer the ego that should be used to issue the attribute
+ * @param subject the subject of the attribute
+ * @param attribute the name of the attribute
+ * @return handle to the queued request
+ */
+struct GNUNET_CREDENTIAL_Credential *
+GNUNET_CREDENTIAL_credential_issue (const struct GNUNET_CRYPTO_EcdsaPrivateKey *issuer,
+ struct GNUNET_CRYPTO_EcdsaPublicKey *subject,
+ const char *attribute,
+ struct GNUNET_TIME_Absolute *expiration)
+{
+ struct CredentialEntry *crd;
+ struct GNUNET_CREDENTIAL_Credential *cred;
+ size_t size;
+
+ size = sizeof (struct CredentialEntry) + strlen (attribute) + 1;
+ crd = GNUNET_malloc (size);
+ cred = GNUNET_malloc (sizeof (struct GNUNET_CREDENTIAL_Credential) + strlen (attribute) + 1);
+ crd->purpose.size = htonl (size - sizeof (struct GNUNET_CRYPTO_EcdsaSignature));
+
+ crd->purpose.purpose = htonl (GNUNET_SIGNATURE_PURPOSE_CREDENTIAL);
+ GNUNET_CRYPTO_ecdsa_key_get_public (issuer,
+ &crd->issuer_key);
+ crd->subject_key = *subject;
+ crd->expiration = GNUNET_htonll (expiration->abs_value_us);
+ crd->issuer_attribute_len = htonl (strlen (attribute)+1);
+ GNUNET_memcpy ((char*)&crd[1],
+ attribute,
+ strlen (attribute)+1);
+ if (GNUNET_OK !=
+ GNUNET_CRYPTO_ecdsa_sign (issuer,
+ &crd->purpose,
+ &crd->signature))
+ {
+ GNUNET_break (0);
+ GNUNET_free (crd);
+ return NULL;
+ }
+ cred->signature = crd->signature;
+ cred->expiration = *expiration;
+ GNUNET_CRYPTO_ecdsa_key_get_public (issuer,
+ &cred->issuer_key);
+
+ cred->subject_key = *subject;
+ GNUNET_memcpy (&cred[1],
+ attribute,
+ strlen (attribute)+1);
+ cred->issuer_attribute = (char*)&cred[1];
+ GNUNET_free (crd);
+ return cred;
+}
+
+
diff --git a/src/credential/credential_misc.h b/src/credential/credential_misc.h
new file mode 100644
index 0000000000..c3aa8c2144
--- /dev/null
+++ b/src/credential/credential_misc.h
@@ -0,0 +1,35 @@
+/*
+ This file is part of GNUnet
+ Copyright (C) 2012-2013 GNUnet e.V.
+
+ GNUnet is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published
+ by the Free Software Foundation; either version 3, or (at your
+ option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GNUnet; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+ */
+/**
+ * @file credential/credential_misc.h
+ * @brief Credential helper functions
+ */
+#ifndef CREDENTIAL_MISC_H
+#define CREDENTIAL_MISC_H
+
+
+
+char*
+GNUNET_CREDENTIAL_credential_to_string (const struct GNUNET_CREDENTIAL_Credential *cred);
+
+struct GNUNET_CREDENTIAL_Credential*
+GNUNET_CREDENTIAL_credential_from_string (const char* str);
+
+#endif
diff --git a/src/credential/credential_serialization.c b/src/credential/credential_serialization.c
new file mode 100644
index 0000000000..1fc72c2033
--- /dev/null
+++ b/src/credential/credential_serialization.c
@@ -0,0 +1,463 @@
+/*
+ This file is part of GNUnet.
+ Copyright (C) 2009-2013, 2016 GNUnet e.V.
+
+ GNUnet is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published
+ by the Free Software Foundation; either version 3, or (at your
+ option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GNUnet; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+
+/**
+ * @file credential/credential_serialization.c
+ * @brief API to serialize and deserialize delegation chains
+ * and credentials
+ * @author Martin Schanzenbach
+ */
+#include "platform.h"
+#include "gnunet_util_lib.h"
+#include "gnunet_constants.h"
+#include "gnunet_credential_service.h"
+#include "gnunet_signatures.h"
+#include "credential.h"
+
+/**
+ * Calculate how many bytes we will need to serialize
+ * the given delegation chain and credential
+ *
+ * @param d_count number of delegation chain entries
+ * @param dd array of #GNUNET_CREDENTIAL_Delegation
+ * @param cd a #GNUNET_CREDENTIAL_Credential
+ * @return the required size to serialize
+ */
+size_t
+GNUNET_CREDENTIAL_delegation_set_get_size (unsigned int ds_count,
+ const struct GNUNET_CREDENTIAL_DelegationSet *dsr)
+{
+ unsigned int i;
+ size_t ret;
+
+ ret = sizeof (struct DelegationRecordData) * (ds_count);
+
+ for (i=0; i<ds_count;i++)
+ {
+ GNUNET_assert ((ret + dsr[i].subject_attribute_len) >= ret);
+ ret += dsr[i].subject_attribute_len;
+ }
+ return ret;
+}
+
+/**
+ * Serizalize the given delegation chain entries and credential
+ *
+ * @param d_count number of delegation chain entries
+ * @param dd array of #GNUNET_CREDENTIAL_Delegation
+ * @param cd a #GNUNET_CREDENTIAL_Credential
+ * @param dest_size size of the destination
+ * @param dest where to store the result
+ * @return the size of the data, -1 on failure
+ */
+ssize_t
+GNUNET_CREDENTIAL_delegation_set_serialize (unsigned int d_count,
+ const struct GNUNET_CREDENTIAL_DelegationSet *dsr,
+ size_t dest_size,
+ char *dest)
+{
+ struct DelegationRecordData rec;
+ unsigned int i;
+ size_t off;
+
+ off = 0;
+ for (i=0;i<d_count;i++)
+ {
+ rec.subject_attribute_len = htonl ((uint32_t) dsr[i].subject_attribute_len);
+ rec.subject_key = dsr[i].subject_key;
+ if (off + sizeof (rec) > dest_size)
+ return -1;
+ GNUNET_memcpy (&dest[off],
+ &rec,
+ sizeof (rec));
+ off += sizeof (rec);
+ if (0 == dsr[i].subject_attribute_len)
+ continue;
+ if (off + dsr[i].subject_attribute_len > dest_size)
+ return -1;
+ GNUNET_memcpy (&dest[off],
+ dsr[i].subject_attribute,
+ dsr[i].subject_attribute_len);
+ off += dsr[i].subject_attribute_len;
+ }
+ return off;
+}
+
+
+/**
+ * Deserialize the given destination
+ *
+ * @param len size of the serialized delegation chain and cred
+ * @param src the serialized data
+ * @param d_count the number of delegation chain entries
+ * @param dd where to put the delegation chain entries
+ * @param cd where to put the credential data
+ * @return #GNUNET_OK on success, #GNUNET_SYSERR on error
+ */
+int
+GNUNET_CREDENTIAL_delegation_set_deserialize (size_t len,
+ const char *src,
+ unsigned int d_count,
+ struct GNUNET_CREDENTIAL_DelegationSet *dsr)
+{
+ struct DelegationRecordData rec;
+ unsigned int i;
+ size_t off;
+
+ off = 0;
+ for (i=0;i<d_count;i++)
+ {
+ if (off + sizeof (rec) > len)
+ return GNUNET_SYSERR;
+ GNUNET_memcpy (&rec, &src[off], sizeof (rec));
+ dsr[i].subject_key = rec.subject_key;
+ off += sizeof (rec);
+ dsr[i].subject_attribute_len = ntohl ((uint32_t) rec.subject_attribute_len);
+ if (off + dsr[i].subject_attribute_len > len)
+ return GNUNET_SYSERR;
+ dsr[i].subject_attribute = (char*)&src[off];
+ off += dsr[i].subject_attribute_len;
+ }
+ return GNUNET_OK;
+}
+
+
+/**
+ * Calculate how many bytes we will need to serialize
+ * the credentials
+ *
+ * @param c_count number of credential entries
+ * @param cd a #GNUNET_CREDENTIAL_Credential
+ * @return the required size to serialize
+ */
+size_t
+GNUNET_CREDENTIAL_credentials_get_size (unsigned int c_count,
+ const struct GNUNET_CREDENTIAL_Credential *cd)
+{
+ unsigned int i;
+ size_t ret;
+
+ ret = sizeof (struct CredentialEntry) * (c_count);
+
+ for (i=0; i<c_count;i++)
+ {
+ GNUNET_assert ((ret + cd[i].issuer_attribute_len) >= ret);
+ ret += cd[i].issuer_attribute_len;
+ }
+ return ret;
+}
+/**
+ * Serizalize the given credentials
+ *
+ * @param c_count number of credential entries
+ * @param cd a #GNUNET_CREDENTIAL_Credential
+ * @param dest_size size of the destination
+ * @param dest where to store the result
+ * @return the size of the data, -1 on failure
+ */
+ssize_t
+GNUNET_CREDENTIAL_credentials_serialize (unsigned int c_count,
+ const struct GNUNET_CREDENTIAL_Credential *cd,
+ size_t dest_size,
+ char *dest)
+{
+ struct CredentialEntry c_rec;
+ unsigned int i;
+ size_t off;
+
+ off = 0;
+ for (i=0;i<c_count;i++)
+ {
+ c_rec.issuer_attribute_len = htonl ((uint32_t) cd[i].issuer_attribute_len);
+ c_rec.issuer_key = cd[i].issuer_key;
+ c_rec.subject_key = cd[i].subject_key;
+ c_rec.signature = cd[i].signature;
+ c_rec.purpose.purpose = htonl (GNUNET_SIGNATURE_PURPOSE_CREDENTIAL);
+ c_rec.purpose.size = htonl ((sizeof (struct CredentialEntry) + cd[i].issuer_attribute_len) - sizeof (struct GNUNET_CRYPTO_EcdsaSignature));
+ c_rec.expiration = GNUNET_htonll (cd[i].expiration.abs_value_us);
+ if (off + sizeof (c_rec) > dest_size)
+ return -1;
+ GNUNET_memcpy (&dest[off],
+ &c_rec,
+ sizeof (c_rec));
+ off += sizeof (c_rec);
+ if (off + cd[i].issuer_attribute_len > dest_size)
+ return -1;
+ GNUNET_memcpy (&dest[off],
+ cd[i].issuer_attribute,
+ cd[i].issuer_attribute_len);
+ off += cd[i].issuer_attribute_len;
+ }
+
+ return off;
+}
+
+
+
+/**
+ * Deserialize the given destination
+ *
+ * @param len size of the serialized creds
+ * @param src the serialized data
+ * @param c_count the number of credential entries
+ * @param cd where to put the credential data
+ * @return #GNUNET_OK on success, #GNUNET_SYSERR on error
+ */
+int
+GNUNET_CREDENTIAL_credentials_deserialize (size_t len,
+ const char *src,
+ unsigned int c_count,
+ struct GNUNET_CREDENTIAL_Credential *cd)
+{
+ struct CredentialEntry c_rec;
+ unsigned int i;
+ size_t off;
+
+ off = 0;
+ for (i=0;i<c_count;i++)
+ {
+ if (off + sizeof (c_rec) > len)
+ return GNUNET_SYSERR;
+ GNUNET_memcpy (&c_rec, &src[off], sizeof (c_rec));
+ cd[i].issuer_attribute_len = ntohl ((uint32_t) c_rec.issuer_attribute_len);
+ cd[i].issuer_key = c_rec.issuer_key;
+ cd[i].subject_key = c_rec.subject_key;
+ cd[i].signature = c_rec.signature;
+ cd[i].expiration.abs_value_us = GNUNET_ntohll(c_rec.expiration);
+ off += sizeof (c_rec);
+ if (off + cd[i].issuer_attribute_len > len)
+ return GNUNET_SYSERR;
+ cd[i].issuer_attribute = &src[off];
+ off += cd[i].issuer_attribute_len;
+ }
+ return GNUNET_OK;
+}
+
+
+
+/**
+ * Calculate how many bytes we will need to serialize
+ * the given delegation chain and credential
+ *
+ * @param d_count number of delegation chain entries
+ * @param dd array of #GNUNET_CREDENTIAL_Delegation
+ * @param c_count number of credential entries
+ * @param cd a #GNUNET_CREDENTIAL_Credential
+ * @return the required size to serialize
+ */
+size_t
+GNUNET_CREDENTIAL_delegation_chain_get_size (unsigned int d_count,
+ const struct GNUNET_CREDENTIAL_Delegation *dd,
+ unsigned int c_count,
+ const struct GNUNET_CREDENTIAL_Credential *cd)
+{
+ unsigned int i;
+ size_t ret;
+
+ ret = sizeof (struct ChainEntry) * (d_count);
+
+ for (i=0; i<d_count;i++)
+ {
+ GNUNET_assert ((ret +
+ dd[i].issuer_attribute_len +
+ dd[i].subject_attribute_len) >= ret);
+ ret += dd[i].issuer_attribute_len + dd[i].subject_attribute_len;
+ }
+ return ret+GNUNET_CREDENTIAL_credentials_get_size(c_count, cd);
+ return ret;
+}
+
+/**
+ * Serizalize the given delegation chain entries and credential
+ *
+ * @param d_count number of delegation chain entries
+ * @param dd array of #GNUNET_CREDENTIAL_Delegation
+ * @param c_count number of credential entries
+ * @param cd a #GNUNET_CREDENTIAL_Credential
+ * @param dest_size size of the destination
+ * @param dest where to store the result
+ * @return the size of the data, -1 on failure
+ */
+ssize_t
+GNUNET_CREDENTIAL_delegation_chain_serialize (unsigned int d_count,
+ const struct GNUNET_CREDENTIAL_Delegation *dd,
+ unsigned int c_count,
+ const struct GNUNET_CREDENTIAL_Credential *cd,
+ size_t dest_size,
+ char *dest)
+{
+ struct ChainEntry rec;
+ unsigned int i;
+ size_t off;
+
+ off = 0;
+ for (i=0;i<d_count;i++)
+ {
+ rec.issuer_attribute_len = htonl ((uint32_t) dd[i].issuer_attribute_len);
+ rec.subject_attribute_len = htonl ((uint32_t) dd[i].subject_attribute_len);
+ rec.issuer_key = dd[i].issuer_key;
+ rec.subject_key = dd[i].subject_key;
+ if (off + sizeof (rec) > dest_size)
+ return -1;
+ GNUNET_memcpy (&dest[off],
+ &rec,
+ sizeof (rec));
+ off += sizeof (rec);
+ if (off + dd[i].issuer_attribute_len > dest_size)
+ return -1;
+ GNUNET_memcpy (&dest[off],
+ dd[i].issuer_attribute,
+ dd[i].issuer_attribute_len);
+ off += dd[i].issuer_attribute_len;
+ if (0 == dd[i].subject_attribute_len)
+ continue;
+ if (off + dd[i].subject_attribute_len > dest_size)
+ return -1;
+ GNUNET_memcpy (&dest[off],
+ dd[i].subject_attribute,
+ dd[i].subject_attribute_len);
+ off += dd[i].subject_attribute_len;
+ }
+ return off+GNUNET_CREDENTIAL_credentials_serialize (c_count,
+ cd,
+ dest_size-off,
+ &dest[off]);
+}
+
+
+/**
+ * Deserialize the given destination
+ *
+ * @param len size of the serialized delegation chain and cred
+ * @param src the serialized data
+ * @param d_count the number of delegation chain entries
+ * @param dd where to put the delegation chain entries
+ * @param c_count the number of credential entries
+ * @param cd where to put the credential data
+ * @return #GNUNET_OK on success, #GNUNET_SYSERR on error
+ */
+int
+GNUNET_CREDENTIAL_delegation_chain_deserialize (size_t len,
+ const char *src,
+ unsigned int d_count,
+ struct GNUNET_CREDENTIAL_Delegation *dd,
+ unsigned int c_count,
+ struct GNUNET_CREDENTIAL_Credential *cd)
+{
+ struct ChainEntry rec;
+ unsigned int i;
+ size_t off;
+
+ off = 0;
+ for (i=0;i<d_count;i++)
+ {
+ if (off + sizeof (rec) > len)
+ return GNUNET_SYSERR;
+ GNUNET_memcpy (&rec, &src[off], sizeof (rec));
+ dd[i].issuer_attribute_len = ntohl ((uint32_t) rec.issuer_attribute_len);
+ dd[i].issuer_key = rec.issuer_key;
+ dd[i].subject_key = rec.subject_key;
+ off += sizeof (rec);
+ if (off + dd[i].issuer_attribute_len > len)
+ return GNUNET_SYSERR;
+ dd[i].issuer_attribute = &src[off];
+ off += dd[i].issuer_attribute_len;
+ dd[i].subject_attribute_len = ntohl ((uint32_t) rec.subject_attribute_len);
+ if (off + dd[i].subject_attribute_len > len)
+ return GNUNET_SYSERR;
+ dd[i].subject_attribute = &src[off];
+ off += dd[i].subject_attribute_len;
+ }
+ return GNUNET_CREDENTIAL_credentials_deserialize (len-off,
+ &src[off],
+ c_count,
+ cd);
+}
+int
+GNUNET_CREDENTIAL_credential_serialize (struct GNUNET_CREDENTIAL_Credential *cred,
+ char **data)
+{
+ size_t size;
+ struct CredentialEntry *cdata;
+
+ size = sizeof (struct CredentialEntry) + strlen (cred->issuer_attribute) + 1;
+ *data = GNUNET_malloc (size);
+ cdata = (struct CredentialEntry*)*data;
+ cdata->subject_key = cred->subject_key;
+ cdata->issuer_key = cred->issuer_key;
+ cdata->expiration = GNUNET_htonll (cred->expiration.abs_value_us);
+ cdata->signature = cred->signature;
+ cdata->issuer_attribute_len = htonl (strlen (cred->issuer_attribute) + 1);
+ cdata->purpose.purpose = htonl (GNUNET_SIGNATURE_PURPOSE_CREDENTIAL);
+ cdata->purpose.size = htonl (size - sizeof (struct GNUNET_CRYPTO_EcdsaSignature));
+ GNUNET_memcpy (&cdata[1],
+ cred->issuer_attribute,
+ strlen (cred->issuer_attribute));
+
+ if(GNUNET_OK != GNUNET_CRYPTO_ecdsa_verify(GNUNET_SIGNATURE_PURPOSE_CREDENTIAL,
+ &cdata->purpose,
+ &cdata->signature,
+ &cdata->issuer_key))
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+ "Invalid credential\n");
+ //return NULL;
+ }
+ return size;
+}
+
+struct GNUNET_CREDENTIAL_Credential*
+GNUNET_CREDENTIAL_credential_deserialize (const char* data,
+ size_t data_size)
+{
+ struct GNUNET_CREDENTIAL_Credential *cred;
+ struct CredentialEntry *cdata;
+ char *issuer_attribute;
+
+ if (data_size < sizeof (struct CredentialEntry))
+ return NULL;
+ cdata = (struct CredentialEntry*)data;
+ if(GNUNET_OK != GNUNET_CRYPTO_ecdsa_verify(GNUNET_SIGNATURE_PURPOSE_CREDENTIAL,
+ &cdata->purpose,
+ &cdata->signature,
+ &cdata->issuer_key))
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+ "Invalid credential\n");
+ //return NULL;
+ }
+ issuer_attribute = (char*)&cdata[1];
+
+ cred = GNUNET_malloc (sizeof (struct GNUNET_CREDENTIAL_Credential) + ntohl(cdata->issuer_attribute_len));
+
+ cred->issuer_key = cdata->issuer_key;
+ cred->subject_key = cdata->subject_key;
+ GNUNET_memcpy (&cred[1],
+ issuer_attribute,
+ ntohl (cdata->issuer_attribute_len));
+ cred->signature = cdata->signature;
+ cred->issuer_attribute = (char*)&cred[1];
+ cred->expiration.abs_value_us = GNUNET_ntohll (cdata->expiration);
+ return cred;
+}
+
+
+/* end of credential_serialization.c */
diff --git a/src/credential/credential_serialization.h b/src/credential/credential_serialization.h
new file mode 100644
index 0000000000..b870d47dce
--- /dev/null
+++ b/src/credential/credential_serialization.h
@@ -0,0 +1,159 @@
+/*
+ This file is part of GNUnet.
+ Copyright (C) 2009-2013, 2016 GNUnet e.V.
+
+ GNUnet is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published
+ by the Free Software Foundation; either version 3, or (at your
+ option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GNUnet; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+
+/**
+ * @file credential/credential_serialization.h
+ * @brief API to serialize and deserialize delegation chains
+ * and credentials
+ * @author Martin Schanzenbach
+ */
+#ifndef CREDENTIAL_SERIALIZATION_H
+#define CREDENTIAL_SERIALIZATION_H
+
+#include "platform.h"
+#include "gnunet_util_lib.h"
+#include "gnunet_constants.h"
+#include "gnunet_credential_service.h"
+
+/**
+ * Calculate how many bytes we will need to serialize
+ * the given delegation record
+ *
+ * @param ds_count number of delegation chain entries
+ * @param dsr array of #GNUNET_CREDENTIAL_Delegation
+ * @return the required size to serialize
+ */
+size_t
+GNUNET_CREDENTIAL_delegation_set_get_size (unsigned int ds_count,
+ const struct GNUNET_CREDENTIAL_DelegationSet *dsr);
+
+/**
+ * Serizalize the given delegation record entries
+ *
+ * @param d_count number of delegation chain entries
+ * @param dsr array of #GNUNET_CREDENTIAL_Delegation
+ * @param dest_size size of the destination
+ * @param dest where to store the result
+ * @return the size of the data, -1 on failure
+ */
+ssize_t
+GNUNET_CREDENTIAL_delegation_set_serialize (unsigned int d_count,
+ const struct GNUNET_CREDENTIAL_DelegationSet *dsr,
+ size_t dest_size,
+ char *dest);
+
+
+/**
+ * Deserialize the given destination
+ *
+ * @param len size of the serialized delegation recird
+ * @param src the serialized data
+ * @param d_count the number of delegation chain entries
+ * @param dsr where to put the delegation chain entries
+ * @return #GNUNET_OK on success, #GNUNET_SYSERR on error
+ */
+int
+GNUNET_CREDENTIAL_delegation_set_deserialize (size_t len,
+ const char *src,
+ unsigned int d_count,
+ struct GNUNET_CREDENTIAL_DelegationSet *dsr);
+
+ /**
+ * Calculate how many bytes we will need to serialize
+ * the given delegation chain and credential
+ *
+ * @param d_count number of delegation chain entries
+ * @param dd array of #GNUNET_CREDENTIAL_Delegation
+ * @param c_count number of credential entries
+ * @param cd a #GNUNET_CREDENTIAL_Credential
+ * @return the required size to serialize
+ */
+ size_t
+ GNUNET_CREDENTIAL_delegation_chain_get_size (unsigned int d_count,
+ const struct GNUNET_CREDENTIAL_Delegation *dd,
+ unsigned int c_count,
+ const struct GNUNET_CREDENTIAL_Credential *cd);
+
+ /**
+ * Serizalize the given delegation chain entries and credential
+ *
+ * @param d_count number of delegation chain entries
+ * @param dd array of #GNUNET_CREDENTIAL_Delegation
+ * @param c_count number of credential entries
+ * @param cd a #GNUNET_CREDENTIAL_Credential
+ * @param dest_size size of the destination
+ * @param dest where to store the result
+ * @return the size of the data, -1 on failure
+ */
+ ssize_t
+ GNUNET_CREDENTIAL_delegation_chain_serialize (unsigned int d_count,
+ const struct GNUNET_CREDENTIAL_Delegation *dd,
+ unsigned int c_count,
+ const struct GNUNET_CREDENTIAL_Credential *cd,
+ size_t dest_size,
+ char *dest);
+
+
+ /**
+ * Deserialize the given destination
+ *
+ * @param len size of the serialized delegation chain and cred
+ * @param src the serialized data
+ * @param d_count the number of delegation chain entries
+ * @param dd where to put the delegation chain entries
+ * @param c_count number of credential entries
+ * @param cd where to put the credential data
+ * @return #GNUNET_OK on success, #GNUNET_SYSERR on error
+ */
+ int
+ GNUNET_CREDENTIAL_delegation_chain_deserialize (size_t len,
+ const char *src,
+ unsigned int d_count,
+ struct GNUNET_CREDENTIAL_Delegation *dd,
+ unsigned int c_count,
+ struct GNUNET_CREDENTIAL_Credential *cd);
+ size_t
+ GNUNET_CREDENTIAL_credentials_get_size (unsigned int c_count,
+ const struct GNUNET_CREDENTIAL_Credential *cd);
+
+ssize_t
+GNUNET_CREDENTIAL_credentials_serialize (unsigned int c_count,
+ const struct GNUNET_CREDENTIAL_Credential *cd,
+ size_t dest_size,
+ char *dest);
+
+
+int
+GNUNET_CREDENTIAL_credentials_deserialize (size_t len,
+ const char *src,
+ unsigned int c_count,
+ struct GNUNET_CREDENTIAL_Credential *cd);
+
+
+int
+GNUNET_CREDENTIAL_credential_serialize (struct GNUNET_CREDENTIAL_Credential *cred,
+ char **data);
+
+struct GNUNET_CREDENTIAL_Credential*
+GNUNET_CREDENTIAL_credential_deserialize (const char* data,
+ size_t data_size);
+#endif
+/* end of credential_serialization.h */
diff --git a/src/credential/gnunet-credential.c b/src/credential/gnunet-credential.c
new file mode 100644
index 0000000000..4a6dc5ccdf
--- /dev/null
+++ b/src/credential/gnunet-credential.c
@@ -0,0 +1,602 @@
+/*
+ This file is part of GNUnet.
+ Copyright (C) 2012-2013 GNUnet e.V.
+
+ GNUnet is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published
+ by the Free Software Foundation; either version 3, or (at your
+ option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GNUnet; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+/**
+ * @file gnunet-credential.c
+ * @brief command line tool to access command line Credential service
+ * @author Adnan Husain
+ */
+#include "platform.h"
+#include <gnunet_util_lib.h>
+#include <gnunet_credential_service.h>
+#include <gnunet_gnsrecord_lib.h>
+#include "credential_misc.h"
+#include "credential_serialization.h"
+
+/**
+ * Configuration we are using.
+ */
+static const struct GNUNET_CONFIGURATION_Handle *cfg;
+
+/**
+ * EgoLookup
+ */
+static struct GNUNET_IDENTITY_EgoLookup *el;
+
+/**
+ * Handle to Credential service.
+ */
+static struct GNUNET_CREDENTIAL_Handle *credential;
+
+/**
+ * Desired timeout for the lookup (default is no timeout).
+ */
+static struct GNUNET_TIME_Relative timeout;
+
+/**
+ * Handle to verify request
+ */
+static struct GNUNET_CREDENTIAL_Request *verify_request;
+
+/**
+ * Handle to collect request
+ */
+static struct GNUNET_CREDENTIAL_Request *collect_request;
+
+/**
+ * Task scheduled to handle timeout.
+ */
+static struct GNUNET_SCHEDULER_Task *tt;
+
+/**
+ * Subject pubkey string
+ */
+static char *subject_key;
+
+/**
+ * Subject credential string
+ */
+static char *subject_credential;
+
+/**
+ * Credential TTL
+ */
+static char *expiration;
+
+/**
+ * Subject key
+ */
+struct GNUNET_CRYPTO_EcdsaPublicKey subject_pkey;
+
+/**
+ * Issuer key
+ */
+struct GNUNET_CRYPTO_EcdsaPublicKey issuer_pkey;
+
+
+/**
+ * Issuer pubkey string
+ */
+static char *issuer_key;
+
+/**
+ * ego
+ */
+static char *ego_name;
+
+/**
+ * Issuer attribute
+ */
+static char *issuer_attr;
+
+/**
+ * Verify mode
+ */
+static int verify;
+
+/**
+ * Issue mode
+ */
+static int create_cred;
+
+/**
+ * Collect mode
+ */
+static int collect;
+
+/**
+ * Task run on shutdown. Cleans up everything.
+ *
+ * @param cls unused
+ */
+static void
+do_shutdown (void *cls)
+{
+ if (NULL != verify_request)
+ {
+ GNUNET_CREDENTIAL_request_cancel (verify_request);
+ verify_request = NULL;
+ }
+ if (NULL != credential)
+ {
+ GNUNET_CREDENTIAL_disconnect (credential);
+ credential = NULL;
+ }
+ if (NULL != tt)
+ {
+ GNUNET_SCHEDULER_cancel (tt);
+ tt = NULL;
+ }
+}
+
+
+/**
+ * Task run on timeout. Triggers shutdown.
+ *
+ * @param cls unused
+ */
+static void
+do_timeout (void *cls)
+{
+ tt = NULL;
+ GNUNET_SCHEDULER_shutdown ();
+}
+
+/**
+ * Function called with the result of a Credential lookup.
+ *
+ * @param cls the 'const char *' name that was resolved
+ * @param cd_count number of records returned
+ * @param cd array of @a cd_count records with the results
+ */
+static void
+handle_collect_result (void *cls,
+ unsigned int d_count,
+ struct GNUNET_CREDENTIAL_Delegation *dc,
+ unsigned int c_count,
+ struct GNUNET_CREDENTIAL_Credential *cred)
+{
+ int i;
+ char* line;
+
+ verify_request = NULL;
+ if (NULL != cred)
+ {
+ for (i=0;i<c_count;i++)
+ {
+ line = GNUNET_CREDENTIAL_credential_to_string (&cred[i]);
+ printf ("%s\n",
+ line);
+ GNUNET_free (line);
+ }
+ }
+
+
+ GNUNET_SCHEDULER_shutdown ();
+}
+
+
+/**
+ * Function called with the result of a Credential lookup.
+ *
+ * @param cls the 'const char *' name that was resolved
+ * @param cd_count number of records returned
+ * @param cd array of @a cd_count records with the results
+ */
+static void
+handle_verify_result (void *cls,
+ unsigned int d_count,
+ struct GNUNET_CREDENTIAL_Delegation *dc,
+ unsigned int c_count,
+ struct GNUNET_CREDENTIAL_Credential *cred)
+{
+ int i;
+ char* iss_key;
+ char* sub_key;
+
+ verify_request = NULL;
+ if (NULL == cred)
+ printf ("Failed.\n");
+ else
+ {
+ printf("Delegation Chain:\n");
+ for (i=0;i<d_count;i++)
+ {
+ iss_key = GNUNET_CRYPTO_ecdsa_public_key_to_string (&dc[i].issuer_key);
+ sub_key = GNUNET_CRYPTO_ecdsa_public_key_to_string (&dc[i].subject_key);
+ if (0 != dc[i].subject_attribute_len)
+ {
+ printf ("(%d) %s.%s <- %s.%s\n", i,
+ iss_key, dc[i].issuer_attribute,
+ sub_key, dc[i].subject_attribute);
+ } else {
+ printf ("(%d) %s.%s <- %s\n", i,
+ iss_key, dc[i].issuer_attribute,
+ sub_key);
+ }
+ GNUNET_free (iss_key);
+ GNUNET_free (sub_key);
+ }
+ printf("\nCredentials:\n");
+ for (i=0;i<c_count;i++)
+ {
+ iss_key = GNUNET_CRYPTO_ecdsa_public_key_to_string (&cred[i].issuer_key);
+ sub_key = GNUNET_CRYPTO_ecdsa_public_key_to_string (&cred[i].subject_key);
+ printf ("%s.%s <- %s\n",
+ iss_key, cred[i].issuer_attribute,
+ sub_key);
+ GNUNET_free (iss_key);
+ GNUNET_free (sub_key);
+
+ }
+ printf ("Successful.\n");
+ }
+
+
+ GNUNET_SCHEDULER_shutdown ();
+}
+
+/**
+ * Callback invoked from identity service with ego information.
+ * An @a ego of NULL means the ego was not found.
+ *
+ * @param cls closure with the configuration
+ * @param ego an ego known to identity service, or NULL
+ */
+static void
+identity_cb (void *cls,
+ const struct GNUNET_IDENTITY_Ego *ego)
+{
+ const struct GNUNET_CRYPTO_EcdsaPrivateKey *privkey;
+ struct GNUNET_CREDENTIAL_Credential *crd;
+ struct GNUNET_TIME_Absolute etime_abs;
+ struct GNUNET_TIME_Relative etime_rel;
+ char *res;
+
+ el = NULL;
+ if (NULL == ego)
+ {
+ if (NULL != ego_name)
+ {
+ fprintf (stderr,
+ _("Ego `%s' not known to identity service\n"),
+ ego_name);
+ }
+ GNUNET_SCHEDULER_shutdown ();
+ return;
+ }
+
+ if (GNUNET_YES == collect)
+ {
+
+ if (GNUNET_OK !=
+ GNUNET_CRYPTO_ecdsa_public_key_from_string (issuer_key,
+ strlen (issuer_key),
+ &issuer_pkey))
+ {
+ fprintf (stderr,
+ _("Issuer public key `%s' is not well-formed\n"),
+ issuer_key);
+ GNUNET_SCHEDULER_shutdown ();
+ }
+ privkey = GNUNET_IDENTITY_ego_get_private_key (ego);
+
+ collect_request = GNUNET_CREDENTIAL_collect(credential,
+ &issuer_pkey,
+ issuer_attr, //TODO argument
+ privkey,
+ &handle_collect_result,
+ NULL);
+ return;
+ }
+
+ //Else issue
+
+ if (NULL == expiration)
+ {
+ fprintf (stderr,
+ "Please specify a TTL\n");
+ GNUNET_SCHEDULER_shutdown ();
+ return;
+ } else if (GNUNET_OK == GNUNET_STRINGS_fancy_time_to_relative (expiration,
+ &etime_rel))
+ {
+ etime_abs = GNUNET_TIME_relative_to_absolute (etime_rel);
+ } else if (GNUNET_OK != GNUNET_STRINGS_fancy_time_to_absolute (expiration,
+ &etime_abs))
+ {
+ fprintf (stderr,
+ "%s is not a valid ttl!\n",
+ expiration);
+ GNUNET_SCHEDULER_shutdown ();
+ return;
+ }
+
+
+ privkey = GNUNET_IDENTITY_ego_get_private_key (ego);
+ GNUNET_free_non_null (ego_name);
+ ego_name = NULL;
+ crd = GNUNET_CREDENTIAL_credential_issue (privkey,
+ &subject_pkey,
+ issuer_attr,
+ &etime_abs);
+
+ res = GNUNET_CREDENTIAL_credential_to_string (crd);
+ GNUNET_free (crd);
+ printf ("%s\n", res);
+ GNUNET_SCHEDULER_shutdown ();
+}
+
+
+
+
+/**
+ * Main function that will be run.
+ *
+ * @param cls closure
+ * @param args remaining command-line arguments
+ * @param cfgfile name of the configuration file used (for saving, can be NULL!)
+ * @param c configuration
+ */
+static void
+run (void *cls,
+ char *const *args,
+ const char *cfgfile,
+ const struct GNUNET_CONFIGURATION_Handle *c)
+{
+
+ cfg = c;
+
+
+ tt = GNUNET_SCHEDULER_add_delayed (timeout,
+ &do_timeout, NULL);
+ GNUNET_SCHEDULER_add_shutdown (&do_shutdown, NULL);
+
+ if (GNUNET_YES == collect) {
+ if (NULL == issuer_key)
+ {
+ fprintf (stderr,
+ _("Issuer public key not well-formed\n"));
+ GNUNET_SCHEDULER_shutdown ();
+ return;
+
+ }
+
+ credential = GNUNET_CREDENTIAL_connect (cfg);
+
+ if (NULL == credential)
+ {
+ fprintf (stderr,
+ _("Failed to connect to CREDENTIAL\n"));
+ GNUNET_SCHEDULER_shutdown ();
+ }
+ if (NULL == issuer_attr)
+ {
+ fprintf (stderr,
+ _("You must provide issuer the attribute\n"));
+ GNUNET_SCHEDULER_shutdown ();
+ }
+
+ if (NULL == ego_name)
+ {
+ fprintf (stderr,
+ _("ego required\n"));
+ GNUNET_SCHEDULER_shutdown ();
+ return;
+
+ }
+ el = GNUNET_IDENTITY_ego_lookup (cfg,
+ ego_name,
+ &identity_cb,
+ (void *) cfg);
+ return;
+
+ }
+
+ if (NULL == subject_key)
+ {
+ fprintf (stderr,
+ _("Subject public key needed\n"));
+ GNUNET_SCHEDULER_shutdown ();
+ return;
+
+ }
+ if (GNUNET_OK !=
+ GNUNET_CRYPTO_ecdsa_public_key_from_string (subject_key,
+ strlen (subject_key),
+ &subject_pkey))
+ {
+ fprintf (stderr,
+ _("Subject public key `%s' is not well-formed\n"),
+ subject_key);
+ GNUNET_SCHEDULER_shutdown ();
+ return;
+ }
+ if (GNUNET_YES == verify) {
+ if (NULL == issuer_key)
+ {
+ fprintf (stderr,
+ _("Issuer public key not well-formed\n"));
+ GNUNET_SCHEDULER_shutdown ();
+ return;
+
+ }
+ if (GNUNET_OK !=
+ GNUNET_CRYPTO_ecdsa_public_key_from_string (issuer_key,
+ strlen (issuer_key),
+ &issuer_pkey))
+ {
+ fprintf (stderr,
+ _("Issuer public key `%s' is not well-formed\n"),
+ issuer_key);
+ GNUNET_SCHEDULER_shutdown ();
+ }
+ credential = GNUNET_CREDENTIAL_connect (cfg);
+
+ if (NULL == credential)
+ {
+ fprintf (stderr,
+ _("Failed to connect to CREDENTIAL\n"));
+ GNUNET_SCHEDULER_shutdown ();
+ }
+ if (NULL == issuer_attr || NULL == subject_credential)
+ {
+ fprintf (stderr,
+ _("You must provide issuer and subject attributes\n"));
+ GNUNET_SCHEDULER_shutdown ();
+ }
+
+ //Subject credentials are comma separated
+ char *tmp = GNUNET_strdup (subject_credential);
+ char *tok = strtok (tmp, ",");
+ if (NULL == tok)
+ {
+ fprintf (stderr,
+ "Invalid subject credentials\n");
+ GNUNET_free (tmp);
+ GNUNET_SCHEDULER_shutdown ();
+ }
+ int count = 1;
+ int i;
+ while (NULL != (tok = strtok(NULL, ",")))
+ count++;
+ struct GNUNET_CREDENTIAL_Credential credentials[count];
+ struct GNUNET_CREDENTIAL_Credential *cred;
+ GNUNET_free (tmp);
+ tmp = GNUNET_strdup (subject_credential);
+ tok = strtok (tmp, ",");
+ for (i=0;i<count;i++)
+ {
+ cred = GNUNET_CREDENTIAL_credential_from_string (tok);
+ GNUNET_memcpy (&credentials[i],
+ cred,
+ sizeof (struct GNUNET_CREDENTIAL_Credential));
+ credentials[i].issuer_attribute = GNUNET_strdup (cred->issuer_attribute);
+ tok = strtok(NULL, ",");
+ GNUNET_free (cred);
+ }
+
+ verify_request = GNUNET_CREDENTIAL_verify(credential,
+ &issuer_pkey,
+ issuer_attr, //TODO argument
+ &subject_pkey,
+ count,
+ credentials,
+ &handle_verify_result,
+ NULL);
+ for (i=0;i<count;i++)
+ {
+ GNUNET_free ((char*)credentials[i].issuer_attribute);
+ }
+ } else if (GNUNET_YES == create_cred) {
+ if (NULL == ego_name)
+ {
+ fprintf (stderr,
+ _("Issuer ego required\n"));
+ GNUNET_SCHEDULER_shutdown ();
+ return;
+
+ }
+ el = GNUNET_IDENTITY_ego_lookup (cfg,
+ ego_name,
+ &identity_cb,
+ (void *) cfg);
+ return;
+ } else {
+ fprintf (stderr,
+ _("Please specify name to lookup, subject key and issuer key!\n"));
+ GNUNET_SCHEDULER_shutdown ();
+ }
+ return;
+}
+
+
+/**
+ * The main function for gnunet-gns.
+ *
+ * @param argc number of arguments from the command line
+ * @param argv command line arguments
+ * @return 0 ok, 1 on error
+ */
+int
+main (int argc, char *const *argv)
+{
+ struct GNUNET_GETOPT_CommandLineOption options[] = {
+ GNUNET_GETOPT_option_flag ('I',
+ "issue",
+ gettext_noop ("create credential"),
+ &create_cred),
+ GNUNET_GETOPT_option_flag ('V',
+ "verify",
+ gettext_noop ("verify credential against attribute"),
+ &verify),
+ GNUNET_GETOPT_option_string ('s',
+ "subject",
+ "PKEY",
+ gettext_noop ("The public key of the subject to lookup the credential for"),
+ &subject_key),
+ GNUNET_GETOPT_option_string ('b',
+ "credential",
+ "CRED",
+ gettext_noop ("The name of the credential presented by the subject"),
+ &subject_credential),
+ GNUNET_GETOPT_option_string ('i',
+ "issuer",
+ "PKEY",
+ gettext_noop ("The public key of the authority to verify the credential against"),
+ &issuer_key),
+ GNUNET_GETOPT_option_string ('e',
+ "ego",
+ "EGO",
+ gettext_noop ("The ego to use"),
+ &ego_name),
+ GNUNET_GETOPT_option_string ('a',
+ "attribute",
+ "ATTR",
+ gettext_noop ("The issuer attribute to verify against or to issue"),
+ &issuer_attr),
+ GNUNET_GETOPT_option_string ('T',
+ "ttl",
+ "EXP",
+ gettext_noop ("The time to live for the credential"),
+ &expiration),
+ GNUNET_GETOPT_option_flag ('g',
+ "collect",
+ gettext_noop ("collect credentials"),
+ &collect),
+ GNUNET_GETOPT_OPTION_END
+ };
+ int ret;
+
+ timeout = GNUNET_TIME_UNIT_FOREVER_REL;
+ if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv))
+ return 2;
+
+ GNUNET_log_setup ("gnunet-credential", "WARNING", NULL);
+ ret =
+ (GNUNET_OK ==
+ GNUNET_PROGRAM_run (argc, argv, "gnunet-credential",
+ _("GNUnet credential resolver tool"),
+ options,
+ &run, NULL)) ? 0 : 1;
+ GNUNET_free ((void*) argv);
+ return ret;
+}
+
+/* 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 0000000000..be75e485ec
--- /dev/null
+++ b/src/credential/gnunet-service-credential.c
@@ -0,0 +1,1238 @@
+/*
+ This file is part of GNUnet.
+ Copyright (C) 2011-2013 GNUnet e.V.
+
+ GNUnet is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published
+ by the Free Software Foundation; either version 3, or (at your
+ option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GNUnet; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+/**
+ * @file gns/gnunet-service-credential.c
+ * @brief GNU Credential Service (main service)
+ * @author Adnan Husain
+ */
+#include "platform.h"
+#include "gnunet_util_lib.h"
+#include "gnunet_credential_service.h"
+#include "gnunet_statistics_service.h"
+#include "credential.h"
+#include "credential_serialization.h"
+#include "gnunet_protocols.h"
+#include "gnunet_signatures.h"
+
+#include <gnunet_dnsparser_lib.h>
+#include <gnunet_identity_service.h>
+#include <gnunet_gnsrecord_lib.h>
+#include <gnunet_namestore_service.h>
+#include <gnunet_gns_service.h>
+
+
+#define GNUNET_CREDENTIAL_MAX_LENGTH 255
+
+struct VerifyRequestHandle;
+
+struct DelegationSetQueueEntry;
+
+
+struct DelegationChainEntry
+{
+ /**
+ * DLL
+ */
+ struct DelegationChainEntry *next;
+
+ /**
+ * DLL
+ */
+ struct DelegationChainEntry *prev;
+
+ /**
+ * The issuer
+ */
+ struct GNUNET_CRYPTO_EcdsaPublicKey issuer_key;
+
+ /**
+ * The subject
+ */
+ struct GNUNET_CRYPTO_EcdsaPublicKey subject_key;
+
+ /**
+ * The issued attribute
+ */
+ char *issuer_attribute;
+
+ /**
+ * The delegated attribute
+ */
+ char *subject_attribute;
+};
+
+/**
+ * DLL for record
+ */
+struct CredentialRecordEntry
+{
+ /**
+ * DLL
+ */
+ struct CredentialRecordEntry *next;
+
+ /**
+ * DLL
+ */
+ struct CredentialRecordEntry *prev;
+
+ /**
+ * Number of references in delegation chains
+ */
+ uint32_t refcount;
+
+ /**
+ * Payload
+ */
+ struct GNUNET_CREDENTIAL_Credential *credential;
+};
+
+/**
+ * DLL used for delegations
+ * Used for OR delegations
+ */
+struct DelegationQueueEntry
+{
+ /**
+ * DLL
+ */
+ struct DelegationQueueEntry *next;
+
+ /**
+ * DLL
+ */
+ struct DelegationQueueEntry *prev;
+
+ /**
+ * Sets under this Queue
+ */
+ struct DelegationSetQueueEntry *set_entries_head;
+
+ /**
+ * Sets under this Queue
+ */
+ struct DelegationSetQueueEntry *set_entries_tail;
+
+ /**
+ * Parent set
+ */
+ struct DelegationSetQueueEntry *parent_set;
+
+ /**
+ * Required solutions
+ */
+ uint32_t required_solutions;
+};
+
+/**
+ * DLL for delegation sets
+ * Used for AND delegation set
+ */
+struct DelegationSetQueueEntry
+{
+ /**
+ * DLL
+ */
+ struct DelegationSetQueueEntry *next;
+
+ /**
+ * DLL
+ */
+ struct DelegationSetQueueEntry *prev;
+
+ /**
+ * GNS handle
+ */
+ struct GNUNET_GNS_LookupRequest *lookup_request;
+
+ /**
+ * Verify handle
+ */
+ struct VerifyRequestHandle *handle;
+
+ /**
+ * Parent attribute delegation
+ */
+ struct DelegationQueueEntry *parent;
+
+ /**
+ * Issuer key
+ */
+ struct GNUNET_CRYPTO_EcdsaPublicKey *issuer_key;
+
+ /**
+ * Queue entries of this set
+ */
+ struct DelegationQueueEntry *queue_entries_head;
+
+ /**
+ * Queue entries of this set
+ */
+ struct DelegationQueueEntry *queue_entries_tail;
+
+ /**
+ * Parent QueueEntry
+ */
+ struct DelegationQueueEntry *parent_queue_entry;
+
+ /**
+ * Issuer attribute delegated to
+ */
+ char *issuer_attribute;
+
+ /**
+ * The current attribute to look up
+ */
+ char *lookup_attribute;
+
+ /**
+ * Trailing attribute context
+ */
+ char *attr_trailer;
+
+ /**
+ * Still to resolve delegation as string
+ */
+ char *unresolved_attribute_delegation;
+
+ /**
+ * The delegation chain entry
+ */
+ struct DelegationChainEntry *delegation_chain_entry;
+
+};
+
+
+/**
+ * Handle to a lookup operation from api
+ */
+struct VerifyRequestHandle
+{
+
+ /**
+ * We keep these in a DLL.
+ */
+ struct VerifyRequestHandle *next;
+
+ /**
+ * We keep these in a DLL.
+ */
+ struct VerifyRequestHandle *prev;
+
+ /**
+ * Handle to the requesting client
+ */
+ struct GNUNET_SERVICE_Client *client;
+
+ /**
+ * GNS handle
+ */
+ struct GNUNET_GNS_LookupRequest *lookup_request;
+
+ /**
+ * Size of delegation tree
+ */
+ uint32_t delegation_chain_size;
+
+ /**
+ * Children of this attribute
+ */
+ struct DelegationChainEntry *delegation_chain_head;
+
+ /**
+ * Children of this attribute
+ */
+ struct DelegationChainEntry *delegation_chain_tail;
+
+ /**
+ * Issuer public key
+ */
+ struct GNUNET_CRYPTO_EcdsaPublicKey issuer_key;
+
+ /**
+ * Issuer attribute
+ */
+ char *issuer_attribute;
+
+ /**
+ * Subject public key
+ */
+ struct GNUNET_CRYPTO_EcdsaPublicKey subject_key;
+
+ /**
+ * Credential DLL
+ */
+ struct CredentialRecordEntry *cred_chain_head;
+
+ /**
+ * Credential DLL
+ */
+ struct CredentialRecordEntry *cred_chain_tail;
+
+ /**
+ * Credential DLL size
+ */
+ uint32_t cred_chain_size;
+
+ /**
+ * Root Delegation Set
+ */
+ struct DelegationSetQueueEntry *root_set;
+
+ /**
+ * Current Delegation Pointer
+ */
+ struct DelegationQueueEntry *current_delegation;
+
+ /**
+ * request id
+ */
+ uint32_t request_id;
+
+ /**
+ * Pending lookups
+ */
+ uint64_t pending_lookups;
+
+ /**
+ * Credential iterator
+ */
+ struct GNUNET_NAMESTORE_ZoneIterator *cred_collection_iter;
+
+ /**
+ * Collect task
+ */
+ struct GNUNET_SCHEDULER_Task *collect_next_task;
+
+};
+
+
+/**
+ * Head of the DLL.
+ */
+static struct VerifyRequestHandle *vrh_head;
+
+/**
+ * Tail of the DLL.
+ */
+static struct VerifyRequestHandle *vrh_tail;
+
+/**
+ * Handle to the statistics service
+ */
+static struct GNUNET_STATISTICS_Handle *statistics;
+
+/**
+ * Handle to GNS service.
+ */
+static struct GNUNET_GNS_Handle *gns;
+
+
+/**
+ * Handle to namestore service
+ */
+static struct GNUNET_NAMESTORE_Handle *namestore;
+
+static void
+cleanup_delegation_set (struct DelegationSetQueueEntry *ds_entry)
+{
+ struct DelegationQueueEntry *dq_entry;
+ struct DelegationSetQueueEntry *child;
+
+ if (NULL == ds_entry)
+ return;
+
+ for (dq_entry = ds_entry->queue_entries_head;
+ NULL != dq_entry;
+ dq_entry = ds_entry->queue_entries_head)
+ {
+ GNUNET_CONTAINER_DLL_remove (ds_entry->queue_entries_head,
+ ds_entry->queue_entries_tail,
+ dq_entry);
+ for (child = dq_entry->set_entries_head;
+ NULL != child;
+ child = dq_entry->set_entries_head)
+ {
+ GNUNET_CONTAINER_DLL_remove (dq_entry->set_entries_head,
+ dq_entry->set_entries_tail,
+ child);
+ cleanup_delegation_set (child);
+ }
+ GNUNET_free (dq_entry);
+ }
+ if (NULL != ds_entry->issuer_key)
+ GNUNET_free (ds_entry->issuer_key);
+ if (NULL != ds_entry->lookup_attribute)
+ GNUNET_free (ds_entry->lookup_attribute);
+ if (NULL != ds_entry->issuer_attribute)
+ GNUNET_free (ds_entry->issuer_attribute);
+ if (NULL != ds_entry->unresolved_attribute_delegation)
+ GNUNET_free (ds_entry->unresolved_attribute_delegation);
+ if (NULL != ds_entry->attr_trailer)
+ GNUNET_free (ds_entry->attr_trailer);
+ if (NULL != ds_entry->lookup_request)
+ {
+ GNUNET_GNS_lookup_cancel (ds_entry->lookup_request);
+ ds_entry->lookup_request = NULL;
+ }
+ if (NULL != ds_entry->delegation_chain_entry)
+ {
+ if (NULL != ds_entry->delegation_chain_entry->subject_attribute)
+ GNUNET_free (ds_entry->delegation_chain_entry->subject_attribute);
+ if (NULL != ds_entry->delegation_chain_entry->issuer_attribute)
+ GNUNET_free (ds_entry->delegation_chain_entry->issuer_attribute);
+ GNUNET_free (ds_entry->delegation_chain_entry);
+ }
+ GNUNET_free (ds_entry);
+}
+
+static void
+cleanup_handle (struct VerifyRequestHandle *vrh)
+{
+ struct CredentialRecordEntry *cr_entry;
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Cleaning up...\n");
+ if (NULL != vrh->lookup_request)
+ {
+ GNUNET_GNS_lookup_cancel (vrh->lookup_request);
+ vrh->lookup_request = NULL;
+ }
+ cleanup_delegation_set (vrh->root_set);
+ if (NULL != vrh->issuer_attribute)
+ GNUNET_free (vrh->issuer_attribute);
+ for (cr_entry = vrh->cred_chain_head;
+ NULL != vrh->cred_chain_head;
+ cr_entry = vrh->cred_chain_head)
+ {
+ GNUNET_CONTAINER_DLL_remove (vrh->cred_chain_head,
+ vrh->cred_chain_tail,
+ cr_entry);
+ if (NULL != cr_entry->credential);
+ GNUNET_free (cr_entry->credential);
+ GNUNET_free (cr_entry);
+ }
+ GNUNET_free (vrh);
+}
+
+/**
+ * Task run during shutdown.
+ *
+ * @param cls unused
+ * @param tc unused
+ */
+static void
+shutdown_task (void *cls)
+{
+ struct VerifyRequestHandle *vrh;
+
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Shutting down!\n");
+
+ while (NULL != (vrh = vrh_head))
+ {
+ //CREDENTIAL_resolver_lookup_cancel (clh->lookup);
+ GNUNET_CONTAINER_DLL_remove (vrh_head,
+ vrh_tail,
+ vrh);
+ cleanup_handle (vrh);
+ }
+
+ if (NULL != gns)
+ {
+ GNUNET_GNS_disconnect (gns);
+ gns = NULL;
+ }
+ if (NULL != namestore)
+ {
+ GNUNET_NAMESTORE_disconnect (namestore);
+ namestore = NULL;
+ }
+ if (NULL != statistics)
+ {
+ GNUNET_STATISTICS_destroy (statistics,
+ GNUNET_NO);
+ statistics = NULL;
+ }
+
+}
+
+
+
+/**
+ * Send.
+ *
+ * @param handle the handle to the request
+ */
+static void
+send_lookup_response (struct VerifyRequestHandle *vrh)
+{
+ struct GNUNET_MQ_Envelope *env;
+ struct DelegationChainResultMessage *rmsg;
+ struct DelegationChainEntry *dce;
+ struct GNUNET_CREDENTIAL_Delegation dd[vrh->delegation_chain_size];
+ struct GNUNET_CREDENTIAL_Credential cred[vrh->cred_chain_size];
+ struct CredentialRecordEntry *cd;
+ struct CredentialRecordEntry *tmp;
+ size_t size;
+ int i;
+
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Sending response\n");
+ dce = vrh->delegation_chain_head;
+ for (i=0;i<vrh->delegation_chain_size;i++)
+ {
+ dd[i].issuer_key = dce->issuer_key;
+ dd[i].subject_key = dce->subject_key;
+ dd[i].issuer_attribute = dce->issuer_attribute;
+ dd[i].issuer_attribute_len = strlen (dce->issuer_attribute)+1;
+ dd[i].subject_attribute_len = 0;
+ dd[i].subject_attribute = NULL;
+ if (NULL != dce->subject_attribute)
+ {
+ dd[i].subject_attribute = dce->subject_attribute;
+ dd[i].subject_attribute_len = strlen(dce->subject_attribute)+1;
+ }
+ dce = dce->next;
+ }
+
+ /**
+ * Remove all credentials not needed
+ */
+ for (cd = vrh->cred_chain_head; NULL != cd;)
+ {
+ if (cd->refcount > 0)
+ {
+ cd = cd->next;
+ continue;
+ }
+ tmp = cd;
+ cd = cd->next;
+ GNUNET_CONTAINER_DLL_remove (vrh->cred_chain_head,
+ vrh->cred_chain_tail,
+ tmp);
+ GNUNET_free (tmp->credential);
+ GNUNET_free (tmp);
+ vrh->cred_chain_size--;
+ }
+
+ /**
+ * Get serialized record data
+ * Append at the end of rmsg
+ */
+ cd = vrh->cred_chain_head;
+ for (i=0;i<vrh->cred_chain_size;i++)
+ {
+ cred[i].issuer_key = cd->credential->issuer_key;
+ cred[i].subject_key = cd->credential->subject_key;
+ cred[i].issuer_attribute_len = strlen(cd->credential->issuer_attribute)+1;
+ cred[i].issuer_attribute = cd->credential->issuer_attribute;
+ cred[i].expiration = cd->credential->expiration;
+ cred[i].signature = cd->credential->signature;
+ cd = cd->next;
+ }
+ size = GNUNET_CREDENTIAL_delegation_chain_get_size (vrh->delegation_chain_size,
+ dd,
+ vrh->cred_chain_size,
+ cred);
+ env = GNUNET_MQ_msg_extra (rmsg,
+ size,
+ GNUNET_MESSAGE_TYPE_CREDENTIAL_VERIFY_RESULT);
+ //Assign id so that client can find associated request
+ rmsg->id = vrh->request_id;
+ rmsg->d_count = htonl (vrh->delegation_chain_size);
+ rmsg->c_count = htonl (vrh->cred_chain_size);
+
+ if (0 < vrh->cred_chain_size)
+ rmsg->cred_found = htonl (GNUNET_YES);
+ else
+ rmsg->cred_found = htonl (GNUNET_NO);
+
+ GNUNET_assert (-1 !=
+ GNUNET_CREDENTIAL_delegation_chain_serialize (vrh->delegation_chain_size,
+ dd,
+ vrh->cred_chain_size,
+ cred,
+ size,
+ (char*)&rmsg[1]));
+
+ GNUNET_MQ_send (GNUNET_SERVICE_client_get_mq(vrh->client),
+ env);
+ GNUNET_CONTAINER_DLL_remove (vrh_head, vrh_tail, vrh);
+ cleanup_handle(vrh);
+
+ GNUNET_STATISTICS_update (statistics,
+ "Completed verifications", 1,
+ GNUNET_NO);
+}
+
+
+static void
+backward_resolution (void* cls,
+ uint32_t rd_count,
+ const struct GNUNET_GNSRECORD_Data *rd)
+{
+
+ struct VerifyRequestHandle *vrh;
+ const struct GNUNET_CREDENTIAL_DelegationRecord *sets;
+ struct CredentialRecordEntry *cred_pointer;
+ struct DelegationSetQueueEntry *current_set;
+ struct DelegationSetQueueEntry *ds_entry;
+ struct DelegationSetQueueEntry *tmp_set;
+ struct DelegationQueueEntry *dq_entry;
+ char *expanded_attr;
+ char *lookup_attribute;
+ int i;
+ int j;
+
+
+ current_set = cls;
+ current_set->lookup_request = NULL;
+ vrh = current_set->handle;
+ vrh->pending_lookups--;
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Got %d attrs\n", rd_count);
+
+ // Each OR
+ for (i=0; i < rd_count; i++)
+ {
+ if (GNUNET_GNSRECORD_TYPE_ATTRIBUTE != rd[i].record_type)
+ continue;
+
+ sets = rd[i].data;
+ struct GNUNET_CREDENTIAL_DelegationSet set[ntohl(sets->set_count)];
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Found new attribute delegation with %d sets. Creating new Job...\n",
+ ntohl (sets->set_count));
+
+ if (GNUNET_OK !=GNUNET_CREDENTIAL_delegation_set_deserialize (GNUNET_ntohll(sets->data_size),
+ (const char*)&sets[1],
+ ntohl(sets->set_count),
+ set))
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Failed to deserialize!\n");
+ continue;
+ }
+ dq_entry = GNUNET_new (struct DelegationQueueEntry);
+ dq_entry->required_solutions = ntohl(sets->set_count);
+ dq_entry->parent_set = current_set;
+ GNUNET_CONTAINER_DLL_insert (current_set->queue_entries_head,
+ current_set->queue_entries_tail,
+ dq_entry);
+ // Each AND
+ for (j=0; j<ntohl(sets->set_count); j++)
+ {
+ ds_entry = GNUNET_new (struct DelegationSetQueueEntry);
+ if (NULL != current_set->attr_trailer)
+ {
+ if (0 == set[j].subject_attribute_len)
+ {
+ GNUNET_asprintf (&expanded_attr,
+ "%s",
+ current_set->attr_trailer);
+
+ } else {
+ GNUNET_asprintf (&expanded_attr,
+ "%s.%s",
+ set[j].subject_attribute,
+ current_set->attr_trailer);
+ }
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Expanded to %s\n", expanded_attr);
+ ds_entry->unresolved_attribute_delegation = expanded_attr;
+ } else {
+ if (0 != set[j].subject_attribute_len)
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Not Expanding %s\n", set[j].subject_attribute);
+ ds_entry->unresolved_attribute_delegation = GNUNET_strdup (set[j].subject_attribute);
+ }
+ }
+
+ //Add a credential chain entry
+ ds_entry->delegation_chain_entry = GNUNET_new (struct DelegationChainEntry);
+ ds_entry->delegation_chain_entry->subject_key = set[j].subject_key;
+ ds_entry->issuer_key = GNUNET_new (struct GNUNET_CRYPTO_EcdsaPublicKey);
+ GNUNET_memcpy (ds_entry->issuer_key,
+ &set[j].subject_key,
+ sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey));
+ if (0 < set[j].subject_attribute_len)
+ ds_entry->delegation_chain_entry->subject_attribute = GNUNET_strdup (set[j].subject_attribute);
+ ds_entry->delegation_chain_entry->issuer_key = *current_set->issuer_key;
+ ds_entry->delegation_chain_entry->issuer_attribute = GNUNET_strdup (current_set->lookup_attribute);
+
+ ds_entry->parent_queue_entry = dq_entry; //current_delegation;
+ GNUNET_CONTAINER_DLL_insert (dq_entry->set_entries_head,
+ dq_entry->set_entries_tail,
+ ds_entry);
+
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Checking for cred match\n");
+ /**
+ * Check if this delegation already matches one of our credentials
+ */
+ for(cred_pointer = vrh->cred_chain_head; cred_pointer != NULL;
+ cred_pointer = cred_pointer->next)
+ {
+ if(0 != memcmp (&set->subject_key,
+ &cred_pointer->credential->issuer_key,
+ sizeof(struct GNUNET_CRYPTO_EcdsaPublicKey)))
+ continue;
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Checking if %s matches %s\n",
+ ds_entry->unresolved_attribute_delegation,
+ cred_pointer->credential->issuer_attribute);
+
+ if (0 != strcmp (ds_entry->unresolved_attribute_delegation,
+ cred_pointer->credential->issuer_attribute))
+ continue;
+
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Found issuer\n");
+ cred_pointer->refcount++;
+ //Backtrack
+ for (tmp_set = ds_entry;
+ NULL != tmp_set->parent_queue_entry;
+ tmp_set = tmp_set->parent_queue_entry->parent_set)
+ {
+ tmp_set->parent_queue_entry->required_solutions--;
+ if (NULL != tmp_set->delegation_chain_entry)
+ {
+ vrh->delegation_chain_size++;
+ GNUNET_CONTAINER_DLL_insert (vrh->delegation_chain_head,
+ vrh->delegation_chain_tail,
+ tmp_set->delegation_chain_entry);
+ }
+ if (0 < tmp_set->parent_queue_entry->required_solutions)
+ break;
+ }
+
+ if (NULL == tmp_set->parent_queue_entry)
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "All solutions found\n");
+ //Found match
+ send_lookup_response (vrh);
+ return;
+ }
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Not all solutions found yet.\n");
+ continue;
+
+ }
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Building new lookup request from %s\n",
+ ds_entry->unresolved_attribute_delegation);
+ //Continue with backward resolution
+ char issuer_attribute_name[strlen (ds_entry->unresolved_attribute_delegation)+1];
+ strcpy (issuer_attribute_name,
+ ds_entry->unresolved_attribute_delegation);
+ char *next_attr = strtok (issuer_attribute_name, ".");
+ GNUNET_asprintf (&lookup_attribute,
+ "%s.gnu",
+ next_attr);
+ GNUNET_asprintf (&ds_entry->lookup_attribute,
+ "%s",
+ next_attr);
+ if (strlen (next_attr) == strlen (ds_entry->unresolved_attribute_delegation))
+ {
+ ds_entry->attr_trailer = NULL;
+ } else {
+ next_attr += strlen (next_attr) + 1;
+ ds_entry->attr_trailer = GNUNET_strdup (next_attr);
+ }
+
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Looking up %s\n", ds_entry->lookup_attribute);
+ if (NULL != ds_entry->attr_trailer)
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "%s still to go...\n", ds_entry->attr_trailer);
+
+ vrh->pending_lookups++;
+ ds_entry->handle = vrh;
+ ds_entry->lookup_request = GNUNET_GNS_lookup (gns,
+ lookup_attribute,
+ ds_entry->issuer_key, //issuer_key,
+ GNUNET_GNSRECORD_TYPE_ATTRIBUTE,
+ GNUNET_GNS_LO_DEFAULT,
+ &backward_resolution,
+ ds_entry);
+ GNUNET_free (lookup_attribute);
+ }
+ }
+
+ if(0 == vrh->pending_lookups)
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "We are all out of attributes...\n");
+ send_lookup_response (vrh);
+ return;
+
+ }
+}
+
+
+/**
+ * Result from GNS lookup.
+ *
+ * @param cls the closure (our client lookup handle)
+ * @param rd_count the number of records in @a rd
+ * @param rd the record data
+ */
+static void
+delegation_chain_resolution_start (void* cls)
+{
+ struct VerifyRequestHandle *vrh = cls;
+ struct DelegationSetQueueEntry *ds_entry;
+ struct CredentialRecordEntry *cr_entry;
+ vrh->lookup_request = NULL;
+
+ if (0 == vrh->cred_chain_size)
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "No credentials found\n");
+ send_lookup_response (vrh);
+ return;
+ }
+
+ for (cr_entry = vrh->cred_chain_head; cr_entry != NULL; cr_entry = cr_entry->next)
+ {
+ if (0 != memcmp (&cr_entry->credential->issuer_key,
+ &vrh->issuer_key,
+ sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey)))
+ continue;
+ if (0 != strcmp (cr_entry->credential->issuer_attribute, vrh->issuer_attribute))
+ continue;
+ cr_entry->refcount++;
+ //Found match prematurely
+ send_lookup_response (vrh);
+ return;
+
+ }
+
+ /**
+ * Check for attributes from the issuer and follow the chain
+ * till you get the required subject's attributes
+ */
+ char issuer_attribute_name[strlen (vrh->issuer_attribute)];
+ strcpy (issuer_attribute_name,
+ vrh->issuer_attribute);
+ strcpy (issuer_attribute_name + strlen (vrh->issuer_attribute),
+ ".gnu");
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Looking up %s\n", issuer_attribute_name);
+ ds_entry = GNUNET_new (struct DelegationSetQueueEntry);
+ ds_entry->issuer_key = GNUNET_new (struct GNUNET_CRYPTO_EcdsaPublicKey);
+ memcpy (ds_entry->issuer_key,
+ &vrh->issuer_key,
+ sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey));
+ ds_entry->issuer_attribute = GNUNET_strdup (vrh->issuer_attribute);
+ ds_entry->handle = vrh;
+ ds_entry->lookup_attribute = GNUNET_strdup (vrh->issuer_attribute);
+ vrh->root_set = ds_entry;
+ vrh->pending_lookups = 1;
+ //Start with backward resolution
+ ds_entry->lookup_request = GNUNET_GNS_lookup (gns,
+ issuer_attribute_name,
+ &vrh->issuer_key, //issuer_key,
+ GNUNET_GNSRECORD_TYPE_ATTRIBUTE,
+ GNUNET_GNS_LO_DEFAULT,
+ &backward_resolution,
+ ds_entry);
+}
+
+/**
+ * Checks a #GNUNET_MESSAGE_TYPE_CREDENTIAL_VERIFY message
+ *
+ * @param cls client sending the message
+ * @param v_msg message of type `struct VerifyMessage`
+ * @return #GNUNET_OK if @a v_msg is well-formed
+ */
+static int
+check_verify (void *cls,
+ const struct VerifyMessage *v_msg)
+{
+ size_t msg_size;
+ const char* attr;
+
+ msg_size = ntohs (v_msg->header.size);
+ if (msg_size < sizeof (struct VerifyMessage))
+ {
+ GNUNET_break (0);
+ return GNUNET_SYSERR;
+ }
+ if (ntohs (v_msg->issuer_attribute_len) > GNUNET_CREDENTIAL_MAX_LENGTH)
+ {
+ GNUNET_break (0);
+ return GNUNET_SYSERR;
+ }
+ attr = (const char *) &v_msg[1];
+
+ if ( strlen (attr) > GNUNET_CREDENTIAL_MAX_LENGTH)
+ {
+ GNUNET_break (0);
+ return GNUNET_SYSERR;
+ }
+ return GNUNET_OK;
+}
+
+/**
+ * Handle Credential verification requests from client
+ *
+ * @param cls the closure
+ * @param client the client
+ * @param message the message
+ */
+static void
+handle_verify (void *cls,
+ const struct VerifyMessage *v_msg)
+{
+ struct VerifyRequestHandle *vrh;
+ struct GNUNET_SERVICE_Client *client = cls;
+ struct CredentialRecordEntry *cr_entry;
+ uint32_t credentials_count;
+ uint32_t credential_data_size;
+ int i;
+ char attr[GNUNET_CREDENTIAL_MAX_LENGTH + 1];
+ char issuer_attribute[GNUNET_CREDENTIAL_MAX_LENGTH + 1];
+ char *attrptr = attr;
+ char *credential_data;
+ const char *utf_in;
+
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Received VERIFY message\n");
+ utf_in = (const char *) &v_msg[1];
+ GNUNET_STRINGS_utf8_tolower (utf_in, attrptr);
+ GNUNET_memcpy (issuer_attribute, attr, ntohs (v_msg->issuer_attribute_len));
+ issuer_attribute[ntohs (v_msg->issuer_attribute_len)] = '\0';
+ vrh = GNUNET_new (struct VerifyRequestHandle);
+ GNUNET_CONTAINER_DLL_insert (vrh_head, vrh_tail, vrh);
+ vrh->client = client;
+ vrh->request_id = v_msg->id;
+ vrh->issuer_key = v_msg->issuer_key;
+ vrh->subject_key = v_msg->subject_key;
+ vrh->issuer_attribute = GNUNET_strdup (issuer_attribute);
+ if (NULL == issuer_attribute)
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "No issuer attribute provided!\n");
+ send_lookup_response (vrh);
+ return;
+ }
+ /**
+ * First, collect credentials
+ * TODO: cleanup!
+ */
+ credentials_count = ntohl(v_msg->c_count);
+ credential_data_size = ntohs (v_msg->header.size)
+ - sizeof (struct VerifyMessage)
+ - ntohs (v_msg->issuer_attribute_len)
+ - 1;
+ struct GNUNET_CREDENTIAL_Credential credentials[credentials_count];
+ credential_data = (char*)&v_msg[1] + ntohs (v_msg->issuer_attribute_len) + 1;
+ if (GNUNET_OK != GNUNET_CREDENTIAL_credentials_deserialize (credential_data_size,
+ credential_data,
+ credentials_count,
+ credentials))
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Cannot deserialize credentials!\n");
+ send_lookup_response (vrh);
+ return;
+ }
+
+ for (i=0;i<credentials_count;i++) {
+ cr_entry = GNUNET_new (struct CredentialRecordEntry);
+ cr_entry->credential = GNUNET_malloc (sizeof (struct GNUNET_CREDENTIAL_Credential) +
+ credentials[i].issuer_attribute_len);
+ GNUNET_memcpy (cr_entry->credential,
+ &credentials[i],
+ sizeof (struct GNUNET_CREDENTIAL_Credential));
+ GNUNET_memcpy (&cr_entry->credential[1],
+ credentials[i].issuer_attribute,
+ credentials[i].issuer_attribute_len);
+ cr_entry->credential->issuer_attribute = (char*)&cr_entry->credential[1];
+ GNUNET_CONTAINER_DLL_insert_tail (vrh->cred_chain_head,
+ vrh->cred_chain_tail,
+ cr_entry);
+ vrh->cred_chain_size++;
+ }
+
+ delegation_chain_resolution_start (vrh);
+
+}
+
+/**
+ * We encountered an error while collecting
+ */
+static void
+handle_cred_collection_error_cb (void *cls)
+{
+ struct VerifyRequestHandle *vrh = cls;
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Got disconnected from namestore database.\n");
+ vrh->cred_collection_iter = NULL;
+ send_lookup_response (vrh);
+}
+
+static void
+collect_next (void *cls)
+{
+ struct VerifyRequestHandle *vrh = cls;
+ vrh->collect_next_task = NULL;
+ GNUNET_assert (NULL != vrh->cred_collection_iter);
+ GNUNET_NAMESTORE_zone_iterator_next (vrh->cred_collection_iter);
+}
+
+/**
+ * Store credential
+ */
+static void
+handle_cred_collection_cb (void *cls,
+ const struct GNUNET_CRYPTO_EcdsaPrivateKey *key,
+ const char *label,
+ unsigned int rd_count,
+ const struct GNUNET_GNSRECORD_Data *rd)
+{
+ struct VerifyRequestHandle *vrh = cls;
+ struct GNUNET_CREDENTIAL_Credential *crd;
+ struct CredentialRecordEntry *cr_entry;
+ int cred_record_count;
+ int i;
+
+ cred_record_count = 0;
+ for (i=0; i < rd_count; i++)
+ {
+ if (GNUNET_GNSRECORD_TYPE_CREDENTIAL != rd[i].record_type)
+ continue;
+ cred_record_count++;
+ crd = GNUNET_CREDENTIAL_credential_deserialize (rd[i].data,
+ rd[i].data_size);
+ if (NULL == crd)
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+ "Invalid credential found\n");
+ continue;
+ }
+ cr_entry = GNUNET_new (struct CredentialRecordEntry);
+ cr_entry->credential = crd;
+ GNUNET_CONTAINER_DLL_insert_tail (vrh->cred_chain_head,
+ vrh->cred_chain_tail,
+ cr_entry);
+ vrh->cred_chain_size++;
+ }
+ vrh->collect_next_task = GNUNET_SCHEDULER_add_now (&collect_next,
+ vrh);
+}
+
+/**
+ * We encountered an error while collecting
+ */
+static void
+handle_cred_collection_finished_cb (void *cls)
+{
+ struct VerifyRequestHandle *vrh = cls;
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Done collecting credentials.\n");
+ vrh->cred_collection_iter = NULL;
+ delegation_chain_resolution_start (vrh);
+}
+
+/**
+ * Handle Credential collection requests from client
+ *
+ * @param cls the closure
+ * @param client the client
+ * @param message the message
+ */
+static void
+handle_collect (void *cls,
+ const struct CollectMessage *c_msg)
+{
+ char attr[GNUNET_CREDENTIAL_MAX_LENGTH + 1];
+ char issuer_attribute[GNUNET_CREDENTIAL_MAX_LENGTH + 1];
+ struct VerifyRequestHandle *vrh;
+ struct GNUNET_SERVICE_Client *client = cls;
+ char *attrptr = attr;
+ const char *utf_in;
+
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Received COLLECT message\n");
+
+ utf_in = (const char *) &c_msg[1];
+ GNUNET_STRINGS_utf8_tolower (utf_in, attrptr);
+
+ GNUNET_memcpy (issuer_attribute, attr, ntohs (c_msg->issuer_attribute_len));
+ issuer_attribute[ntohs (c_msg->issuer_attribute_len)] = '\0';
+ vrh = GNUNET_new (struct VerifyRequestHandle);
+ GNUNET_CONTAINER_DLL_insert (vrh_head, vrh_tail, vrh);
+ vrh->client = client;
+ vrh->request_id = c_msg->id;
+ vrh->issuer_key = c_msg->issuer_key;
+ GNUNET_CRYPTO_ecdsa_key_get_public (&c_msg->subject_key,
+ &vrh->subject_key);
+ vrh->issuer_attribute = GNUNET_strdup (issuer_attribute);
+
+ if (NULL == issuer_attribute)
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "No issuer attribute provided!\n");
+ send_lookup_response (vrh);
+ return;
+ }
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Getting credentials for subject\n");
+ /**
+ * First, get attribute from subject
+ */
+ vrh->cred_collection_iter = GNUNET_NAMESTORE_zone_iteration_start (namestore,
+ &c_msg->subject_key,
+ &handle_cred_collection_error_cb,
+ vrh,
+ &handle_cred_collection_cb,
+ vrh,
+ &handle_cred_collection_finished_cb,
+ vrh);
+}
+
+
+/**
+ * Checks a #GNUNET_MESSAGE_TYPE_CREDENTIAL_COLLECT message
+ *
+ * @param cls client sending the message
+ * @param v_msg message of type `struct CollectMessage`
+ * @return #GNUNET_OK if @a v_msg is well-formed
+ */
+static int
+check_collect (void *cls,
+ const struct CollectMessage *c_msg)
+{
+ size_t msg_size;
+ const char* attr;
+
+ msg_size = ntohs (c_msg->header.size);
+ if (msg_size < sizeof (struct CollectMessage))
+ {
+ GNUNET_break (0);
+ return GNUNET_SYSERR;
+ }
+ if (ntohs (c_msg->issuer_attribute_len) > GNUNET_CREDENTIAL_MAX_LENGTH)
+ {
+ GNUNET_break (0);
+ return GNUNET_SYSERR;
+ }
+ attr = (const char *) &c_msg[1];
+
+ if ( ('\0' != attr[ntohs(c_msg->header.size) - sizeof (struct CollectMessage) - 1]) ||
+ (strlen (attr) > GNUNET_CREDENTIAL_MAX_LENGTH) )
+ {
+ GNUNET_break (0);
+ return GNUNET_SYSERR;
+ }
+ return GNUNET_OK;
+}
+
+/**
+ * One of our clients disconnected, clean up after it.
+ *
+ * @param cls NULL
+ * @param client the client that disconnected
+ */
+static void
+client_disconnect_cb (void *cls,
+ struct GNUNET_SERVICE_Client *client,
+ void *app_ctx)
+{
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Client %p disconnected\n",
+ client);
+}
+
+/**
+ * Add a client to our list of active clients.
+ *
+ * @param cls NULL
+ * @param client client to add
+ * @param mq message queue for @a client
+ * @return this client
+ */
+static void *
+client_connect_cb (void *cls,
+ struct GNUNET_SERVICE_Client *client,
+ struct GNUNET_MQ_Handle *mq)
+{
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Client %p connected\n",
+ client);
+ return client;
+}
+
+/**
+ * Process Credential requests.
+ *
+ * @param cls closure
+ * @param server the initialized server
+ * @param c configuration to use
+ */
+static void
+run (void *cls,
+ const struct GNUNET_CONFIGURATION_Handle *c,
+ struct GNUNET_SERVICE_Handle *handle)
+{
+
+ gns = GNUNET_GNS_connect (c);
+ if (NULL == gns)
+ {
+ fprintf (stderr,
+ _("Failed to connect to GNS\n"));
+ }
+ namestore = GNUNET_NAMESTORE_connect (c);
+ if (NULL == namestore)
+ {
+ fprintf (stderr,
+ _("Failed to connect to namestore\n"));
+ }
+
+ statistics = GNUNET_STATISTICS_create ("credential", c);
+ GNUNET_SCHEDULER_add_shutdown (&shutdown_task, NULL);
+}
+
+
+/**
+ * Define "main" method using service macro
+ */
+GNUNET_SERVICE_MAIN
+("credential",
+ GNUNET_SERVICE_OPTION_NONE,
+ &run,
+ &client_connect_cb,
+ &client_disconnect_cb,
+ NULL,
+ GNUNET_MQ_hd_var_size (verify,
+ GNUNET_MESSAGE_TYPE_CREDENTIAL_VERIFY,
+ struct VerifyMessage,
+ NULL),
+ GNUNET_MQ_hd_var_size (collect,
+ GNUNET_MESSAGE_TYPE_CREDENTIAL_COLLECT,
+ struct CollectMessage,
+ NULL),
+ GNUNET_MQ_handler_end());
+
+/* 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 0000000000..72d6b53f55
--- /dev/null
+++ b/src/credential/plugin_gnsrecord_credential.c
@@ -0,0 +1,353 @@
+/*
+ This file is part of GNUnet
+ Copyright (C) 2013 GNUnet e.V.
+
+ GNUnet is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published
+ by the Free Software Foundation; either version 3, or (at your
+ option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GNUnet; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+/**
+ * @file credential/plugin_gnsrecord_credential.c
+ * @brief gnsrecord plugin to provide the API for CREDENTIAL records
+ * @author Adnan Husain
+ */
+
+#include "platform.h"
+#include "gnunet_util_lib.h"
+#include "gnunet_gnsrecord_lib.h"
+#include "gnunet_credential_service.h"
+#include "gnunet_gnsrecord_plugin.h"
+#include "gnunet_signatures.h"
+#include "credential_serialization.h"
+#include "credential_misc.h"
+
+/**
+ * Convert the 'value' of a record to a string.
+ *
+ * @param cls closure, unused
+ * @param type type of the record
+ * @param data value in binary encoding
+ * @param data_size number of bytes in @a data
+ * @return NULL on error, otherwise human-readable representation of the value
+ */
+static char *
+credential_value_to_string (void *cls,
+ uint32_t type,
+ const void *data,
+ size_t data_size)
+{
+
+ const char *cdata;
+
+ switch (type)
+ {
+ case GNUNET_GNSRECORD_TYPE_ATTRIBUTE:
+ {
+ struct GNUNET_CREDENTIAL_DelegationRecord sets;
+ char *attr_str;
+ char *subject_pkey;
+ char *tmp_str;
+ int i;
+ if (data_size < sizeof (struct GNUNET_CREDENTIAL_DelegationRecord))
+ return NULL; /* malformed */
+ memcpy (&sets,
+ data,
+ sizeof (sets));
+ cdata = data;
+ struct GNUNET_CREDENTIAL_DelegationSet set[ntohl(sets.set_count)];
+ if (GNUNET_OK != GNUNET_CREDENTIAL_delegation_set_deserialize (GNUNET_ntohll (sets.data_size),
+ &cdata[sizeof (sets)],
+ ntohl (sets.set_count),
+ set))
+ return NULL;
+
+ for (i=0;i<ntohl(sets.set_count);i++)
+ {
+ subject_pkey = GNUNET_CRYPTO_ecdsa_public_key_to_string (&set[i].subject_key);
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "%d len attr\n", set[i].subject_attribute_len);
+ if (0 == set[i].subject_attribute_len)
+ {
+ if (0 == i)
+ {
+ GNUNET_asprintf (&attr_str,
+ "%s",
+ subject_pkey);
+ } else {
+ GNUNET_asprintf (&tmp_str,
+ "%s,%s",
+ attr_str,
+ subject_pkey);
+ GNUNET_free (attr_str);
+ attr_str = tmp_str;
+ }
+ } else {
+ if (0 == i)
+ {
+ GNUNET_asprintf (&attr_str,
+ "%s %s",
+ subject_pkey,
+ set[i].subject_attribute);
+ } else {
+ GNUNET_asprintf (&tmp_str,
+ "%s,%s %s",
+ attr_str,
+ subject_pkey,
+ set[i].subject_attribute);
+ GNUNET_free (attr_str);
+ attr_str = tmp_str;
+ }
+ }
+ GNUNET_free (subject_pkey);
+ }
+ return attr_str;
+ }
+ case GNUNET_GNSRECORD_TYPE_CREDENTIAL:
+ {
+ struct GNUNET_CREDENTIAL_Credential *cred;
+ char *cred_str;
+
+ cred = GNUNET_CREDENTIAL_credential_deserialize (data,
+ data_size);
+ cred_str = GNUNET_CREDENTIAL_credential_to_string (cred);
+ GNUNET_free (cred);
+ return cred_str;
+ }
+ case GNUNET_GNSRECORD_TYPE_POLICY:
+ {
+ return GNUNET_strndup (data,data_size);
+ }
+ default:
+ return NULL;
+ }
+}
+
+
+/**
+ * Convert human-readable version of a 'value' of a record to the binary
+ * representation.
+ *
+ * @param cls closure, unused
+ * @param type type of the record
+ * @param s human-readable string
+ * @param data set to value in binary encoding (will be allocated)
+ * @param data_size set to number of bytes in @a data
+ * @return #GNUNET_OK on success
+ */
+static int
+credential_string_to_value (void *cls,
+ uint32_t type,
+ const char *s,
+ void **data,
+ size_t *data_size)
+{
+ if (NULL == s)
+ return GNUNET_SYSERR;
+ switch (type)
+ {
+ case GNUNET_GNSRECORD_TYPE_ATTRIBUTE:
+ {
+ struct GNUNET_CREDENTIAL_DelegationRecord *sets;
+ char attr_str[253 + 1];
+ char subject_pkey[52 + 1];
+ char *token;
+ char *tmp_str;
+ int matches = 0;
+ int entries;
+ size_t tmp_data_size;
+ int i;
+
+ tmp_str = GNUNET_strdup (s);
+ token = strtok (tmp_str, ",");
+ entries = 0;
+ tmp_data_size = 0;
+ *data_size = sizeof (struct GNUNET_CREDENTIAL_DelegationRecord);
+ while (NULL != token)
+ {
+ matches = SSCANF (token,
+ "%s %s",
+ subject_pkey,
+ attr_str);
+ if (0 == matches)
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ _("Unable to parse ATTR record string `%s'\n"),
+ s);
+ GNUNET_free (tmp_str);
+ return GNUNET_SYSERR;
+ }
+ if (1 == matches) {
+ tmp_data_size += sizeof (struct GNUNET_CREDENTIAL_DelegationRecordSet);
+ } else if (2 == matches) {
+ tmp_data_size += sizeof (struct GNUNET_CREDENTIAL_DelegationRecordSet) + strlen (attr_str) + 1;
+ }
+ entries++;
+ token = strtok (NULL, ",");
+ }
+ GNUNET_free (tmp_str);
+ tmp_str = GNUNET_strdup (s);
+ token = strtok (tmp_str, ",");
+ struct GNUNET_CREDENTIAL_DelegationSet set[entries];
+ for (i=0;i<entries;i++)
+ {
+ matches = SSCANF (token,
+ "%s %s",
+ subject_pkey,
+ attr_str);
+ GNUNET_CRYPTO_ecdsa_public_key_from_string (subject_pkey,
+ strlen (subject_pkey),
+ &set[i].subject_key);
+ if (2 == matches) {
+ set[i].subject_attribute_len = strlen (attr_str) + 1;
+ set[i].subject_attribute = GNUNET_strdup (attr_str);
+ }
+ token = strtok (NULL , ",");
+ }
+ tmp_data_size = GNUNET_CREDENTIAL_delegation_set_get_size (entries,
+ set);
+
+ if (-1 == tmp_data_size)
+ return GNUNET_SYSERR;
+ *data_size += tmp_data_size;
+ *data = sets = GNUNET_malloc (*data_size);
+ GNUNET_CREDENTIAL_delegation_set_serialize (entries,
+ set,
+ tmp_data_size,
+ (char*)&sets[1]);
+ for (i=0;i<entries;i++)
+ {
+ if (0 != set[i].subject_attribute_len)
+ GNUNET_free ((char*)set[i].subject_attribute);
+ }
+ sets->set_count = htonl (entries);
+ sets->data_size = GNUNET_htonll (tmp_data_size);
+
+ GNUNET_free (tmp_str);
+ return GNUNET_OK;
+ }
+ case GNUNET_GNSRECORD_TYPE_CREDENTIAL:
+ {
+ struct GNUNET_CREDENTIAL_Credential *cred;
+ cred = GNUNET_CREDENTIAL_credential_from_string (s);
+
+ *data_size = GNUNET_CREDENTIAL_credential_serialize (cred,
+ (char**)data);
+ return GNUNET_OK;
+ }
+ case GNUNET_GNSRECORD_TYPE_POLICY:
+ {
+ *data_size = strlen (s);
+ *data = GNUNET_strdup (s);
+ return GNUNET_OK;
+ }
+ default:
+ return GNUNET_SYSERR;
+ }
+}
+
+
+/**
+ * Mapping of record type numbers to human-readable
+ * record type names.
+ */
+static struct {
+ const char *name;
+ uint32_t number;
+} name_map[] = {
+ { "CRED", GNUNET_GNSRECORD_TYPE_CREDENTIAL },
+ { "ATTR", GNUNET_GNSRECORD_TYPE_ATTRIBUTE },
+ { "POLICY", GNUNET_GNSRECORD_TYPE_POLICY },
+ { NULL, UINT32_MAX }
+};
+
+
+/**
+ * Convert a type name (i.e. "AAAA") to the corresponding number.
+ *
+ * @param cls closure, unused
+ * @param gns_typename name to convert
+ * @return corresponding number, UINT32_MAX on error
+ */
+static uint32_t
+credential_typename_to_number (void *cls,
+ const char *gns_typename)
+{
+ unsigned int i;
+
+ i=0;
+ while ( (name_map[i].name != NULL) &&
+ (0 != strcasecmp (gns_typename, name_map[i].name)) )
+ i++;
+ return name_map[i].number;
+}
+
+
+/**
+ * Convert a type number (i.e. 1) to the corresponding type string (i.e. "A")
+ *
+ * @param cls closure, unused
+ * @param type number of a type to convert
+ * @return corresponding typestring, NULL on error
+ */
+static const char *
+credential_number_to_typename (void *cls,
+ uint32_t type)
+{
+ unsigned int i;
+
+ i=0;
+ while ( (name_map[i].name != NULL) &&
+ (type != name_map[i].number) )
+ i++;
+ return name_map[i].name;
+}
+
+
+/**
+ * Entry point for the plugin.
+ *
+ * @param cls NULL
+ * @return the exported block API
+ */
+void *
+libgnunet_plugin_gnsrecord_credential_init (void *cls)
+{
+ struct GNUNET_GNSRECORD_PluginFunctions *api;
+
+ api = GNUNET_new (struct GNUNET_GNSRECORD_PluginFunctions);
+ api->value_to_string = &credential_value_to_string;
+ api->string_to_value = &credential_string_to_value;
+ api->typename_to_number = &credential_typename_to_number;
+ api->number_to_typename = &credential_number_to_typename;
+ return api;
+}
+
+
+/**
+ * Exit point from the plugin.
+ *
+ * @param cls the return value from #libgnunet_plugin_block_test_init
+ * @return NULL
+ */
+void *
+libgnunet_plugin_gnsrecord_credential_done (void *cls)
+{
+ struct GNUNET_GNSRECORD_PluginFunctions *api = cls;
+
+ GNUNET_free (api);
+ return NULL;
+}
+
+/* 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 0000000000..48d48fba0f
--- /dev/null
+++ b/src/credential/plugin_rest_credential.c
@@ -0,0 +1,1179 @@
+/*
+ This file is part of GNUnet.
+ Copyright (C) 2012-2016 GNUnet e.V.
+
+ GNUnet is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published
+ by the Free Software Foundation; either version 3, or (at your
+ option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GNUnet; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+ */
+/**
+ * @author Martin Schanzenbach
+ * @file gns/plugin_rest_credential.c
+ * @brief GNUnet CREDENTIAL REST plugin
+ *
+ */
+
+#include "platform.h"
+#include "gnunet_rest_plugin.h"
+#include <gnunet_identity_service.h>
+#include <gnunet_gnsrecord_lib.h>
+#include <gnunet_namestore_service.h>
+#include <gnunet_credential_service.h>
+#include <gnunet_rest_lib.h>
+#include <gnunet_jsonapi_lib.h>
+#include <gnunet_jsonapi_util.h>
+#include <jansson.h>
+
+#define GNUNET_REST_API_NS_CREDENTIAL "/credential"
+
+#define GNUNET_REST_API_NS_CREDENTIAL_ISSUE "/credential/issue"
+
+#define GNUNET_REST_API_NS_CREDENTIAL_VERIFY "/credential/verify"
+
+#define GNUNET_REST_API_NS_CREDENTIAL_COLLECT "/credential/collect"
+
+#define GNUNET_REST_JSONAPI_CREDENTIAL_EXPIRATION "expiration"
+
+#define GNUNET_REST_JSONAPI_CREDENTIAL_SUBJECT_KEY "subject_key"
+
+#define GNUNET_REST_JSONAPI_CREDENTIAL_SUBJECT_EGO "subject"
+
+#define GNUNET_REST_JSONAPI_CREDENTIAL "credential"
+
+#define GNUNET_REST_JSONAPI_CREDENTIAL_TYPEINFO "credential"
+
+#define GNUNET_REST_JSONAPI_DELEGATIONS "delegations"
+
+#define GNUNET_REST_JSONAPI_CREDENTIAL_ISSUER_ATTR "attribute"
+
+#define GNUNET_REST_JSONAPI_CREDENTIAL_SUBJECT_ATTR "credential"
+
+/**
+ * @brief struct returned by the initialization function of the plugin
+ */
+struct Plugin
+{
+ const struct GNUNET_CONFIGURATION_Handle *cfg;
+};
+
+const struct GNUNET_CONFIGURATION_Handle *cfg;
+
+struct RequestHandle
+{
+ /**
+ * Handle to Credential service.
+ */
+ struct GNUNET_CREDENTIAL_Handle *credential;
+
+ /**
+ * Handle to lookup request
+ */
+ struct GNUNET_CREDENTIAL_Request *verify_request;
+
+ /**
+ * Handle to issue request
+ */
+ struct GNUNET_CREDENTIAL_Request *issue_request;
+
+ /**
+ * Handle to identity
+ */
+ struct GNUNET_IDENTITY_Handle *identity;
+
+ /**
+ * Handle to identity operation
+ */
+ struct GNUNET_IDENTITY_Operation *id_op;
+
+ /**
+ * Handle to ego lookup
+ */
+ struct GNUNET_IDENTITY_EgoLookup *ego_lookup;
+
+ /**
+ * Handle to rest request
+ */
+ struct GNUNET_REST_RequestHandle *rest_handle;
+
+ /**
+ * ID of a task associated with the resolution process.
+ */
+ struct GNUNET_SCHEDULER_Task * timeout_task;
+
+ /**
+ * The root of the received JSON or NULL
+ */
+ json_t *json_root;
+
+ /**
+ * The plugin result processor
+ */
+ GNUNET_REST_ResultProcessor proc;
+
+ /**
+ * The closure of the result processor
+ */
+ void *proc_cls;
+
+ /**
+ * The issuer attribute to verify
+ */
+ char *issuer_attr;
+
+ /**
+ * The subject attribute
+ */
+ char *subject_attr;
+
+ /**
+ * The public key of the issuer
+ */
+ struct GNUNET_CRYPTO_EcdsaPublicKey issuer_key;
+
+ /**
+ * The public key of the subject
+ */
+ struct GNUNET_CRYPTO_EcdsaPublicKey subject_key;
+
+ /**
+ * HTTP response code
+ */
+ int response_code;
+
+ /**
+ * Timeout
+ */
+ struct GNUNET_TIME_Relative timeout;
+
+};
+
+
+/**
+ * Cleanup lookup handle.
+ *
+ * @param handle Handle to clean up
+ */
+static void
+cleanup_handle (struct RequestHandle *handle)
+{
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Cleaning up\n");
+ if (NULL != handle->json_root)
+ json_decref (handle->json_root);
+
+ if (NULL != handle->issuer_attr)
+ GNUNET_free (handle->issuer_attr);
+ if (NULL != handle->subject_attr)
+ GNUNET_free (handle->subject_attr);
+ if (NULL != handle->verify_request)
+ GNUNET_CREDENTIAL_request_cancel (handle->verify_request);
+ if (NULL != handle->credential)
+ GNUNET_CREDENTIAL_disconnect (handle->credential);
+ if (NULL != handle->id_op)
+ GNUNET_IDENTITY_cancel (handle->id_op);
+ if (NULL != handle->ego_lookup)
+ GNUNET_IDENTITY_ego_lookup_cancel (handle->ego_lookup);
+ if (NULL != handle->identity)
+ GNUNET_IDENTITY_disconnect (handle->identity);
+ if (NULL != handle->timeout_task)
+ {
+ GNUNET_SCHEDULER_cancel (handle->timeout_task);
+ }
+ GNUNET_free (handle);
+}
+
+
+/**
+ * Task run on shutdown. Cleans up everything.
+ *
+ * @param cls unused
+ * @param tc scheduler context
+ */
+static void
+do_error (void *cls)
+{
+ struct RequestHandle *handle = cls;
+ struct MHD_Response *resp;
+
+ resp = GNUNET_REST_create_response (NULL);
+ handle->proc (handle->proc_cls, resp, handle->response_code);
+ cleanup_handle (handle);
+}
+
+/**
+ * Attribute delegation to JSON
+ * @param attr the attribute
+ * @return JSON, NULL if failed
+ */
+static json_t*
+attribute_delegation_to_json (struct GNUNET_CREDENTIAL_Delegation *delegation_chain_entry)
+{
+ char *subject;
+ char *issuer;
+ json_t *attr_obj;
+
+ issuer = GNUNET_CRYPTO_ecdsa_public_key_to_string (&delegation_chain_entry->issuer_key);
+ if (NULL == issuer)
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Issuer in delegation malformed\n");
+ return NULL;
+ }
+ subject = GNUNET_CRYPTO_ecdsa_public_key_to_string (&delegation_chain_entry->subject_key);
+ if (NULL == subject)
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Subject in credential malformed\n");
+ GNUNET_free (issuer);
+ return NULL;
+ }
+ attr_obj = json_object ();
+
+ json_object_set_new (attr_obj, "issuer", json_string (issuer));
+ json_object_set_new (attr_obj, "issuer_attribute",
+ json_string (delegation_chain_entry->issuer_attribute));
+
+ json_object_set_new (attr_obj, "subject", json_string (subject));
+ if (0 < delegation_chain_entry->subject_attribute_len)
+ {
+ json_object_set_new (attr_obj, "subject_attribute",
+ json_string (delegation_chain_entry->subject_attribute));
+ }
+ GNUNET_free (issuer);
+ GNUNET_free (subject);
+ return attr_obj;
+}
+
+/**
+ * JSONAPI resource to Credential
+ * @param res the JSONAPI resource
+ * @return the resulting credential, NULL if failed
+ */
+static struct GNUNET_CREDENTIAL_Credential*
+json_to_credential (json_t *res)
+{
+ struct GNUNET_CREDENTIAL_Credential *cred;
+ json_t *tmp;
+ const char *attribute;
+ const char *signature;
+ char *sig;
+
+ tmp = json_object_get (res, "attribute");
+ if (0 == json_is_string (tmp))
+ {
+ return NULL;
+ }
+ attribute = json_string_value (tmp);
+ cred = GNUNET_malloc (sizeof (struct GNUNET_CREDENTIAL_Credential)
+ + strlen (attribute));
+ cred->issuer_attribute = attribute;
+ cred->issuer_attribute_len = strlen (attribute);
+ tmp = json_object_get (res, "issuer");
+ if (0 == json_is_string (tmp))
+ {
+ GNUNET_free (cred);
+ return NULL;
+ }
+
+ GNUNET_CRYPTO_ecdsa_public_key_from_string (json_string_value(tmp),
+ strlen (json_string_value(tmp)),
+ &cred->issuer_key);
+ tmp = json_object_get (res, "subject");
+ if (0 == json_is_string (tmp))
+ {
+ GNUNET_free (cred);
+ return NULL;
+ }
+ GNUNET_CRYPTO_ecdsa_public_key_from_string (json_string_value(tmp),
+ strlen (json_string_value(tmp)),
+ &cred->subject_key);
+
+ tmp = json_object_get (res, "signature");
+ if (0 == json_is_string (tmp))
+ {
+ GNUNET_free (cred);
+ return NULL;
+ }
+ signature = json_string_value (tmp);
+ GNUNET_STRINGS_base64_decode (signature,
+ strlen (signature),
+ (char**)&sig);
+ GNUNET_memcpy (&cred->signature,
+ sig,
+ sizeof (struct GNUNET_CRYPTO_EcdsaSignature));
+ GNUNET_free (sig);
+
+ tmp = json_object_get (res, "expiration");
+ if (0 == json_is_integer (tmp))
+ {
+ GNUNET_free (cred);
+ return NULL;
+ }
+ cred->expiration.abs_value_us = json_integer_value (tmp);
+ return cred;
+}
+
+
+/**
+ * Credential to JSON
+ * @param cred the credential
+ * @return the resulting json, NULL if failed
+ */
+static json_t*
+credential_to_json (struct GNUNET_CREDENTIAL_Credential *cred)
+{
+ char *issuer;
+ char *subject;
+ char *signature;
+ char attribute[cred->issuer_attribute_len + 1];
+ json_t *cred_obj;
+
+ issuer = GNUNET_CRYPTO_ecdsa_public_key_to_string (&cred->issuer_key);
+ if (NULL == issuer)
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Issuer in credential malformed\n");
+ return NULL;
+ }
+ subject = GNUNET_CRYPTO_ecdsa_public_key_to_string (&cred->subject_key);
+ if (NULL == subject)
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Subject in credential malformed\n");
+ GNUNET_free (issuer);
+ return NULL;
+ }
+ GNUNET_STRINGS_base64_encode ((char*)&cred->signature,
+ sizeof (struct GNUNET_CRYPTO_EcdsaSignature),
+ &signature);
+ memcpy (attribute,
+ cred->issuer_attribute,
+ cred->issuer_attribute_len);
+ attribute[cred->issuer_attribute_len] = '\0';
+ cred_obj = json_object ();
+ json_object_set_new (cred_obj, "issuer", json_string (issuer));
+ json_object_set_new (cred_obj, "subject", json_string (subject));
+ json_object_set_new (cred_obj, "attribute", json_string (attribute));
+ json_object_set_new (cred_obj, "signature", json_string (signature));
+ json_object_set_new (cred_obj, "expiration", json_integer (cred->expiration.abs_value_us));
+ GNUNET_free (issuer);
+ GNUNET_free (subject);
+ GNUNET_free (signature);
+ return cred_obj;
+}
+
+/**
+ * Function called with the result of a Credential lookup.
+ *
+ * @param cls the 'const char *' name that was resolved
+ * @param cd_count number of records returned
+ * @param cd array of @a cd_count records with the results
+ */
+static void
+handle_collect_response (void *cls,
+ unsigned int d_count,
+ struct GNUNET_CREDENTIAL_Delegation *delegation_chain,
+ unsigned int c_count,
+ struct GNUNET_CREDENTIAL_Credential *cred)
+{
+ struct RequestHandle *handle = cls;
+ struct MHD_Response *resp;
+ struct GNUNET_JSONAPI_Document *json_document;
+ struct GNUNET_JSONAPI_Resource *json_resource;
+ json_t *cred_obj;
+ json_t *cred_array;
+ char *result;
+ char *issuer;
+ char *id;
+ uint32_t i;
+
+ handle->verify_request = NULL;
+ if (NULL == cred) {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Verify failed.\n");
+ handle->response_code = MHD_HTTP_NOT_FOUND;
+ GNUNET_SCHEDULER_add_now (&do_error, handle);
+ return;
+ }
+ issuer = GNUNET_CRYPTO_ecdsa_public_key_to_string (&handle->issuer_key);
+ if (NULL == issuer)
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Issuer in delegation malformed\n");
+ return;
+ }
+ GNUNET_asprintf (&id,
+ "%s.%s",
+ issuer,
+ handle->issuer_attr);
+ GNUNET_free (issuer);
+ json_document = GNUNET_JSONAPI_document_new ();
+ json_resource = GNUNET_JSONAPI_resource_new (GNUNET_REST_JSONAPI_CREDENTIAL_TYPEINFO,
+ id);
+ GNUNET_free (id);
+ cred_array = json_array ();
+ for (i=0;i<c_count;i++)
+ {
+ cred_obj = credential_to_json (&cred[i]);
+ json_array_append_new (cred_array, cred_obj);
+ }
+ GNUNET_JSONAPI_resource_add_attr (json_resource,
+ GNUNET_REST_JSONAPI_CREDENTIAL,
+ cred_array);
+ GNUNET_JSONAPI_document_resource_add (json_document, json_resource);
+ GNUNET_JSONAPI_document_serialize (json_document, &result);
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Result %s\n",
+ result);
+ json_decref (cred_array);
+ GNUNET_JSONAPI_document_delete (json_document);
+ resp = GNUNET_REST_create_response (result);
+ GNUNET_free(result);
+ handle->proc (handle->proc_cls, resp, MHD_HTTP_OK);
+ cleanup_handle (handle);
+}
+
+static void
+subject_ego_lookup (void *cls,
+ const struct GNUNET_IDENTITY_Ego *ego)
+{
+ struct RequestHandle *handle = cls;
+ const struct GNUNET_CRYPTO_EcdsaPrivateKey *sub_key;
+ handle->ego_lookup = NULL;
+
+ if (NULL == ego)
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Subject not found\n");
+ GNUNET_SCHEDULER_add_now (&do_error, handle);
+ return;
+ }
+ sub_key = GNUNET_IDENTITY_ego_get_private_key (ego);
+ handle->verify_request = GNUNET_CREDENTIAL_collect (handle->credential,
+ &handle->issuer_key,
+ handle->issuer_attr,
+ sub_key,
+ &handle_collect_response,
+ handle);
+}
+
+
+
+/**
+ * Function called with the result of a Credential lookup.
+ *
+ * @param cls the 'const char *' name that was resolved
+ * @param cd_count number of records returned
+ * @param cd array of @a cd_count records with the results
+ */
+static void
+handle_verify_response (void *cls,
+ unsigned int d_count,
+ struct GNUNET_CREDENTIAL_Delegation *delegation_chain,
+ unsigned int c_count,
+ struct GNUNET_CREDENTIAL_Credential *cred)
+{
+
+ struct RequestHandle *handle = cls;
+ struct MHD_Response *resp;
+ struct GNUNET_JSONAPI_Document *json_document;
+ struct GNUNET_JSONAPI_Resource *json_resource;
+ json_t *cred_obj;
+ json_t *attr_obj;
+ json_t *cred_array;
+ json_t *attr_array;
+ char *result;
+ char *issuer;
+ char *id;
+ uint32_t i;
+
+ handle->verify_request = NULL;
+ if (NULL == cred) {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Verify failed.\n");
+ handle->response_code = MHD_HTTP_NOT_FOUND;
+ GNUNET_SCHEDULER_add_now (&do_error, handle);
+ return;
+ }
+ issuer = GNUNET_CRYPTO_ecdsa_public_key_to_string (&handle->issuer_key);
+ if (NULL == issuer)
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Issuer in delegation malformed\n");
+ return;
+ }
+ GNUNET_asprintf (&id,
+ "%s.%s",
+ issuer,
+ handle->issuer_attr);
+ GNUNET_free (issuer);
+ json_document = GNUNET_JSONAPI_document_new ();
+ json_resource = GNUNET_JSONAPI_resource_new (GNUNET_REST_JSONAPI_CREDENTIAL_TYPEINFO,
+ id);
+ GNUNET_free (id);
+ attr_array = json_array ();
+ for (i = 0; i < d_count; i++)
+ {
+ attr_obj = attribute_delegation_to_json (&delegation_chain[i]);
+ json_array_append_new (attr_array, attr_obj);
+ }
+ cred_array = json_array ();
+ for (i=0;i<c_count;i++)
+ {
+ cred_obj = credential_to_json (&cred[i]);
+ json_array_append_new (cred_array, cred_obj);
+ }
+ GNUNET_JSONAPI_resource_add_attr (json_resource,
+ GNUNET_REST_JSONAPI_CREDENTIAL,
+ cred_array);
+ GNUNET_JSONAPI_resource_add_attr (json_resource,
+ GNUNET_REST_JSONAPI_DELEGATIONS,
+ attr_array);
+ GNUNET_JSONAPI_document_resource_add (json_document, json_resource);
+ GNUNET_JSONAPI_document_serialize (json_document, &result);
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Result %s\n",
+ result);
+ json_decref (attr_array);
+ json_decref (cred_array);
+ GNUNET_JSONAPI_document_delete (json_document);
+ resp = GNUNET_REST_create_response (result);
+ handle->proc (handle->proc_cls, resp, MHD_HTTP_OK);
+ GNUNET_free (result);
+ cleanup_handle (handle);
+}
+
+static void
+collect_cred_cont (struct GNUNET_REST_RequestHandle *conndata_handle,
+ const char* url,
+ void *cls)
+{
+ struct RequestHandle *handle = cls;
+ struct GNUNET_HashCode key;
+ char *tmp;
+ char *entity_attr;
+
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Connecting...\n");
+ handle->credential = GNUNET_CREDENTIAL_connect (cfg);
+ handle->timeout_task = GNUNET_SCHEDULER_add_delayed (handle->timeout,
+ &do_error, handle);
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Connected\n");
+ if (NULL == handle->credential)
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Connecting to CREDENTIAL failed\n");
+ GNUNET_SCHEDULER_add_now (&do_error, handle);
+ return;
+ }
+ GNUNET_CRYPTO_hash (GNUNET_REST_JSONAPI_CREDENTIAL_ISSUER_ATTR,
+ strlen (GNUNET_REST_JSONAPI_CREDENTIAL_ISSUER_ATTR),
+ &key);
+ if ( GNUNET_NO ==
+ GNUNET_CONTAINER_multihashmap_contains (conndata_handle->url_param_map,
+ &key) )
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Missing issuer attribute\n");
+ GNUNET_SCHEDULER_add_now (&do_error, handle);
+ return;
+ }
+ tmp = GNUNET_CONTAINER_multihashmap_get (conndata_handle->url_param_map,
+ &key);
+ entity_attr = GNUNET_strdup (tmp);
+ tmp = strtok(entity_attr, ".");
+ if (NULL == tmp)
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Malformed issuer or attribute\n");
+ GNUNET_free (entity_attr);
+ GNUNET_SCHEDULER_add_now (&do_error, handle);
+ return;
+ }
+ if (GNUNET_OK !=
+ GNUNET_CRYPTO_ecdsa_public_key_from_string (tmp,
+ strlen (tmp),
+ &handle->issuer_key))
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Malformed issuer key\n");
+ GNUNET_free (entity_attr);
+ GNUNET_SCHEDULER_add_now (&do_error, handle);
+ return;
+ }
+ tmp = strtok (NULL, "."); //Issuer attribute
+ if (NULL == tmp)
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Malformed attribute\n");
+ GNUNET_free (entity_attr);
+ GNUNET_SCHEDULER_add_now (&do_error, handle);
+ return;
+ }
+ handle->issuer_attr = GNUNET_strdup (tmp);
+ GNUNET_free (entity_attr);
+
+ GNUNET_CRYPTO_hash (GNUNET_REST_JSONAPI_CREDENTIAL_SUBJECT_EGO,
+ strlen (GNUNET_REST_JSONAPI_CREDENTIAL_SUBJECT_EGO),
+ &key);
+ if ( GNUNET_NO ==
+ GNUNET_CONTAINER_multihashmap_contains (conndata_handle->url_param_map,
+ &key) )
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Missing subject\n");
+ GNUNET_free (entity_attr);
+ GNUNET_SCHEDULER_add_now (&do_error, handle);
+ return;
+ }
+ tmp = GNUNET_CONTAINER_multihashmap_get (conndata_handle->url_param_map,
+ &key);
+ if (NULL == tmp)
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Malformed subject\n");
+ GNUNET_free (entity_attr);
+ GNUNET_SCHEDULER_add_now (&do_error, handle);
+ return;
+ }
+ handle->ego_lookup = GNUNET_IDENTITY_ego_lookup (cfg,
+ tmp,
+ &subject_ego_lookup,
+ handle);
+}
+
+
+
+static void
+verify_cred_cont (struct GNUNET_REST_RequestHandle *conndata_handle,
+ const char* url,
+ void *cls)
+{
+ struct RequestHandle *handle = cls;
+ struct GNUNET_HashCode key;
+ struct GNUNET_JSONAPI_Document *json_obj;
+ struct GNUNET_JSONAPI_Resource *res;
+ struct GNUNET_CREDENTIAL_Credential *cred;
+ char *tmp;
+ char *entity_attr;
+ int i;
+ uint32_t credential_count;
+ uint32_t resource_count;
+ json_t *cred_json;
+ json_t *data_js;
+ json_error_t err;
+
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Connecting...\n");
+ handle->credential = GNUNET_CREDENTIAL_connect (cfg);
+ handle->timeout_task = GNUNET_SCHEDULER_add_delayed (handle->timeout,
+ &do_error, handle);
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Connected\n");
+ if (NULL == handle->credential)
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Connecting to CREDENTIAL failed\n");
+ GNUNET_SCHEDULER_add_now (&do_error, handle);
+ return;
+ }
+ GNUNET_CRYPTO_hash (GNUNET_REST_JSONAPI_CREDENTIAL_ISSUER_ATTR,
+ strlen (GNUNET_REST_JSONAPI_CREDENTIAL_ISSUER_ATTR),
+ &key);
+ if ( GNUNET_NO ==
+ GNUNET_CONTAINER_multihashmap_contains (conndata_handle->url_param_map,
+ &key) )
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Missing issuer attribute\n");
+ GNUNET_SCHEDULER_add_now (&do_error, handle);
+ return;
+ }
+ tmp = GNUNET_CONTAINER_multihashmap_get (conndata_handle->url_param_map,
+ &key);
+ entity_attr = GNUNET_strdup (tmp);
+ tmp = strtok(entity_attr, ".");
+ if (NULL == tmp)
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Malformed issuer or attribute\n");
+ GNUNET_free (entity_attr);
+ GNUNET_SCHEDULER_add_now (&do_error, handle);
+ return;
+ }
+ if (GNUNET_OK !=
+ GNUNET_CRYPTO_ecdsa_public_key_from_string (tmp,
+ strlen (tmp),
+ &handle->issuer_key))
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Malformed issuer key\n");
+ GNUNET_free (entity_attr);
+ GNUNET_SCHEDULER_add_now (&do_error, handle);
+ return;
+ }
+ tmp = strtok (NULL, "."); //Issuer attribute
+ if (NULL == tmp)
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Malformed attribute\n");
+ GNUNET_free (entity_attr);
+ GNUNET_SCHEDULER_add_now (&do_error, handle);
+ return;
+ }
+ handle->issuer_attr = GNUNET_strdup (tmp);
+ GNUNET_free (entity_attr);
+
+ GNUNET_CRYPTO_hash (GNUNET_REST_JSONAPI_CREDENTIAL_SUBJECT_KEY,
+ strlen (GNUNET_REST_JSONAPI_CREDENTIAL_SUBJECT_KEY),
+ &key);
+ if ( GNUNET_NO ==
+ GNUNET_CONTAINER_multihashmap_contains (conndata_handle->url_param_map,
+ &key) )
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Missing subject key\n");
+ GNUNET_free (entity_attr);
+ GNUNET_SCHEDULER_add_now (&do_error, handle);
+ return;
+ }
+ tmp = GNUNET_CONTAINER_multihashmap_get (conndata_handle->url_param_map,
+ &key);
+ if (NULL == tmp)
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Malformed subject\n");
+ GNUNET_free (entity_attr);
+ GNUNET_SCHEDULER_add_now (&do_error, handle);
+ return;
+ }
+ if (GNUNET_OK !=
+ GNUNET_CRYPTO_ecdsa_public_key_from_string (tmp,
+ strlen (tmp),
+ &handle->subject_key)) {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Malformed subject key\n");
+ GNUNET_free (entity_attr);
+ GNUNET_SCHEDULER_add_now (&do_error, handle);
+ return;
+ }
+
+ if (0 >= handle->rest_handle->data_size)
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Missing credentials\n");
+ GNUNET_SCHEDULER_add_now (&do_error, handle);
+ return;
+ }
+
+ struct GNUNET_JSON_Specification docspec[] = {
+ GNUNET_JSON_spec_jsonapi_document (&json_obj),
+ GNUNET_JSON_spec_end()
+ };
+ char term_data[handle->rest_handle->data_size+1];
+ term_data[handle->rest_handle->data_size] = '\0';
+ credential_count = 0;
+ GNUNET_memcpy (term_data,
+ handle->rest_handle->data,
+ handle->rest_handle->data_size);
+ data_js = json_loads (term_data,
+ JSON_DECODE_ANY,
+ &err);
+ GNUNET_assert (GNUNET_OK == GNUNET_JSON_parse (data_js, docspec,
+ NULL, NULL));
+ json_decref (data_js);
+ if (NULL == json_obj)
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Unable to parse JSONAPI Object from %s\n",
+ term_data);
+ GNUNET_SCHEDULER_add_now (&do_error, handle);
+ return;
+ }
+
+ resource_count = GNUNET_JSONAPI_document_resource_count(json_obj);
+ GNUNET_assert (1 == resource_count);
+ res = (GNUNET_JSONAPI_document_get_resource(json_obj, 0));
+ if (GNUNET_NO == GNUNET_JSONAPI_resource_check_type(res,
+ GNUNET_REST_JSONAPI_CREDENTIAL_TYPEINFO))
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Resource not a credential!\n");
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Unable to parse JSONAPI Object from %s\n",
+ term_data);
+ GNUNET_JSONAPI_document_delete (json_obj);
+ GNUNET_SCHEDULER_add_now (&do_error, handle);
+ return;
+ }
+ cred_json = GNUNET_JSONAPI_resource_read_attr (res,
+ GNUNET_REST_JSONAPI_CREDENTIAL);
+
+ GNUNET_assert (json_is_array (cred_json));
+
+ credential_count = json_array_size(cred_json);
+
+ struct GNUNET_CREDENTIAL_Credential credentials[credential_count];
+ for (i=0;i<credential_count;i++)
+ {
+ cred = json_to_credential (json_array_get (cred_json, i));
+ if (NULL == cred)
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Unable to parse credential!\n");
+ continue;
+ }
+ GNUNET_memcpy (&credentials[i],
+ cred,
+ sizeof (struct GNUNET_CREDENTIAL_Credential));
+ credentials[i].issuer_attribute = GNUNET_strdup (cred->issuer_attribute);
+ GNUNET_free (cred);
+ }
+ GNUNET_JSONAPI_document_delete(json_obj);
+ handle->verify_request = GNUNET_CREDENTIAL_verify (handle->credential,
+ &handle->issuer_key,
+ handle->issuer_attr,
+ &handle->subject_key,
+ credential_count,
+ credentials,
+ &handle_verify_response,
+ handle);
+ for (i=0;i<credential_count;i++)
+ GNUNET_free ((char*)credentials[i].issuer_attribute);
+
+}
+
+void
+send_cred_response (struct RequestHandle *handle,
+ struct GNUNET_CREDENTIAL_Credential *cred)
+{
+ struct MHD_Response *resp;
+ struct GNUNET_JSONAPI_Document *json_document;
+ struct GNUNET_JSONAPI_Resource *json_resource;
+ json_t *cred_obj;
+ char *result;
+ char *issuer;
+ char *subject;
+ char *signature;
+ char *id;
+
+ GNUNET_assert (NULL != cred);
+ issuer = GNUNET_CRYPTO_ecdsa_public_key_to_string (&cred->issuer_key);
+ if (NULL == issuer)
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Subject malformed\n");
+ return;
+ }
+ GNUNET_asprintf (&id,
+ "%s.%s",
+ issuer,
+ (char*)&cred[1]);
+ subject = GNUNET_CRYPTO_ecdsa_public_key_to_string (&cred->subject_key);
+ if (NULL == subject)
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Subject malformed\n");
+ return;
+ }
+ GNUNET_STRINGS_base64_encode ((char*)&cred->signature,
+ sizeof (struct GNUNET_CRYPTO_EcdsaSignature),
+ &signature);
+ json_document = GNUNET_JSONAPI_document_new ();
+ json_resource = GNUNET_JSONAPI_resource_new (GNUNET_REST_JSONAPI_CREDENTIAL_TYPEINFO,
+ id);
+ GNUNET_free (id);
+ cred_obj = json_object();
+ json_object_set_new (cred_obj, "issuer", json_string (issuer));
+ json_object_set_new (cred_obj, "subject", json_string (subject));
+ json_object_set_new (cred_obj, "expiration", json_integer( cred->expiration.abs_value_us));
+ json_object_set_new (cred_obj, "signature", json_string (signature));
+ GNUNET_JSONAPI_resource_add_attr (json_resource,
+ GNUNET_REST_JSONAPI_CREDENTIAL,
+ cred_obj);
+ GNUNET_JSONAPI_document_resource_add (json_document, json_resource);
+ GNUNET_JSONAPI_document_serialize (json_document, &result);
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Result %s\n",
+ result);
+ json_decref (cred_obj);
+ GNUNET_JSONAPI_document_delete (json_document);
+ resp = GNUNET_REST_create_response (result);
+ handle->proc (handle->proc_cls, resp, MHD_HTTP_OK);
+ GNUNET_free (result);
+ GNUNET_free (signature);
+ GNUNET_free (issuer);
+ GNUNET_free (subject);
+ cleanup_handle (handle);
+}
+
+void
+get_cred_issuer_cb (void *cls,
+ struct GNUNET_IDENTITY_Ego *ego,
+ void **ctx,
+ const char *name)
+{
+ struct RequestHandle *handle = cls;
+ struct GNUNET_TIME_Absolute etime_abs;
+ struct GNUNET_TIME_Relative etime_rel;
+ const struct GNUNET_CRYPTO_EcdsaPrivateKey *issuer_key;
+ struct GNUNET_HashCode key;
+ struct GNUNET_CREDENTIAL_Credential *cred;
+ char* expiration_str;
+ char* tmp;
+
+ handle->id_op = NULL;
+
+ if (NULL == name)
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Issuer not configured!\n");
+ GNUNET_SCHEDULER_add_now (&do_error, handle);
+ return;
+ }
+
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Connecting to credential service...\n");
+ handle->credential = GNUNET_CREDENTIAL_connect (cfg);
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Connected\n");
+ if (NULL == handle->credential)
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Connecting to CREDENTIAL failed\n");
+ GNUNET_SCHEDULER_add_now (&do_error, handle);
+ return;
+ }
+ GNUNET_CRYPTO_hash (GNUNET_REST_JSONAPI_CREDENTIAL_EXPIRATION,
+ strlen (GNUNET_REST_JSONAPI_CREDENTIAL_EXPIRATION),
+ &key);
+ if ( GNUNET_NO ==
+ GNUNET_CONTAINER_multihashmap_contains (handle->rest_handle->url_param_map,
+ &key) )
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Missing expiration\n");
+ GNUNET_SCHEDULER_add_now (&do_error, handle);
+ return;
+ }
+ expiration_str = GNUNET_CONTAINER_multihashmap_get (handle->rest_handle->url_param_map,
+ &key);
+ if (GNUNET_OK == GNUNET_STRINGS_fancy_time_to_relative (expiration_str,
+ &etime_rel))
+ {
+ etime_abs = GNUNET_TIME_relative_to_absolute (etime_rel);
+ } else if (GNUNET_OK != GNUNET_STRINGS_fancy_time_to_absolute (expiration_str,
+ &etime_abs))
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Malformed expiration: %s\n", expiration_str);
+ GNUNET_SCHEDULER_add_now (&do_error, handle);
+ return;
+ }
+ GNUNET_CRYPTO_hash (GNUNET_REST_JSONAPI_CREDENTIAL_ISSUER_ATTR,
+ strlen (GNUNET_REST_JSONAPI_CREDENTIAL_ISSUER_ATTR),
+ &key);
+ if ( GNUNET_NO ==
+ GNUNET_CONTAINER_multihashmap_contains (handle->rest_handle->url_param_map,
+ &key) )
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Missing issuer attribute\n");
+ GNUNET_SCHEDULER_add_now (&do_error, handle);
+ return;
+ }
+ handle->issuer_attr = GNUNET_strdup(GNUNET_CONTAINER_multihashmap_get
+ (handle->rest_handle->url_param_map,
+ &key));
+ GNUNET_CRYPTO_hash (GNUNET_REST_JSONAPI_CREDENTIAL_SUBJECT_KEY,
+ strlen (GNUNET_REST_JSONAPI_CREDENTIAL_SUBJECT_KEY),
+ &key);
+ if ( GNUNET_NO ==
+ GNUNET_CONTAINER_multihashmap_contains (handle->rest_handle->url_param_map,
+ &key) )
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Missing subject\n");
+ GNUNET_SCHEDULER_add_now (&do_error, handle);
+ return;
+ }
+ tmp = GNUNET_CONTAINER_multihashmap_get (handle->rest_handle->url_param_map,
+ &key);
+ if (NULL == tmp)
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Malformed subject\n");
+ GNUNET_SCHEDULER_add_now (&do_error, handle);
+ return;
+ }
+ if (GNUNET_OK !=
+ GNUNET_CRYPTO_ecdsa_public_key_from_string (tmp,
+ strlen (tmp),
+ &handle->subject_key)) {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Malformed subject key\n");
+ GNUNET_SCHEDULER_add_now (&do_error, handle);
+ return;
+ }
+ issuer_key = GNUNET_IDENTITY_ego_get_private_key (ego);
+ cred = GNUNET_CREDENTIAL_credential_issue (issuer_key,
+ &handle->subject_key,
+ handle->issuer_attr,
+ &etime_abs);
+ if (NULL == cred)
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Failed to create credential\n");
+ GNUNET_SCHEDULER_add_now (&do_error, handle);
+ return;
+ }
+ send_cred_response (handle, cred);
+}
+
+
+static void
+issue_cred_cont (struct GNUNET_REST_RequestHandle *conndata_handle,
+ const char* url,
+ void *cls)
+{
+ struct RequestHandle *handle = cls;
+
+ handle->identity = GNUNET_IDENTITY_connect (cfg,
+ NULL,
+ NULL);
+ handle->id_op = GNUNET_IDENTITY_get(handle->identity,
+ "credential-issuer",
+ &get_cred_issuer_cb,
+ handle);
+ handle->timeout_task = GNUNET_SCHEDULER_add_delayed (handle->timeout,
+ &do_error,
+ handle);
+}
+
+/**
+ * Handle rest request
+ *
+ * @param handle the lookup handle
+ */
+static void
+options_cont (struct GNUNET_REST_RequestHandle *con_handle,
+ const char* url,
+ void *cls)
+{
+ struct MHD_Response *resp;
+ struct RequestHandle *handle = cls;
+
+ //For GNS, independent of path return all options
+ resp = GNUNET_REST_create_response (NULL);
+ MHD_add_response_header (resp,
+ "Access-Control-Allow-Methods",
+ MHD_HTTP_METHOD_GET);
+ handle->proc (handle->proc_cls,
+ resp,
+ MHD_HTTP_OK);
+ cleanup_handle (handle);
+}
+
+
+/**
+ * Function processing the REST call
+ *
+ * @param method HTTP method
+ * @param url URL of the HTTP request
+ * @param data body of the HTTP request (optional)
+ * @param data_size length of the body
+ * @param proc callback function for the result
+ * @param proc_cls closure for callback function
+ * @return GNUNET_OK if request accepted
+ */
+static void
+rest_credential_process_request(struct GNUNET_REST_RequestHandle *conndata_handle,
+ GNUNET_REST_ResultProcessor proc,
+ void *proc_cls)
+{
+ struct RequestHandle *handle = GNUNET_new (struct RequestHandle);
+ struct GNUNET_REST_RequestHandlerError err;
+
+ handle->timeout = GNUNET_TIME_UNIT_FOREVER_REL;
+ handle->proc_cls = proc_cls;
+ handle->proc = proc;
+ handle->rest_handle = conndata_handle;
+
+ static const struct GNUNET_REST_RequestHandler handlers[] = {
+ {MHD_HTTP_METHOD_POST, GNUNET_REST_API_NS_CREDENTIAL_VERIFY, &verify_cred_cont},
+ {MHD_HTTP_METHOD_GET, GNUNET_REST_API_NS_CREDENTIAL_COLLECT, &collect_cred_cont},
+ {MHD_HTTP_METHOD_GET, GNUNET_REST_API_NS_CREDENTIAL_ISSUE, &issue_cred_cont},
+ {MHD_HTTP_METHOD_OPTIONS, GNUNET_REST_API_NS_CREDENTIAL, &options_cont},
+ GNUNET_REST_HANDLER_END
+ };
+
+ if (GNUNET_NO == GNUNET_JSONAPI_handle_request (conndata_handle,
+ handlers,
+ &err,
+ handle))
+ {
+ handle->response_code = err.error_code;
+ GNUNET_SCHEDULER_add_now (&do_error, handle);
+ }
+}
+
+
+/**
+ * Entry point for the plugin.
+ *
+ * @param cls the "struct GNUNET_NAMESTORE_PluginEnvironment*"
+ * @return NULL on error, otherwise the plugin context
+ */
+void *
+libgnunet_plugin_rest_credential_init (void *cls)
+{
+ static struct Plugin plugin;
+ cfg = cls;
+ struct GNUNET_REST_Plugin *api;
+
+ if (NULL != plugin.cfg)
+ return NULL; /* can only initialize once! */
+ memset (&plugin, 0, sizeof (struct Plugin));
+ plugin.cfg = cfg;
+ api = GNUNET_new (struct GNUNET_REST_Plugin);
+ api->cls = &plugin;
+ api->name = GNUNET_REST_API_NS_CREDENTIAL;
+ api->process_request = &rest_credential_process_request;
+ GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+ _("GNS REST API initialized\n"));
+ return api;
+}
+
+
+/**
+ * Exit point from the plugin.
+ *
+ * @param cls the plugin context (as returned by "init")
+ * @return always NULL
+ */
+void *
+libgnunet_plugin_rest_credential_done (void *cls)
+{
+ struct GNUNET_REST_Plugin *api = cls;
+ struct Plugin *plugin = api->cls;
+
+ plugin->cfg = NULL;
+ GNUNET_free (api);
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "GNS REST plugin is finished\n");
+ return NULL;
+}
+
+/* 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 0000000000..6c713063f5
--- /dev/null
+++ b/src/credential/test_credential_collect.sh
@@ -0,0 +1,47 @@
+#!/bin/bash
+trap "gnunet-arm -e -c test_credential_lookup.conf" SIGINT
+
+LOCATION=$(which gnunet-config)
+if [ -z $LOCATION ]
+then
+ LOCATION="gnunet-config"
+fi
+$LOCATION --version 1> /dev/null
+if test $? != 0
+then
+ echo "GNUnet command line tools cannot be found, check environmental variables PATH and GNUNET_PREFIX"
+ exit 77
+fi
+
+rm -rf `gnunet-config -c test_credential_lookup.conf -s PATHS -o GNUNET_HOME -f`
+
+# (1) PKEY1.user -> PKEY2.resu.user
+# (2) PKEY2.resu -> PKEY3
+# (3) PKEY3.user -> PKEY4
+
+
+which timeout &> /dev/null && DO_TIMEOUT="timeout 30"
+
+TEST_ATTR="test"
+TEST_ATTR2="test2"
+gnunet-arm -s -c test_credential_lookup.conf
+gnunet-identity -C testissuer -c test_credential_lookup.conf
+gnunet-identity -C testsubject -c test_credential_lookup.conf
+SUBJECT_KEY=$(gnunet-identity -d -c test_credential_lookup.conf | grep testsubject | awk '{print $3}')
+ISSUER_KEY=$(gnunet-identity -d -c test_credential_lookup.conf | grep testissuer | awk '{print $3}')
+#TODO1 Get credential and store it with subject (3)
+CRED=`$DO_TIMEOUT gnunet-credential --issue --ego=testissuer --subject=$SUBJECT_KEY --attribute=$TEST_ATTR --ttl=5m -c test_credential_lookup.conf`
+$DO_TIMEOUT gnunet-namestore -a -z testsubject -n c1 -t CRED -V "$CRED" -e 5m -c test_credential_lookup.conf
+CRED=`$DO_TIMEOUT gnunet-credential --issue --ego=testissuer --subject=$SUBJECT_KEY --attribute=$TEST_ATTR2 --ttl=5m -c test_credential_lookup.conf`
+$DO_TIMEOUT gnunet-namestore -a -z testsubject -n c2 -t CRED -V "$CRED" -e 5m -c test_credential_lookup.conf
+CREDS=`$DO_TIMEOUT gnunet-credential --collect --issuer=$ISSUER_KEY --attribute=$TEST_ATTR --ego=testsubject -c test_credential_lookup.conf | paste -d, -s`
+echo $CREDS
+RES=$?
+gnunet-arm -e -c test_credential_lookup.conf
+
+if test $? != 0
+then
+ echo "Error collecting..."
+ exit 1
+fi
+
diff --git a/src/credential/test_credential_collect_rest.sh b/src/credential/test_credential_collect_rest.sh
new file mode 100755
index 0000000000..0b31f85bc2
--- /dev/null
+++ b/src/credential/test_credential_collect_rest.sh
@@ -0,0 +1,90 @@
+#!/bin/bash
+trap "gnunet-arm -e -c test_credential_lookup.conf" SIGINT
+
+LOCATION=$(which gnunet-config)
+if [ -z $LOCATION ]
+then
+ LOCATION="gnunet-config"
+fi
+$LOCATION --version 1> /dev/null
+if test $? != 0
+then
+ echo "GNUnet command line tools cannot be found, check environmental variables PATH and GNUNET_PREFIX"
+ exit 77
+fi
+
+rm -rf `gnunet-config -c test_credential_lookup.conf -s PATHS -o GNUNET_HOME -f`
+
+# (1) Service.user -> GNU.project.member
+# (2) GNU.project -> GNUnet
+# (3) GNUnet.member -> GNUnet.developer
+# (4) GNUnet.member -> GNUnet.user
+# (5) GNUnet.developer -> Alice
+
+
+which timeout &> /dev/null && DO_TIMEOUT="timeout 30"
+gnunet-arm -s -c test_credential_lookup.conf
+gnunet-identity -C service -c test_credential_lookup.conf
+gnunet-identity -C alice -c test_credential_lookup.conf
+gnunet-identity -C gnu -c test_credential_lookup.conf
+gnunet-identity -C gnunet -c test_credential_lookup.conf
+
+GNU_KEY=$(gnunet-identity -d -c test_credential_lookup.conf | grep gnu | grep -v gnunet | awk '{print $3}')
+ALICE_KEY=$(gnunet-identity -d -c test_credential_lookup.conf | grep alice | awk '{print $3}')
+GNUNET_KEY=$(gnunet-identity -d -c test_credential_lookup.conf | grep gnunet | awk '{print $3}')
+SERVICE_KEY=$(gnunet-identity -d -c test_credential_lookup.conf | grep service | awk '{print $3}')
+
+USER_ATTR="user"
+GNU_PROJECT_ATTR="project"
+MEMBER_ATTR="member"
+DEVELOPER_ATTR="developer"
+DEV_ATTR="developer"
+TEST_CREDENTIAL="mygnunetcreds"
+
+# (1) A service assigns the attribute "user" to all entities that have been assigned "member" by entities that werde assigned "project" from GNU
+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
+
+# (2) GNU recognized GNUnet as a GNU project and delegates the "project" attribute
+gnunet-namestore -p -z gnu -a -n $GNU_PROJECT_ATTR -t ATTR -V "$GNUNET_KEY" -e 5m -c test_credential_lookup.conf
+
+# (3+4) GNUnet assigns the attribute "member" to all entities gnunet has also assigned "developer" or "user"
+gnunet-namestore -p -z gnunet -a -n $MEMBER_ATTR -t ATTR -V "$GNUNET_KEY $DEVELOPER_ATTR" -e 5m -c test_credential_lookup.conf
+gnunet-namestore -p -z gnunet -a -n $MEMBER_ATTR -t ATTR -V "$GNUNET_KEY $USER_ATTR" -e 5m -c test_credential_lookup.conf
+
+# (5) GNUnet issues Alice the credential "developer"
+CRED=`$DO_TIMEOUT gnunet-credential --issue --ego=gnunet --subject=$ALICE_KEY --attribute=$DEV_ATTR --ttl=5m -c test_credential_lookup.conf`
+
+# Alice stores the credential under "mygnunetcreds"
+gnunet-namestore -p -z alice -a -n $TEST_CREDENTIAL -t CRED -V "$CRED" -e 5m -c test_credential_lookup.conf
+
+# (5) GNUnet issues Alice the credential "developer"
+CRED=`$DO_TIMEOUT gnunet-credential --issue --ego=gnunet --subject=$ALICE_KEY --attribute=$USER_ATTR --ttl=5m -c test_credential_lookup.conf`
+
+# Alice stores the credential under "mygnunetcreds"
+gnunet-namestore -p -z alice -a -n $TEST_CREDENTIAL -t CRED -V "$CRED" -e 5m -c test_credential_lookup.conf
+
+#TODO2 Add -z swich like in gnunet-gns
+#RES_CRED=`gnunet-credential --collect --issuer=$SERVICE_KEY --attribute=$USER_ATTR --subject=$ALICE_KEY -c test_credential_lookup.conf`
+
+gnunet-arm -i rest -c test_credential_lookup.conf
+
+sleep 5
+
+curl -v "localhost:7776/credential/collect?attribute=$SERVICE_KEY.$USER_ATTR&subject=alice"
+
+#TODO cleanup properly
+gnunet-namestore -z alice -d -n $TEST_CREDENTIAL -t CRED -e never -c test_credential_lookup.conf
+gnunet-namestore -z gnu -d -n $GNU_PROJECT_ATTR -t ATTR -c test_credential_lookup.conf
+gnunet-namestore -z gnunet -d -n $MEMBER_ATTR -t ATTR -c test_credential_lookup.conf
+gnunet-namestore -z service -d -n $USER_ATTR -t ATTR -c test_credential_lookup.conf
+echo "Stopping arm..."
+gnunet-arm -e -c test_credential_lookup.conf
+echo "Done"
+if [ "$RES_CRED" != "Failed." ]
+then
+ echo -e "${RES_CRED}"
+ exit 0
+else
+ echo "FAIL: Failed to verify credential $RES_CRED."
+ exit 1
+fi
diff --git a/src/credential/test_credential_defaults.conf b/src/credential/test_credential_defaults.conf
new file mode 100644
index 0000000000..d157ddd437
--- /dev/null
+++ b/src/credential/test_credential_defaults.conf
@@ -0,0 +1,24 @@
+@INLINE@ ../../contrib/no_forcestart.conf
+
+[PATHS]
+GNUNET_TEST_HOME = /tmp/test-gnunet-credential-testing/
+
+[namestore-sqlite]
+FILENAME = $GNUNET_TEST_HOME/namestore/sqlite_test.db
+
+[namecache-sqlite]
+FILENAME=$GNUNET_TEST_HOME/namecache/namecache.db
+
+[identity]
+# Directory where we store information about our egos
+EGODIR = $GNUNET_TEST_HOME/identity/egos/
+
+[dhtcache]
+DATABASE = heap
+
+[transport]
+PLUGINS = tcp
+
+[transport-tcp]
+BINDTO = 127.0.0.1
+
diff --git a/src/credential/test_credential_issue.sh b/src/credential/test_credential_issue.sh
new file mode 100755
index 0000000000..158d91c5b0
--- /dev/null
+++ b/src/credential/test_credential_issue.sh
@@ -0,0 +1,44 @@
+#!/bin/bash
+trap "gnunet-arm -e -c test_credential_lookup.conf" SIGINT
+
+LOCATION=$(which gnunet-config)
+if [ -z $LOCATION ]
+then
+ LOCATION="gnunet-config"
+fi
+$LOCATION --version 1> /dev/null
+if test $? != 0
+then
+ echo "GNUnet command line tools cannot be found, check environmental variables PATH and GNUNET_PREFIX"
+ exit 77
+fi
+
+rm -rf `gnunet-config -c test_credential_lookup.conf -s PATHS -o GNUNET_HOME -f`
+
+# (1) PKEY1.user -> PKEY2.resu.user
+# (2) PKEY2.resu -> PKEY3
+# (3) PKEY3.user -> PKEY4
+
+
+which timeout &> /dev/null && DO_TIMEOUT="timeout 30"
+
+TEST_ATTR="test"
+gnunet-arm -s -c test_credential_lookup.conf
+gnunet-identity -C testissuer -c test_credential_lookup.conf
+gnunet-identity -C testsubject -c test_credential_lookup.conf
+SUBJECT_KEY=$(gnunet-identity -d -c test_credential_lookup.conf | grep testsubject | awk '{print $3}')
+ISSUER_KEY=$(gnunet-identity -d -c test_credential_lookup.conf | grep testissuer | awk '{print $3}')
+#TODO1 Get credential and store it with subject (3)
+CRED=`$DO_TIMEOUT gnunet-credential --issue --ego=testissuer --subject=$SUBJECT_KEY --attribute=$TEST_ATTR --ttl=5m -c test_credential_lookup.conf`
+STATUS=$?
+
+if test $? != 0
+then
+ echo "Error issuing..."
+ exit 1
+fi
+#Try import
+$DO_TIMEOUT gnunet-namestore -a -z testsubject -n c1 -t CRED -V "$CRED" -e 5m -c test_credential_lookup.conf
+RES=$?
+gnunet-arm -e -c test_credential_lookup.conf
+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 0000000000..15cd55083e
--- /dev/null
+++ b/src/credential/test_credential_issue_rest.sh
@@ -0,0 +1,53 @@
+#!/bin/bash
+trap "gnunet-arm -e -c test_credential_lookup.conf" SIGINT
+
+LOCATION=$(which gnunet-config)
+if [ -z $LOCATION ]
+then
+ LOCATION="gnunet-config"
+fi
+$LOCATION --version 1> /dev/null
+if test $? != 0
+then
+ echo "GNUnet command line tools cannot be found, check environmental variables PATH and GNUNET_PREFIX"
+ exit 77
+fi
+
+rm -rf `gnunet-config -c test_credential_lookup.conf -s PATHS -o GNUNET_HOME -f`
+
+# (1) PKEY1.user -> PKEY2.resu.user
+# (2) PKEY2.resu -> PKEY3
+# (3) PKEY3.user -> PKEY4
+
+
+which timeout &> /dev/null && DO_TIMEOUT="timeout 30"
+
+TEST_ATTR="test"
+gnunet-arm -s -c test_credential_lookup.conf
+gnunet-arm -i gns
+gnunet-arm -i credential
+gnunet-arm -i identity
+gnunet-arm -i rest -c test_credential_lookup.conf
+
+gnunet-arm -I -c test_credential_lookup.conf
+gnunet-identity -C testissuer -c test_credential_lookup.conf
+gnunet-identity -C testsubject -c test_credential_lookup.conf
+gnunet-identity -s credential-issuer -e testissuer
+SUBJECT_KEY=$(gnunet-identity -d -c test_credential_lookup.conf | grep testsubject | awk '{print $3}')
+ISSUER_KEY=$(gnunet-identity -d -c test_credential_lookup.conf | grep testissuer | awk '{print $3}')
+#TODO1 Get credential and store it with subject (3)
+sleep 5
+curl "localhost:7776/credential/issue?subject_key=$SUBJECT_KEY&attribute=$TEST_ATTR&expiration=1d"
+#CRED=`$DO_TIMEOUT gnunet-credential --issue --ego=testissuer --subject=$SUBJECT_KEY --attribute=$TEST_ATTR --ttl=5m -c test_credential_lookup.conf`
+STATUS=$?
+
+if test $? != 0
+then
+ echo "Error issuing..."
+ exit 1
+fi
+#Try import
+#$DO_TIMEOUT gnunet-namestore -a -z testsubject -n c1 -t CRED -V "$CRED" -e 5m -c test_credential_lookup.conf
+RES=$?
+gnunet-arm -e -c test_credential_lookup.conf
+exit $RES
diff --git a/src/credential/test_credential_lookup.conf b/src/credential/test_credential_lookup.conf
new file mode 100644
index 0000000000..3684063b1f
--- /dev/null
+++ b/src/credential/test_credential_lookup.conf
@@ -0,0 +1,28 @@
+@INLINE@ test_credential_defaults.conf
+
+[PATHS]
+GNUNET_TEST_HOME = /tmp/test-gnunet-credential-peer-1/
+
+[dht]
+AUTOSTART = YES
+
+[transport]
+PLUGINS =
+
+[credential]
+AUTOSTART = YES
+PREFIX = valgrind --leak-check=full --track-origins=yes --log-file=/tmp/credlog
+
+[rest]
+PREFIX = valgrind --leak-check=full --track-origins=yes --log-file=/tmp/restlog
+
+[gns]
+#PREFIX = valgrind --leak-check=full --track-origins=yes
+AUTOSTART = YES
+AUTO_IMPORT_PKEY = YES
+MAX_PARALLEL_BACKGROUND_QUERIES = 10
+DEFAULT_LOOKUP_TIMEOUT = 15 s
+RECORD_PUT_INTERVAL = 1 h
+ZONE_PUBLISH_TIME_WINDOW = 1 h
+DNS_ROOT=PD67SGHF3E0447TU9HADIVU9OM7V4QHTOG0EBU69TFRI2LG63DR0
+
diff --git a/src/credential/test_credential_verify.sh b/src/credential/test_credential_verify.sh
new file mode 100755
index 0000000000..d042bcfe6f
--- /dev/null
+++ b/src/credential/test_credential_verify.sh
@@ -0,0 +1,81 @@
+#!/bin/bash
+trap "gnunet-arm -e -c test_credential_lookup.conf" SIGINT
+
+LOCATION=$(which gnunet-config)
+if [ -z $LOCATION ]
+then
+ LOCATION="gnunet-config"
+fi
+$LOCATION --version 1> /dev/null
+if test $? != 0
+then
+ echo "GNUnet command line tools cannot be found, check environmental variables PATH and GNUNET_PREFIX"
+ exit 77
+fi
+
+rm -rf `gnunet-config -c test_credential_lookup.conf -s PATHS -o GNUNET_HOME -f`
+
+# (1) Service.user -> GNU.project.member
+# (2) GNU.project -> GNUnet
+# (3) GNUnet.member -> GNUnet.developer
+# (4) GNUnet.member -> GNUnet.user
+# (5) GNUnet.developer -> Alice
+
+
+which timeout &> /dev/null && DO_TIMEOUT="timeout 30"
+gnunet-arm -s -c test_credential_lookup.conf
+gnunet-identity -C service -c test_credential_lookup.conf
+gnunet-identity -C alice -c test_credential_lookup.conf
+gnunet-identity -C gnu -c test_credential_lookup.conf
+gnunet-identity -C gnunet -c test_credential_lookup.conf
+
+GNU_KEY=$(gnunet-identity -d -c test_credential_lookup.conf | grep gnu | grep -v gnunet | awk '{print $3}')
+ALICE_KEY=$(gnunet-identity -d -c test_credential_lookup.conf | grep alice | awk '{print $3}')
+GNUNET_KEY=$(gnunet-identity -d -c test_credential_lookup.conf | grep gnunet | awk '{print $3}')
+SERVICE_KEY=$(gnunet-identity -d -c test_credential_lookup.conf | grep service | awk '{print $3}')
+
+USER_ATTR="user"
+GNU_PROJECT_ATTR="project"
+MEMBER_ATTR="member"
+DEVELOPER_ATTR="developer"
+DEV_ATTR="developer"
+TEST_CREDENTIAL="mygnunetcreds"
+
+# (1) A service assigns the attribute "user" to all entities that have been assigned "member" by entities that werde assigned "project" from GNU
+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
+
+# (2) GNU recognized GNUnet as a GNU project and delegates the "project" attribute
+gnunet-namestore -p -z gnu -a -n $GNU_PROJECT_ATTR -t ATTR -V "$GNUNET_KEY" -e 5m -c test_credential_lookup.conf
+
+# (3+4) GNUnet assigns the attribute "member" to all entities gnunet has also assigned "developer" or "user"
+gnunet-namestore -p -z gnunet -a -n $MEMBER_ATTR -t ATTR -V "$GNUNET_KEY $DEVELOPER_ATTR" -e 5m -c test_credential_lookup.conf
+gnunet-namestore -p -z gnunet -a -n $MEMBER_ATTR -t ATTR -V "$GNUNET_KEY $USER_ATTR" -e 5m -c test_credential_lookup.conf
+
+# (5) GNUnet issues Alice the credential "developer"
+CRED=`$DO_TIMEOUT gnunet-credential --issue --ego=gnunet --subject=$ALICE_KEY --attribute=$DEV_ATTR --ttl=5m -c test_credential_lookup.conf`
+
+# Alice stores the credential under "mygnunetcreds"
+gnunet-namestore -p -z alice -a -n $TEST_CREDENTIAL -t CRED -V "$CRED" -e 5m -c test_credential_lookup.conf
+
+CREDS=`$DO_TIMEOUT gnunet-credential --collect --issuer=$SERVICE_KEY --attribute=$USER_ATTR --ego=alice -c test_credential_lookup.conf | paste -d, -s`
+
+echo gnunet-credential --verify --issuer=$SERVICE_KEY --attribute=$USER_ATTR --subject=$ALICE_KEY --credential=\'$CREDS\' -c test_credential_lookup.conf
+#TODO2 Add -z swich like in gnunet-gns
+gnunet-credential --verify --issuer=$SERVICE_KEY --attribute=$USER_ATTR --subject=$ALICE_KEY --credential="$CREDS" -c test_credential_lookup.conf
+
+
+#TODO cleanup properly
+gnunet-namestore -z alice -d -n $TEST_CREDENTIAL -t CRED -e never -c test_credential_lookup.conf
+gnunet-namestore -z gnu -d -n $GNU_PROJECT_ATTR -t ATTR -c test_credential_lookup.conf
+gnunet-namestore -z gnunet -d -n $MEMBER_ATTR -t ATTR -c test_credential_lookup.conf
+gnunet-namestore -z service -d -n $USER_ATTR -t ATTR -c test_credential_lookup.conf
+gnunet-arm -e -c test_credential_lookup.conf
+
+if [ "$RES_CRED" != "Failed." ]
+then
+ echo -e "${RES_CRED}"
+ exit 0
+else
+ echo "FAIL: Failed to verify credential $RES_CRED."
+ exit 1
+fi
diff --git a/src/credential/test_credential_verify_and.sh b/src/credential/test_credential_verify_and.sh
new file mode 100755
index 0000000000..9d5c1962e9
--- /dev/null
+++ b/src/credential/test_credential_verify_and.sh
@@ -0,0 +1,81 @@
+#!/bin/bash
+trap "gnunet-arm -e -c test_credential_lookup.conf" SIGINT
+
+LOCATION=$(which gnunet-config)
+if [ -z $LOCATION ]
+then
+ LOCATION="gnunet-config"
+fi
+$LOCATION --version 1> /dev/null
+if test $? != 0
+then
+ echo "GNUnet command line tools cannot be found, check environmental variables PATH and GNUNET_PREFIX"
+ exit 77
+fi
+
+rm -rf `gnunet-config -c test_credential_lookup.conf -s PATHS -o GNUNET_HOME -f`
+
+# (1) Service.user -> GNU.project.member
+# (2) GNU.project -> GNUnet
+# (3) GNUnet.member -> GNUnet.developer
+# (4) GNUnet.member -> GNUnet.user
+# (5) GNUnet.developer -> Alice
+
+
+which timeout &> /dev/null && DO_TIMEOUT="timeout 30"
+gnunet-arm -s -c test_credential_lookup.conf
+gnunet-identity -C service -c test_credential_lookup.conf
+gnunet-identity -C alice -c test_credential_lookup.conf
+gnunet-identity -C gnu -c test_credential_lookup.conf
+gnunet-identity -C gnunet -c test_credential_lookup.conf
+
+GNU_KEY=$(gnunet-identity -d -c test_credential_lookup.conf | grep gnu | grep -v gnunet | awk '{print $3}')
+ALICE_KEY=$(gnunet-identity -d -c test_credential_lookup.conf | grep alice | awk '{print $3}')
+GNUNET_KEY=$(gnunet-identity -d -c test_credential_lookup.conf | grep gnunet | awk '{print $3}')
+SERVICE_KEY=$(gnunet-identity -d -c test_credential_lookup.conf | grep service | awk '{print $3}')
+
+USER_ATTR="user"
+GNU_PROJECT_ATTR="project"
+MEMBER_ATTR="member"
+DEVELOPER_ATTR="developer"
+DEV_ATTR="developer"
+TEST_CREDENTIAL="mygnunetcreds"
+
+# (1) A service assigns the attribute "user" to all entities that have been assigned "member" by entities that werde assigned "project" from GNU
+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
+
+# (2) GNU recognized GNUnet as a GNU project and delegates the "project" attribute
+gnunet-namestore -p -z gnu -a -n $GNU_PROJECT_ATTR -t ATTR -V "$GNUNET_KEY" -e 5m -c test_credential_lookup.conf
+
+# (3+4) GNUnet assigns the attribute "member" to all entities gnunet has also assigned "developer" or "user"
+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
+
+# (5) GNUnet issues Alice the credential "developer"
+CRED1=`$DO_TIMEOUT gnunet-credential --issue --ego=gnunet --subject=$ALICE_KEY --attribute=$DEV_ATTR --ttl=5m -c test_credential_lookup.conf`
+# (5) GNUnet issues Alice the credential "user"
+CRED2=`$DO_TIMEOUT gnunet-credential --issue --ego=gnunet --subject=$ALICE_KEY --attribute=$USER_ATTR --ttl=5m -c test_credential_lookup.conf`
+# Alice stores the credential under "mygnunetcreds"
+gnunet-namestore -p -z alice -a -n $TEST_CREDENTIAL -t CRED -V "$CRED1" -e 5m -c test_credential_lookup.conf
+gnunet-namestore -p -z alice -a -n $TEST_CREDENTIAL -t CRED -V "$CRED2" -e 5m -c test_credential_lookup.conf
+
+CREDS=`$DO_TIMEOUT gnunet-credential --collect --issuer=$SERVICE_KEY --attribute=$USER_ATTR --ego=alice -c test_credential_lookup.conf | paste -d, -s`
+
+#TODO2 Add -z swich like in gnunet-gns
+RES_CRED=`gnunet-credential --verify --issuer=$SERVICE_KEY --attribute=$USER_ATTR --subject=$ALICE_KEY --credential="$CREDS" -c test_credential_lookup.conf`
+
+
+#TODO cleanup properly
+gnunet-namestore -z alice -d -n $TEST_CREDENTIAL -t CRED -e never -c test_credential_lookup.conf
+gnunet-namestore -z gnu -d -n $GNU_PROJECT_ATTR -t ATTR -c test_credential_lookup.conf
+gnunet-namestore -z gnunet -d -n $MEMBER_ATTR -t ATTR -c test_credential_lookup.conf
+gnunet-namestore -z service -d -n $USER_ATTR -t ATTR -c test_credential_lookup.conf
+gnunet-arm -e -c test_credential_lookup.conf
+
+if [ "$RES_CRED" != "Failed." ]
+then
+ echo -e "${RES_CRED}"
+ exit 0
+else
+ echo "FAIL: Failed to verify credential $RES_CRED."
+ exit 1
+fi
diff --git a/src/credential/test_credential_verify_rest.sh b/src/credential/test_credential_verify_rest.sh
new file mode 100755
index 0000000000..6133ea25ef
--- /dev/null
+++ b/src/credential/test_credential_verify_rest.sh
@@ -0,0 +1,87 @@
+#!/bin/bash
+trap "gnunet-arm -e -c test_credential_lookup.conf" SIGINT
+
+LOCATION=$(which gnunet-config)
+if [ -z $LOCATION ]
+then
+ LOCATION="gnunet-config"
+fi
+$LOCATION --version 1> /dev/null
+if test $? != 0
+then
+ echo "GNUnet command line tools cannot be found, check environmental variables PATH and GNUNET_PREFIX"
+ exit 77
+fi
+
+rm -rf `gnunet-config -c test_credential_lookup.conf -s PATHS -o GNUNET_HOME -f`
+
+# (1) Service.user -> GNU.project.member
+# (2) GNU.project -> GNUnet
+# (3) GNUnet.member -> GNUnet.developer
+# (4) GNUnet.member -> GNUnet.user
+# (5) GNUnet.developer -> Alice
+
+
+which timeout &> /dev/null && DO_TIMEOUT="timeout 30"
+gnunet-arm -s -c test_credential_lookup.conf
+gnunet-identity -C service -c test_credential_lookup.conf
+gnunet-identity -C alice -c test_credential_lookup.conf
+gnunet-identity -C gnu -c test_credential_lookup.conf
+gnunet-identity -C gnunet -c test_credential_lookup.conf
+
+GNU_KEY=$(gnunet-identity -d -c test_credential_lookup.conf | grep gnu | grep -v gnunet | awk '{print $3}')
+ALICE_KEY=$(gnunet-identity -d -c test_credential_lookup.conf | grep alice | awk '{print $3}')
+GNUNET_KEY=$(gnunet-identity -d -c test_credential_lookup.conf | grep gnunet | awk '{print $3}')
+SERVICE_KEY=$(gnunet-identity -d -c test_credential_lookup.conf | grep service | awk '{print $3}')
+
+USER_ATTR="user"
+GNU_PROJECT_ATTR="project"
+MEMBER_ATTR="member"
+DEVELOPER_ATTR="developer"
+DEV_ATTR="developer"
+TEST_CREDENTIAL="mygnunetcreds"
+
+# (1) A service assigns the attribute "user" to all entities that have been assigned "member" by entities that werde assigned "project" from GNU
+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
+
+# (2) GNU recognized GNUnet as a GNU project and delegates the "project" attribute
+gnunet-namestore -p -z gnu -a -n $GNU_PROJECT_ATTR -t ATTR -V "$GNUNET_KEY" -e 5m -c test_credential_lookup.conf
+
+# (3+4) GNUnet assigns the attribute "member" to all entities gnunet has also assigned "developer" or "user"
+gnunet-namestore -p -z gnunet -a -n $MEMBER_ATTR -t ATTR -V "$GNUNET_KEY $DEVELOPER_ATTR" -e 5m -c test_credential_lookup.conf
+gnunet-namestore -p -z gnunet -a -n $MEMBER_ATTR -t ATTR -V "$GNUNET_KEY $USER_ATTR" -e 5m -c test_credential_lookup.conf
+
+# (5) GNUnet issues Alice the credential "developer"
+CRED=`$DO_TIMEOUT gnunet-credential --issue --ego=gnunet --subject=$ALICE_KEY --attribute=$DEV_ATTR --ttl=5m -c test_credential_lookup.conf`
+
+# Alice stores the credential under "mygnunetcreds"
+gnunet-namestore -p -z alice -a -n $TEST_CREDENTIAL -t CRED -V "$CRED" -e 5m -c test_credential_lookup.conf
+
+#TODO2 Add -z swich like in gnunet-gns
+#RES_CRED=`gnunet-credential --verify --issuer=$SERVICE_KEY --attribute=$USER_ATTR --subject=$ALICE_KEY --credential=$TEST_CREDENTIAL -c test_credential_lookup.conf`
+
+gnunet-arm -i rest -c test_credential_lookup.conf
+
+sleep 5
+
+CREDS=`curl "localhost:7776/credential/collect?attribute=$SERVICE_KEY.$USER_ATTR&subject=alice"`
+
+echo $CREDS
+
+curl -v "localhost:7776/credential/verify?attribute=$SERVICE_KEY.$USER_ATTR&subject_key=$ALICE_KEY" --data "$CREDS"
+
+#TODO cleanup properly
+gnunet-namestore -z alice -d -n $TEST_CREDENTIAL -t CRED -e never -c test_credential_lookup.conf
+gnunet-namestore -z gnu -d -n $GNU_PROJECT_ATTR -t ATTR -c test_credential_lookup.conf
+gnunet-namestore -z gnunet -d -n $MEMBER_ATTR -t ATTR -c test_credential_lookup.conf
+gnunet-namestore -z service -d -n $USER_ATTR -t ATTR -c test_credential_lookup.conf
+gnunet-arm -e -c test_credential_lookup.conf
+
+if [ "$RES_CRED" != "Failed." ]
+then
+ echo -e "${RES_CRED}"
+ exit 0
+else
+ echo "FAIL: Failed to verify credential $RES_CRED."
+ exit 1
+fi
diff --git a/src/credential/test_credential_verify_simple.sh b/src/credential/test_credential_verify_simple.sh
new file mode 100755
index 0000000000..c4fd8c7a39
--- /dev/null
+++ b/src/credential/test_credential_verify_simple.sh
@@ -0,0 +1,50 @@
+#!/bin/bash
+trap "gnunet-arm -e -c test_credential_lookup.conf" SIGINT
+
+LOCATION=$(which gnunet-config)
+if [ -z $LOCATION ]
+then
+ LOCATION="gnunet-config"
+fi
+$LOCATION --version 1> /dev/null
+if test $? != 0
+then
+ echo "GNUnet command line tools cannot be found, check environmental variables PATH and GNUNET_PREFIX"
+ exit 77
+fi
+
+rm -rf `gnunet-config -c test_credential_lookup.conf -s PATHS -o GNUNET_HOME -f`
+
+# (3) Isser.user -> Subject
+
+
+which timeout &> /dev/null && DO_TIMEOUT="timeout 30"
+gnunet-arm -s -c test_credential_lookup.conf
+gnunet-identity -C testissuer -c test_credential_lookup.conf
+gnunet-identity -C testsubject -c test_credential_lookup.conf
+
+TEST_ATTR="user"
+SUBJECT_KEY=$(gnunet-identity -d -c test_credential_lookup.conf | grep testsubject | awk '{print $3}')
+ISSUER_KEY=$(gnunet-identity -d -c test_credential_lookup.conf | grep testissuer | awk '{print $3}')
+CRED=`$DO_TIMEOUT gnunet-credential --issue --ego=testissuer --subject=$SUBJECT_KEY --attribute=$TEST_ATTR --ttl=5m -c test_credential_lookup.conf`
+
+TEST_CREDENTIAL="t1"
+gnunet-namestore -p -z testsubject -a -n $TEST_CREDENTIAL -t CRED -V "$CRED" -e 5m -c test_credential_lookup.conf
+
+#TODO2 Add -z swich like in gnunet-gns
+#RES_CRED=`$DO_TIMEOUT gnunet-credential --verify --issuer=$ISSUER_KEY --attribute="$TEST_ATTR" --subject=$SUBJECT_KEY --credential=$TEST_CREDENTIAL -c test_credential_lookup.conf`
+RES_CRED=`gnunet-credential --verify --issuer=$ISSUER_KEY --attribute=$TEST_ATTR --subject=$SUBJECT_KEY --credential=$TEST_CREDENTIAL -c test_credential_lookup.conf`
+
+#TODO cleanup properly
+gnunet-namestore -z testsubject -d -n $TEST_CREDENTIAL -t CRED -e never -c test_credential_lookup.conf
+gnunet-identity -D testsubject -c test_credential_lookup.conf
+gnunet-arm -e -c test_credential_lookup.conf
+echo $RES_CRED
+#TODO3 proper test
+if [ "$RES_CRED" == "Successful." ]
+then
+ exit 0
+else
+ echo "FAIL: Failed to verify credential."
+ exit 1
+fi
diff --git a/src/exit/gnunet-daemon-exit.c b/src/exit/gnunet-daemon-exit.c
index 7196a18446..d9a5dd6848 100644
--- a/src/exit/gnunet-daemon-exit.c
+++ b/src/exit/gnunet-daemon-exit.c
@@ -3802,7 +3802,7 @@ run (void *cls,
if (GNUNET_YES !=
GNUNET_OS_check_helper_binary (binary,
GNUNET_YES,
- "-d gnunet-vpn - - - 169.1.3.3.7 255.255.255.0")) //no nat, ipv4 only
+ "gnunet-vpn - - - 169.1.3.7 255.255.255.0")) //no nat, ipv4 only
{
GNUNET_free (binary);
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
diff --git a/src/gns/gns_api.c b/src/gns/gns_api.c
index 26293f4df8..84c4ae189f 100644
--- a/src/gns/gns_api.c
+++ b/src/gns/gns_api.c
@@ -244,10 +244,7 @@ handle_result (void *cls,
return;
proc = lr->lookup_proc;
proc_cls = lr->proc_cls;
- GNUNET_CONTAINER_DLL_remove (handle->lookup_head,
- handle->lookup_tail,
- lr);
- GNUNET_free (lr);
+
GNUNET_assert (GNUNET_OK ==
GNUNET_GNSRECORD_records_deserialize (mlen,
(const char*) &lookup_msg[1],
@@ -256,6 +253,12 @@ handle_result (void *cls,
proc (proc_cls,
rd_count,
rd);
+ GNUNET_CONTAINER_DLL_remove (handle->lookup_head,
+ handle->lookup_tail,
+ lr);
+ if (NULL != lr->env)
+ GNUNET_MQ_discard (lr->env);
+ GNUNET_free (lr);
}
diff --git a/src/gns/plugin_gnsrecord_gns.c b/src/gns/plugin_gnsrecord_gns.c
index 5d611e19e4..6adad0f348 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,
GNUNET_free (ival);
return box_str;
}
- case GNUNET_GNSRECORD_TYPE_REVERSE:
- {
- struct GNUNET_GNSRECORD_ReverseRecord rev;
- char *rev_str;
- char *pkey_str;
-
- if (data_size < sizeof (struct GNUNET_GNSRECORD_ReverseRecord))
- return NULL; /* malformed */
-
- memcpy (&rev,
- data,
- sizeof (rev));
- cdata = data;
- pkey_str = GNUNET_CRYPTO_ecdsa_public_key_to_string (&rev.pkey);
-
- GNUNET_asprintf (&rev_str,
- "%s %s %"SCNu64,
- &cdata[sizeof (rev)],
- pkey_str,
- rev.expiration.abs_value_us);
- GNUNET_free (pkey_str);
- return rev_str;
-
- }
default:
return NULL;
}
@@ -335,48 +311,6 @@ gns_string_to_value (void *cls,
GNUNET_free (bval);
return GNUNET_OK;
}
- case GNUNET_GNSRECORD_TYPE_REVERSE:
- {
- struct GNUNET_GNSRECORD_ReverseRecord *rev;
- char known_by[253 + 1];
- struct GNUNET_TIME_Absolute expiration;
-
- /* TODO: From crypto_ecc.c
- * Why is this not a constant???
- */
- size_t enclen = (sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey)) * 8;
- if (enclen % 5 > 0)
- enclen += 5 - enclen % 5;
- enclen /= 5; /* 260/5 = 52 */
- char pkey_str[enclen + 1];
-
- if (3 != SSCANF (s,
- "%253s %52s %"SCNu64,
- known_by,
- pkey_str,
- &expiration.abs_value_us))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- _("Unable to parse REVERSE record string `%s'\n"),
- s);
- return GNUNET_SYSERR;
- }
- *data_size = sizeof (struct GNUNET_GNSRECORD_ReverseRecord) + strlen (known_by) + 1;
- *data = rev = GNUNET_malloc (*data_size);
- if (GNUNET_OK !=
- GNUNET_CRYPTO_ecdsa_public_key_from_string (pkey_str,
- strlen (pkey_str),
- &rev->pkey))
- {
- GNUNET_free (rev);
- return GNUNET_SYSERR;
- }
- rev->expiration = expiration;
- GNUNET_memcpy (&rev[1],
- known_by,
- strlen (known_by));
- return GNUNET_OK;
- }
default:
return GNUNET_SYSERR;
}
@@ -397,7 +331,6 @@ static struct {
{ "VPN", GNUNET_GNSRECORD_TYPE_VPN },
{ "GNS2DNS", GNUNET_GNSRECORD_TYPE_GNS2DNS },
{ "BOX", GNUNET_GNSRECORD_TYPE_BOX },
- { "REVERSE", GNUNET_GNSRECORD_TYPE_REVERSE },
{ NULL, UINT32_MAX }
};
diff --git a/src/identity-attribute/Makefile.am b/src/identity-attribute/Makefile.am
new file mode 100644
index 0000000000..770bc2ead2
--- /dev/null
+++ b/src/identity-attribute/Makefile.am
@@ -0,0 +1,44 @@
+# This Makefile.am is in the public domain
+AM_CPPFLAGS = -I$(top_srcdir)/src/include
+
+plugindir = $(libdir)/gnunet
+
+pkgcfgdir= $(pkgdatadir)/config.d/
+
+libexecdir= $(pkglibdir)/libexec/
+
+if MINGW
+ WINFLAGS = -Wl,--no-undefined -Wl,--export-all-symbols
+endif
+
+if USE_COVERAGE
+ AM_CFLAGS = --coverage -O0
+ XLIBS = -lgcov
+endif
+
+lib_LTLIBRARIES = \
+ libgnunetidentityattribute.la
+
+libgnunetidentityattribute_la_SOURCES = \
+ identity_attribute.c
+libgnunetidentityattribute_la_LIBADD = \
+ $(top_builddir)/src/util/libgnunetutil.la \
+ $(GN_LIBINTL)
+libgnunetidentityattribute_la_LDFLAGS = \
+ $(GN_LIB_LDFLAGS) $(WINFLAGS) \
+ -version-info 0:0:0
+
+
+plugin_LTLIBRARIES = \
+ libgnunet_plugin_identity_attribute_gnuid.la
+
+
+libgnunet_plugin_identity_attribute_gnuid_la_SOURCES = \
+ plugin_identity_attribute_gnuid.c
+libgnunet_plugin_identity_attribute_gnuid_la_LIBADD = \
+ $(top_builddir)/src/util/libgnunetutil.la \
+ $(LTLIBINTL)
+libgnunet_plugin_gnsrecord_dns_la_LDFLAGS = \
+ $(GN_PLUGIN_LDFLAGS)
+
+
diff --git a/src/identity-attribute/identity_attribute.c b/src/identity-attribute/identity_attribute.c
new file mode 100644
index 0000000000..377eb3211a
--- /dev/null
+++ b/src/identity-attribute/identity_attribute.c
@@ -0,0 +1,245 @@
+/*
+ This file is part of GNUnet
+ Copyright (C) 2010-2015 GNUnet e.V.
+
+ GNUnet is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published
+ by the Free Software Foundation; either version 3, or (at your
+ option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GNUnet; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+ */
+
+/**
+ * @file identity-provider/identity_attribute.c
+ * @brief helper library to manage identity attributes
+ * @author Martin Schanzenbach
+ */
+#include "platform.h"
+#include "gnunet_util_lib.h"
+#include "identity_attribute.h"
+
+/**
+ * Create a new attribute.
+ *
+ * @param name the attribute name
+ * @param type the attribute type
+ * @param data the attribute value
+ * @param data_size the attribute value size
+ * @return the new attribute
+ */
+struct GNUNET_IDENTITY_ATTRIBUTE_Claim *
+GNUNET_IDENTITY_ATTRIBUTE_claim_new (const char* attr_name,
+ uint32_t attr_type,
+ const void* data,
+ size_t data_size)
+{
+ struct GNUNET_IDENTITY_ATTRIBUTE_Claim *attr;
+ char *write_ptr;
+
+ attr = GNUNET_malloc (sizeof (struct GNUNET_IDENTITY_ATTRIBUTE_Claim) +
+ strlen (attr_name) + 1 +
+ data_size);
+ attr->type = attr_type;
+ attr->data_size = data_size;
+ attr->version = 0;
+ write_ptr = (char*)&attr[1];
+ GNUNET_memcpy (write_ptr,
+ attr_name,
+ strlen (attr_name) + 1);
+ attr->name = write_ptr;
+ write_ptr += strlen (attr->name) + 1;
+ GNUNET_memcpy (write_ptr,
+ data,
+ data_size);
+ attr->data = write_ptr;
+ return attr;
+}
+
+size_t
+GNUNET_IDENTITY_ATTRIBUTE_list_serialize_get_size (const struct GNUNET_IDENTITY_ATTRIBUTE_ClaimList *attrs)
+{
+ struct GNUNET_IDENTITY_ATTRIBUTE_ClaimListEntry *le;
+ size_t len = 0;
+ for (le = attrs->list_head; NULL != le; le = le->next)
+ len += GNUNET_IDENTITY_ATTRIBUTE_serialize_get_size (le->claim);
+ return len;
+}
+
+size_t
+GNUNET_IDENTITY_ATTRIBUTE_list_serialize (const struct GNUNET_IDENTITY_ATTRIBUTE_ClaimList *attrs,
+ char *result)
+{
+ struct GNUNET_IDENTITY_ATTRIBUTE_ClaimListEntry *le;
+ size_t len;
+ size_t total_len;
+ char* write_ptr;
+
+ write_ptr = result;
+ total_len = 0;
+ for (le = attrs->list_head; NULL != le; le = le->next)
+ {
+ len = GNUNET_IDENTITY_ATTRIBUTE_serialize (le->claim,
+ write_ptr);
+ total_len += len;
+ write_ptr += len;
+ }
+ return total_len;
+}
+
+struct GNUNET_IDENTITY_ATTRIBUTE_ClaimList *
+GNUNET_IDENTITY_ATTRIBUTE_list_deserialize (const char* data,
+ size_t data_size)
+{
+ struct GNUNET_IDENTITY_ATTRIBUTE_ClaimList *attrs;
+ struct GNUNET_IDENTITY_ATTRIBUTE_ClaimListEntry *le;
+ size_t attr_len;
+ const char* read_ptr;
+
+ if (data_size < sizeof (struct Attribute))
+ return NULL;
+
+ attrs = GNUNET_new (struct GNUNET_IDENTITY_ATTRIBUTE_ClaimList);
+ read_ptr = data;
+ while (((data + data_size) - read_ptr) >= sizeof (struct Attribute))
+ {
+
+ le = GNUNET_new (struct GNUNET_IDENTITY_ATTRIBUTE_ClaimListEntry);
+ le->claim = GNUNET_IDENTITY_ATTRIBUTE_deserialize (read_ptr,
+ data_size - (read_ptr - data));
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Deserialized attribute %s\n", le->claim->name);
+ GNUNET_CONTAINER_DLL_insert (attrs->list_head,
+ attrs->list_tail,
+ le);
+ attr_len = GNUNET_IDENTITY_ATTRIBUTE_serialize_get_size (le->claim);
+ read_ptr += attr_len;
+ }
+ return attrs;
+}
+
+struct GNUNET_IDENTITY_ATTRIBUTE_ClaimList*
+GNUNET_IDENTITY_ATTRIBUTE_list_dup (const struct GNUNET_IDENTITY_ATTRIBUTE_ClaimList *attrs)
+{
+ struct GNUNET_IDENTITY_ATTRIBUTE_ClaimListEntry *le;
+ struct GNUNET_IDENTITY_ATTRIBUTE_ClaimListEntry *result_le;
+ struct GNUNET_IDENTITY_ATTRIBUTE_ClaimList *result;
+ size_t len;
+
+ result = GNUNET_new (struct GNUNET_IDENTITY_ATTRIBUTE_ClaimList);
+ for (le = attrs->list_head; NULL != le; le = le->next)
+ {
+ result_le = GNUNET_new (struct GNUNET_IDENTITY_ATTRIBUTE_ClaimListEntry);
+ len = sizeof (struct GNUNET_IDENTITY_ATTRIBUTE_Claim) + le->claim->data_size;
+ result_le->claim = GNUNET_malloc (len);
+ GNUNET_memcpy (result_le->claim,
+ le->claim,
+ len);
+ result_le->claim->name = (const char*)&result_le->claim[1];
+ GNUNET_CONTAINER_DLL_insert (result->list_head,
+ result->list_tail,
+ result_le);
+ }
+ return result;
+}
+
+
+void
+GNUNET_IDENTITY_ATTRIBUTE_list_destroy (struct GNUNET_IDENTITY_ATTRIBUTE_ClaimList *attrs)
+{
+ struct GNUNET_IDENTITY_ATTRIBUTE_ClaimListEntry *le;
+ struct GNUNET_IDENTITY_ATTRIBUTE_ClaimListEntry *tmp_le;
+
+ for (le = attrs->list_head; NULL != le;)
+ {
+ GNUNET_free (le->claim);
+ tmp_le = le;
+ le = le->next;
+ GNUNET_free (tmp_le);
+ }
+ GNUNET_free (attrs);
+
+}
+
+size_t
+GNUNET_IDENTITY_ATTRIBUTE_serialize_get_size (const struct GNUNET_IDENTITY_ATTRIBUTE_Claim *attr)
+{
+ return sizeof (struct Attribute)
+ + strlen (attr->name)
+ + attr->data_size;
+}
+
+size_t
+GNUNET_IDENTITY_ATTRIBUTE_serialize (const struct GNUNET_IDENTITY_ATTRIBUTE_Claim *attr,
+ char *result)
+{
+ size_t data_len_ser;
+ size_t name_len;
+ struct Attribute *attr_ser;
+ char* write_ptr;
+
+ attr_ser = (struct Attribute*)result;
+ attr_ser->attribute_type = htons (attr->type);
+ attr_ser->attribute_version = htonl (attr->version);
+ name_len = strlen (attr->name);
+ attr_ser->name_len = htons (name_len);
+ write_ptr = (char*)&attr_ser[1];
+ GNUNET_memcpy (write_ptr, attr->name, name_len);
+ write_ptr += name_len;
+ //TODO plugin-ize
+ //data_len_ser = plugin->serialize_attribute_value (attr,
+ // &attr_ser[1]);
+ data_len_ser = attr->data_size;
+ GNUNET_memcpy (write_ptr, attr->data, attr->data_size);
+ attr_ser->data_size = htons (data_len_ser);
+
+ return sizeof (struct Attribute) + strlen (attr->name) + attr->data_size;
+}
+
+struct GNUNET_IDENTITY_ATTRIBUTE_Claim *
+GNUNET_IDENTITY_ATTRIBUTE_deserialize (const char* data,
+ size_t data_size)
+{
+ struct GNUNET_IDENTITY_ATTRIBUTE_Claim *attr;
+ struct Attribute *attr_ser;
+ size_t data_len;
+ size_t name_len;
+ char* write_ptr;
+
+ if (data_size < sizeof (struct Attribute))
+ return NULL;
+
+ attr_ser = (struct Attribute*)data;
+ data_len = ntohs (attr_ser->data_size);
+ name_len = ntohs (attr_ser->name_len);
+ attr = GNUNET_malloc (sizeof (struct GNUNET_IDENTITY_ATTRIBUTE_Claim)
+ + data_len + name_len + 1);
+ attr->type = ntohs (attr_ser->attribute_type);
+ attr->version = ntohl (attr_ser->attribute_version);
+ attr->data_size = ntohs (attr_ser->data_size);
+
+ write_ptr = (char*)&attr[1];
+ GNUNET_memcpy (write_ptr,
+ &attr_ser[1],
+ name_len);
+ write_ptr[name_len] = '\0';
+ attr->name = write_ptr;
+
+ write_ptr += name_len + 1;
+ GNUNET_memcpy (write_ptr,
+ (char*)&attr_ser[1] + name_len,
+ attr->data_size);
+ attr->data = write_ptr;
+ return attr;
+
+}
+
+/* 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 0000000000..0463218078
--- /dev/null
+++ b/src/identity-attribute/identity_attribute.h
@@ -0,0 +1,56 @@
+/*
+ This file is part of GNUnet.
+ Copyright (C) 2012-2015 GNUnet e.V.
+
+ GNUnet is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published
+ by the Free Software Foundation; either version 3, or (at your
+ option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GNUnet; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+ */
+/**
+ * @author Martin Schanzenbach
+ * @file identity-provider/identity_attribute.h
+ * @brief GNUnet Identity Provider library
+ *
+ */
+#ifndef IDENTITY_ATTRIBUTE_H
+#define IDENTITY_ATTRIBUTE_H
+
+#include "gnunet_identity_provider_service.h"
+
+struct Attribute
+{
+ /**
+ * Attribute type
+ */
+ uint32_t attribute_type;
+
+ /**
+ * Attribute version
+ */
+ uint32_t attribute_version;
+
+ /**
+ * Name length
+ */
+ uint32_t name_len;
+
+ /**
+ * Data size
+ */
+ uint32_t data_size;
+
+ //followed by data_size Attribute value data
+};
+
+#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 0000000000..ba460d0a57
--- /dev/null
+++ b/src/identity-attribute/plugin_identity_attribute_gnuid.c
@@ -0,0 +1,184 @@
+/*
+ This file is part of GNUnet
+ Copyright (C) 2013, 2014, 2016 GNUnet e.V.
+
+ GNUnet is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published
+ by the Free Software Foundation; either version 3, or (at your
+ option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GNUnet; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+/**
+ * @file identity-provider/plugin_identity_attribute_gnuid.c
+ * @brief identity attribute plugin to provide the API for fundamental
+ * attribute types.
+ *
+ * @author Martin Schanzenbach
+ */
+#include "platform.h"
+#include "gnunet_util_lib.h"
+#include "gnunet_identity_attribute_plugin.h"
+#include <inttypes.h>
+
+
+/**
+ * Convert the 'value' of an attribute to a string.
+ *
+ * @param cls closure, unused
+ * @param type type of the attribute
+ * @param data value in binary encoding
+ * @param data_size number of bytes in @a data
+ * @return NULL on error, otherwise human-readable representation of the value
+ */
+static char *
+gnuid_value_to_string (void *cls,
+ uint32_t type,
+ const void *data,
+ size_t data_size)
+{
+
+ switch (type)
+ {
+ case GNUNET_IDENTITY_ATTRIBUTE_TYPE_STRING:
+ return GNUNET_strndup (data, data_size);
+ default:
+ return NULL;
+ }
+}
+
+
+/**
+ * Convert human-readable version of a 'value' of an attribute to the binary
+ * representation.
+ *
+ * @param cls closure, unused
+ * @param type type of the attribute
+ * @param s human-readable string
+ * @param data set to value in binary encoding (will be allocated)
+ * @param data_size set to number of bytes in @a data
+ * @return #GNUNET_OK on success
+ */
+static int
+gnuid_string_to_value (void *cls,
+ uint32_t type,
+ const char *s,
+ void **data,
+ size_t *data_size)
+{
+ if (NULL == s)
+ return GNUNET_SYSERR;
+ switch (type)
+ {
+
+ case GNUNET_IDENTITY_ATTRIBUTE_TYPE_STRING:
+ *data = GNUNET_strdup (s);
+ *data_size = strlen (s);
+ return GNUNET_OK;
+ default:
+ return GNUNET_SYSERR;
+ }
+}
+
+
+/**
+ * Mapping of attribute type numbers to human-readable
+ * attribute type names.
+ */
+static struct {
+ const char *name;
+ uint32_t number;
+} gnuid_name_map[] = {
+ { "STRING", GNUNET_IDENTITY_ATTRIBUTE_TYPE_STRING },
+ { NULL, UINT32_MAX }
+};
+
+
+/**
+ * Convert a type name to the corresponding number.
+ *
+ * @param cls closure, unused
+ * @param gnuid_typename name to convert
+ * @return corresponding number, UINT32_MAX on error
+ */
+static uint32_t
+gnuid_typename_to_number (void *cls,
+ const char *gnuid_typename)
+{
+ unsigned int i;
+
+ i=0;
+ while ( (NULL != gnuid_name_map[i].name) &&
+ (0 != strcasecmp (gnuid_typename,
+ gnuid_name_map[i].name)) )
+ i++;
+ return gnuid_name_map[i].number;
+}
+
+
+/**
+ * Convert a type number (i.e. 1) to the corresponding type string
+ *
+ * @param cls closure, unused
+ * @param type number of a type to convert
+ * @return corresponding typestring, NULL on error
+ */
+static const char *
+gnuid_number_to_typename (void *cls,
+ uint32_t type)
+{
+ unsigned int i;
+
+ i=0;
+ while ( (NULL != gnuid_name_map[i].name) &&
+ (type != gnuid_name_map[i].number) )
+ i++;
+ return gnuid_name_map[i].name;
+}
+
+
+/**
+ * Entry point for the plugin.
+ *
+ * @param cls NULL
+ * @return the exported block API
+ */
+void *
+libgnunet_plugin_attribute_type_gnuid_init (void *cls)
+{
+ struct GNUNET_IDENTITY_ATTRIBUTE_PluginFunctions *api;
+
+ api = GNUNET_new (struct GNUNET_IDENTITY_ATTRIBUTE_PluginFunctions);
+ api->value_to_string = &gnuid_value_to_string;
+ api->string_to_value = &gnuid_string_to_value;
+ api->typename_to_number = &gnuid_typename_to_number;
+ api->number_to_typename = &gnuid_number_to_typename;
+ return api;
+}
+
+
+/**
+ * Exit point from the plugin.
+ *
+ * @param cls the return value from #libgnunet_plugin_block_test_init()
+ * @return NULL
+ */
+void *
+libgnunet_plugin_attribute_type_gnuid_done (void *cls)
+{
+ struct GNUNET_IDENTITY_ATTRIBUTE_PluginFunctions *api = cls;
+
+ GNUNET_free (api);
+ return NULL;
+}
+
+/* end of plugin_identity_attribute_type_gnuid.c */
diff --git a/src/identity-provider/Makefile.am b/src/identity-provider/Makefile.am
index 7c2bb9646b..3b072e59d8 100644
--- a/src/identity-provider/Makefile.am
+++ b/src/identity-provider/Makefile.am
@@ -12,6 +12,15 @@ if USE_COVERAGE
XLIB = -lgcov
endif
+if HAVE_SQLITE
+SQLITE_PLUGIN = libgnunet_plugin_identity_provider_sqlite.la
+endif
+
+EXTRA_DIST = \
+ test_idp_defaults.conf \
+ test_idp.conf \
+ $(check_SCRIPTS)
+
pkgcfgdir= $(pkgdatadir)/config.d/
libexecdir= $(pkglibdir)/libexec/
@@ -22,26 +31,50 @@ pkgcfg_DATA = \
lib_LTLIBRARIES = \
libgnunetidentityprovider.la
plugin_LTLIBRARIES = \
- libgnunet_plugin_rest_identity_provider.la
+ libgnunet_plugin_rest_identity_provider.la \
+ libgnunet_plugin_gnsrecord_identity_provider.la \
+ $(SQLITE_PLUGIN)
bin_PROGRAMS = \
- gnunet-identity-token
+ gnunet-idp
libexec_PROGRAMS = \
gnunet-service-identity-provider
+libgnunet_plugin_gnsrecord_identity_provider_la_SOURCES = \
+ plugin_gnsrecord_identity_provider.c
+libgnunet_plugin_gnsrecord_identity_provider_la_LIBADD = \
+ $(top_builddir)/src/util/libgnunetutil.la \
+ $(LTLIBINTL)
+libgnunet_plugin_gnsrecord_identity_provider_la_LDFLAGS = \
+ $(GN_PLUGIN_LDFLAGS)
+
+libgnunet_plugin_identity_provider_sqlite_la_SOURCES = \
+ plugin_identity_provider_sqlite.c
+libgnunet_plugin_identity_provider_sqlite_la_LIBADD = \
+ libgnunetidentityprovider.la \
+ $(top_builddir)/src/sq/libgnunetsq.la \
+ $(top_builddir)/src/statistics/libgnunetstatistics.la \
+ $(top_builddir)/src/util/libgnunetutil.la $(XLIBS) -lsqlite3 \
+ $(LTLIBINTL)
+libgnunet_plugin_identity_provider_sqlite_la_LDFLAGS = \
+ $(GN_PLUGIN_LDFLAGS)
+
+
+
gnunet_service_identity_provider_SOURCES = \
- gnunet-service-identity-provider.c \
- identity_token.c
+ gnunet-service-identity-provider.c
gnunet_service_identity_provider_LDADD = \
$(top_builddir)/src/gnsrecord/libgnunetgnsrecord.la \
$(top_builddir)/src/util/libgnunetutil.la \
$(top_builddir)/src/namestore/libgnunetnamestore.la \
$(top_builddir)/src/identity/libgnunetidentity.la \
$(top_builddir)/src/statistics/libgnunetstatistics.la \
+ $(top_builddir)/src/credential/libgnunetcredential.la \
+ $(top_builddir)/src/identity-attribute/libgnunetidentityattribute.la \
+ libgnunetidentityprovider.la \
$(top_builddir)/src/gns/libgnunetgns.la \
- $(GN_LIBINTL) \
- -ljansson
+ $(GN_LIBINTL)
libgnunetidentityprovider_la_SOURCES = \
identity_provider_api.c \
@@ -60,16 +93,30 @@ libgnunet_plugin_rest_identity_provider_la_LIBADD = \
libgnunetidentityprovider.la \
$(top_builddir)/src/rest/libgnunetrest.la \
$(top_builddir)/src/jsonapi/libgnunetjsonapi.la \
+ $(top_builddir)/src/identity-attribute/libgnunetidentityattribute.la \
$(top_builddir)/src/namestore/libgnunetnamestore.la \
$(top_builddir)/src/util/libgnunetutil.la $(XLIBS) \
$(LTLIBINTL) -ljansson -lmicrohttpd
libgnunet_plugin_rest_identity_provider_la_LDFLAGS = \
$(GN_PLUGIN_LDFLAGS)
-
-gnunet_identity_token_SOURCES = \
- gnunet-identity-token.c
-gnunet_identity_token_LDADD = \
+gnunet_idp_SOURCES = \
+ gnunet-idp.c
+gnunet_idp_LDADD = \
$(top_builddir)/src/util/libgnunetutil.la \
- -ljansson -lmicrohttpd \
+ $(top_builddir)/src/namestore/libgnunetnamestore.la \
+ libgnunetidentityprovider.la \
+ $(top_builddir)/src/identity/libgnunetidentity.la \
+ $(top_builddir)/src/identity-attribute/libgnunetidentityattribute.la \
$(GN_LIBINTL)
+
+check_SCRIPTS = \
+ test_idp_attribute.sh \
+ test_idp_issue.sh \
+ test_idp_consume.sh \
+ test_idp_revoke.sh
+
+if ENABLE_TEST_RUN
+ AM_TESTS_ENVIRONMENT=export GNUNET_PREFIX=$${GNUNET_PREFIX:-@libdir@};export PATH=$${GNUNET_PREFIX:-@prefix@}/bin:$$PATH;unset XDG_DATA_HOME;unset XDG_CONFIG_HOME;
+ TESTS = $(check_SCRIPTS)
+endif
diff --git a/src/identity-provider/gnunet-identity-token.c b/src/identity-provider/gnunet-identity-token.c
deleted file mode 100644
index 30b63bfc49..0000000000
--- a/src/identity-provider/gnunet-identity-token.c
+++ /dev/null
@@ -1,179 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2012-2015 GNUnet e.V.
-
- GNUnet is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published
- by the Free Software Foundation; either version 3, or (at your
- option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with GNUnet; see the file COPYING. If not, write to the
- Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA.
- */
-/**
- * @author Martin Schanzenbach
- * @file src/identity-provider/gnunet-service-identity-provider.c
- * @brief Identity Token Service
- *
- */
-
-#include "platform.h"
-#include "gnunet_util_lib.h"
-#include <jansson.h>
-#include "gnunet_signatures.h"
-
-/**
- * The token
- */
-static char* token;
-
-/**
- * Weather to print the token
- */
-static int print_token;
-
-static void
-run (void *cls,
- char *const *args,
- const char *cfgfile,
- const struct GNUNET_CONFIGURATION_Handle *c)
-{
- char *payload;
- char *header;
- //Get token parts
- const char *header_b64;
- const char *payload_b64;
- const char *signature_b32;
- const char *keystring;
- char *data;
- json_t *payload_json;
- json_t *keystring_json;
- json_error_t error;
- struct GNUNET_CRYPTO_EcdsaPublicKey key;
- struct GNUNET_CRYPTO_EccSignaturePurpose *purpose;
- struct GNUNET_CRYPTO_EcdsaSignature sig;
-
- if (NULL == token)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE,
- _("Option `-t' is required\n"));
- return;
- }
- header_b64 = strtok (token, ".");
- payload_b64 = strtok (NULL, ".");
- signature_b32 = strtok (NULL, ".");
- if ( (NULL == header_b64) ||
- (NULL == payload_b64) ||
- (NULL == signature_b32) )
- {
- GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE,
- _("Token `%s' is malformed\n"),
- token);
- GNUNET_free (token);
- token = NULL;
- return;
- }
-
- //Decode payload
- GNUNET_STRINGS_base64_decode (payload_b64,
- strlen (payload_b64),
- &payload);
- //Decode header
- GNUNET_STRINGS_base64_decode (header_b64,
- strlen (header_b64),
- &header);
-
-
- GNUNET_asprintf(&data,
- "%s,%s",
- header_b64,
- payload_b64);
- char *val = GNUNET_malloc (sizeof (struct GNUNET_CRYPTO_EccSignaturePurpose) + strlen (data));
- purpose = (struct GNUNET_CRYPTO_EccSignaturePurpose*)val;
- purpose->size = htonl(sizeof (struct GNUNET_CRYPTO_EccSignaturePurpose) + strlen (data));
- purpose->purpose = htonl(GNUNET_SIGNATURE_PURPOSE_GNUID_TOKEN);
- GNUNET_memcpy (&purpose[1], data, strlen(data));
- GNUNET_free (data);
- GNUNET_free (token);
- token = NULL;
-
- if (print_token)
- printf ("Token:\nHeader:\t\t%s\nPayload:\t%s\n",
- header,
- payload);
- GNUNET_free (header);
-
- payload_json = json_loads (payload, 0, &error);
- GNUNET_free (payload);
-
- if ((NULL == payload_json) || (! json_is_object (payload_json)) )
- {
- GNUNET_free (val);
- return;
- }
- keystring_json = json_object_get (payload_json, "iss");
- if (! json_is_string (keystring_json))
- {
- GNUNET_free (val);
- return;
- }
- keystring = json_string_value (keystring_json);
- if (GNUNET_OK !=
- GNUNET_CRYPTO_ecdsa_public_key_from_string (keystring,
- strlen (keystring),
- &key))
- {
- GNUNET_free (val);
- return;
- }
- GNUNET_STRINGS_string_to_data (signature_b32,
- strlen (signature_b32),
- &sig,
- sizeof (struct GNUNET_CRYPTO_EcdsaSignature));
-
- if (print_token)
- printf ("Signature:\t%s\n",
- keystring);
-
- if (GNUNET_OK !=
- GNUNET_CRYPTO_ecdsa_verify(GNUNET_SIGNATURE_PURPOSE_GNUID_TOKEN,
- purpose,
- &sig,
- &key))
- printf("Signature not OK!\n");
- else
- printf("Signature OK!\n");
- GNUNET_free (val);
- return;
-}
-
-
-int
-main(int argc, char *const argv[])
-{
- struct GNUNET_GETOPT_CommandLineOption options[] = {
-
- GNUNET_GETOPT_option_string ('t',
- "token",
- NULL,
- gettext_noop ("GNUid token"),
- &token),
-
- GNUNET_GETOPT_option_flag ('p',
- "print",
- gettext_noop ("Print token contents"),
- &print_token),
-
- GNUNET_GETOPT_OPTION_END
- };
- return GNUNET_PROGRAM_run (argc, argv, "ct",
- "ct", options,
- &run, NULL);
-}
diff --git a/src/identity-provider/gnunet-idp.c b/src/identity-provider/gnunet-idp.c
new file mode 100644
index 0000000000..18a5676c0d
--- /dev/null
+++ b/src/identity-provider/gnunet-idp.c
@@ -0,0 +1,413 @@
+/*
+ This file is part of GNUnet.
+ Copyright (C) 2012-2015 GNUnet e.V.
+
+ GNUnet is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published
+ by the Free Software Foundation; either version 3, or (at your
+ option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GNUnet; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+ */
+/**
+ * @author Martin Schanzenbach
+ * @file src/identity-provider/gnunet-idp.c
+ * @brief Identity Provider utility
+ *
+ */
+
+#include "platform.h"
+#include "gnunet_util_lib.h"
+#include "gnunet_namestore_service.h"
+#include "gnunet_identity_provider_service.h"
+#include "gnunet_identity_service.h"
+#include "gnunet_signatures.h"
+
+/**
+ * return value
+ */
+static int ret;
+
+/**
+ * List attribute flag
+ */
+static int list;
+
+/**
+ * Relying party
+ */
+static char* rp;
+
+/**
+ * The attribute
+ */
+static char* attr_name;
+
+/**
+ * Attribute value
+ */
+static char* attr_value;
+
+/**
+ * Attributes to issue
+ */
+static char* issue_attrs;
+
+/**
+ * Ticket to consume
+ */
+static char* consume_ticket;
+
+/**
+ * Ticket to revoke
+ */
+static char* revoke_ticket;
+
+/**
+ * Ego name
+ */
+static char* ego_name;
+
+/**
+ * Identity handle
+ */
+static struct GNUNET_IDENTITY_Handle *identity_handle;
+
+/**
+ * IdP handle
+ */
+static struct GNUNET_IDENTITY_PROVIDER_Handle *idp_handle;
+
+/**
+ * IdP operation
+ */
+static struct GNUNET_IDENTITY_PROVIDER_Operation *idp_op;
+
+/**
+ * Attribute iterator
+ */
+static struct GNUNET_IDENTITY_PROVIDER_AttributeIterator *attr_iterator;
+
+/**
+ * Master ABE key
+ */
+static struct GNUNET_CRYPTO_AbeMasterKey *abe_key;
+
+/**
+ * ego private key
+ */
+static const struct GNUNET_CRYPTO_EcdsaPrivateKey *pkey;
+
+/**
+ * rp public key
+ */
+static struct GNUNET_CRYPTO_EcdsaPublicKey rp_key;
+
+/**
+ * Ticket to consume
+ */
+static struct GNUNET_IDENTITY_PROVIDER_Ticket ticket;
+
+/**
+ * Attribute list
+ */
+static struct GNUNET_IDENTITY_ATTRIBUTE_ClaimList *attr_list;
+
+static void
+do_cleanup(void *cls)
+{
+ if (NULL != attr_iterator)
+ GNUNET_IDENTITY_PROVIDER_get_attributes_stop (attr_iterator);
+ if (NULL != idp_handle)
+ GNUNET_IDENTITY_PROVIDER_disconnect (idp_handle);
+ if (NULL != identity_handle)
+ GNUNET_IDENTITY_disconnect (identity_handle);
+ if (NULL != abe_key)
+ GNUNET_free (abe_key);
+ if (NULL != attr_list)
+ GNUNET_free (attr_list);
+}
+
+static void
+ticket_issue_cb (void* cls,
+ const struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket)
+{
+ char* ticket_str;
+ if (NULL != ticket) {
+ ticket_str = GNUNET_STRINGS_data_to_string_alloc (ticket,
+ sizeof (struct GNUNET_IDENTITY_PROVIDER_Ticket));
+ printf("%s\n",
+ ticket_str);
+ GNUNET_free (ticket_str);
+ }
+ GNUNET_SCHEDULER_add_now (&do_cleanup, NULL);
+}
+
+static void
+store_attr_cont (void *cls,
+ int32_t success,
+ const char*emsg)
+{
+ if (GNUNET_SYSERR == success) {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "%s\n", emsg);
+ }
+ GNUNET_SCHEDULER_add_now (&do_cleanup, NULL);
+}
+
+static void
+process_attrs (void *cls,
+ const struct GNUNET_CRYPTO_EcdsaPublicKey *identity,
+ const struct GNUNET_IDENTITY_ATTRIBUTE_Claim *attr)
+{
+ if (NULL == identity)
+ {
+ GNUNET_SCHEDULER_add_now (&do_cleanup, NULL);
+ return;
+ }
+ if (NULL == attr)
+ {
+ ret = 1;
+ return;
+ }
+ GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE,
+ "%s: %s\n", attr->name, (char*)attr->data);
+}
+
+
+static void
+iter_error (void *cls)
+{
+ attr_iterator = NULL;
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Failed to iterate over attributes\n");
+ GNUNET_SCHEDULER_add_now (&do_cleanup, NULL);
+}
+
+static void
+process_rvk (void *cls, int success, const char* msg)
+{
+ if (GNUNET_OK != success)
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE,
+ "Revocation failed.\n");
+ ret = 1;
+ }
+ GNUNET_SCHEDULER_add_now (&do_cleanup, NULL);
+}
+
+static void
+iter_finished (void *cls)
+{
+ struct GNUNET_IDENTITY_ATTRIBUTE_Claim *attr;
+
+ attr_iterator = NULL;
+ if (list)
+ {
+ GNUNET_SCHEDULER_add_now (&do_cleanup, NULL);
+ return;
+ }
+
+ if (issue_attrs)
+ {
+ idp_op = GNUNET_IDENTITY_PROVIDER_ticket_issue (idp_handle,
+ pkey,
+ &rp_key,
+ attr_list,
+ &ticket_issue_cb,
+ NULL);
+ return;
+ }
+ if (consume_ticket)
+ {
+ idp_op = GNUNET_IDENTITY_PROVIDER_ticket_consume (idp_handle,
+ pkey,
+ &ticket,
+ &process_attrs,
+ NULL);
+ return;
+ }
+ if (revoke_ticket)
+ {
+ idp_op = GNUNET_IDENTITY_PROVIDER_ticket_revoke (idp_handle,
+ pkey,
+ &ticket,
+ &process_rvk,
+ NULL);
+ return;
+ }
+ attr = GNUNET_IDENTITY_ATTRIBUTE_claim_new (attr_name,
+ GNUNET_IDENTITY_ATTRIBUTE_TYPE_STRING,
+ attr_value,
+ strlen (attr_value) + 1);
+ idp_op = GNUNET_IDENTITY_PROVIDER_attribute_store (idp_handle,
+ pkey,
+ attr,
+ &store_attr_cont,
+ NULL);
+
+
+}
+
+static void
+iter_cb (void *cls,
+ const struct GNUNET_CRYPTO_EcdsaPublicKey *identity,
+ const struct GNUNET_IDENTITY_ATTRIBUTE_Claim *attr)
+{
+ struct GNUNET_IDENTITY_ATTRIBUTE_ClaimListEntry *le;
+ char *attrs_tmp;
+ char *attr_str;
+
+ if (issue_attrs)
+ {
+ attrs_tmp = GNUNET_strdup (issue_attrs);
+ attr_str = strtok (attrs_tmp, ",");
+ while (NULL != attr_str) {
+ if (0 != strcmp (attr_str, attr->name)) {
+ attr_str = strtok (NULL, ",");
+ continue;
+ }
+ le = GNUNET_new (struct GNUNET_IDENTITY_ATTRIBUTE_ClaimListEntry);
+ le->claim = GNUNET_IDENTITY_ATTRIBUTE_claim_new (attr->name,
+ attr->type,
+ attr->data,
+ attr->data_size);
+ GNUNET_CONTAINER_DLL_insert (attr_list->list_head,
+ attr_list->list_tail,
+ le);
+ break;
+ }
+ GNUNET_free (attrs_tmp);
+ } else if (list) {
+ GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE,
+ "%s: %s\n", attr->name, (char*)attr->data);
+ }
+ GNUNET_IDENTITY_PROVIDER_get_attributes_next (attr_iterator);
+}
+
+static void
+ego_cb (void *cls,
+ struct GNUNET_IDENTITY_Ego *ego,
+ void **ctx,
+ const char *name)
+{
+ if (NULL == name)
+ return;
+ if (0 != strcmp (name, ego_name))
+ return;
+ pkey = GNUNET_IDENTITY_ego_get_private_key (ego);
+
+ if (NULL != rp)
+ GNUNET_CRYPTO_ecdsa_public_key_from_string (rp,
+ strlen (rp),
+ &rp_key);
+ if (NULL != consume_ticket)
+ GNUNET_STRINGS_string_to_data (consume_ticket,
+ strlen (consume_ticket),
+ &ticket,
+ sizeof (struct GNUNET_IDENTITY_PROVIDER_Ticket));
+ if (NULL != revoke_ticket)
+ GNUNET_STRINGS_string_to_data (revoke_ticket,
+ strlen (revoke_ticket),
+ &ticket,
+ sizeof (struct GNUNET_IDENTITY_PROVIDER_Ticket));
+
+
+ attr_list = GNUNET_new (struct GNUNET_IDENTITY_ATTRIBUTE_ClaimList);
+
+ attr_iterator = GNUNET_IDENTITY_PROVIDER_get_attributes_start (idp_handle,
+ pkey,
+ &iter_error,
+ NULL,
+ &iter_cb,
+ NULL,
+ &iter_finished,
+ NULL);
+
+
+}
+
+static void
+run (void *cls,
+ char *const *args,
+ const char *cfgfile,
+ const struct GNUNET_CONFIGURATION_Handle *c)
+{
+ ret = 0;
+ if (NULL == ego_name)
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE,
+ _("Ego is required\n"));
+ return;
+ }
+
+ idp_handle = GNUNET_IDENTITY_PROVIDER_connect (c);
+ //Get Ego
+ identity_handle = GNUNET_IDENTITY_connect (c,
+ &ego_cb,
+ NULL);
+
+
+}
+
+
+int
+main(int argc, char *const argv[])
+{
+ struct GNUNET_GETOPT_CommandLineOption options[] = {
+
+ GNUNET_GETOPT_option_string ('a',
+ "add",
+ NULL,
+ gettext_noop ("Add attribute"),
+ &attr_name),
+
+ GNUNET_GETOPT_option_string ('V',
+ "value",
+ NULL,
+ gettext_noop ("Attribute value"),
+ &attr_value),
+ GNUNET_GETOPT_option_string ('e',
+ "ego",
+ NULL,
+ gettext_noop ("Ego"),
+ &ego_name),
+ GNUNET_GETOPT_option_string ('r',
+ "rp",
+ NULL,
+ gettext_noop ("Audience (relying party)"),
+ &rp),
+ GNUNET_GETOPT_option_flag ('D',
+ "dump",
+ gettext_noop ("List attributes for Ego"),
+ &list),
+ GNUNET_GETOPT_option_string ('i',
+ "issue",
+ NULL,
+ gettext_noop ("Issue a ticket"),
+ &issue_attrs),
+ GNUNET_GETOPT_option_string ('C',
+ "consume",
+ NULL,
+ gettext_noop ("Consume a ticket"),
+ &consume_ticket),
+ GNUNET_GETOPT_option_string ('R',
+ "revoke",
+ NULL,
+ gettext_noop ("Revoke a ticket"),
+ &revoke_ticket),
+ GNUNET_GETOPT_OPTION_END
+ };
+ GNUNET_PROGRAM_run (argc, argv, "ct",
+ "ct", options,
+ &run, NULL);
+ return ret;
+}
diff --git a/src/identity-provider/gnunet-service-identity-provider.c b/src/identity-provider/gnunet-service-identity-provider.c
index 53fd02c9ff..a5c178aa59 100644
--- a/src/identity-provider/gnunet-service-identity-provider.c
+++ b/src/identity-provider/gnunet-service-identity-provider.c
@@ -30,12 +30,13 @@
#include "gnunet_identity_service.h"
#include "gnunet_gnsrecord_lib.h"
#include "gnunet_namestore_service.h"
+#include "gnunet_credential_service.h"
#include "gnunet_statistics_service.h"
#include "gnunet_gns_service.h"
+#include "gnunet_identity_provider_plugin.h"
+#include "gnunet_identity_attribute_lib.h"
#include "gnunet_signatures.h"
#include "identity_provider.h"
-#include "identity_token.h"
-#include <inttypes.h>
/**
* First pass state
@@ -58,24 +59,19 @@
#define DEFAULT_TOKEN_EXPIRATION_INTERVAL GNUNET_TIME_UNIT_HOURS
/**
- * Service state (to detect initial update pass)
- */
-static int state;
-
-/**
- * Head of ego entry DLL
+ * Identity handle
*/
-static struct EgoEntry *ego_head;
+static struct GNUNET_IDENTITY_Handle *identity_handle;
/**
- * Tail of ego entry DLL
+ * Database handle
*/
-static struct EgoEntry *ego_tail;
+static struct GNUNET_IDENTITY_PROVIDER_PluginFunctions *TKT_database;
/**
- * Identity handle
+ * Name of DB plugin
*/
-static struct GNUNET_IDENTITY_Handle *identity_handle;
+static char *db_lib_name;
/**
* Token expiration interval
@@ -93,6 +89,16 @@ static struct GNUNET_NAMESTORE_Handle *ns_handle;
static struct GNUNET_GNS_Handle *gns_handle;
/**
+ * Credential handle
+ */
+static struct GNUNET_CREDENTIAL_Handle *credential_handle;
+
+/**
+ * Stats handle
+ */
+static struct GNUNET_STATISTICS_Handle *stats_handle;
+
+/**
* Namestore qe
*/
static struct GNUNET_NAMESTORE_QueueEntry *ns_qe;
@@ -112,11 +118,6 @@ static struct GNUNET_SCHEDULER_Task *timeout_task;
*/
static struct GNUNET_SCHEDULER_Task *update_task;
-/**
- * Timeout for next update pass
- */
-static struct GNUNET_TIME_Relative min_rel_exp;
-
/**
* Currently processed token
@@ -134,43 +135,260 @@ static char* label;
static char* scopes;
/**
- * Expiration for processed token
+ * Handle to the statistics service.
*/
-static uint64_t rd_exp;
+static struct GNUNET_STATISTICS_Handle *stats;
/**
- * ECDHE Privkey for processed token metadata
+ * Our configuration.
*/
-static struct GNUNET_CRYPTO_EcdhePrivateKey ecdhe_privkey;
+static const struct GNUNET_CONFIGURATION_Handle *cfg;
/**
- * Handle to the statistics service.
+ * An idp client
*/
-static struct GNUNET_STATISTICS_Handle *stats;
+struct IdpClient;
/**
- * Our configuration.
+ * A ticket iteration operation.
*/
-static const struct GNUNET_CONFIGURATION_Handle *cfg;
+struct TicketIteration
+{
+ /**
+ * DLL
+ */
+ struct TicketIteration *next;
+
+ /**
+ * DLL
+ */
+ struct TicketIteration *prev;
+
+ /**
+ * Client which intiated this zone iteration
+ */
+ struct IdpClient *client;
+
+ /**
+ * Key of the identity we are iterating over.
+ */
+ struct GNUNET_CRYPTO_EcdsaPublicKey identity;
+
+ /**
+ * Identity is audience
+ */
+ uint32_t is_audience;
+
+ /**
+ * The operation id fot the iteration in the response for the client
+ */
+ uint32_t r_id;
+
+ /**
+ * Offset of the iteration used to address next result of the
+ * iteration in the store
+ *
+ * Initialy set to 0 in handle_iteration_start
+ * Incremented with by every call to handle_iteration_next
+ */
+ uint32_t offset;
+
+};
+
+
+
+/**
+ * Callback after an ABE bootstrap
+ *
+ * @param cls closure
+ * @param abe_key the ABE key that exists or was created
+ */
+typedef void
+(*AbeBootstrapResult) (void *cls,
+ struct GNUNET_CRYPTO_AbeMasterKey *abe_key);
-struct ExchangeHandle
+struct AbeBootstrapHandle
{
+ /**
+ * Function to call when finished
+ */
+ AbeBootstrapResult proc;
/**
- * Client connection
+ * Callback closure
+ */
+ char *proc_cls;
+
+ /**
+ * Key of the zone we are iterating over.
+ */
+ struct GNUNET_CRYPTO_EcdsaPrivateKey identity;
+
+ /**
+ * Namestore Queue Entry
+ */
+ struct GNUNET_NAMESTORE_QueueEntry *ns_qe;
+
+ /**
+ * The issuer egos ABE master key
+ */
+ struct GNUNET_CRYPTO_AbeMasterKey *abe_key;
+};
+
+/**
+ * An attribute iteration operation.
+ */
+struct AttributeIterator
+{
+ /**
+ * Next element in the DLL
+ */
+ struct AttributeIterator *next;
+
+ /**
+ * Previous element in the DLL
+ */
+ struct AttributeIterator *prev;
+
+ /**
+ * IDP client which intiated this zone iteration
+ */
+ struct IdpClient *client;
+
+ /**
+ * Key of the zone we are iterating over.
+ */
+ struct GNUNET_CRYPTO_EcdsaPrivateKey identity;
+
+ /**
+ * The issuer egos ABE master key
+ */
+ struct GNUNET_CRYPTO_AbeMasterKey *abe_key;
+
+ /**
+ * Namestore iterator
+ */
+ struct GNUNET_NAMESTORE_ZoneIterator *ns_it;
+
+ /**
+ * The operation id fot the zone iteration in the response for the client
+ */
+ uint32_t request_id;
+
+};
+
+
+
+/**
+ * An idp client
+ */
+struct IdpClient
+{
+
+ /**
+ * The client
*/
struct GNUNET_SERVICE_Client *client;
/**
- * Ticket
+ * Message queue for transmission to @e client
+ */
+ struct GNUNET_MQ_Handle *mq;
+
+ /**
+ * Head of the DLL of
+ * Attribute iteration operations in
+ * progress initiated by this client
+ */
+ struct AttributeIterator *op_head;
+
+ /**
+ * Tail of the DLL of
+ * Attribute iteration operations
+ * in progress initiated by this client
+ */
+ struct AttributeIterator *op_tail;
+
+ /**
+ * Head of DLL of ticket iteration ops
+ */
+ struct TicketIteration *ticket_iter_head;
+
+ /**
+ * Tail of DLL of ticket iteration ops
+ */
+ struct TicketIteration *ticket_iter_tail;
+
+
+ /**
+ * Head of DLL of ticket revocation ops
+ */
+ struct TicketRevocationHandle *revocation_list_head;
+
+ /**
+ * Tail of DLL of ticket revocation ops
+ */
+ struct TicketRevocationHandle *revocation_list_tail;
+};
+
+
+
+struct AttributeStoreHandle
+{
+
+ /**
+ * Client connection
+ */
+ struct IdpClient *client;
+
+ /**
+ * Identity
+ */
+ struct GNUNET_CRYPTO_EcdsaPrivateKey identity;
+
+ /**
+ * Identity pubkey
+ */
+ struct GNUNET_CRYPTO_EcdsaPublicKey identity_pkey;
+
+ /**
+ * The issuer egos ABE master key
+ */
+ struct GNUNET_CRYPTO_AbeMasterKey *abe_key;
+
+ /**
+ * QueueEntry
+ */
+ struct GNUNET_NAMESTORE_QueueEntry *ns_qe;
+
+ /**
+ * The attribute to store
+ */
+ struct GNUNET_IDENTITY_ATTRIBUTE_Claim *claim;
+
+ /**
+ * request id
+ */
+ uint32_t r_id;
+};
+
+
+/* Prototype */
+struct ParallelLookup;
+
+struct ConsumeTicketHandle
+{
+
+ /**
+ * Client connection
*/
- struct TokenTicket *ticket;
+ struct IdpClient *client;
/**
- * Token returned
+ * Ticket
*/
- struct IdentityToken *token;
+ struct GNUNET_IDENTITY_PROVIDER_Ticket ticket;
/**
* LookupRequest
@@ -180,86 +398,173 @@ struct ExchangeHandle
/**
* Audience Key
*/
- struct GNUNET_CRYPTO_EcdsaPrivateKey aud_privkey;
+ struct GNUNET_CRYPTO_EcdsaPrivateKey identity;
+
+ /**
+ * Audience Key
+ */
+ struct GNUNET_CRYPTO_EcdsaPublicKey identity_pub;
/**
- * Label to return
+ * Lookup DLL
*/
- char *label;
+ struct ParallelLookup *parallel_lookups_head;
+
+ /**
+ * Lookup DLL
+ */
+ struct ParallelLookup *parallel_lookups_tail;
+
+ /**
+ * Kill task
+ */
+ struct GNUNET_SCHEDULER_Task *kill_task;
/**
+ * The ABE key
+ */
+ struct GNUNET_CRYPTO_AbeKey *key;
+
+ /**
+ * Attributes
+ */
+ struct GNUNET_IDENTITY_ATTRIBUTE_ClaimList *attrs;
+
+ /**
+ * Lookup time
+ */
+ struct GNUNET_TIME_Absolute lookup_start_time;
+
+ /**
* request id
*/
uint32_t r_id;
};
-struct IssueHandle
+/**
+ * Handle for a parallel GNS lookup job
+ */
+struct ParallelLookup
+{
+ /* DLL */
+ struct ParallelLookup *next;
+
+ /* DLL */
+ struct ParallelLookup *prev;
+
+ /* The GNS request */
+ struct GNUNET_GNS_LookupRequest *lookup_request;
+
+ /* The handle the return to */
+ struct ConsumeTicketHandle *handle;
+
+ /**
+ * Lookup time
+ */
+ struct GNUNET_TIME_Absolute lookup_start_time;
+
+ /* The label to look up */
+ char *label;
+};
+
+/**
+ * Ticket revocation request handle
+ */
+struct TicketRevocationHandle
{
+ /**
+ * DLL
+ */
+ struct TicketRevocationHandle *next;
+
+ /**
+ * DLL
+ */
+ struct TicketRevocationHandle *prev;
/**
* Client connection
*/
- struct GNUNET_SERVICE_Client *client;
+ struct IdpClient *client;
+
+ /**
+ * Attributes to reissue
+ */
+ struct GNUNET_IDENTITY_ATTRIBUTE_ClaimList *attrs;
+
+ /**
+ * Attributes to revoke
+ */
+ struct GNUNET_IDENTITY_ATTRIBUTE_ClaimList *rvk_attrs;
/**
* Issuer Key
*/
- struct GNUNET_CRYPTO_EcdsaPrivateKey iss_key;
+ struct GNUNET_CRYPTO_EcdsaPrivateKey identity;
/**
- * Issue pubkey
+ * Ticket to issue
*/
- struct GNUNET_CRYPTO_EcdsaPublicKey iss_pkey;
+ struct GNUNET_IDENTITY_PROVIDER_Ticket ticket;
/**
- * Audience Key
+ * QueueEntry
*/
- struct GNUNET_CRYPTO_EcdsaPublicKey aud_key;
+ struct GNUNET_NAMESTORE_QueueEntry *ns_qe;
/**
- * Expiration
+ * Namestore iterator
*/
- struct GNUNET_TIME_Absolute expiration;
+ struct GNUNET_NAMESTORE_ZoneIterator *ns_it;
/**
- * Scopes
+ * The ABE master key
*/
- char *scopes;
+ struct GNUNET_CRYPTO_AbeMasterKey *abe_key;
/**
- * nonce
+ * Offset
*/
- uint64_t nonce;
+ uint32_t offset;
/**
- * NS iterator
+ * request id
*/
- struct GNUNET_NAMESTORE_ZoneIterator *ns_it;
+ uint32_t r_id;
+};
+
+
+
+/**
+ * Ticket issue request handle
+ */
+struct TicketIssueHandle
+{
/**
- * Attribute map
+ * Client connection
*/
- struct GNUNET_CONTAINER_MultiHashMap *attr_map;
+ struct IdpClient *client;
/**
- * Token
+ * Attributes to issue
*/
- struct IdentityToken *token;
+ struct GNUNET_IDENTITY_ATTRIBUTE_ClaimList *attrs;
/**
- * Ticket
+ * Issuer Key
*/
- struct TokenTicket *ticket;
+ struct GNUNET_CRYPTO_EcdsaPrivateKey identity;
/**
- * QueueEntry
+ * Ticket to issue
*/
- struct GNUNET_NAMESTORE_QueueEntry *ns_qe;
+ struct GNUNET_IDENTITY_PROVIDER_Ticket ticket;
/**
- * The label the token is stored under
+ * QueueEntry
*/
- char *label;
+ struct GNUNET_NAMESTORE_QueueEntry *ns_qe;
/**
* request id
@@ -267,6 +572,7 @@ struct IssueHandle
uint32_t r_id;
};
+
/**
* DLL for ego handles to egos containing the ID_ATTRS in a map in json_t format
*
@@ -293,988 +599,1362 @@ struct EgoEntry
*/
struct GNUNET_CONTAINER_MultiHashMap *attr_map;
- /**
- * Attributes are old and should be updated if GNUNET_YES
- */
- int attributes_dirty;
};
/**
- * Continuation for token store call
+ * Cleanup task
+ */
+static void
+cleanup()
+{
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Cleaning up\n");
+ if (NULL != stats)
+ {
+ GNUNET_STATISTICS_destroy (stats, GNUNET_NO);
+ stats = NULL;
+ }
+ GNUNET_break (NULL == GNUNET_PLUGIN_unload (db_lib_name,
+ TKT_database));
+ GNUNET_free (db_lib_name);
+ db_lib_name = NULL;
+ if (NULL != timeout_task)
+ GNUNET_SCHEDULER_cancel (timeout_task);
+ if (NULL != update_task)
+ GNUNET_SCHEDULER_cancel (update_task);
+ if (NULL != identity_handle)
+ GNUNET_IDENTITY_disconnect (identity_handle);
+ if (NULL != gns_handle)
+ GNUNET_GNS_disconnect (gns_handle);
+ if (NULL != credential_handle)
+ GNUNET_CREDENTIAL_disconnect (credential_handle);
+ if (NULL != ns_it)
+ GNUNET_NAMESTORE_zone_iteration_stop (ns_it);
+ if (NULL != ns_qe)
+ GNUNET_NAMESTORE_cancel (ns_qe);
+ if (NULL != ns_handle)
+ GNUNET_NAMESTORE_disconnect (ns_handle);
+ if (NULL != stats_handle)
+ GNUNET_STATISTICS_destroy (stats_handle, GNUNET_NO);
+ if (NULL != token)
+ GNUNET_free (token);
+ if (NULL != label)
+ GNUNET_free (label);
+
+}
+
+/**
+ * Shutdown task
*
* @param cls NULL
- * @param success error code
- * @param emsg error message
+ * @param tc task context
+ */
+static void
+do_shutdown (void *cls)
+{
+ GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+ "Shutting down...\n");
+ cleanup();
+}
+
+/**
+ * Finished storing newly bootstrapped ABE key
*/
static void
-store_token_cont (void *cls,
- int32_t success,
- const char *emsg)
+bootstrap_store_cont (void *cls,
+ int32_t success,
+ const char *emsg)
{
- ns_qe = NULL;
+ struct AbeBootstrapHandle *abh = cls;
if (GNUNET_SYSERR == success)
{
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Failed to update token: %s\n",
+ "Failed to bootstrap ABE master %s\n",
emsg);
+ abh->proc (abh->proc_cls, NULL);
+ GNUNET_free (abh->abe_key);
+ GNUNET_free (abh);
return;
}
- GNUNET_NAMESTORE_zone_iterator_next (ns_it);
+ abh->proc (abh->proc_cls, abh->abe_key);
+ GNUNET_free (abh);
}
+/**
+ * Generates and stores a new ABE key
+ */
+static void
+bootstrap_store_task (void *cls)
+{
+ struct AbeBootstrapHandle *abh = cls;
+ struct GNUNET_GNSRECORD_Data rd[1];
+ char *key;
+
+ rd[0].data_size = GNUNET_CRYPTO_cpabe_serialize_master_key (abh->abe_key,
+ (void**)&key);
+ rd[0].data = key;
+ rd[0].record_type = GNUNET_GNSRECORD_TYPE_ABE_MASTER;
+ rd[0].flags = GNUNET_GNSRECORD_RF_RELATIVE_EXPIRATION | GNUNET_GNSRECORD_RF_PRIVATE;
+ rd[0].expiration_time = GNUNET_TIME_UNIT_HOURS.rel_value_us; //TODO sane?
+ abh->ns_qe = GNUNET_NAMESTORE_records_store (ns_handle,
+ &abh->identity,
+ "+",
+ 1,
+ rd,
+ &bootstrap_store_cont,
+ abh);
+ GNUNET_free (key);
+}
/**
- * This function updates the old token with new attributes,
- * removes deleted attributes and expiration times.
- *
- * @param cls the ego entry
+ * Error checking for ABE master
*/
static void
-handle_token_update (void *cls)
+bootstrap_abe_error (void *cls)
{
- char *token_metadata;
- char *write_ptr;
- char *enc_token_str;
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *priv_key;
- struct GNUNET_CRYPTO_EcdsaPublicKey pub_key;
- struct GNUNET_CRYPTO_EcdhePrivateKey *new_ecdhe_privkey;
- struct EgoEntry *ego_entry = cls;
- struct GNUNET_GNSRECORD_Data token_record[2];
- struct GNUNET_HashCode key_hash;
- struct GNUNET_TIME_Relative token_rel_exp;
- struct GNUNET_TIME_Relative token_ttl;
- struct GNUNET_TIME_Absolute token_exp;
- struct GNUNET_TIME_Absolute token_nbf;
- struct GNUNET_TIME_Absolute new_exp;
- struct GNUNET_TIME_Absolute new_iat;
- struct GNUNET_TIME_Absolute new_nbf;
- struct IdentityToken *new_token;
- struct TokenAttr *cur_value;
- struct TokenAttr *attr;
- size_t token_metadata_len;
-
- priv_key = GNUNET_IDENTITY_ego_get_private_key (ego_entry->ego);
- GNUNET_IDENTITY_ego_get_public_key (ego_entry->ego,
- &pub_key);
-
- //Note: We need the token expiration time here. Not the record expiration
- //time.
- //There are two types of tokens: Token that expire on GNS level with
- //an absolute expiration time. Those are basically tokens that will
- //be automatically revoked on (record)expiration.
- //Tokens stored with relative expiration times will expire on the token level (token expiration)
- //but this service will reissue new tokens that can be retrieved from GNS
- //automatically.
-
- for (attr = token->attr_head; NULL != attr; attr = attr->next)
- {
- if (0 == strcmp (attr->name, "exp"))
- {
- GNUNET_assert (1 == sscanf (attr->val_head->value,
- "%"SCNu64,
- &token_exp.abs_value_us));
- } else if (0 == strcmp (attr->name, "nbf")) {
- GNUNET_assert (1 == sscanf (attr->val_head->value,
- "%"SCNu64,
- &token_nbf.abs_value_us));
- }
- }
- token_rel_exp = GNUNET_TIME_absolute_get_difference (token_nbf, token_exp);
+ struct AbeBootstrapHandle *abh = cls;
+ GNUNET_free (abh);
+ abh->proc (abh->proc_cls, NULL);
+ GNUNET_free (abh);
+}
- token_ttl = GNUNET_TIME_absolute_get_remaining (token_exp);
- if (0 != GNUNET_TIME_absolute_get_remaining (token_exp).rel_value_us)
- {
- //This token is not yet expired! Save and skip
- if (min_rel_exp.rel_value_us > token_ttl.rel_value_us)
- {
- min_rel_exp = token_ttl;
- }
- GNUNET_free (token);
- token = NULL;
- GNUNET_free (label);
- label = NULL;
- GNUNET_free (scopes);
- scopes = NULL;
- GNUNET_NAMESTORE_zone_iterator_next (ns_it);
+
+/**
+ * Handle ABE lookup in namestore
+ */
+static void
+bootstrap_abe_result (void *cls,
+ const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone,
+ const char *label,
+ unsigned int rd_count,
+ const struct GNUNET_GNSRECORD_Data *rd)
+{
+ struct AbeBootstrapHandle *abh = cls;
+ struct GNUNET_CRYPTO_AbeMasterKey *abe_key;
+ int i;
+
+ for (i=0;i<rd_count;i++) {
+ if (GNUNET_GNSRECORD_TYPE_ABE_MASTER != rd[i].record_type)
+ continue;
+ abe_key = GNUNET_CRYPTO_cpabe_deserialize_master_key (rd[i].data,
+ rd[i].data_size);
+ abh->proc (abh->proc_cls, abe_key);
+ GNUNET_free (abh);
return;
}
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Token is expired. Create a new one\n");
- new_token = token_create (&pub_key,
- &token->aud_key);
- new_exp = GNUNET_TIME_relative_to_absolute (token_rel_exp);
- new_nbf = GNUNET_TIME_absolute_get ();
- new_iat = new_nbf;
- for (attr = token->attr_head; NULL != attr; attr = attr->next)
+
+ //No ABE master found, bootstrapping...
+ abh->abe_key = GNUNET_CRYPTO_cpabe_create_master_key ();
+ GNUNET_SCHEDULER_add_now (&bootstrap_store_task, abh);
+}
+
+/**
+ * Bootstrap ABE master if it does not yet exists.
+ * Will call the AbeBootstrapResult processor when done.
+ * will always recreate the ABE key of GNUNET_YES == recreate
+ */
+static void
+bootstrap_abe (const struct GNUNET_CRYPTO_EcdsaPrivateKey *identity,
+ AbeBootstrapResult proc,
+ void* cls,
+ int recreate)
+{
+ struct AbeBootstrapHandle *abh;
+
+ abh = GNUNET_new (struct AbeBootstrapHandle);
+ abh->proc = proc;
+ abh->proc_cls = cls;
+ abh->identity = *identity;
+ if (GNUNET_YES == recreate)
{
- if (0 == strcmp (attr->name, "exp"))
- {
- token_add_attr_int (new_token, attr->name, new_exp.abs_value_us);
- }
- else if (0 == strcmp (attr->name, "nbf"))
- {
- token_add_attr_int (new_token, attr->name, new_nbf.abs_value_us);
- }
- else if (0 == strcmp (attr->name, "iat"))
- {
- token_add_attr_int (new_token, attr->name, new_iat.abs_value_us);
- }
- else if ((0 == strcmp (attr->name, "iss"))
- || (0 == strcmp (attr->name, "aud")))
- {
- //Omit
- }
- else if (0 == strcmp (attr->name, "sub"))
- {
- token_add_attr (new_token,
- attr->name,
- attr->val_head->value);
- }
- else
- {
- GNUNET_CRYPTO_hash (attr->name,
- strlen (attr->name),
- &key_hash);
- //Check if attr still exists. omit of not
- if (GNUNET_NO !=
- GNUNET_CONTAINER_multihashmap_contains (ego_entry->attr_map,
- &key_hash))
- {
- cur_value = GNUNET_CONTAINER_multihashmap_get (ego_entry->attr_map,
- &key_hash);
- GNUNET_assert (NULL != cur_value);
- GNUNET_CONTAINER_DLL_insert (new_token->attr_head,
- new_token->attr_tail,
- cur_value);
- }
- }
+ abh->abe_key = GNUNET_CRYPTO_cpabe_create_master_key ();
+ GNUNET_SCHEDULER_add_now (&bootstrap_store_task, abh);
+ } else {
+ abh->ns_qe = GNUNET_NAMESTORE_records_lookup (ns_handle,
+ identity,
+ "+",
+ &bootstrap_abe_error,
+ abh,
+ &bootstrap_abe_result,
+ abh);
}
-
- // reassemble and set
- GNUNET_assert (token_serialize (new_token,
- priv_key,
- &new_ecdhe_privkey,
- &enc_token_str));
-
- token_record[0].data = enc_token_str;
- token_record[0].data_size = strlen (enc_token_str) + 1;
- token_record[0].expiration_time = rd_exp; //Old expiration time
- token_record[0].record_type = GNUNET_GNSRECORD_TYPE_ID_TOKEN;
- token_record[0].flags = GNUNET_GNSRECORD_RF_NONE;
-
- //Meta
- token_metadata_len = sizeof (struct GNUNET_CRYPTO_EcdhePrivateKey)
- + sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey)
- + strlen (scopes) + 1; //With 0-Terminator
- token_metadata = GNUNET_malloc (token_metadata_len);
- write_ptr = token_metadata;
- GNUNET_memcpy (token_metadata, new_ecdhe_privkey, sizeof (struct GNUNET_CRYPTO_EcdhePrivateKey));
- write_ptr += sizeof (struct GNUNET_CRYPTO_EcdhePrivateKey);
- GNUNET_memcpy (write_ptr, &token->aud_key, sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey));
- write_ptr += sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey);
- GNUNET_memcpy (write_ptr, scopes, strlen (scopes) + 1); //with 0-Terminator;
-
- token_record[1].data = token_metadata;
- token_record[1].data_size = token_metadata_len;
- token_record[1].expiration_time = rd_exp;
- token_record[1].record_type = GNUNET_GNSRECORD_TYPE_ID_TOKEN_METADATA;
- token_record[1].flags = GNUNET_GNSRECORD_RF_PRIVATE;
-
- ns_qe = GNUNET_NAMESTORE_records_store (ns_handle,
- priv_key,
- label,
- 2,
- token_record,
- &store_token_cont,
- ego_entry);
- token_destroy (new_token);
- token_destroy (token);
- GNUNET_free (new_ecdhe_privkey);
- GNUNET_free (enc_token_str);
- token = NULL;
- GNUNET_free (label);
- label = NULL;
- GNUNET_free (scopes);
- scopes = NULL;
}
+
+static int
+create_sym_key_from_ecdh(const struct GNUNET_HashCode *new_key_hash,
+ struct GNUNET_CRYPTO_SymmetricSessionKey *skey,
+ struct GNUNET_CRYPTO_SymmetricInitializationVector *iv)
+{
+ struct GNUNET_CRYPTO_HashAsciiEncoded new_key_hash_str;
+
+ GNUNET_CRYPTO_hash_to_enc (new_key_hash,
+ &new_key_hash_str);
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Creating symmetric rsa key from %s\n", (char*)&new_key_hash_str);
+ static const char ctx_key[] = "gnuid-aes-ctx-key";
+ GNUNET_CRYPTO_kdf (skey, sizeof (struct GNUNET_CRYPTO_SymmetricSessionKey),
+ new_key_hash, sizeof (struct GNUNET_HashCode),
+ ctx_key, strlen (ctx_key),
+ NULL, 0);
+ static const char ctx_iv[] = "gnuid-aes-ctx-iv";
+ GNUNET_CRYPTO_kdf (iv, sizeof (struct GNUNET_CRYPTO_SymmetricInitializationVector),
+ new_key_hash, sizeof (struct GNUNET_HashCode),
+ ctx_iv, strlen (ctx_iv),
+ NULL, 0);
+ return GNUNET_OK;
+}
+
static void
-update_identities(void *cls);
+cleanup_ticket_issue_handle (struct TicketIssueHandle *handle)
+{
+ if (NULL != handle->attrs)
+ GNUNET_IDENTITY_ATTRIBUTE_list_destroy (handle->attrs);
+ if (NULL != handle->ns_qe)
+ GNUNET_NAMESTORE_cancel (handle->ns_qe);
+ GNUNET_free (handle);
+}
-/**
- *
- * Cleanup attr_map
- *
- * @param cls NULL
- * @param key the key
- * @param value the json_t attribute value
- * @return #GNUNET_YES
- */
-static int
-clear_ego_attrs (void *cls,
- const struct GNUNET_HashCode *key,
- void *value)
-{
- struct TokenAttr *attr = value;
- struct TokenAttrValue *val;
- struct TokenAttrValue *tmp_val;
- for (val = attr->val_head; NULL != val;)
+static void
+send_ticket_result (struct IdpClient *client,
+ uint32_t r_id,
+ const struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket,
+ const struct GNUNET_IDENTITY_ATTRIBUTE_ClaimList *attrs)
+{
+ struct TicketResultMessage *irm;
+ struct GNUNET_MQ_Envelope *env;
+ struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket_buf;
+
+ /* store ticket in DB */
+ if (GNUNET_OK != TKT_database->store_ticket (TKT_database->cls,
+ ticket,
+ attrs))
{
- tmp_val = val->next;
- GNUNET_CONTAINER_DLL_remove (attr->val_head,
- attr->val_tail,
- val);
- GNUNET_free (val->value);
- GNUNET_free (val);
- val = tmp_val;
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Unable to store ticket after issue\n");
+ GNUNET_break (0);
}
- GNUNET_free (attr->name);
- GNUNET_free (attr);
- return GNUNET_YES;
+ env = GNUNET_MQ_msg_extra (irm,
+ sizeof (struct GNUNET_IDENTITY_PROVIDER_Ticket),
+ GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_TICKET_RESULT);
+ ticket_buf = (struct GNUNET_IDENTITY_PROVIDER_Ticket *)&irm[1];
+ *ticket_buf = *ticket;
+ irm->id = htonl (r_id);
+ GNUNET_MQ_send (client->mq,
+ env);
}
-
static void
-token_collect_error_cb (void *cls)
+store_ticket_issue_cont (void *cls,
+ int32_t success,
+ const char *emsg)
{
- struct EgoEntry *ego_entry = cls;
+ struct TicketIssueHandle *handle = cls;
+
+ handle->ns_qe = NULL;
+ if (GNUNET_SYSERR == success)
+ {
+ cleanup_ticket_issue_handle (handle);
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "%s\n",
+ "Unknown Error\n");
+ GNUNET_SCHEDULER_add_now (&do_shutdown, NULL);
+ return;
+ }
+ send_ticket_result (handle->client,
+ handle->r_id,
+ &handle->ticket,
+ handle->attrs);
+ cleanup_ticket_issue_handle (handle);
+}
+
+
+
+int
+serialize_abe_keyinfo2 (const struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket,
+ const struct GNUNET_IDENTITY_ATTRIBUTE_ClaimList *attrs,
+ const struct GNUNET_CRYPTO_AbeKey *rp_key,
+ struct GNUNET_CRYPTO_EcdhePrivateKey **ecdh_privkey,
+ char **result)
+{
+ struct GNUNET_CRYPTO_EcdhePublicKey ecdh_pubkey;
+ struct GNUNET_IDENTITY_ATTRIBUTE_ClaimListEntry *le;
+ char *enc_keyinfo;
+ char *serialized_key;
+ char *buf;
+ char *write_ptr;
+ char attrs_str_len;
+ ssize_t size;
+
+ struct GNUNET_CRYPTO_SymmetricSessionKey skey;
+ struct GNUNET_CRYPTO_SymmetricInitializationVector iv;
+ struct GNUNET_HashCode new_key_hash;
+ ssize_t enc_size;
+
+ size = GNUNET_CRYPTO_cpabe_serialize_key (rp_key,
+ (void**)&serialized_key);
+ attrs_str_len = 0;
+ for (le = attrs->list_head; NULL != le; le = le->next) {
+ attrs_str_len += strlen (le->claim->name) + 1;
+ }
+ buf = GNUNET_malloc (attrs_str_len + size);
+ write_ptr = buf;
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Writing attributes\n");
+ for (le = attrs->list_head; NULL != le; le = le->next) {
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "%s\n", le->claim->name);
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- ">>> Updating Ego failed!\n");
- //Clear attribute map for ego
- GNUNET_CONTAINER_multihashmap_iterate (ego_entry->attr_map,
- &clear_ego_attrs,
- ego_entry);
- GNUNET_CONTAINER_multihashmap_clear (ego_entry->attr_map);
- update_task = GNUNET_SCHEDULER_add_now (&update_identities,
- ego_entry->next);
+ GNUNET_memcpy (write_ptr,
+ le->claim->name,
+ strlen (le->claim->name));
+ write_ptr[strlen (le->claim->name)] = ',';
+ write_ptr += strlen (le->claim->name) + 1;
+ }
+ write_ptr--;
+ write_ptr[0] = '\0'; //replace last , with a 0-terminator
+ write_ptr++;
+ GNUNET_memcpy (write_ptr,
+ serialized_key,
+ size);
+ GNUNET_free (serialized_key);
+ // ECDH keypair E = eG
+ *ecdh_privkey = GNUNET_CRYPTO_ecdhe_key_create();
+ GNUNET_CRYPTO_ecdhe_key_get_public (*ecdh_privkey,
+ &ecdh_pubkey);
+ enc_keyinfo = GNUNET_malloc (size + attrs_str_len);
+ // Derived key K = H(eB)
+ GNUNET_assert (GNUNET_OK == GNUNET_CRYPTO_ecdh_ecdsa (*ecdh_privkey,
+ &ticket->audience,
+ &new_key_hash));
+ create_sym_key_from_ecdh(&new_key_hash, &skey, &iv);
+ enc_size = GNUNET_CRYPTO_symmetric_encrypt (buf,
+ size + attrs_str_len,
+ &skey, &iv,
+ enc_keyinfo);
+ *result = GNUNET_malloc (sizeof (struct GNUNET_CRYPTO_EcdhePublicKey)+
+ enc_size);
+ GNUNET_memcpy (*result,
+ &ecdh_pubkey,
+ sizeof (struct GNUNET_CRYPTO_EcdhePublicKey));
+ GNUNET_memcpy (*result + sizeof (struct GNUNET_CRYPTO_EcdhePublicKey),
+ enc_keyinfo,
+ enc_size);
+ GNUNET_free (enc_keyinfo);
+ GNUNET_free (buf);
+ return sizeof (struct GNUNET_CRYPTO_EcdhePublicKey)+enc_size;
}
+
static void
-token_collect_finished_cb (void *cls)
+issue_ticket_after_abe_bootstrap (void *cls,
+ struct GNUNET_CRYPTO_AbeMasterKey *abe_key)
{
- struct EgoEntry *ego_entry = cls;
+ struct TicketIssueHandle *ih = cls;
+ struct GNUNET_IDENTITY_ATTRIBUTE_ClaimListEntry *le;
+ struct GNUNET_CRYPTO_EcdhePrivateKey *ecdhe_privkey;
+ struct GNUNET_GNSRECORD_Data code_record[1];
+ struct GNUNET_CRYPTO_AbeKey *rp_key;
+ char *code_record_data;
+ char **attrs;
+ char *label;
+ char *policy;
+ int attrs_len;
+ int i;
+ size_t code_record_len;
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- ">>> Updating Ego finished\n");
- //Clear attribute map for ego
- GNUNET_CONTAINER_multihashmap_iterate (ego_entry->attr_map,
- &clear_ego_attrs,
- ego_entry);
- GNUNET_CONTAINER_multihashmap_clear (ego_entry->attr_map);
- update_task = GNUNET_SCHEDULER_add_now (&update_identities,
- ego_entry->next);
+ //Create new ABE key for RP
+ attrs_len = 0;
+ for (le = ih->attrs->list_head; NULL != le; le = le->next)
+ attrs_len++;
+ attrs = GNUNET_malloc ((attrs_len + 1)*sizeof (char*));
+ i = 0;
+ for (le = ih->attrs->list_head; NULL != le; le = le->next) {
+ GNUNET_asprintf (&policy, "%s_%lu",
+ le->claim->name,
+ le->claim->version);
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Adding attribute to key: %s\n",
+ policy);
+ attrs[i] = policy;
+ i++;
+ }
+ attrs[i] = NULL;
+ rp_key = GNUNET_CRYPTO_cpabe_create_key (abe_key,
+ attrs);
+
+ //TODO review this wireformat
+ code_record_len = serialize_abe_keyinfo2 (&ih->ticket,
+ ih->attrs,
+ rp_key,
+ &ecdhe_privkey,
+ &code_record_data);
+ code_record[0].data = code_record_data;
+ code_record[0].data_size = code_record_len;
+ code_record[0].expiration_time = GNUNET_TIME_UNIT_DAYS.rel_value_us;
+ code_record[0].record_type = GNUNET_GNSRECORD_TYPE_ABE_KEY;
+ code_record[0].flags = GNUNET_GNSRECORD_RF_RELATIVE_EXPIRATION;
+
+ label = GNUNET_STRINGS_data_to_string_alloc (&ih->ticket.rnd,
+ sizeof (uint64_t));
+ //Publish record
+ ih->ns_qe = GNUNET_NAMESTORE_records_store (ns_handle,
+ &ih->identity,
+ label,
+ 1,
+ code_record,
+ &store_ticket_issue_cont,
+ ih);
+ //for (; i > 0; i--)
+ // GNUNET_free (attrs[i-1]);
+ GNUNET_free (ecdhe_privkey);
+ GNUNET_free (label);
+ GNUNET_free (attrs);
+ GNUNET_free (code_record_data);
+ GNUNET_CRYPTO_cpabe_delete_key (rp_key,
+ GNUNET_YES);
+ GNUNET_CRYPTO_cpabe_delete_master_key (abe_key);
}
/**
+ * Checks a ticket issue message
*
- * Update all ID_TOKEN records for an identity and store them
- *
- * @param cls the identity entry
- * @param zone the identity
- * @param lbl the name of the record
- * @param rd_count number of records
- * @param rd record data
+ * @param cls client sending the message
+ * @param im message of type `struct TicketIssueMessage`
+ * @return #GNUNET_OK if @a im is well-formed
*/
-static void
-token_collect (void *cls,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone,
- const char *lbl,
- unsigned int rd_count,
- const struct GNUNET_GNSRECORD_Data *rd)
-{
- struct EgoEntry *ego_entry = cls;
- const struct GNUNET_GNSRECORD_Data *token_record;
- const struct GNUNET_GNSRECORD_Data *token_metadata_record;
- struct GNUNET_CRYPTO_EcdsaPublicKey *aud_key;
- struct GNUNET_CRYPTO_EcdhePrivateKey *priv_key;
-
- //There should be only a single record for a token under a label
- if (2 != rd_count)
- {
- GNUNET_NAMESTORE_zone_iterator_next (ns_it);
- return;
- }
+static int
+check_issue_ticket_message(void *cls,
+ const struct IssueTicketMessage *im)
+{
+ uint16_t size;
- if (rd[0].record_type == GNUNET_GNSRECORD_TYPE_ID_TOKEN_METADATA)
- {
- token_metadata_record = &rd[0];
- token_record = &rd[1];
- }
- else
- {
- token_record = &rd[0];
- token_metadata_record = &rd[1];
- }
- if (token_metadata_record->record_type != GNUNET_GNSRECORD_TYPE_ID_TOKEN_METADATA)
- {
- GNUNET_NAMESTORE_zone_iterator_next (ns_it);
- return;
- }
- if (token_record->record_type == GNUNET_GNSRECORD_TYPE_ID_TOKEN)
+ size = ntohs (im->header.size);
+ if (size <= sizeof (struct IssueTicketMessage))
{
- GNUNET_NAMESTORE_zone_iterator_next (ns_it);
- return;
+ GNUNET_break (0);
+ return GNUNET_SYSERR;
}
+ return GNUNET_OK;
+}
+
- //Get metadata and decrypt token
- priv_key = (struct GNUNET_CRYPTO_EcdhePrivateKey *)token_metadata_record->data;
- ecdhe_privkey = *priv_key;
- aud_key = (struct GNUNET_CRYPTO_EcdsaPublicKey *)&priv_key[1];
- scopes = GNUNET_strdup ((char*) aud_key+sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey));
+/**
+ *
+ * Handler for ticket issue message
+ *
+ * @param cls unused
+ * @param client who sent the message
+ * @param message the message
+ */
+static void
+handle_issue_ticket_message (void *cls,
+ const struct IssueTicketMessage *im)
+{
+ struct TicketIssueHandle *ih;
+ struct IdpClient *idp = cls;
+ size_t attrs_len;
+
+ ih = GNUNET_new (struct TicketIssueHandle);
+ attrs_len = ntohs (im->attr_len);
+ ih->attrs = GNUNET_IDENTITY_ATTRIBUTE_list_deserialize ((char*)&im[1], attrs_len);
+ ih->r_id = ntohl (im->id);
+ ih->client = idp;
+ ih->identity = im->identity;
+ GNUNET_CRYPTO_ecdsa_key_get_public (&ih->identity,
+ &ih->ticket.identity);
+ ih->ticket.audience = im->rp;
+ ih->ticket.rnd =
+ GNUNET_CRYPTO_random_u64 (GNUNET_CRYPTO_QUALITY_STRONG,
+ UINT64_MAX);
+ bootstrap_abe (&ih->identity, &issue_ticket_after_abe_bootstrap, ih, GNUNET_NO);
+ GNUNET_SERVICE_client_continue (idp->client);
- token_parse2 (token_record->data,
- &ecdhe_privkey,
- aud_key,
- &token);
+}
- label = GNUNET_strdup (lbl);
- rd_exp = token_record->expiration_time;
+/**********************************************************
+ * Revocation
+ **********************************************************/
- GNUNET_SCHEDULER_add_now (&handle_token_update,
- ego_entry);
+/**
+ * Cleanup revoke handle
+ */
+static void
+cleanup_revoke_ticket_handle (struct TicketRevocationHandle *handle)
+{
+ if (NULL != handle->attrs)
+ GNUNET_IDENTITY_ATTRIBUTE_list_destroy (handle->attrs);
+ if (NULL != handle->rvk_attrs)
+ GNUNET_IDENTITY_ATTRIBUTE_list_destroy (handle->rvk_attrs);
+ if (NULL != handle->abe_key)
+ GNUNET_CRYPTO_cpabe_delete_master_key (handle->abe_key);
+ if (NULL != handle->ns_qe)
+ GNUNET_NAMESTORE_cancel (handle->ns_qe);
+ if (NULL != handle->ns_it)
+ GNUNET_NAMESTORE_zone_iteration_stop (handle->ns_it);
+ GNUNET_free (handle);
}
+/**
+ * Send revocation result
+ */
static void
-attribute_collect_error_cb (void *cls)
+send_revocation_finished (struct TicketRevocationHandle *rh,
+ uint32_t success)
{
- struct EgoEntry *ego_entry = cls;
+ struct GNUNET_MQ_Envelope *env;
+ struct RevokeTicketResultMessage *trm;
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- ">>> Updating Attributes failed!\n");
- ego_entry->attributes_dirty = GNUNET_NO;
- update_task = GNUNET_SCHEDULER_add_now (&update_identities,
- ego_entry);
+ env = GNUNET_MQ_msg (trm,
+ GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_REVOKE_TICKET_RESULT);
+ trm->id = htonl (rh->r_id);
+ trm->success = htonl (success);
+ GNUNET_MQ_send (rh->client->mq,
+ env);
+ GNUNET_CONTAINER_DLL_remove (rh->client->revocation_list_head,
+ rh->client->revocation_list_tail,
+ rh);
}
+/**
+ * Process ticket from database
+ *
+ * @param cls struct TicketIterationProcResult
+ * @param ticket the ticket
+ * @param attrs the attributes
+ */
+static void
+ticket_reissue_proc (void *cls,
+ const struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket,
+ const struct GNUNET_IDENTITY_ATTRIBUTE_ClaimList *attrs);
+
static void
-attribute_collect_finished_cb (void *cls)
+revocation_reissue_tickets (struct TicketRevocationHandle *rh);
+
+
+static void reissue_next (void *cls)
{
- struct EgoEntry *ego_entry = cls;
+ struct TicketRevocationHandle *rh = cls;
+ revocation_reissue_tickets (rh);
+}
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- ">>> Updating Attributes finished\n");
- ego_entry->attributes_dirty = GNUNET_NO;
- update_task = GNUNET_SCHEDULER_add_now (&update_identities,
- ego_entry);
+
+static void
+reissue_ticket_cont (void *cls,
+ int32_t success,
+ const char *emsg)
+{
+ struct TicketRevocationHandle *rh = cls;
+
+ rh->ns_qe = NULL;
+ if (GNUNET_SYSERR == success)
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "%s\n",
+ "Unknown Error\n");
+ send_revocation_finished (rh, GNUNET_SYSERR);
+ cleanup_revoke_ticket_handle (rh);
+ return;
+ }
+ rh->offset++;
+ GNUNET_SCHEDULER_add_now (&reissue_next, rh);
}
/**
+ * Process ticket from database
*
- * Collect all ID_ATTR records for an identity and store them
- *
- * @param cls the identity entry
- * @param zone the identity
- * @param lbl the name of the record
- * @param rd_count number of records
- * @param rd record data
- *
+ * @param cls struct TicketIterationProcResult
+ * @param ticket the ticket
+ * @param attrs the attributes
*/
static void
-attribute_collect (void *cls,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone,
- const char *lbl,
- unsigned int rd_count,
- const struct GNUNET_GNSRECORD_Data *rd)
-{
- struct EgoEntry *ego_entry = cls;
- struct GNUNET_HashCode key;
- struct TokenAttr *attr;
- struct TokenAttrValue *val;
- char *val_str;
+ticket_reissue_proc (void *cls,
+ const struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket,
+ const struct GNUNET_IDENTITY_ATTRIBUTE_ClaimList *attrs)
+{
+ struct TicketRevocationHandle *rh = cls;
+ struct GNUNET_IDENTITY_ATTRIBUTE_ClaimListEntry *le;
+ struct GNUNET_IDENTITY_ATTRIBUTE_ClaimListEntry *le_rollover;
+ struct GNUNET_CRYPTO_EcdhePrivateKey *ecdhe_privkey;
+ struct GNUNET_GNSRECORD_Data code_record[1];
+ struct GNUNET_CRYPTO_AbeKey *rp_key;
+ char *code_record_data;
+ char **attr_arr;
+ char *label;
+ char *policy;
+ int attrs_len;
int i;
+ int reissue_ticket;
+ size_t code_record_len;
+
- if (0 == rd_count)
+ if (NULL == ticket)
{
- GNUNET_NAMESTORE_zone_iterator_next (ns_it);
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Iteration done\n");
return;
}
- GNUNET_CRYPTO_hash (lbl,
- strlen (lbl),
- &key);
- if (1 == rd_count)
+
+ if (0 == memcmp (&ticket->audience,
+ &rh->ticket.audience,
+ sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey)))
{
- if (rd->record_type == GNUNET_GNSRECORD_TYPE_ID_ATTR)
- {
- val_str = GNUNET_GNSRECORD_value_to_string (rd->record_type,
- rd->data,
- rd->data_size);
- attr = GNUNET_malloc (sizeof (struct TokenAttr));
- attr->name = GNUNET_strdup (lbl);
- val = GNUNET_malloc (sizeof (struct TokenAttrValue));
- val->value = val_str;
- GNUNET_CONTAINER_DLL_insert (attr->val_head,
- attr->val_tail,
- val);
- GNUNET_assert (GNUNET_OK ==
- GNUNET_CONTAINER_multihashmap_put (ego_entry->attr_map,
- &key,
- attr,
- GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY));
- }
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Do not reissue for this identity.!\n");
- GNUNET_NAMESTORE_zone_iterator_next (ns_it);
+ rh->offset++;
+ GNUNET_SCHEDULER_add_now (&reissue_next, rh);
return;
}
- attr = GNUNET_malloc (sizeof (struct TokenAttr));
- attr->name = GNUNET_strdup (lbl);
- for (i = 0; i < rd_count; i++)
+ /*
+ * Check if any attribute of this ticket intersects with a rollover attribute
+ */
+ reissue_ticket = GNUNET_NO;
+ for (le = attrs->list_head; NULL != le; le = le->next)
{
- if (rd[i].record_type == GNUNET_GNSRECORD_TYPE_ID_ATTR)
+ for (le_rollover = rh->rvk_attrs->list_head;
+ NULL != le_rollover;
+ le_rollover = le_rollover->next)
{
- val_str = GNUNET_GNSRECORD_value_to_string (rd[i].record_type,
- rd[i].data,
- rd[i].data_size);
- val = GNUNET_malloc (sizeof (struct TokenAttrValue));
- val->value = val_str;
- GNUNET_CONTAINER_DLL_insert (attr->val_head,
- attr->val_tail,
- val);
+ if (0 == strcmp (le_rollover->claim->name,
+ le->claim->name))
+ {
+ reissue_ticket = GNUNET_YES;
+ le->claim->version = le_rollover->claim->version;
+ }
}
}
- GNUNET_assert (GNUNET_OK == GNUNET_CONTAINER_multihashmap_put (ego_entry->attr_map,
- &key,
- attr,
- GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY));
- GNUNET_NAMESTORE_zone_iterator_next (ns_it);
-}
-
-/**
- *
- * Update identity information for ego. If attribute map is
- * dirty, first update the attributes.
- *
- * @param cls the ego to update
- */
-static void
-update_identities(void *cls)
-{
- struct EgoEntry *next_ego = cls;
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *priv_key;
- update_task = NULL;
- if (NULL == next_ego)
+ if (GNUNET_NO == reissue_ticket)
{
- if (min_rel_exp.rel_value_us < MIN_WAIT_TIME.rel_value_us)
- min_rel_exp = MIN_WAIT_TIME;
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- ">>> Finished. Rescheduling in %"SCNu64"\n",
- min_rel_exp.rel_value_us);
- ns_it = NULL;
- //finished -> reschedule
- update_task = GNUNET_SCHEDULER_add_delayed (min_rel_exp,
- &update_identities,
- ego_head);
- min_rel_exp.rel_value_us = 0;
+ "Skipping ticket.\n");
+
+ rh->offset++;
+ GNUNET_SCHEDULER_add_now (&reissue_next, rh);
+
+
return;
}
- priv_key = GNUNET_IDENTITY_ego_get_private_key (next_ego->ego);
- if (GNUNET_YES == next_ego->attributes_dirty)
- {
- //Starting over. We must update the Attributes for they might have changed.
- ns_it = GNUNET_NAMESTORE_zone_iteration_start (ns_handle,
- priv_key,
- &attribute_collect_error_cb,
- next_ego,
- &attribute_collect,
- next_ego,
- &attribute_collect_finished_cb,
- next_ego);
+ //Create new ABE key for RP
+ attrs_len = 0;
+
+ /* If this is the RP we want to revoke attributes of, the do so */
+
+ for (le = attrs->list_head; NULL != le; le = le->next)
+ attrs_len++;
+ attr_arr = GNUNET_malloc ((attrs_len + 1)*sizeof (char*));
+ i = 0;
+ for (le = attrs->list_head; NULL != le; le = le->next) {
+ GNUNET_asprintf (&policy, "%s_%lu",
+ le->claim->name,
+ le->claim->version);
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Recreating key with %s\n", policy);
+ attr_arr[i] = policy;
+ i++;
+ }
+ attr_arr[i] = NULL;
+ rp_key = GNUNET_CRYPTO_cpabe_create_key (rh->abe_key,
+ attr_arr);
+
+ //TODO review this wireformat
+ code_record_len = serialize_abe_keyinfo2 (ticket,
+ attrs,
+ rp_key,
+ &ecdhe_privkey,
+ &code_record_data);
+ code_record[0].data = code_record_data;
+ code_record[0].data_size = code_record_len;
+ code_record[0].expiration_time = GNUNET_TIME_UNIT_DAYS.rel_value_us;
+ code_record[0].record_type = GNUNET_GNSRECORD_TYPE_ABE_KEY;
+ code_record[0].flags = GNUNET_GNSRECORD_RF_RELATIVE_EXPIRATION;
+
+ label = GNUNET_STRINGS_data_to_string_alloc (&ticket->rnd,
+ sizeof (uint64_t));
+ //Publish record
+ rh->ns_qe = GNUNET_NAMESTORE_records_store (ns_handle,
+ &rh->identity,
+ label,
+ 1,
+ code_record,
+ &reissue_ticket_cont,
+ rh);
+ //for (; i > 0; i--)
+ // GNUNET_free (attr_arr[i-1]);
+ GNUNET_free (ecdhe_privkey);
+ GNUNET_free (label);
+ GNUNET_free (attr_arr);
+ GNUNET_free (code_record_data);
+ GNUNET_CRYPTO_cpabe_delete_key (rp_key, GNUNET_YES);
+}
+
+
+/* Prototype for below function */
+static void
+attr_reenc_cont (void *cls,
+ int32_t success,
+ const char *emsg);
+
+static void
+revocation_reissue_tickets (struct TicketRevocationHandle *rh)
+{
+ int ret;
+ /* Done, issue new keys */
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Revocation Phase III: Reissuing Tickets\n");
+ if (GNUNET_SYSERR == (ret = TKT_database->iterate_tickets (TKT_database->cls,
+ &rh->ticket.identity,
+ GNUNET_NO,
+ rh->offset,
+ &ticket_reissue_proc,
+ rh)))
+ {
+ GNUNET_break (0);
}
- else
+ if (GNUNET_NO == ret)
{
- //Ego will be dirty next time
- next_ego->attributes_dirty = GNUNET_YES;
- ns_it = GNUNET_NAMESTORE_zone_iteration_start (ns_handle,
- priv_key,
- &token_collect_error_cb,
- next_ego,
- &token_collect,
- next_ego,
- &token_collect_finished_cb,
- next_ego);
+ send_revocation_finished (rh, GNUNET_OK);
+ cleanup_revoke_ticket_handle (rh);
+ return;
}
}
-
/**
- * Function called initially to start update task
+ * Revoke next attribte by reencryption with
+ * new ABE master
*/
static void
-init_cont ()
+reenc_next_attribute (struct TicketRevocationHandle *rh)
{
- GNUNET_log (GNUNET_ERROR_TYPE_INFO, ">>> Starting Service\n");
- //Initially iterate all itenties and refresh all tokens
- update_task = GNUNET_SCHEDULER_add_now (&update_identities,
- ego_head);
+ struct GNUNET_GNSRECORD_Data rd[1];
+ char* buf;
+ char* enc_buf;
+ size_t enc_size;
+ char* rd_buf;
+ size_t buf_size;
+ char* policy;
+ uint32_t attr_ver;
+
+ if (NULL == rh->attrs->list_head)
+ {
+ revocation_reissue_tickets (rh);
+ return;
+ }
+ buf_size = GNUNET_IDENTITY_ATTRIBUTE_serialize_get_size (rh->attrs->list_head->claim);
+ buf = GNUNET_malloc (buf_size);
+ GNUNET_IDENTITY_ATTRIBUTE_serialize (rh->attrs->list_head->claim,
+ buf);
+ rh->attrs->list_head->claim->version++;
+ GNUNET_asprintf (&policy, "%s_%lu",
+ rh->attrs->list_head->claim->name,
+ rh->attrs->list_head->claim->version);
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Encrypting with policy %s\n", policy);
+ /**
+ * Encrypt the attribute value and store in namestore
+ */
+ enc_size = GNUNET_CRYPTO_cpabe_encrypt (buf,
+ buf_size,
+ policy, //Policy
+ rh->abe_key,
+ (void**)&enc_buf);
+ GNUNET_free (buf);
+ GNUNET_free (policy);
+ rd[0].data_size = enc_size + sizeof (uint32_t);
+ rd_buf = GNUNET_malloc (rd[0].data_size);
+ attr_ver = htonl (rh->attrs->list_head->claim->version);
+ GNUNET_memcpy (rd_buf,
+ &attr_ver,
+ sizeof (uint32_t));
+ GNUNET_memcpy (rd_buf+sizeof (uint32_t),
+ enc_buf,
+ enc_size);
+ rd[0].data = rd_buf;
+ rd[0].record_type = GNUNET_GNSRECORD_TYPE_ID_ATTR;
+ rd[0].flags = GNUNET_GNSRECORD_RF_RELATIVE_EXPIRATION;
+ rd[0].expiration_time = GNUNET_TIME_UNIT_HOURS.rel_value_us; //TODO sane?
+ rh->ns_qe = GNUNET_NAMESTORE_records_store (ns_handle,
+ &rh->identity,
+ rh->attrs->list_head->claim->name,
+ 1,
+ rd,
+ &attr_reenc_cont,
+ rh);
+ GNUNET_free (enc_buf);
+ GNUNET_free (rd_buf);
}
-
/**
- * Initial ego collection function.
- *
- * @param cls NULL
- * @param ego ego
- * @param ctx context
- * @param identifier ego name
+ * Namestore callback after revoked attribute
+ * is stored
*/
static void
-list_ego (void *cls,
- struct GNUNET_IDENTITY_Ego *ego,
- void **ctx,
- const char *identifier)
+attr_reenc_cont (void *cls,
+ int32_t success,
+ const char *emsg)
{
- struct EgoEntry *new_entry;
- if ((NULL == ego) && (STATE_INIT == state))
+ struct TicketRevocationHandle *rh = cls;
+ struct GNUNET_IDENTITY_ATTRIBUTE_ClaimListEntry *le;
+
+ if (GNUNET_SYSERR == success)
{
- state = STATE_POST_INIT;
- init_cont ();
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Failed to reencrypt attribute %s\n",
+ emsg);
+ GNUNET_SCHEDULER_add_now (&do_shutdown, NULL);
return;
}
- if (STATE_INIT == state) {
- new_entry = GNUNET_malloc (sizeof (struct EgoEntry));
- new_entry->ego = ego;
- new_entry->attr_map = GNUNET_CONTAINER_multihashmap_create (5,
- GNUNET_NO);
- new_entry->attributes_dirty = GNUNET_YES;
- GNUNET_CONTAINER_DLL_insert_tail(ego_head, ego_tail, new_entry);
+ if (NULL == rh->attrs->list_head)
+ {
+ revocation_reissue_tickets (rh);
+ return;
}
+ le = rh->attrs->list_head;
+ GNUNET_CONTAINER_DLL_remove (rh->attrs->list_head,
+ rh->attrs->list_tail,
+ le);
+ GNUNET_assert (NULL != rh->rvk_attrs);
+ GNUNET_CONTAINER_DLL_insert (rh->rvk_attrs->list_head,
+ rh->rvk_attrs->list_tail,
+ le);
+
+
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Re-encrypting next attribute\n");
+ reenc_next_attribute (rh);
}
-/**
- * Cleanup task
- */
+
static void
-cleanup()
+process_attributes_to_update (void *cls,
+ const struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket,
+ const struct GNUNET_IDENTITY_ATTRIBUTE_ClaimList *attrs)
{
- struct EgoEntry *ego_entry;
- struct EgoEntry *ego_tmp;
+ struct TicketRevocationHandle *rh = cls;
+ rh->attrs = GNUNET_IDENTITY_ATTRIBUTE_list_dup (attrs);
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Cleaning up\n");
- if (NULL != stats)
+ "Revocation Phase I: Collecting attributes\n");
+ /* Reencrypt all attributes with new key */
+ if (NULL == rh->attrs->list_head)
{
- GNUNET_STATISTICS_destroy (stats, GNUNET_NO);
- stats = NULL;
+ /* No attributes to reencrypt */
+ send_revocation_finished (rh, GNUNET_OK);
+ cleanup_revoke_ticket_handle (rh);
+ return;
+ } else {
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Revocation Phase II: Re-encrypting attributes\n");
+ reenc_next_attribute (rh);
}
- if (NULL != timeout_task)
- GNUNET_SCHEDULER_cancel (timeout_task);
- if (NULL != update_task)
- GNUNET_SCHEDULER_cancel (update_task);
- if (NULL != identity_handle)
- GNUNET_IDENTITY_disconnect (identity_handle);
- if (NULL != gns_handle)
- GNUNET_GNS_disconnect (gns_handle);
- if (NULL != ns_it)
- GNUNET_NAMESTORE_zone_iteration_stop (ns_it);
- if (NULL != ns_qe)
- GNUNET_NAMESTORE_cancel (ns_qe);
- if (NULL != ns_handle)
- GNUNET_NAMESTORE_disconnect (ns_handle);
- if (NULL != token)
- GNUNET_free (token);
- if (NULL != label)
- GNUNET_free (label);
+}
- for (ego_entry = ego_head;
- NULL != ego_entry;)
- {
- ego_tmp = ego_entry;
- if (0 != GNUNET_CONTAINER_multihashmap_size (ego_tmp->attr_map))
- {
- GNUNET_CONTAINER_multihashmap_iterate (ego_tmp->attr_map,
- &clear_ego_attrs,
- ego_tmp);
- }
- GNUNET_CONTAINER_multihashmap_destroy (ego_tmp->attr_map);
- ego_entry = ego_entry->next;
- GNUNET_free (ego_tmp);
- }
+
+static void
+get_ticket_after_abe_bootstrap (void *cls,
+ struct GNUNET_CRYPTO_AbeMasterKey *abe_key)
+{
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Finished ABE bootstrap\n");
+ struct TicketRevocationHandle *rh = cls;
+ rh->abe_key = abe_key;
+ TKT_database->get_ticket_attributes (TKT_database->cls,
+ &rh->ticket,
+ &process_attributes_to_update,
+ rh);
}
/**
- * Shutdown task
+ * Checks a ticket revocation message
*
- * @param cls NULL
- * @param tc task context
+ * @param cls client sending the message
+ * @param im message of type `struct RevokeTicketMessage`
+ * @return #GNUNET_OK if @a im is well-formed
*/
-static void
-do_shutdown (void *cls)
+static int
+check_revoke_ticket_message(void *cls,
+ const struct RevokeTicketMessage *im)
{
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Shutting down...\n");
- cleanup();
-}
-
+ uint16_t size;
-static struct GNUNET_MQ_Envelope*
-create_exchange_result_message (const char* token,
- const char* label,
- uint64_t ticket_nonce,
- uint64_t id)
-{
- struct GNUNET_MQ_Envelope *env;
- struct ExchangeResultMessage *erm;
- uint16_t token_len = strlen (token) + 1;
-
- env = GNUNET_MQ_msg_extra (erm,
- token_len,
- GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_EXCHANGE_RESULT);
- erm->ticket_nonce = htonl (ticket_nonce);
- erm->id = id;
- GNUNET_memcpy (&erm[1], token, token_len);
- return env;
+ size = ntohs (im->header.size);
+ if (size <= sizeof (struct RevokeTicketMessage))
+ {
+ GNUNET_break (0);
+ return GNUNET_SYSERR;
+ }
+ return GNUNET_OK;
}
-
-
-static struct GNUNET_MQ_Envelope*
-create_issue_result_message (const char* label,
- const char* ticket,
- const char* token,
- uint64_t id)
+/**
+ *
+ * Handler for ticket revocation message
+ *
+ * @param cls unused
+ * @param client who sent the message
+ * @param message the message
+ */
+static void
+handle_revoke_ticket_message (void *cls,
+ const struct RevokeTicketMessage *rm)
{
- struct GNUNET_MQ_Envelope *env;
- struct IssueResultMessage *irm;
- char *tmp_str;
- size_t len;
+ struct TicketRevocationHandle *rh;
+ struct IdpClient *idp = cls;
+ struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket;
+
+ rh = GNUNET_new (struct TicketRevocationHandle);
+ ticket = (struct GNUNET_IDENTITY_PROVIDER_Ticket*)&rm[1];
+ rh->rvk_attrs = GNUNET_new (struct GNUNET_IDENTITY_ATTRIBUTE_ClaimList);
+ rh->ticket = *ticket;
+ rh->r_id = ntohl (rm->id);
+ rh->client = idp;
+ rh->identity = rm->identity;
+ GNUNET_CRYPTO_ecdsa_key_get_public (&rh->identity,
+ &rh->ticket.identity);
+ GNUNET_CONTAINER_DLL_insert (idp->revocation_list_head,
+ idp->revocation_list_tail,
+ rh);
+ bootstrap_abe (&rh->identity, &get_ticket_after_abe_bootstrap, rh, GNUNET_NO);
+ GNUNET_SERVICE_client_continue (idp->client);
- GNUNET_asprintf (&tmp_str, "%s,%s,%s", label, ticket, token);
- len = strlen (tmp_str) + 1;
- env = GNUNET_MQ_msg_extra (irm,
- len,
- GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_ISSUE_RESULT);
- irm->id = id;
- GNUNET_memcpy (&irm[1], tmp_str, strlen (tmp_str) + 1);
- GNUNET_free (tmp_str);
- return env;
}
-static void
-cleanup_issue_handle (struct IssueHandle *handle)
-{
- if (NULL != handle->attr_map)
- GNUNET_CONTAINER_multihashmap_destroy (handle->attr_map);
- if (NULL != handle->scopes)
- GNUNET_free (handle->scopes);
- if (NULL != handle->token)
- token_destroy (handle->token);
- if (NULL != handle->ticket)
- ticket_destroy (handle->ticket);
- if (NULL != handle->label)
- GNUNET_free (handle->label);
- GNUNET_free (handle);
-}
static void
-store_token_issue_cont (void *cls,
- int32_t success,
- const char *emsg)
+cleanup_consume_ticket_handle (struct ConsumeTicketHandle *handle)
{
- struct IssueHandle *handle = cls;
- struct GNUNET_MQ_Envelope *env;
- char *ticket_str;
- char *token_str;
-
- handle->ns_qe = NULL;
- if (GNUNET_SYSERR == success)
- {
- cleanup_issue_handle (handle);
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "%s\n",
- "Unknown Error\n");
- GNUNET_SCHEDULER_add_now (&do_shutdown, NULL);
- return;
- }
- if (GNUNET_OK != ticket_serialize (handle->ticket,
- &handle->iss_key,
- &ticket_str))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "%s\n",
- "Error serializing ticket\n");
- cleanup_issue_handle (handle);
- GNUNET_SCHEDULER_add_now (&do_shutdown, NULL);
- return;
- }
- if (GNUNET_OK != token_to_string (handle->token,
- &handle->iss_key,
- &token_str))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "%s\n",
- "Error serializing token\n");
- GNUNET_free (ticket_str);
- cleanup_issue_handle (handle);
- GNUNET_SCHEDULER_add_now (&do_shutdown, NULL);
- return;
- }
- env = create_issue_result_message (handle->label,
- ticket_str,
- token_str,
- handle->r_id);
- GNUNET_MQ_send (GNUNET_SERVICE_client_get_mq(handle->client),
- env);
- cleanup_issue_handle (handle);
- GNUNET_free (ticket_str);
- GNUNET_free (token_str);
+ if (NULL != handle->key)
+ GNUNET_CRYPTO_cpabe_delete_key (handle->key,
+ GNUNET_YES);
+ if (NULL != handle->attrs)
+ GNUNET_IDENTITY_ATTRIBUTE_list_destroy (handle->attrs);
+ GNUNET_free (handle);
}
+
/**
- * Build a token and store it
+ * Checks a ticket consume message
*
- * @param cls the IssueHandle
+ * @param cls client sending the message
+ * @param im message of type `struct ConsumeTicketMessage`
+ * @return #GNUNET_OK if @a im is well-formed
*/
-static void
-sign_and_return_token (void *cls)
+static int
+check_consume_ticket_message(void *cls,
+ const struct ConsumeTicketMessage *cm)
{
- struct GNUNET_CRYPTO_EcdsaPublicKey pub_key;
- struct GNUNET_CRYPTO_EcdhePrivateKey *ecdhe_privkey;
- struct IssueHandle *handle = cls;
- struct GNUNET_GNSRECORD_Data token_record[2];
- char *nonce_str;
- char *enc_token_str;
- char *token_metadata;
- char* write_ptr;
- uint64_t time;
- uint64_t exp_time;
- size_t token_metadata_len;
-
- //Remote nonce
- nonce_str = NULL;
- GNUNET_asprintf (&nonce_str, "%lu", handle->nonce);
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Request nonce: %s\n", nonce_str);
-
- GNUNET_CRYPTO_ecdsa_key_get_public (&handle->iss_key,
- &pub_key);
- handle->ticket = ticket_create (handle->nonce,
- &pub_key,
- handle->label,
- &handle->aud_key);
-
- time = GNUNET_TIME_absolute_get().abs_value_us;
- exp_time = time + token_expiration_interval.rel_value_us;
-
- token_add_attr_int (handle->token, "nbf", time);
- token_add_attr_int (handle->token, "iat", time);
- token_add_attr_int (handle->token, "exp", exp_time);
- token_add_attr (handle->token, "nonce", nonce_str);
-
- //Token in a serialized encrypted format
- GNUNET_assert (token_serialize (handle->token,
- &handle->iss_key,
- &ecdhe_privkey,
- &enc_token_str));
-
- //Token record E,E_K (Token)
- token_record[0].data = enc_token_str;
- token_record[0].data_size = strlen (enc_token_str) + 1;
- token_record[0].expiration_time = exp_time;
- token_record[0].record_type = GNUNET_GNSRECORD_TYPE_ID_TOKEN;
- token_record[0].flags = GNUNET_GNSRECORD_RF_NONE;
-
-
- token_metadata_len = sizeof (struct GNUNET_CRYPTO_EcdhePrivateKey)
- + sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey)
- + strlen (handle->scopes) + 1; //With 0-Terminator
- token_metadata = GNUNET_malloc (token_metadata_len);
- write_ptr = token_metadata;
- GNUNET_memcpy (token_metadata, ecdhe_privkey, sizeof (struct GNUNET_CRYPTO_EcdhePrivateKey));
- write_ptr += sizeof (struct GNUNET_CRYPTO_EcdhePrivateKey);
- GNUNET_memcpy (write_ptr, &handle->aud_key, sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey));
- write_ptr += sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey);
- GNUNET_memcpy (write_ptr, handle->scopes, strlen (handle->scopes) + 1); //with 0-Terminator;
-
- token_record[1].data = token_metadata;
- token_record[1].data_size = token_metadata_len;
- token_record[1].expiration_time = exp_time;
- token_record[1].record_type = GNUNET_GNSRECORD_TYPE_ID_TOKEN_METADATA;
- token_record[1].flags = GNUNET_GNSRECORD_RF_PRIVATE;
-
- //Persist token
- handle->ns_qe = GNUNET_NAMESTORE_records_store (ns_handle,
- &handle->iss_key,
- handle->label,
- 2,
- token_record,
- &store_token_issue_cont,
- handle);
- GNUNET_free (ecdhe_privkey);
- GNUNET_free (nonce_str);
- GNUNET_free (enc_token_str);
- GNUNET_free (token_metadata);
-}
+ uint16_t size;
+ size = ntohs (cm->header.size);
+ if (size <= sizeof (struct ConsumeTicketMessage))
+ {
+ GNUNET_break (0);
+ return GNUNET_SYSERR;
+ }
+ return GNUNET_OK;
+}
static void
-attr_collect_error (void *cls)
+process_parallel_lookup2 (void *cls, uint32_t rd_count,
+ const struct GNUNET_GNSRECORD_Data *rd)
{
- struct IssueHandle *handle = cls;
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Parallel lookup finished (count=%u)\n", rd_count);
+ struct ParallelLookup *parallel_lookup = cls;
+ struct ConsumeTicketHandle *handle = parallel_lookup->handle;
+ struct ConsumeTicketResultMessage *crm;
+ struct GNUNET_MQ_Envelope *env;
+ struct GNUNET_IDENTITY_ATTRIBUTE_ClaimListEntry *attr_le;
+ struct GNUNET_TIME_Absolute decrypt_duration;
+ char *data;
+ char *data_tmp;
+ ssize_t attr_len;
+ size_t attrs_len;
+
+ GNUNET_CONTAINER_DLL_remove (handle->parallel_lookups_head,
+ handle->parallel_lookups_tail,
+ parallel_lookup);
+ GNUNET_free (parallel_lookup->label);
+
+ GNUNET_STATISTICS_update (stats_handle,
+ "attribute_lookup_time_total",
+ GNUNET_TIME_absolute_get_duration (parallel_lookup->lookup_start_time).rel_value_us,
+ GNUNET_YES);
+ GNUNET_STATISTICS_update (stats_handle,
+ "attribute_lookups_count",
+ 1,
+ GNUNET_YES);
+
+
+ GNUNET_free (parallel_lookup);
+ if (1 != rd_count)
+ GNUNET_break(0);//TODO
+ if (rd->record_type == GNUNET_GNSRECORD_TYPE_ID_ATTR)
+ {
+ decrypt_duration = GNUNET_TIME_absolute_get ();
+ attr_len = GNUNET_CRYPTO_cpabe_decrypt (rd->data + sizeof (uint32_t),
+ rd->data_size - sizeof (uint32_t),
+ handle->key,
+ (void**)&data);
+ if (GNUNET_SYSERR != attr_len)
+ {
+ GNUNET_STATISTICS_update (stats_handle,
+ "abe_decrypt_time_total",
+ GNUNET_TIME_absolute_get_duration (decrypt_duration).rel_value_us,
+ GNUNET_YES);
+ GNUNET_STATISTICS_update (stats_handle,
+ "abe_decrypt_count",
+ 1,
+ GNUNET_YES);
+
+ attr_le = GNUNET_new (struct GNUNET_IDENTITY_ATTRIBUTE_ClaimListEntry);
+ attr_le->claim = GNUNET_IDENTITY_ATTRIBUTE_deserialize (data,
+ attr_len);
+ attr_le->claim->version = ntohl(*(uint32_t*)rd->data);
+ GNUNET_CONTAINER_DLL_insert (handle->attrs->list_head,
+ handle->attrs->list_tail,
+ attr_le);
+ GNUNET_free (data);
+ }
+ }
+ if (NULL != handle->parallel_lookups_head)
+ return; //Wait for more
+ /* Else we are done */
+
+ /* Store ticket in DB */
+ if (GNUNET_OK != TKT_database->store_ticket (TKT_database->cls,
+ &handle->ticket,
+ handle->attrs))
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Unable to store ticket after consume\n");
+ GNUNET_break (0);
+ }
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Adding attribute Error!\n");
- handle->ns_it = NULL;
- GNUNET_SCHEDULER_add_now (&sign_and_return_token, handle);
+ GNUNET_SCHEDULER_cancel (handle->kill_task);
+ attrs_len = GNUNET_IDENTITY_ATTRIBUTE_list_serialize_get_size (handle->attrs);
+ env = GNUNET_MQ_msg_extra (crm,
+ attrs_len,
+ GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_CONSUME_TICKET_RESULT);
+ crm->id = htonl (handle->r_id);
+ crm->attrs_len = htons (attrs_len);
+ crm->identity = handle->ticket.identity;
+ data_tmp = (char *) &crm[1];
+ GNUNET_IDENTITY_ATTRIBUTE_list_serialize (handle->attrs,
+ data_tmp);
+ GNUNET_MQ_send (handle->client->mq, env);
+ cleanup_consume_ticket_handle (handle);
}
-
-static void
-attr_collect_finished (void *cls)
+void
+abort_parallel_lookups2 (void *cls)
{
- struct IssueHandle *handle = cls;
+ struct ConsumeTicketHandle *handle = cls;
+ struct ParallelLookup *lu;
+ struct ParallelLookup *tmp;
+ struct AttributeResultMessage *arm;
+ struct GNUNET_MQ_Envelope *env;
+
+ for (lu = handle->parallel_lookups_head;
+ NULL != lu;) {
+ GNUNET_GNS_lookup_cancel (lu->lookup_request);
+ GNUNET_free (lu->label);
+ tmp = lu->next;
+ GNUNET_CONTAINER_DLL_remove (handle->parallel_lookups_head,
+ handle->parallel_lookups_tail,
+ lu);
+ GNUNET_free (lu);
+ lu = tmp;
+ }
+ env = GNUNET_MQ_msg (arm,
+ GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_ATTRIBUTE_RESULT);
+ arm->id = htonl (handle->r_id);
+ arm->attr_len = htons (0);
+ GNUNET_MQ_send (handle->client->mq, env);
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Adding attribute END: \n");
- handle->ns_it = NULL;
- GNUNET_SCHEDULER_add_now (&sign_and_return_token, handle);
}
-/**
- * Collect attributes for token
- */
static void
-attr_collect (void *cls,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone,
- const char *label,
- unsigned int rd_count,
- const struct GNUNET_GNSRECORD_Data *rd)
+process_consume_abe_key (void *cls, uint32_t rd_count,
+ const struct GNUNET_GNSRECORD_Data *rd)
{
- struct IssueHandle *handle = cls;
- int i;
- char* data;
- struct GNUNET_HashCode key;
-
- GNUNET_CRYPTO_hash (label,
- strlen (label),
- &key);
-
- if (0 == rd_count ||
- ( (NULL != handle->attr_map) &&
- (GNUNET_YES != GNUNET_CONTAINER_multihashmap_contains (handle->attr_map,
- &key))
- )
- )
+ struct ConsumeTicketHandle *handle = cls;
+ struct GNUNET_HashCode new_key_hash;
+ struct GNUNET_CRYPTO_SymmetricSessionKey enc_key;
+ struct GNUNET_CRYPTO_SymmetricInitializationVector enc_iv;
+ struct GNUNET_CRYPTO_EcdhePublicKey *ecdh_key;
+ struct ParallelLookup *parallel_lookup;
+ size_t size;
+ char *buf;
+ char *scope;
+ char *lookup_query;
+
+ handle->lookup_request = NULL;
+ if (1 != rd_count)
{
- GNUNET_NAMESTORE_zone_iterator_next (handle->ns_it);
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Number of keys %d != 1.",
+ rd_count);
+ cleanup_consume_ticket_handle (handle);
+ GNUNET_SCHEDULER_add_now (&do_shutdown, NULL);
return;
}
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Adding attribute: %s\n", label);
+ //Decrypt
+ ecdh_key = (struct GNUNET_CRYPTO_EcdhePublicKey *)rd->data;
+
+ buf = GNUNET_malloc (rd->data_size - sizeof (struct GNUNET_CRYPTO_EcdhePublicKey));
+
+ //Calculate symmetric key from ecdh parameters
+ GNUNET_assert (GNUNET_OK ==
+ GNUNET_CRYPTO_ecdsa_ecdh (&handle->identity,
+ ecdh_key,
+ &new_key_hash));
+ create_sym_key_from_ecdh (&new_key_hash,
+ &enc_key,
+ &enc_iv);
+ size = GNUNET_CRYPTO_symmetric_decrypt (rd->data + sizeof (struct GNUNET_CRYPTO_EcdhePublicKey),
+ rd->data_size - sizeof (struct GNUNET_CRYPTO_EcdhePublicKey),
+ &enc_key,
+ &enc_iv,
+ buf);
- if (1 == rd_count)
- {
- if (rd->record_type == GNUNET_GNSRECORD_TYPE_ID_ATTR)
- {
- data = GNUNET_GNSRECORD_value_to_string (rd->record_type,
- rd->data,
- rd->data_size);
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Adding value: %s\n", data);
- token_add_attr (handle->token,
- label,
- data);
- GNUNET_free (data);
- }
- GNUNET_NAMESTORE_zone_iterator_next (handle->ns_it);
- return;
- }
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Decrypted bytes: %zd Expected bytes: %zd\n",
+ size, rd->data_size - sizeof (struct GNUNET_CRYPTO_EcdhePublicKey));
+ GNUNET_STATISTICS_update (stats_handle,
+ "abe_key_lookup_time_total",
+ GNUNET_TIME_absolute_get_duration (handle->lookup_start_time).rel_value_us,
+ GNUNET_YES);
+ GNUNET_STATISTICS_update (stats_handle,
+ "abe_key_lookups_count",
+ 1,
+ GNUNET_YES);
+ scopes = GNUNET_strdup (buf);
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Scopes %s\n", scopes);
+ handle->key = GNUNET_CRYPTO_cpabe_deserialize_key ((void*)(buf + strlen (scopes) + 1),
+ rd->data_size - sizeof (struct GNUNET_CRYPTO_EcdhePublicKey)
+ - strlen (scopes) - 1);
- i = 0;
- for (; i < rd_count; i++)
+ for (scope = strtok (scopes, ","); NULL != scope; scope = strtok (NULL, ","))
{
- if (rd->record_type == GNUNET_GNSRECORD_TYPE_ID_ATTR)
- {
- data = GNUNET_GNSRECORD_value_to_string (rd[i].record_type,
- rd[i].data,
- rd[i].data_size);
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Adding value: %s\n", data);
- token_add_attr (handle->token, label, data);
- GNUNET_free (data);
- }
+ GNUNET_asprintf (&lookup_query,
+ "%s.gnu",
+ scope);
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Looking up %s\n", lookup_query);
+ parallel_lookup = GNUNET_new (struct ParallelLookup);
+ parallel_lookup->handle = handle;
+ parallel_lookup->label = GNUNET_strdup (scope);
+ parallel_lookup->lookup_start_time = GNUNET_TIME_absolute_get();
+ parallel_lookup->lookup_request
+ = GNUNET_GNS_lookup (gns_handle,
+ lookup_query,
+ &handle->ticket.identity,
+ GNUNET_GNSRECORD_TYPE_ID_ATTR,
+ GNUNET_GNS_LO_DEFAULT,
+ &process_parallel_lookup2,
+ parallel_lookup);
+ GNUNET_CONTAINER_DLL_insert (handle->parallel_lookups_head,
+ handle->parallel_lookups_tail,
+ parallel_lookup);
+ GNUNET_free (lookup_query);
}
+ GNUNET_free (scopes);
+ GNUNET_free (buf);
+ handle->kill_task = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_MINUTES,3),
+ &abort_parallel_lookups2,
+ handle);
+}
- GNUNET_NAMESTORE_zone_iterator_next (handle->ns_it);
+
+/**
+ *
+ * Handler for ticket issue message
+ *
+ * @param cls unused
+ * @param client who sent the message
+ * @param message the message
+ */
+static void
+handle_consume_ticket_message (void *cls,
+ const struct ConsumeTicketMessage *cm)
+{
+ struct ConsumeTicketHandle *ch;
+ struct IdpClient *idp = cls;
+ char* lookup_query;
+ char* rnd_label;
+
+ ch = GNUNET_new (struct ConsumeTicketHandle);
+ ch->r_id = ntohl (cm->id);
+ ch->client = idp;
+ ch->identity = cm->identity;
+ ch->attrs = GNUNET_new (struct GNUNET_IDENTITY_ATTRIBUTE_ClaimList);
+ GNUNET_CRYPTO_ecdsa_key_get_public (&ch->identity,
+ &ch->identity_pub);
+ ch->ticket = *((struct GNUNET_IDENTITY_PROVIDER_Ticket*)&cm[1]);
+ rnd_label = GNUNET_STRINGS_data_to_string_alloc (&ch->ticket.rnd,
+ sizeof (uint64_t));
+ GNUNET_asprintf (&lookup_query,
+ "%s.gnu",
+ rnd_label);
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Looking for ABE key under %s\n", lookup_query);
+ ch->lookup_start_time = GNUNET_TIME_absolute_get ();
+ ch->lookup_request
+ = GNUNET_GNS_lookup (gns_handle,
+ lookup_query,
+ &ch->ticket.identity,
+ GNUNET_GNSRECORD_TYPE_ABE_KEY,
+ GNUNET_GNS_LO_DEFAULT,
+ &process_consume_abe_key,
+ ch);
+ GNUNET_free (rnd_label);
+ GNUNET_free (lookup_query);
+ GNUNET_SERVICE_client_continue (idp->client);
}
static void
-cleanup_exchange_handle (struct ExchangeHandle *handle)
+cleanup_as_handle (struct AttributeStoreHandle *handle)
{
- if (NULL != handle->ticket)
- ticket_destroy (handle->ticket);
- if (NULL != handle->token)
- token_destroy (handle->token);
+ if (NULL != handle->claim)
+ GNUNET_free (handle->claim);
+ if (NULL != handle->abe_key)
+ GNUNET_CRYPTO_cpabe_delete_master_key (handle->abe_key);
GNUNET_free (handle);
}
static void
-process_lookup_result (void *cls, uint32_t rd_count,
- const struct GNUNET_GNSRECORD_Data *rd)
+attr_store_cont (void *cls,
+ int32_t success,
+ const char *emsg)
{
- struct ExchangeHandle *handle = cls;
+ struct AttributeStoreHandle *as_handle = cls;
struct GNUNET_MQ_Envelope *env;
- char* token_str;
- char* record_str;
+ struct AttributeStoreResultMessage *acr_msg;
- handle->lookup_request = NULL;
- if (2 != rd_count)
+ if (GNUNET_SYSERR == success)
{
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Number of tokens %d != 2.",
- rd_count);
- cleanup_exchange_handle (handle);
+ "Failed to store attribute %s\n",
+ emsg);
+ cleanup_as_handle (as_handle);
GNUNET_SCHEDULER_add_now (&do_shutdown, NULL);
return;
}
- record_str =
- GNUNET_GNSRECORD_value_to_string (GNUNET_GNSRECORD_TYPE_ID_TOKEN,
- rd->data,
- rd->data_size);
-
- //Decrypt and parse
- GNUNET_assert (GNUNET_OK == token_parse (record_str,
- &handle->aud_privkey,
- &handle->token));
-
- //Readable
- GNUNET_assert (GNUNET_OK == token_to_string (handle->token,
- &handle->aud_privkey,
- &token_str));
-
- env = create_exchange_result_message (token_str,
- handle->label,
- handle->ticket->payload->nonce,
- handle->r_id);
- GNUNET_MQ_send (GNUNET_SERVICE_client_get_mq(handle->client),
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Sending ATTRIBUTE_STORE_RESPONSE message\n");
+ env = GNUNET_MQ_msg (acr_msg,
+ GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_ATTRIBUTE_STORE_RESPONSE);
+ acr_msg->id = htonl (as_handle->r_id);
+ acr_msg->op_result = htonl (GNUNET_OK);
+ GNUNET_MQ_send (as_handle->client->mq,
env);
- cleanup_exchange_handle (handle);
- GNUNET_free (record_str);
- GNUNET_free (token_str);
+ cleanup_as_handle (as_handle);
+}
+
+static void
+attr_store_task (void *cls)
+{
+ struct AttributeStoreHandle *as_handle = cls;
+ struct GNUNET_GNSRECORD_Data rd[1];
+ char* buf;
+ char* policy;
+ char* enc_buf;
+ char* rd_buf;
+ size_t enc_size;
+ size_t buf_size;
+ uint32_t attr_ver;
+
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Storing attribute\n");
+ buf_size = GNUNET_IDENTITY_ATTRIBUTE_serialize_get_size (as_handle->claim);
+ buf = GNUNET_malloc (buf_size);
+
+ GNUNET_IDENTITY_ATTRIBUTE_serialize (as_handle->claim,
+ buf);
+
+ GNUNET_asprintf (&policy,
+ "%s_%lu",
+ as_handle->claim->name,
+ as_handle->claim->version);
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Encrypting with policy %s\n", policy);
+ /**
+ * Encrypt the attribute value and store in namestore
+ */
+ enc_size = GNUNET_CRYPTO_cpabe_encrypt (buf,
+ buf_size,
+ policy, //Policy
+ as_handle->abe_key,
+ (void**)&enc_buf);
+ GNUNET_free (buf);
+ GNUNET_free (policy);
+ rd[0].data_size = enc_size + sizeof (uint32_t);
+ rd_buf = GNUNET_malloc (rd[0].data_size);
+ attr_ver = htonl (as_handle->claim->version);
+ GNUNET_memcpy (rd_buf,
+ &attr_ver,
+ sizeof (uint32_t));
+ GNUNET_memcpy (rd_buf+sizeof (uint32_t),
+ enc_buf,
+ enc_size);
+ rd[0].data = rd_buf;
+ rd[0].record_type = GNUNET_GNSRECORD_TYPE_ID_ATTR;
+ rd[0].flags = GNUNET_GNSRECORD_RF_RELATIVE_EXPIRATION;
+ rd[0].expiration_time = GNUNET_TIME_UNIT_HOURS.rel_value_us; //TODO sane?
+ as_handle->ns_qe = GNUNET_NAMESTORE_records_store (ns_handle,
+ &as_handle->identity,
+ as_handle->claim->name,
+ 1,
+ rd,
+ &attr_store_cont,
+ as_handle);
+ GNUNET_free (enc_buf);
+ GNUNET_free (rd_buf);
+}
+
+
+static void
+store_after_abe_bootstrap (void *cls,
+ struct GNUNET_CRYPTO_AbeMasterKey *abe_key)
+{
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Finished ABE bootstrap\n");
+ struct AttributeStoreHandle *ash = cls;
+ ash->abe_key = abe_key;
+ GNUNET_SCHEDULER_add_now (&attr_store_task, ash);
}
/**
- * Checks a exchange message
+ * Checks a store message
*
* @param cls client sending the message
- * @param xm message of type `struct ExchangeMessage`
- * @return #GNUNET_OK if @a xm is well-formed
+ * @param sam message of type `struct AttributeStoreMessage`
+ * @return #GNUNET_OK if @a im is well-formed
*/
static int
-check_exchange_message (void *cls,
- const struct ExchangeMessage *xm)
+check_attribute_store_message(void *cls,
+ const struct AttributeStoreMessage *sam)
{
uint16_t size;
- size = ntohs (xm->header.size);
- if (size <= sizeof (struct ExchangeMessage))
+ size = ntohs (sam->header.size);
+ if (size <= sizeof (struct AttributeStoreMessage))
{
GNUNET_break (0);
return GNUNET_SYSERR;
@@ -1282,301 +1962,492 @@ check_exchange_message (void *cls,
return GNUNET_OK;
}
+
/**
*
- * Handler for exchange message
+ * Handler for store message
*
* @param cls unused
* @param client who sent the message
* @param message the message
*/
static void
-handle_exchange_message (void *cls,
- const struct ExchangeMessage *xm)
+handle_attribute_store_message (void *cls,
+ const struct AttributeStoreMessage *sam)
{
- struct ExchangeHandle *xchange_handle;
- struct GNUNET_SERVICE_Client *client = cls;
- const char *ticket;
- char *lookup_query;
-
- ticket = (const char *) &xm[1];
+ struct AttributeStoreHandle *as_handle;
+ struct IdpClient *idp = cls;
+ size_t data_len;
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Received EXCHANGE of `%s' from client\n",
- ticket);
- xchange_handle = GNUNET_malloc (sizeof (struct ExchangeHandle));
- xchange_handle->aud_privkey = xm->aud_privkey;
- xchange_handle->r_id = xm->id;
- if (GNUNET_SYSERR == ticket_parse (ticket,
- &xchange_handle->aud_privkey,
- &xchange_handle->ticket))
- {
- GNUNET_free (xchange_handle);
- GNUNET_SERVICE_client_drop (client);
- return;
- }
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Looking for token under %s\n",
- xchange_handle->ticket->payload->label);
- GNUNET_asprintf (&lookup_query,
- "%s.gnu",
- xchange_handle->ticket->payload->label);
- GNUNET_SERVICE_client_continue (client);
- xchange_handle->client = client;
- xchange_handle->lookup_request
- = GNUNET_GNS_lookup (gns_handle,
- lookup_query,
- &xchange_handle->ticket->payload->identity_key,
- GNUNET_GNSRECORD_TYPE_ID_TOKEN,
- GNUNET_GNS_LO_LOCAL_MASTER,
- &process_lookup_result,
- xchange_handle);
- GNUNET_free (lookup_query);
+ "Received ATTRIBUTE_STORE message\n");
+
+ data_len = ntohs (sam->attr_len);
+
+ as_handle = GNUNET_new (struct AttributeStoreHandle);
+ as_handle->claim = GNUNET_IDENTITY_ATTRIBUTE_deserialize ((char*)&sam[1],
+ data_len);
+
+ as_handle->r_id = ntohl (sam->id);
+ as_handle->identity = sam->identity;
+ GNUNET_CRYPTO_ecdsa_key_get_public (&sam->identity,
+ &as_handle->identity_pkey);
+ GNUNET_SERVICE_client_continue (idp->client);
+ as_handle->client = idp;
+ bootstrap_abe (&as_handle->identity, &store_after_abe_bootstrap, as_handle, GNUNET_NO);
}
+static void
+cleanup_iter_handle (struct AttributeIterator *ai)
+{
+ if (NULL != ai->abe_key)
+ GNUNET_CRYPTO_cpabe_delete_master_key (ai->abe_key);
+ GNUNET_CONTAINER_DLL_remove (ai->client->op_head,
+ ai->client->op_tail,
+ ai);
+ GNUNET_free (ai);
+}
static void
-find_existing_token_error (void *cls)
+attr_iter_error (void *cls)
{
- struct IssueHandle *handle = cls;
- cleanup_issue_handle (handle);
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Error looking for existing token\n");
+ struct AttributeIterator *ai = cls;
+ //TODO
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Failed to iterate over attributes\n");
+ cleanup_iter_handle (ai);
GNUNET_SCHEDULER_add_now (&do_shutdown, NULL);
}
+static void
+attr_iter_finished (void *cls)
+{
+ struct AttributeIterator *ai = cls;
+ struct GNUNET_MQ_Envelope *env;
+ struct AttributeResultMessage *arm;
+
+ env = GNUNET_MQ_msg (arm,
+ GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_ATTRIBUTE_RESULT);
+ arm->id = htonl (ai->request_id);
+ arm->attr_len = htons (0);
+ GNUNET_MQ_send (ai->client->mq, env);
+ cleanup_iter_handle (ai);
+}
static void
-find_existing_token_finished (void *cls)
+attr_iter_cb (void *cls,
+ const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone,
+ const char *label,
+ unsigned int rd_count,
+ const struct GNUNET_GNSRECORD_Data *rd)
{
- struct IssueHandle *handle = cls;
- uint64_t rnd_key;
+ struct AttributeIterator *ai = cls;
+ struct AttributeResultMessage *arm;
+ struct GNUNET_CRYPTO_AbeKey *key;
+ struct GNUNET_MQ_Envelope *env;
+ ssize_t msg_extra_len;
+ char* attr_ser;
+ char* attrs[2];
+ char* data_tmp;
+ char* policy;
+ uint32_t attr_ver;
+
+ if (rd_count != 1)
+ {
+ GNUNET_NAMESTORE_zone_iterator_next (ai->ns_it);
+ return;
+ }
+ if (GNUNET_GNSRECORD_TYPE_ID_ATTR != rd->record_type) {
+ GNUNET_NAMESTORE_zone_iterator_next (ai->ns_it);
+ return;
+ }
+ attr_ver = ntohl(*((uint32_t*)rd->data));
+ GNUNET_asprintf (&policy, "%s_%lu",
+ label, attr_ver);
+ attrs[0] = policy;
+ attrs[1] = 0;
+ key = GNUNET_CRYPTO_cpabe_create_key (ai->abe_key,
+ attrs);
+ msg_extra_len = GNUNET_CRYPTO_cpabe_decrypt (rd->data+sizeof (uint32_t),
+ rd->data_size-sizeof (uint32_t),
+ key,
+ (void**)&attr_ser);
+
+ GNUNET_CRYPTO_cpabe_delete_key (key,
+ GNUNET_YES);
+ //GNUNET_free (policy);
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- ">>> No existing token found\n");
- rnd_key =
- GNUNET_CRYPTO_random_u64 (GNUNET_CRYPTO_QUALITY_STRONG,
- UINT64_MAX);
- GNUNET_STRINGS_base64_encode ((char*)&rnd_key,
- sizeof (uint64_t),
- &handle->label);
- handle->ns_it = NULL;
- handle->ns_it = GNUNET_NAMESTORE_zone_iteration_start (ns_handle,
- &handle->iss_key,
- &attr_collect_error,
- handle,
- &attr_collect,
- handle,
- &attr_collect_finished,
- handle);
+ "Found attribute: %s\n", label);
+ env = GNUNET_MQ_msg_extra (arm,
+ msg_extra_len,
+ GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_ATTRIBUTE_RESULT);
+ arm->id = htonl (ai->request_id);
+ arm->attr_len = htons (msg_extra_len);
+ GNUNET_CRYPTO_ecdsa_key_get_public (zone,
+ &arm->identity);
+ data_tmp = (char *) &arm[1];
+ GNUNET_memcpy (data_tmp,
+ attr_ser,
+ msg_extra_len);
+ GNUNET_MQ_send (ai->client->mq, env);
+ GNUNET_free (attr_ser);
+ GNUNET_CRYPTO_cpabe_delete_master_key (ai->abe_key);
+ ai->abe_key = NULL;
+}
+
+
+void
+iterate_after_abe_bootstrap (void *cls,
+ struct GNUNET_CRYPTO_AbeMasterKey *abe_key)
+{
+ struct AttributeIterator *ai = cls;
+ ai->abe_key = abe_key;
+ ai->ns_it = GNUNET_NAMESTORE_zone_iteration_start (ns_handle,
+ &ai->identity,
+ &attr_iter_error,
+ ai,
+ &attr_iter_cb,
+ ai,
+ &attr_iter_finished,
+ ai);
}
+void
+iterate_next_after_abe_bootstrap (void *cls,
+ struct GNUNET_CRYPTO_AbeMasterKey *abe_key)
+{
+ struct AttributeIterator *ai = cls;
+ ai->abe_key = abe_key;
+ GNUNET_NAMESTORE_zone_iterator_next (ai->ns_it);
+}
+
+
/**
+ * Handles a #GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_ITERATION_START message
*
- * Look for existing token
- *
- * @param cls the identity entry
- * @param zone the identity
- * @param lbl the name of the record
- * @param rd_count number of records
- * @param rd record data
+ * @param cls the client sending the message
+ * @param zis_msg message from the client
+ */
+static void
+handle_iteration_start (void *cls,
+ const struct AttributeIterationStartMessage *ais_msg)
+{
+ struct IdpClient *idp = cls;
+ struct AttributeIterator *ai;
+
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Received ATTRIBUTE_ITERATION_START message\n");
+ ai = GNUNET_new (struct AttributeIterator);
+ ai->request_id = ntohl (ais_msg->id);
+ ai->client = idp;
+ ai->identity = ais_msg->identity;
+
+ GNUNET_CONTAINER_DLL_insert (idp->op_head,
+ idp->op_tail,
+ ai);
+ bootstrap_abe (&ai->identity, &iterate_after_abe_bootstrap, ai, GNUNET_NO);
+ GNUNET_SERVICE_client_continue (idp->client);
+}
+
+
+/**
+ * Handles a #GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_ITERATION_STOP message
*
+ * @param cls the client sending the message
+ * @param ais_msg message from the client
*/
static void
-find_existing_token (void *cls,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone,
- const char *lbl,
- unsigned int rd_count,
- const struct GNUNET_GNSRECORD_Data *rd)
-{
- struct IssueHandle *handle = cls;
- const struct GNUNET_GNSRECORD_Data *token_metadata_record;
- struct GNUNET_CRYPTO_EcdsaPublicKey *aud_key;
- struct GNUNET_HashCode key;
- int scope_count_token;
- char *scope;
- char *tmp_scopes;
+handle_iteration_stop (void *cls,
+ const struct AttributeIterationStopMessage *ais_msg)
+{
+ struct IdpClient *idp = cls;
+ struct AttributeIterator *ai;
+ uint32_t rid;
- //There should be only a single record for a token under a label
- if (2 != rd_count)
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Received `%s' message\n",
+ "ATTRIBUTE_ITERATION_STOP");
+ rid = ntohl (ais_msg->id);
+ for (ai = idp->op_head; NULL != ai; ai = ai->next)
+ if (ai->request_id == rid)
+ break;
+ if (NULL == ai)
{
- GNUNET_NAMESTORE_zone_iterator_next (handle->ns_it);
+ GNUNET_break (0);
+ GNUNET_SERVICE_client_drop (idp->client);
return;
}
+ GNUNET_CONTAINER_DLL_remove (idp->op_head,
+ idp->op_tail,
+ ai);
+ GNUNET_free (ai);
+ GNUNET_SERVICE_client_continue (idp->client);
+}
- if (rd[0].record_type == GNUNET_GNSRECORD_TYPE_ID_TOKEN_METADATA)
- {
- token_metadata_record = &rd[0];
- }
- else
- {
- token_metadata_record = &rd[1];
- }
- if (token_metadata_record->record_type != GNUNET_GNSRECORD_TYPE_ID_TOKEN_METADATA)
+
+/**
+ * Handles a #GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_ATTRIBUTE_ITERATION_NEXT message
+ *
+ * @param cls the client sending the message
+ * @param message message from the client
+ */
+static void
+handle_iteration_next (void *cls,
+ const struct AttributeIterationNextMessage *ais_msg)
+{
+ struct IdpClient *idp = cls;
+ struct AttributeIterator *ai;
+ uint32_t rid;
+
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Received ATTRIBUTE_ITERATION_NEXT message\n");
+ rid = ntohl (ais_msg->id);
+ for (ai = idp->op_head; NULL != ai; ai = ai->next)
+ if (ai->request_id == rid)
+ break;
+ if (NULL == ai)
{
- GNUNET_NAMESTORE_zone_iterator_next (handle->ns_it);
+ GNUNET_break (0);
+ GNUNET_SERVICE_client_drop (idp->client);
return;
}
- ecdhe_privkey = *((struct GNUNET_CRYPTO_EcdhePrivateKey *)token_metadata_record->data);
- aud_key =
- (struct GNUNET_CRYPTO_EcdsaPublicKey *)(token_metadata_record->data+sizeof(struct GNUNET_CRYPTO_EcdhePrivateKey));
- tmp_scopes = GNUNET_strdup ((char*) aud_key+sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey));
+ bootstrap_abe (&ai->identity,
+ &iterate_next_after_abe_bootstrap,
+ ai,
+ GNUNET_NO);
+ GNUNET_SERVICE_client_continue (idp->client);
+}
- if (0 != memcmp (aud_key, &handle->aud_key,
- sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey)))
+/**
+ * Ticket iteration processor result
+ */
+enum ZoneIterationResult
+{
+ /**
+ * Iteration start.
+ */
+ IT_START = 0,
+
+ /**
+ * Found tickets,
+ * Continue to iterate with next iteration_next call
+ */
+ IT_SUCCESS_MORE_AVAILABLE = 1,
+
+ /**
+ * Iteration complete
+ */
+ IT_SUCCESS_NOT_MORE_RESULTS_AVAILABLE = 2
+};
+
+
+/**
+ * Context for ticket iteration
+ */
+struct TicketIterationProcResult
+{
+ /**
+ * The ticket iteration handle
+ */
+ struct TicketIteration *ti;
+
+ /**
+ * Iteration result: iteration done?
+ * #IT_SUCCESS_MORE_AVAILABLE: if there may be more results overall but
+ * we got one for now and have sent it to the client
+ * #IT_SUCCESS_NOT_MORE_RESULTS_AVAILABLE: if there are no further results,
+ * #IT_START: if we are still trying to find a result.
+ */
+ int res_iteration_finished;
+
+};
+
+static void
+cleanup_ticket_iter_handle (struct TicketIteration *ti)
+{
+ GNUNET_free (ti);
+}
+
+/**
+ * Process ticket from database
+ *
+ * @param cls struct TicketIterationProcResult
+ * @param ticket the ticket
+ * @param attrs the attributes
+ */
+static void
+ticket_iterate_proc (void *cls,
+ const struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket,
+ const struct GNUNET_IDENTITY_ATTRIBUTE_ClaimList *attrs)
+{
+ struct TicketIterationProcResult *proc = cls;
+
+ if (NULL == ticket)
{
- char *tmp2 = GNUNET_STRINGS_data_to_string_alloc (aud_key,
- sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey));
- //Audience does not match!
- char *tmp = GNUNET_GNSRECORD_value_to_string (GNUNET_GNSRECORD_TYPE_ID_TOKEN_METADATA,
- token_metadata_record->data,
- token_metadata_record->data_size);
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Token does not match audience %s vs %s. Moving on\n",
- tmp2,
- tmp);
- GNUNET_free (tmp_scopes);
- GNUNET_free (tmp2);
- GNUNET_free (tmp);
- GNUNET_NAMESTORE_zone_iterator_next (handle->ns_it);
+ "Iteration done\n");
+ proc->res_iteration_finished = IT_SUCCESS_NOT_MORE_RESULTS_AVAILABLE;
return;
}
+ proc->res_iteration_finished = IT_SUCCESS_MORE_AVAILABLE;
+ send_ticket_result (proc->ti->client,
+ proc->ti->r_id,
+ ticket,
+ attrs);
- scope = strtok (tmp_scopes, ",");
- scope_count_token = 0;
- while (NULL != scope)
- {
- GNUNET_CRYPTO_hash (scope,
- strlen (scope),
- &key);
+}
+
+/**
+ * Perform ticket iteration step
+ *
+ * @param ti ticket iterator to process
+ */
+static void
+run_ticket_iteration_round (struct TicketIteration *ti)
+{
+ struct TicketIterationProcResult proc;
+ struct GNUNET_MQ_Envelope *env;
+ struct TicketResultMessage *trm;
+ int ret;
- if ((NULL != handle->attr_map) &&
- (GNUNET_YES != GNUNET_CONTAINER_multihashmap_contains (handle->attr_map, &key)))
+ memset (&proc, 0, sizeof (proc));
+ proc.ti = ti;
+ proc.res_iteration_finished = IT_START;
+ while (IT_START == proc.res_iteration_finished)
+ {
+ if (GNUNET_SYSERR ==
+ (ret = TKT_database->iterate_tickets (TKT_database->cls,
+ &ti->identity,
+ ti->is_audience,
+ ti->offset,
+ &ticket_iterate_proc,
+ &proc)))
{
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Issued token does not include `%s'. Moving on\n", scope);
- GNUNET_free (tmp_scopes);
- GNUNET_NAMESTORE_zone_iterator_next (handle->ns_it);
- return;
+ GNUNET_break (0);
+ break;
}
- scope_count_token++;
- scope = strtok (NULL, ",");
+ if (GNUNET_NO == ret)
+ proc.res_iteration_finished = IT_SUCCESS_NOT_MORE_RESULTS_AVAILABLE;
+ ti->offset++;
}
- GNUNET_free (tmp_scopes);
- //All scopes in token are also in request. Now
- //Check length
- if ((NULL != handle->attr_map) &&
- (GNUNET_CONTAINER_multihashmap_size (handle->attr_map) == scope_count_token))
+ if (IT_SUCCESS_MORE_AVAILABLE == proc.res_iteration_finished)
{
- //We have an existing token
- handle->label = GNUNET_strdup (lbl);
- handle->ns_it = NULL;
- handle->ns_it = GNUNET_NAMESTORE_zone_iteration_start (ns_handle,
- &handle->iss_key,
- &attr_collect_error,
- handle,
- &attr_collect,
- handle,
- &attr_collect_finished,
- handle);
-
- return;
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "More results available\n");
+ return; /* more later */
}
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Nuber of attributes in token do not match request\n");
- //No luck
- GNUNET_NAMESTORE_zone_iterator_next (handle->ns_it);
+ /* send empty response to indicate end of list */
+ env = GNUNET_MQ_msg (trm,
+ GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_TICKET_RESULT);
+ trm->id = htonl (ti->r_id);
+ GNUNET_MQ_send (ti->client->mq,
+ env);
+ GNUNET_CONTAINER_DLL_remove (ti->client->ticket_iter_head,
+ ti->client->ticket_iter_tail,
+ ti);
+ cleanup_ticket_iter_handle (ti);
}
/**
- * Checks an issue message
+ * Handles a #GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_TICKET_ITERATION_START message
*
- * @param cls client sending the message
- * @param im message of type `struct IssueMessage`
- * @return #GNUNET_OK if @a im is well-formed
+ * @param cls the client sending the message
+ * @param tis_msg message from the client
*/
-static int
-check_issue_message(void *cls,
- const struct IssueMessage *im)
+static void
+handle_ticket_iteration_start (void *cls,
+ const struct TicketIterationStartMessage *tis_msg)
{
- uint16_t size;
+ struct IdpClient *client = cls;
+ struct TicketIteration *ti;
- size = ntohs (im->header.size);
- if (size <= sizeof (struct IssueMessage))
- {
- GNUNET_break (0);
- return GNUNET_SYSERR;
- }
- scopes = (char *) &im[1];
- if ('\0' != scopes[size - sizeof (struct IssueMessage) - 1])
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Received TICKET_ITERATION_START message\n");
+ ti = GNUNET_new (struct TicketIteration);
+ ti->r_id = ntohl (tis_msg->id);
+ ti->offset = 0;
+ ti->client = client;
+ ti->identity = tis_msg->identity;
+ ti->is_audience = ntohl (tis_msg->is_audience);
+
+ GNUNET_CONTAINER_DLL_insert (client->ticket_iter_head,
+ client->ticket_iter_tail,
+ ti);
+ run_ticket_iteration_round (ti);
+ GNUNET_SERVICE_client_continue (client->client);
+}
+
+
+/**
+ * Handles a #GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_TICKET_ITERATION_STOP message
+ *
+ * @param cls the client sending the message
+ * @param tis_msg message from the client
+ */
+static void
+handle_ticket_iteration_stop (void *cls,
+ const struct TicketIterationStopMessage *tis_msg)
+{
+ struct IdpClient *client = cls;
+ struct TicketIteration *ti;
+ uint32_t rid;
+
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Received `%s' message\n",
+ "TICKET_ITERATION_STOP");
+ rid = ntohl (tis_msg->id);
+ for (ti = client->ticket_iter_head; NULL != ti; ti = ti->next)
+ if (ti->r_id == rid)
+ break;
+ if (NULL == ti)
{
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Malformed scopes received!\n");
GNUNET_break (0);
- return GNUNET_SYSERR;
+ GNUNET_SERVICE_client_drop (client->client);
+ return;
}
- return GNUNET_OK;
+ GNUNET_CONTAINER_DLL_remove (client->ticket_iter_head,
+ client->ticket_iter_tail,
+ ti);
+ cleanup_ticket_iter_handle (ti);
+ GNUNET_SERVICE_client_continue (client->client);
}
+
/**
+ * Handles a #GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_TICKET_ITERATION_NEXT message
*
- * Handler for issue message
- *
- * @param cls unused
- * @param client who sent the message
- * @param message the message
+ * @param cls the client sending the message
+ * @param message message from the client
*/
static void
-handle_issue_message (void *cls,
- const struct IssueMessage *im)
+handle_ticket_iteration_next (void *cls,
+ const struct TicketIterationNextMessage *tis_msg)
{
- const char *scopes;
- char *scopes_tmp;
- char *scope;
- struct GNUNET_HashCode key;
- struct IssueHandle *issue_handle;
- struct GNUNET_SERVICE_Client *client = cls;
-
- scopes = (const char *) &im[1];
- issue_handle = GNUNET_malloc (sizeof (struct IssueHandle));
- issue_handle->attr_map = GNUNET_CONTAINER_multihashmap_create (5,
- GNUNET_NO);
- scopes_tmp = GNUNET_strdup (scopes);
+ struct IdpClient *client = cls;
+ struct TicketIteration *ti;
+ uint32_t rid;
- for (scope = strtok (scopes_tmp, ","); NULL != scope; scope = strtok (NULL, ","))
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Received TICKET_ITERATION_NEXT message\n");
+ rid = ntohl (tis_msg->id);
+ for (ti = client->ticket_iter_head; NULL != ti; ti = ti->next)
+ if (ti->r_id == rid)
+ break;
+ if (NULL == ti)
{
- GNUNET_CRYPTO_hash (scope,
- strlen (scope),
- &key);
- GNUNET_CONTAINER_multihashmap_put (issue_handle->attr_map,
- &key,
- scope,
- GNUNET_CONTAINER_MULTIHASHMAPOPTION_REPLACE);
+ GNUNET_break (0);
+ GNUNET_SERVICE_client_drop (client->client);
+ return;
}
- GNUNET_free (scopes_tmp);
- issue_handle->r_id = im->id;
- issue_handle->aud_key = im->aud_key;
- issue_handle->iss_key = im->iss_key;
- GNUNET_CRYPTO_ecdsa_key_get_public (&im->iss_key,
- &issue_handle->iss_pkey);
- issue_handle->expiration = GNUNET_TIME_absolute_ntoh (im->expiration);
- issue_handle->nonce = ntohl (im->nonce);
- GNUNET_SERVICE_client_continue (client);
- issue_handle->client = client;
- issue_handle->scopes = GNUNET_strdup (scopes);
- issue_handle->token = token_create (&issue_handle->iss_pkey,
- &issue_handle->aud_key);
-
- issue_handle->ns_it = GNUNET_NAMESTORE_zone_iteration_start (ns_handle,
- &im->iss_key,
- &find_existing_token_error,
- issue_handle,
- &find_existing_token,
- issue_handle,
- &find_existing_token_finished,
- issue_handle);
+ run_ticket_iteration_round (ti);
+ GNUNET_SERVICE_client_continue (client->client);
}
+
+
/**
* Main function that will be run
*
@@ -1590,6 +2461,7 @@ run (void *cls,
const struct GNUNET_CONFIGURATION_Handle *c,
struct GNUNET_SERVICE_Handle *server)
{
+ char *database;
cfg = c;
stats = GNUNET_STATISTICS_create ("identity-provider", cfg);
@@ -1606,10 +2478,38 @@ run (void *cls,
{
GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "error connecting to gns");
}
-
+ credential_handle = GNUNET_CREDENTIAL_connect (cfg);
+ if (NULL == credential_handle)
+ {
+ GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "error connecting to credential");
+ }
identity_handle = GNUNET_IDENTITY_connect (cfg,
- &list_ego,
+ NULL,
NULL);
+ stats_handle = GNUNET_STATISTICS_create ("identity-provider",
+ cfg);
+ /* Loading DB plugin */
+ if (GNUNET_OK !=
+ GNUNET_CONFIGURATION_get_value_string (cfg,
+ "identity-provider",
+ "database",
+ &database))
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "No database backend configured\n");
+ GNUNET_asprintf (&db_lib_name,
+ "libgnunet_plugin_identity_provider_%s",
+ database);
+ TKT_database = GNUNET_PLUGIN_load (db_lib_name,
+ (void *) cfg);
+ GNUNET_free (database);
+ if (NULL == TKT_database)
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Could not load database backend `%s'\n",
+ db_lib_name);
+ GNUNET_SCHEDULER_shutdown ();
+ return;
+ }
if (GNUNET_OK ==
GNUNET_CONFIGURATION_get_value_time (cfg,
@@ -1640,9 +2540,39 @@ client_disconnect_cb (void *cls,
struct GNUNET_SERVICE_Client *client,
void *app_ctx)
{
+ struct IdpClient *idp = app_ctx;
+ struct AttributeIterator *ai;
+ struct TicketIteration *ti;
+ struct TicketRevocationHandle *rh;
+
+ //TODO other operations
+
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"Client %p disconnected\n",
client);
+
+ while (NULL != (ai = idp->op_head))
+ {
+ GNUNET_CONTAINER_DLL_remove (idp->op_head,
+ idp->op_tail,
+ ai);
+ GNUNET_free (ai);
+ }
+ while (NULL != (rh = idp->revocation_list_head))
+ {
+ GNUNET_CONTAINER_DLL_remove (idp->revocation_list_head,
+ idp->revocation_list_tail,
+ rh);
+ cleanup_revoke_ticket_handle (rh);
+ }
+ while (NULL != (ti = idp->ticket_iter_head))
+ {
+ GNUNET_CONTAINER_DLL_remove (idp->ticket_iter_head,
+ idp->ticket_iter_tail,
+ ti);
+ cleanup_ticket_iter_handle (ti);
+ }
+ GNUNET_free (idp);
}
@@ -1659,10 +2589,14 @@ client_connect_cb (void *cls,
struct GNUNET_SERVICE_Client *client,
struct GNUNET_MQ_Handle *mq)
{
+ struct IdpClient *idp;
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"Client %p connected\n",
client);
- return client;
+ idp = GNUNET_new (struct IdpClient);
+ idp->client = client;
+ idp->mq = mq;
+ return idp;
}
@@ -1677,13 +2611,45 @@ GNUNET_SERVICE_MAIN
&client_connect_cb,
&client_disconnect_cb,
NULL,
- GNUNET_MQ_hd_var_size (issue_message,
- GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_ISSUE,
- struct IssueMessage,
+ GNUNET_MQ_hd_var_size (attribute_store_message,
+ GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_ATTRIBUTE_STORE,
+ struct AttributeStoreMessage,
+ NULL),
+ GNUNET_MQ_hd_fixed_size (iteration_start,
+ GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_ATTRIBUTE_ITERATION_START,
+ struct AttributeIterationStartMessage,
+ NULL),
+ GNUNET_MQ_hd_fixed_size (iteration_next,
+ GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_ATTRIBUTE_ITERATION_NEXT,
+ struct AttributeIterationNextMessage,
+ NULL),
+ GNUNET_MQ_hd_fixed_size (iteration_stop,
+ GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_ATTRIBUTE_ITERATION_STOP,
+ struct AttributeIterationStopMessage,
+ NULL),
+ GNUNET_MQ_hd_var_size (issue_ticket_message,
+ GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_ISSUE_TICKET,
+ struct IssueTicketMessage,
+ NULL),
+ GNUNET_MQ_hd_var_size (consume_ticket_message,
+ GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_CONSUME_TICKET,
+ struct ConsumeTicketMessage,
NULL),
- GNUNET_MQ_hd_var_size (exchange_message,
- GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_EXCHANGE,
- struct ExchangeMessage,
+ GNUNET_MQ_hd_fixed_size (ticket_iteration_start,
+ GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_TICKET_ITERATION_START,
+ struct TicketIterationStartMessage,
+ NULL),
+ GNUNET_MQ_hd_fixed_size (ticket_iteration_next,
+ GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_TICKET_ITERATION_NEXT,
+ struct TicketIterationNextMessage,
+ NULL),
+ GNUNET_MQ_hd_fixed_size (ticket_iteration_stop,
+ GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_TICKET_ITERATION_STOP,
+ struct TicketIterationStopMessage,
+ NULL),
+ GNUNET_MQ_hd_var_size (revoke_ticket_message,
+ GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_REVOKE_TICKET,
+ struct RevokeTicketMessage,
NULL),
GNUNET_MQ_handler_end());
/* end of gnunet-service-identity-provider.c */
diff --git a/src/identity-provider/identity-provider.conf b/src/identity-provider/identity-provider.conf
index bac8e69edf..7ee5e50d88 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
UNIX_MATCH_UID = NO
UNIX_MATCH_GID = YES
TOKEN_EXPIRATION_INTERVAL = 30 m
+DATABASE = sqlite
+
+[identity-provider-sqlite]
+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 6fe6102c85..be9fdc6f5c 100644
--- a/src/identity-provider/identity_provider.h
+++ b/src/identity-provider/identity_provider.h
@@ -34,34 +34,157 @@
GNUNET_NETWORK_STRUCT_BEGIN
/**
- * The token
+ * Use to store an identity attribute
*/
-struct GNUNET_IDENTITY_PROVIDER_Token
+struct AttributeStoreMessage
{
/**
- * The JWT representation of the identity token
+ * Type: #GNUNET_MESSAGE_TYPE_IDENTITY_SET_DEFAULT
+ */
+ struct GNUNET_MessageHeader header;
+
+ /**
+ * Unique identifier for this request (for key collisions).
*/
- char *data;
+ uint32_t id GNUNET_PACKED;
+
+ /**
+ * The length of the attribute
+ */
+ uint32_t attr_len GNUNET_PACKED;
+
+ /**
+ * Identity
+ */
+ struct GNUNET_CRYPTO_EcdsaPrivateKey identity;
+
+ /* followed by the serialized attribute */
+
};
/**
- * The ticket
+ * Attribute store response message
*/
-struct GNUNET_IDENTITY_PROVIDER_Ticket
+struct AttributeStoreResultMessage
{
/**
- * The Base64 representation of the ticket
+ * Message header
+ */
+ struct GNUNET_MessageHeader header;
+
+ /**
+ * Unique identifier for this request (for key collisions).
+ */
+ uint32_t id GNUNET_PACKED;
+
+ /**
+ * #GNUNET_SYSERR on failure, #GNUNET_OK on success
+ */
+ int32_t op_result GNUNET_PACKED;
+
+};
+
+/**
+ * Attribute is returned from the idp.
+ */
+struct AttributeResultMessage
+{
+ /**
+ * Message header
+ */
+ struct GNUNET_MessageHeader header;
+
+ /**
+ * Unique identifier for this request (for key collisions).
+ */
+ uint32_t id GNUNET_PACKED;
+
+ /**
+ * Length of serialized attribute data
+ */
+ uint16_t attr_len GNUNET_PACKED;
+
+ /**
+ * always zero (for alignment)
+ */
+ uint16_t reserved GNUNET_PACKED;
+
+ /**
+ * The public key of the identity.
+ */
+ struct GNUNET_CRYPTO_EcdsaPublicKey identity;
+
+ /* followed by:
+ * serialized attribute data
+ */
+};
+
+
+/**
+ * Start a attribute iteration for the given identity
+ */
+struct AttributeIterationStartMessage
+{
+ /**
+ * Message
+ */
+ struct GNUNET_MessageHeader header;
+
+ /**
+ * Unique identifier for this request (for key collisions).
+ */
+ uint32_t id GNUNET_PACKED;
+
+ /**
+ * Identity.
+ */
+ struct GNUNET_CRYPTO_EcdsaPrivateKey identity;
+
+};
+
+
+/**
+ * Ask for next result of attribute iteration for the given operation
+ */
+struct AttributeIterationNextMessage
+{
+ /**
+ * Type will be #GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_ATTRIBUTE_ITERATION_NEXT
+ */
+ struct GNUNET_MessageHeader header;
+
+ /**
+ * Unique identifier for this request (for key collisions).
+ */
+ uint32_t id GNUNET_PACKED;
+
+};
+
+
+/**
+ * Stop attribute iteration for the given operation
+ */
+struct AttributeIterationStopMessage
+{
+ /**
+ * Type will be #GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_ATTRIBUTE_ITERATION_STOP
+ */
+ struct GNUNET_MessageHeader header;
+
+ /**
+ * Unique identifier for this request (for key collisions).
*/
- char *data;
+ uint32_t id GNUNET_PACKED;
+
};
/**
- * Answer from service to client after issue operation
+ * Start a ticket iteration for the given identity
*/
-struct IssueResultMessage
+struct TicketIterationStartMessage
{
/**
- * Type: #GNUNET_MESSAGE_TYPE_IDENTITY_RESULT_CODE
+ * Message
*/
struct GNUNET_MessageHeader header;
@@ -70,18 +193,25 @@ struct IssueResultMessage
*/
uint32_t id GNUNET_PACKED;
- /* followed by 0-terminated label,ticket,token */
+ /**
+ * Identity.
+ */
+ struct GNUNET_CRYPTO_EcdsaPublicKey identity;
+ /**
+ * Identity is audience or issuer
+ */
+ uint32_t is_audience GNUNET_PACKED;
};
/**
- * Ticket exchange message.
+ * Ask for next result of ticket iteration for the given operation
*/
-struct ExchangeResultMessage
+struct TicketIterationNextMessage
{
/**
- * Type: #GNUNET_MESSAGE_TYPE_IDENTITY_UPDATE
+ * Type will be #GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_TICKET_ITERATION_NEXT
*/
struct GNUNET_MessageHeader header;
@@ -90,25 +220,35 @@ struct ExchangeResultMessage
*/
uint32_t id GNUNET_PACKED;
+};
+
+
+/**
+ * Stop ticket iteration for the given operation
+ */
+struct TicketIterationStopMessage
+{
/**
- * Nonce found in ticket. NBO
- * 0 on error.
+ * Type will be #GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_TICKET_ITERATION_STOP
*/
- uint64_t ticket_nonce GNUNET_PACKED;
+ struct GNUNET_MessageHeader header;
- /* followed by 0-terminated token */
+ /**
+ * Unique identifier for this request (for key collisions).
+ */
+ uint32_t id GNUNET_PACKED;
};
/**
- * Client requests IdP to issue token.
+ * Ticket issue message
*/
-struct IssueMessage
+struct IssueTicketMessage
{
/**
- * Type: #GNUNET_MESSAGE_TYPE_IDENTITY_GET_DEFAULT
+ * Type will be #GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_TICKET_ISSUE
*/
struct GNUNET_MessageHeader header;
@@ -117,40 +257,98 @@ struct IssueMessage
*/
uint32_t id GNUNET_PACKED;
+ /**
+ * Identity.
+ */
+ struct GNUNET_CRYPTO_EcdsaPrivateKey identity;
/**
- * Issuer identity private key
+ * Requesting party.
*/
- struct GNUNET_CRYPTO_EcdsaPrivateKey iss_key;
+ struct GNUNET_CRYPTO_EcdsaPublicKey rp;
/**
- * Audience public key
+ * length of serialized attribute list
*/
- struct GNUNET_CRYPTO_EcdsaPublicKey aud_key;
+ uint32_t attr_len GNUNET_PACKED;
+ //Followed by a serialized attribute list
+};
+
+/**
+ * Ticket revoke message
+ */
+struct RevokeTicketMessage
+{
/**
- * Nonce
+ * Type will be #GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_TICKET_ISSUE
*/
- uint64_t nonce;
+ struct GNUNET_MessageHeader header;
/**
- * Expiration of token in NBO.
+ * Unique identifier for this request (for key collisions).
*/
- struct GNUNET_TIME_AbsoluteNBO expiration;
+ uint32_t id GNUNET_PACKED;
+ /**
+ * Identity.
+ */
+ struct GNUNET_CRYPTO_EcdsaPrivateKey identity;
- /* followed by 0-terminated comma-separated scope list */
+ /**
+ * length of serialized attribute list
+ */
+ uint32_t attrs_len GNUNET_PACKED;
+ //Followed by a ticket and serialized attribute list
+};
+
+/**
+ * Ticket revoke message
+ */
+struct RevokeTicketResultMessage
+{
+ /**
+ * Type will be #GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_TICKET_ISSUE
+ */
+ struct GNUNET_MessageHeader header;
+
+ /**
+ * Unique identifier for this request (for key collisions).
+ */
+ uint32_t id GNUNET_PACKED;
+
+ /**
+ * Revocation result
+ */
+ uint32_t success GNUNET_PACKED;
};
/**
- * Use to exchange a ticket for a token
+ * Ticket result message
*/
-struct ExchangeMessage
+struct TicketResultMessage
{
/**
- * Type: #GNUNET_MESSAGE_TYPE_IDENTITY_SET_DEFAULT
+ * Type will be #GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_TICKET_RESULT
+ */
+ struct GNUNET_MessageHeader header;
+
+ /**
+ * Unique identifier for this request (for key collisions).
+ */
+ uint32_t id GNUNET_PACKED;
+
+};
+
+/**
+ * Ticket consume message
+ */
+struct ConsumeTicketMessage
+{
+ /**
+ * Type will be #GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_TICKET_ISSUE
*/
struct GNUNET_MessageHeader header;
@@ -160,15 +358,50 @@ struct ExchangeMessage
uint32_t id GNUNET_PACKED;
/**
- * Audience identity private key
+ * Identity.
+ */
+ struct GNUNET_CRYPTO_EcdsaPrivateKey identity;
+
+ //Followed by a serialized ticket
+};
+
+/**
+ * Attribute list is returned from the idp.
+ */
+struct ConsumeTicketResultMessage
+{
+ /**
+ * Message header
+ */
+ struct GNUNET_MessageHeader header;
+
+ /**
+ * Unique identifier for this request (for key collisions).
+ */
+ uint32_t id GNUNET_PACKED;
+
+ /**
+ * Length of serialized attribute data
*/
- struct GNUNET_CRYPTO_EcdsaPrivateKey aud_privkey;
+ uint16_t attrs_len GNUNET_PACKED;
- /* followed by 0-terminated ticket string */
+ /**
+ * always zero (for alignment)
+ */
+ uint16_t reserved GNUNET_PACKED;
+ /**
+ * The public key of the identity.
+ */
+ struct GNUNET_CRYPTO_EcdsaPublicKey identity;
+
+ /* followed by:
+ * serialized attributes data
+ */
};
+
GNUNET_NETWORK_STRUCT_END
#endif
diff --git a/src/identity-provider/identity_provider_api.c b/src/identity-provider/identity_provider_api.c
index 845d1f7534..6fc8d228a5 100644
--- a/src/identity-provider/identity_provider_api.c
+++ b/src/identity-provider/identity_provider_api.c
@@ -29,12 +29,12 @@
#include "gnunet_protocols.h"
#include "gnunet_mq_lib.h"
#include "gnunet_identity_provider_service.h"
+#include "gnunet_identity_attribute_lib.h"
#include "identity_provider.h"
#define LOG(kind,...) GNUNET_log_from (kind, "identity-api",__VA_ARGS__)
-
/**
* Handle for an operation with the service.
*/
@@ -63,16 +63,24 @@ struct GNUNET_IDENTITY_PROVIDER_Operation
const struct GNUNET_MessageHeader *msg;
/**
- * Continuation to invoke with the result of the transmission; @e cb
- * will be NULL in this case.
+ * Continuation to invoke after attribute store call
+ */
+ GNUNET_IDENTITY_PROVIDER_ContinuationWithStatus as_cb;
+
+ /**
+ * Attribute result callback
+ */
+ GNUNET_IDENTITY_PROVIDER_AttributeResult ar_cb;
+
+ /**
+ * Revocation result callback
*/
- GNUNET_IDENTITY_PROVIDER_ExchangeCallback ex_cb;
+ GNUNET_IDENTITY_PROVIDER_ContinuationWithStatus rvk_cb;
/**
- * Continuation to invoke with the result of the transmission for
- * 'issue' operations (@e cont will be NULL in this case).
+ * Ticket result callback
*/
- GNUNET_IDENTITY_PROVIDER_IssueCallback iss_cb;
+ GNUNET_IDENTITY_PROVIDER_TicketCallback tr_cb;
/**
* Envelope with the message for this queue entry.
@@ -91,6 +99,140 @@ struct GNUNET_IDENTITY_PROVIDER_Operation
};
+/**
+ * Handle for a ticket iterator operation
+ */
+struct GNUNET_IDENTITY_PROVIDER_TicketIterator
+{
+
+ /**
+ * Kept in a DLL.
+ */
+ struct GNUNET_IDENTITY_PROVIDER_TicketIterator *next;
+
+ /**
+ * Kept in a DLL.
+ */
+ struct GNUNET_IDENTITY_PROVIDER_TicketIterator *prev;
+
+ /**
+ * Main handle to access the idp.
+ */
+ struct GNUNET_IDENTITY_PROVIDER_Handle *h;
+
+ /**
+ * Function to call on completion.
+ */
+ GNUNET_SCHEDULER_TaskCallback finish_cb;
+
+ /**
+ * Closure for @e error_cb.
+ */
+ void *finish_cb_cls;
+
+ /**
+ * The continuation to call with the results
+ */
+ GNUNET_IDENTITY_PROVIDER_TicketCallback tr_cb;
+
+ /**
+ * Closure for @e tr_cb.
+ */
+ void *cls;
+
+ /**
+ * Function to call on errors.
+ */
+ GNUNET_SCHEDULER_TaskCallback error_cb;
+
+ /**
+ * Closure for @e error_cb.
+ */
+ void *error_cb_cls;
+
+ /**
+ * Envelope of the message to send to the service, if not yet
+ * sent.
+ */
+ struct GNUNET_MQ_Envelope *env;
+
+ /**
+ * The operation id this zone iteration operation has
+ */
+ uint32_t r_id;
+
+};
+
+
+/**
+ * Handle for a attribute iterator operation
+ */
+struct GNUNET_IDENTITY_PROVIDER_AttributeIterator
+{
+
+ /**
+ * Kept in a DLL.
+ */
+ struct GNUNET_IDENTITY_PROVIDER_AttributeIterator *next;
+
+ /**
+ * Kept in a DLL.
+ */
+ struct GNUNET_IDENTITY_PROVIDER_AttributeIterator *prev;
+
+ /**
+ * Main handle to access the idp.
+ */
+ struct GNUNET_IDENTITY_PROVIDER_Handle *h;
+
+ /**
+ * Function to call on completion.
+ */
+ GNUNET_SCHEDULER_TaskCallback finish_cb;
+
+ /**
+ * Closure for @e error_cb.
+ */
+ void *finish_cb_cls;
+
+ /**
+ * The continuation to call with the results
+ */
+ GNUNET_IDENTITY_PROVIDER_AttributeResult proc;
+
+ /**
+ * Closure for @e proc.
+ */
+ void *proc_cls;
+
+ /**
+ * Function to call on errors.
+ */
+ GNUNET_SCHEDULER_TaskCallback error_cb;
+
+ /**
+ * Closure for @e error_cb.
+ */
+ void *error_cb_cls;
+
+ /**
+ * Envelope of the message to send to the service, if not yet
+ * sent.
+ */
+ struct GNUNET_MQ_Envelope *env;
+
+ /**
+ * Private key of the zone.
+ */
+ struct GNUNET_CRYPTO_EcdsaPrivateKey identity;
+
+ /**
+ * The operation id this zone iteration operation has
+ */
+ uint32_t r_id;
+
+};
+
/**
* Handle for the service.
@@ -123,6 +265,27 @@ struct GNUNET_IDENTITY_PROVIDER_Handle
struct GNUNET_IDENTITY_PROVIDER_Operation *op_tail;
/**
+ * Head of active iterations
+ */
+ struct GNUNET_IDENTITY_PROVIDER_AttributeIterator *it_head;
+
+ /**
+ * Tail of active iterations
+ */
+ struct GNUNET_IDENTITY_PROVIDER_AttributeIterator *it_tail;
+
+ /**
+ * Head of active iterations
+ */
+ struct GNUNET_IDENTITY_PROVIDER_TicketIterator *ticket_it_head;
+
+ /**
+ * Tail of active iterations
+ */
+ struct GNUNET_IDENTITY_PROVIDER_TicketIterator *ticket_it_tail;
+
+
+ /**
* Currently pending transmission request, or NULL for none.
*/
struct GNUNET_CLIENT_TransmitHandle *th;
@@ -197,6 +360,26 @@ force_reconnect (struct GNUNET_IDENTITY_PROVIDER_Handle *handle)
}
/**
+ * Free @a it.
+ *
+ * @param it entry to free
+ */
+static void
+free_it (struct GNUNET_IDENTITY_PROVIDER_AttributeIterator *it)
+{
+ struct GNUNET_IDENTITY_PROVIDER_Handle *h = it->h;
+
+ GNUNET_CONTAINER_DLL_remove (h->it_head,
+ h->it_tail,
+ it);
+ if (NULL != it->env)
+ GNUNET_MQ_discard (it->env);
+ GNUNET_free (it);
+}
+
+
+
+/**
* Generic error handler, called with the appropriate error code and
* the same closure specified at the creation of the message queue.
* Not every message queue implementation supports an error handler.
@@ -213,22 +396,68 @@ mq_error_handler (void *cls,
}
/**
- * Check validity of message received from the service
+ * Handle an incoming message of type
+ * #GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_STORE_RESPONSE
+ *
+ * @param cls
+ * @param msg the message we received
+ */
+static void
+handle_attribute_store_response (void *cls,
+ const struct AttributeStoreResultMessage *msg)
+{
+ struct GNUNET_IDENTITY_PROVIDER_Handle *h = cls;
+ struct GNUNET_IDENTITY_PROVIDER_Operation *op;
+ uint32_t r_id = ntohl (msg->id);
+ int res;
+ const char *emsg;
+
+ for (op = h->op_head; NULL != op; op = op->next)
+ if (op->r_id == r_id)
+ break;
+ if (NULL == op)
+ return;
+
+ res = ntohl (msg->op_result);
+ LOG (GNUNET_ERROR_TYPE_DEBUG,
+ "Received ATTRIBUTE_STORE_RESPONSE with result %d\n",
+ res);
+
+ /* TODO: add actual error message to response... */
+ if (GNUNET_SYSERR == res)
+ emsg = _("failed to store record\n");
+ else
+ emsg = NULL;
+ if (NULL != op->as_cb)
+ op->as_cb (op->cls,
+ res,
+ emsg);
+ GNUNET_CONTAINER_DLL_remove (h->op_head,
+ h->op_tail,
+ op);
+ GNUNET_free (op);
+
+}
+
+
+/**
+ * Handle an incoming message of type
+ * #GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_CONSUME_TICKET_RESULT
*
- * @param cls the `struct GNUNET_IDENTITY_PROVIDER_Handle *`
- * @param result_msg the incoming message
+ * @param cls
+ * @param msg the message we received
+ * @return #GNUNET_OK on success, #GNUNET_SYSERR on error
*/
static int
-check_exchange_result (void *cls,
- const struct ExchangeResultMessage *erm)
+check_consume_ticket_result (void *cls,
+ const struct ConsumeTicketResultMessage *msg)
{
- char *str;
- size_t size = ntohs (erm->header.size) - sizeof (*erm);
-
+ size_t msg_len;
+ size_t attrs_len;
- str = (char *) &erm[1];
- if ( (size > sizeof (struct ExchangeResultMessage)) &&
- ('\0' != str[size - sizeof (struct ExchangeResultMessage) - 1]) )
+ msg_len = ntohs (msg->header.size);
+ attrs_len = ntohs (msg->attrs_len);
+ if (msg_len != sizeof (struct ConsumeTicketResultMessage) + attrs_len)
{
GNUNET_break (0);
return GNUNET_SYSERR;
@@ -238,20 +467,85 @@ check_exchange_result (void *cls,
/**
- * Check validity of message received from the service
+ * Handle an incoming message of type
+ * #GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_CONSUME_TICKET_RESULT
+ *
+ * @param cls
+ * @param msg the message we received
+ */
+static void
+handle_consume_ticket_result (void *cls,
+ const struct ConsumeTicketResultMessage *msg)
+{
+ struct GNUNET_IDENTITY_PROVIDER_Handle *h = cls;
+ struct GNUNET_IDENTITY_PROVIDER_Operation *op;
+ size_t attrs_len;
+ uint32_t r_id = ntohl (msg->id);
+
+ attrs_len = ntohs (msg->attrs_len);
+ LOG (GNUNET_ERROR_TYPE_DEBUG,
+ "Processing attribute result.\n");
+
+
+ for (op = h->op_head; NULL != op; op = op->next)
+ if (op->r_id == r_id)
+ break;
+ if (NULL == op)
+ return;
+
+ {
+ struct GNUNET_IDENTITY_ATTRIBUTE_ClaimList *attrs;
+ struct GNUNET_IDENTITY_ATTRIBUTE_ClaimListEntry *le;
+ attrs = GNUNET_IDENTITY_ATTRIBUTE_list_deserialize ((char*)&msg[1],
+ attrs_len);
+ if (NULL != op->ar_cb)
+ {
+ if (NULL == attrs)
+ {
+ op->ar_cb (op->cls,
+ &msg->identity,
+ NULL);
+ }
+ else
+ {
+ for (le = attrs->list_head; NULL != le; le = le->next)
+ op->ar_cb (op->cls,
+ &msg->identity,
+ le->claim);
+ GNUNET_IDENTITY_ATTRIBUTE_list_destroy (attrs);
+ }
+ }
+ op->ar_cb (op->cls,
+ NULL,
+ NULL);
+ GNUNET_CONTAINER_DLL_remove (h->op_head,
+ h->op_tail,
+ op);
+ GNUNET_free (op);
+ return;
+ }
+ GNUNET_assert (0);
+}
+
+
+/**
+ * Handle an incoming message of type
+ * #GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_ATTRIBUTE_RESULT
*
- * @param cls the `struct GNUNET_IDENTITY_PROVIDER_Handle *`
- * @param result_msg the incoming message
+ * @param cls
+ * @param msg the message we received
+ * @return #GNUNET_OK on success, #GNUNET_SYSERR on error
*/
static int
-check_result (void *cls,
- const struct IssueResultMessage *irm)
+check_attribute_result (void *cls,
+ const struct AttributeResultMessage *msg)
{
- char *str;
- size_t size = ntohs (irm->header.size) - sizeof (*irm);
- str = (char*) &irm[1];
- if ( (size > sizeof (struct IssueResultMessage)) &&
- ('\0' != str[size - sizeof (struct IssueResultMessage) - 1]) )
+ size_t msg_len;
+ size_t attr_len;
+
+ msg_len = ntohs (msg->header.size);
+ attr_len = ntohs (msg->attr_len);
+ if (msg_len != sizeof (struct AttributeResultMessage) + attr_len)
{
GNUNET_break (0);
return GNUNET_SYSERR;
@@ -259,102 +553,225 @@ check_result (void *cls,
return GNUNET_OK;
}
+
/**
- * Handler for messages received from the GNS service
+ * Handle an incoming message of type
+ * #GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_ATTRIBUTE_RESULT
*
- * @param cls the `struct GNUNET_GNS_Handle *`
- * @param loookup_msg the incoming message
+ * @param cls
+ * @param msg the message we received
*/
static void
-handle_exchange_result (void *cls,
- const struct ExchangeResultMessage *erm)
+handle_attribute_result (void *cls,
+ const struct AttributeResultMessage *msg)
{
- struct GNUNET_IDENTITY_PROVIDER_Handle *handle = cls;
+ static struct GNUNET_CRYPTO_EcdsaPrivateKey identity_dummy;
+ struct GNUNET_IDENTITY_PROVIDER_Handle *h = cls;
+ struct GNUNET_IDENTITY_PROVIDER_AttributeIterator *it;
struct GNUNET_IDENTITY_PROVIDER_Operation *op;
- struct GNUNET_IDENTITY_PROVIDER_Token token;
- uint64_t ticket_nonce;
- uint32_t r_id = ntohl (erm->id);
- char *str;
-
- for (op = handle->op_head; NULL != op; op = op->next)
+ size_t attr_len;
+ uint32_t r_id = ntohl (msg->id);
+
+ attr_len = ntohs (msg->attr_len);
+ LOG (GNUNET_ERROR_TYPE_DEBUG,
+ "Processing attribute result.\n");
+
+
+ for (it = h->it_head; NULL != it; it = it->next)
+ if (it->r_id == r_id)
+ break;
+ for (op = h->op_head; NULL != op; op = op->next)
if (op->r_id == r_id)
break;
- if (NULL == op)
+ if ((NULL == it) && (NULL == op))
return;
- str = GNUNET_strdup ((char*)&erm[1]);
- op = handle->op_head;
- GNUNET_CONTAINER_DLL_remove (handle->op_head,
- handle->op_tail,
- op);
- token.data = str;
- ticket_nonce = ntohl (erm->ticket_nonce);
- if (NULL != op->ex_cb)
- op->ex_cb (op->cls, &token, ticket_nonce);
- GNUNET_free (str);
- GNUNET_free (op);
+ if ( (0 == (memcmp (&msg->identity,
+ &identity_dummy,
+ sizeof (identity_dummy)))) )
+ {
+ if ((NULL == it) && (NULL == op))
+ {
+ GNUNET_break (0);
+ force_reconnect (h);
+ return;
+ }
+ if (NULL != it)
+ {
+ if (NULL != it->finish_cb)
+ it->finish_cb (it->finish_cb_cls);
+ free_it (it);
+ }
+ if (NULL != op)
+ {
+ if (NULL != op->ar_cb)
+ op->ar_cb (op->cls,
+ NULL,
+ NULL);
+ GNUNET_CONTAINER_DLL_remove (h->op_head,
+ h->op_tail,
+ op);
+ GNUNET_free (op);
+
+ }
+ return;
+ }
+
+ {
+ struct GNUNET_IDENTITY_ATTRIBUTE_Claim *attr;
+ attr = GNUNET_IDENTITY_ATTRIBUTE_deserialize ((char*)&msg[1],
+ attr_len);
+ if (NULL != it)
+ {
+ if (NULL != it->proc)
+ it->proc (it->proc_cls,
+ &msg->identity,
+ attr);
+ } else if (NULL != op)
+ {
+ if (NULL != op->ar_cb)
+ op->ar_cb (op->cls,
+ &msg->identity,
+ attr);
+
+ }
+ GNUNET_free (attr);
+ return;
+ }
+ GNUNET_assert (0);
}
/**
- * Handler for messages received from the GNS service
+ * Handle an incoming message of type
+ * #GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_TICKET_RESULT
*
- * @param cls the `struct GNUNET_GNS_Handle *`
- * @param loookup_msg the incoming message
+ * @param cls
+ * @param msg the message we received
+ * @return #GNUNET_OK on success, #GNUNET_SYSERR on error
+ */
+static int
+check_ticket_result (void *cls,
+ const struct TicketResultMessage *msg)
+{
+ size_t msg_len;
+
+ msg_len = ntohs (msg->header.size);
+ if (msg_len < sizeof (struct TicketResultMessage))
+ {
+ GNUNET_break (0);
+ return GNUNET_SYSERR;
+ }
+ return GNUNET_OK;
+}
+
+
+
+/**
+ * Handle an incoming message of type
+ * #GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_TICKET_RESULT
+ *
+ * @param cls
+ * @param msg the message we received
*/
static void
-handle_result (void *cls,
- const struct IssueResultMessage *irm)
+handle_ticket_result (void *cls,
+ const struct TicketResultMessage *msg)
{
struct GNUNET_IDENTITY_PROVIDER_Handle *handle = cls;
struct GNUNET_IDENTITY_PROVIDER_Operation *op;
- struct GNUNET_IDENTITY_PROVIDER_Token token;
- struct GNUNET_IDENTITY_PROVIDER_Ticket ticket;
- uint32_t r_id = ntohl (irm->id);
- char *str;
- char *label_str;
- char *ticket_str;
- char *token_str;
+ struct GNUNET_IDENTITY_PROVIDER_TicketIterator *it;
+ const struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket;
+ uint32_t r_id = ntohl (msg->id);
+ size_t msg_len;
for (op = handle->op_head; NULL != op; op = op->next)
if (op->r_id == r_id)
break;
- if (NULL == op)
+ for (it = handle->ticket_it_head; NULL != it; it = it->next)
+ if (it->r_id == r_id)
+ break;
+ if ((NULL == op) && (NULL == it))
return;
- str = GNUNET_strdup ((char*)&irm[1]);
- label_str = strtok (str, ",");
-
- if (NULL == label_str)
+ msg_len = ntohs (msg->header.size);
+ if (NULL != op)
{
- GNUNET_free (str);
- GNUNET_break (0);
+ GNUNET_CONTAINER_DLL_remove (handle->op_head,
+ handle->op_tail,
+ op);
+ if (msg_len == sizeof (struct TicketResultMessage))
+ {
+ if (NULL != op->tr_cb)
+ op->tr_cb (op->cls, NULL);
+ } else {
+ ticket = (struct GNUNET_IDENTITY_PROVIDER_Ticket *)&msg[1];
+ if (NULL != op->tr_cb)
+ op->tr_cb (op->cls, ticket);
+ }
+ GNUNET_free (op);
return;
- }
- ticket_str = strtok (NULL, ",");
- if (NULL == ticket_str)
- {
- GNUNET_free (str);
- GNUNET_break (0);
+ } else if (NULL != it) {
+ if (msg_len == sizeof (struct TicketResultMessage))
+ {
+ if (NULL != it->tr_cb)
+ GNUNET_CONTAINER_DLL_remove (handle->ticket_it_head,
+ handle->ticket_it_tail,
+ it);
+ it->finish_cb (it->finish_cb_cls);
+ GNUNET_free (it);
+ } else {
+ ticket = (struct GNUNET_IDENTITY_PROVIDER_Ticket *)&msg[1];
+ if (NULL != it->tr_cb)
+ it->tr_cb (it->cls, ticket);
+ }
return;
}
- token_str = strtok (NULL, ",");
- if (NULL == token_str)
+ GNUNET_break (0);
+}
+
+/**
+ * Handle an incoming message of type
+ * #GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_REVOKE_TICKET_RESULT
+ *
+ * @param cls
+ * @param msg the message we received
+ */
+static void
+handle_revoke_ticket_result (void *cls,
+ const struct RevokeTicketResultMessage *msg)
+{
+ struct GNUNET_IDENTITY_PROVIDER_Handle *h = cls;
+ struct GNUNET_IDENTITY_PROVIDER_Operation *op;
+ uint32_t r_id = ntohl (msg->id);
+ int32_t success;
+
+ LOG (GNUNET_ERROR_TYPE_DEBUG,
+ "Processing revocation result.\n");
+
+
+ for (op = h->op_head; NULL != op; op = op->next)
+ if (op->r_id == r_id)
+ break;
+ if (NULL == op)
+ return;
+ success = ntohl (msg->success);
{
- GNUNET_free (str);
- GNUNET_break (0);
+ if (NULL != op->rvk_cb)
+ {
+ op->rvk_cb (op->cls,
+ success,
+ NULL);
+ }
+ GNUNET_CONTAINER_DLL_remove (h->op_head,
+ h->op_tail,
+ op);
+ GNUNET_free (op);
return;
}
- GNUNET_CONTAINER_DLL_remove (handle->op_head,
- handle->op_tail,
- op);
- ticket.data = ticket_str;
- token.data = token_str;
- if (NULL != op->iss_cb)
- op->iss_cb (op->cls, label_str, &ticket, &token);
- GNUNET_free (str);
- GNUNET_free (op);
-
+ GNUNET_assert (0);
}
+
+
/**
* Try again to connect to the service.
*
@@ -364,14 +781,26 @@ static void
reconnect (struct GNUNET_IDENTITY_PROVIDER_Handle *h)
{
struct GNUNET_MQ_MessageHandler handlers[] = {
- GNUNET_MQ_hd_var_size (result,
- GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_ISSUE_RESULT,
- struct IssueResultMessage,
+ GNUNET_MQ_hd_fixed_size (attribute_store_response,
+ GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_ATTRIBUTE_STORE_RESPONSE,
+ struct AttributeStoreResultMessage,
+ h),
+ GNUNET_MQ_hd_var_size (attribute_result,
+ GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_ATTRIBUTE_RESULT,
+ struct AttributeResultMessage,
h),
- GNUNET_MQ_hd_var_size (exchange_result,
- GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_EXCHANGE_RESULT,
- struct ExchangeResultMessage,
+ GNUNET_MQ_hd_var_size (ticket_result,
+ GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_TICKET_RESULT,
+ struct TicketResultMessage,
h),
+ GNUNET_MQ_hd_var_size (consume_ticket_result,
+ GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_CONSUME_TICKET_RESULT,
+ struct ConsumeTicketResultMessage,
+ h),
+ GNUNET_MQ_hd_fixed_size (revoke_ticket_result,
+ GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_REVOKE_TICKET_RESULT,
+ struct RevokeTicketResultMessage,
+ h),
GNUNET_MQ_handler_end ()
};
struct GNUNET_IDENTITY_PROVIDER_Operation *op;
@@ -417,111 +846,6 @@ GNUNET_IDENTITY_PROVIDER_connect (const struct GNUNET_CONFIGURATION_Handle *cfg)
/**
- * Issue an identity token
- *
- * @param id identity service to query
- * @param service_name for which service is an identity wanted
- * @param cb function to call with the result (will only be called once)
- * @param cb_cls closure for @a cb
- * @return handle to abort the operation
- */
-struct GNUNET_IDENTITY_PROVIDER_Operation *
-GNUNET_IDENTITY_PROVIDER_issue_token (struct GNUNET_IDENTITY_PROVIDER_Handle *id,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *iss_key,
- const struct GNUNET_CRYPTO_EcdsaPublicKey *aud_key,
- const char* scopes,
- struct GNUNET_TIME_Absolute expiration,
- uint64_t nonce,
- GNUNET_IDENTITY_PROVIDER_IssueCallback cb,
- void *cb_cls)
-{
- struct GNUNET_IDENTITY_PROVIDER_Operation *op;
- struct IssueMessage *im;
- size_t slen;
-
- slen = strlen (scopes) + 1;
- if (slen >= GNUNET_MAX_MESSAGE_SIZE - sizeof (struct IssueMessage))
- {
- GNUNET_break (0);
- return NULL;
- }
- op = GNUNET_new (struct GNUNET_IDENTITY_PROVIDER_Operation);
- op->h = id;
- op->iss_cb = cb;
- op->cls = cb_cls;
- op->r_id = id->r_id_gen++;
- op->env = GNUNET_MQ_msg_extra (im,
- slen,
- GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_ISSUE);
- im->id = op->r_id;
- im->iss_key = *iss_key;
- im->aud_key = *aud_key;
- im->nonce = htonl (nonce);
- im->expiration = GNUNET_TIME_absolute_hton (expiration);
- GNUNET_memcpy (&im[1], scopes, slen);
- GNUNET_CONTAINER_DLL_insert_tail (id->op_head,
- id->op_tail,
- op);
- if (NULL != id->mq)
- GNUNET_MQ_send_copy (id->mq,
- op->env);
- return op;
-}
-
-
-/**
- * Exchange a token ticket for a token
- *
- * @param id identity provider service
- * @param ticket ticket to exchange
- * @param cont function to call once the operation finished
- * @param cont_cls closure for @a cont
- * @return handle to abort the operation
- */
-struct GNUNET_IDENTITY_PROVIDER_Operation *
-GNUNET_IDENTITY_PROVIDER_exchange_ticket (struct GNUNET_IDENTITY_PROVIDER_Handle *id,
- const struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *aud_privkey,
- GNUNET_IDENTITY_PROVIDER_ExchangeCallback cont,
- void *cont_cls)
-{
- struct GNUNET_IDENTITY_PROVIDER_Operation *op;
- struct ExchangeMessage *em;
- size_t slen;
- char *ticket_str;
-
- ticket_str = GNUNET_IDENTITY_PROVIDER_ticket_to_string (ticket);
-
- slen = strlen (ticket_str) + 1;
- if (slen >= GNUNET_MAX_MESSAGE_SIZE - sizeof (struct ExchangeMessage))
- {
- GNUNET_free (ticket_str);
- GNUNET_break (0);
- return NULL;
- }
- op = GNUNET_new (struct GNUNET_IDENTITY_PROVIDER_Operation);
- op->h = id;
- op->ex_cb = cont;
- op->cls = cont_cls;
- op->r_id = id->r_id_gen++;
- op->env = GNUNET_MQ_msg_extra (em,
- slen,
- GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_EXCHANGE);
- em->aud_privkey = *aud_privkey;
- em->id = htonl (op->r_id);
- GNUNET_memcpy (&em[1], ticket_str, slen);
- GNUNET_free (ticket_str);
- GNUNET_CONTAINER_DLL_insert_tail (id->op_head,
- id->op_tail,
- op);
- if (NULL != id->mq)
- GNUNET_MQ_send_copy (id->mq,
- op->env);
- return op;
-}
-
-
-/**
* Cancel an operation. Note that the operation MAY still
* be executed; this merely cancels the continuation; if the request
* was already transmitted, the service may still choose to complete
@@ -566,80 +890,483 @@ GNUNET_IDENTITY_PROVIDER_disconnect (struct GNUNET_IDENTITY_PROVIDER_Handle *h)
}
/**
- * Convenience API
+ * Store an attribute. If the attribute is already present,
+ * it is replaced with the new attribute.
+ *
+ * @param h handle to the identity provider
+ * @param pkey private key of the identity
+ * @param name the attribute name
+ * @param value the attribute value
+ * @param cont continuation to call when done
+ * @param cont_cls closure for @a cont
+ * @return handle to abort the request
+ */
+struct GNUNET_IDENTITY_PROVIDER_Operation *
+GNUNET_IDENTITY_PROVIDER_attribute_store (struct GNUNET_IDENTITY_PROVIDER_Handle *h,
+ const struct GNUNET_CRYPTO_EcdsaPrivateKey *pkey,
+ const struct GNUNET_IDENTITY_ATTRIBUTE_Claim *attr,
+ GNUNET_IDENTITY_PROVIDER_ContinuationWithStatus cont,
+ void *cont_cls)
+{
+ struct GNUNET_IDENTITY_PROVIDER_Operation *op;
+ struct AttributeStoreMessage *sam;
+ size_t attr_len;
+
+ op = GNUNET_new (struct GNUNET_IDENTITY_PROVIDER_Operation);
+ op->h = h;
+ op->as_cb = cont;
+ op->cls = cont_cls;
+ op->r_id = h->r_id_gen++;
+ GNUNET_CONTAINER_DLL_insert_tail (h->op_head,
+ h->op_tail,
+ op);
+ attr_len = GNUNET_IDENTITY_ATTRIBUTE_serialize_get_size (attr);
+ op->env = GNUNET_MQ_msg_extra (sam,
+ attr_len,
+ GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_ATTRIBUTE_STORE);
+ sam->identity = *pkey;
+ sam->id = htonl (op->r_id);
+
+ GNUNET_IDENTITY_ATTRIBUTE_serialize (attr,
+ (char*)&sam[1]);
+
+ sam->attr_len = htons (attr_len);
+ if (NULL != h->mq)
+ GNUNET_MQ_send_copy (h->mq,
+ op->env);
+ return op;
+
+}
+
+
+/**
+ * List all attributes for a local identity.
+ * This MUST lock the `struct GNUNET_IDENTITY_PROVIDER_Handle`
+ * for any other calls than #GNUNET_IDENTITY_PROVIDER_get_attributes_next() and
+ * #GNUNET_IDENTITY_PROVIDER_get_attributes_stop. @a proc will be called once
+ * immediately, and then again after
+ * #GNUNET_IDENTITY_PROVIDER_get_attributes_next() is invoked.
+ *
+ * On error (disconnect), @a error_cb will be invoked.
+ * On normal completion, @a finish_cb proc will be
+ * invoked.
+ *
+ * @param h handle to the idp
+ * @param identity identity to access
+ * @param error_cb function to call on error (i.e. disconnect),
+ * the handle is afterwards invalid
+ * @param error_cb_cls closure for @a error_cb
+ * @param proc function to call on each attribute; it
+ * will be called repeatedly with a value (if available)
+ * @param proc_cls closure for @a proc
+ * @param finish_cb function to call on completion
+ * the handle is afterwards invalid
+ * @param finish_cb_cls closure for @a finish_cb
+ * @return an iterator handle to use for iteration
+ */
+struct GNUNET_IDENTITY_PROVIDER_AttributeIterator *
+GNUNET_IDENTITY_PROVIDER_get_attributes_start (struct GNUNET_IDENTITY_PROVIDER_Handle *h,
+ const struct GNUNET_CRYPTO_EcdsaPrivateKey *identity,
+ GNUNET_SCHEDULER_TaskCallback error_cb,
+ void *error_cb_cls,
+ GNUNET_IDENTITY_PROVIDER_AttributeResult proc,
+ void *proc_cls,
+ GNUNET_SCHEDULER_TaskCallback finish_cb,
+ void *finish_cb_cls)
+{
+ struct GNUNET_IDENTITY_PROVIDER_AttributeIterator *it;
+ struct GNUNET_MQ_Envelope *env;
+ struct AttributeIterationStartMessage *msg;
+ uint32_t rid;
+
+ rid = h->r_id_gen++;
+ it = GNUNET_new (struct GNUNET_IDENTITY_PROVIDER_AttributeIterator);
+ it->h = h;
+ it->error_cb = error_cb;
+ it->error_cb_cls = error_cb_cls;
+ it->finish_cb = finish_cb;
+ it->finish_cb_cls = finish_cb_cls;
+ it->proc = proc;
+ it->proc_cls = proc_cls;
+ it->r_id = rid;
+ it->identity = *identity;
+ GNUNET_CONTAINER_DLL_insert_tail (h->it_head,
+ h->it_tail,
+ it);
+ env = GNUNET_MQ_msg (msg,
+ GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_ATTRIBUTE_ITERATION_START);
+ msg->id = htonl (rid);
+ msg->identity = *identity;
+ if (NULL == h->mq)
+ it->env = env;
+ else
+ GNUNET_MQ_send (h->mq,
+ env);
+ return it;
+}
+
+
+/**
+ * Calls the record processor specified in #GNUNET_IDENTITY_PROVIDER_get_attributes_start
+ * for the next record.
+ *
+ * @param it the iterator
*/
+void
+GNUNET_IDENTITY_PROVIDER_get_attributes_next (struct GNUNET_IDENTITY_PROVIDER_AttributeIterator *it)
+{
+ struct GNUNET_IDENTITY_PROVIDER_Handle *h = it->h;
+ struct AttributeIterationNextMessage *msg;
+ struct GNUNET_MQ_Envelope *env;
+
+ env = GNUNET_MQ_msg (msg,
+ GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_ATTRIBUTE_ITERATION_NEXT);
+ msg->id = htonl (it->r_id);
+ GNUNET_MQ_send (h->mq,
+ env);
+}
/**
- * Destroy token
+ * Stops iteration and releases the idp handle for further calls. Must
+ * be called on any iteration that has not yet completed prior to calling
+ * #GNUNET_IDENTITY_PROVIDER_disconnect.
*
- * @param token the token
+ * @param it the iterator
*/
void
-GNUNET_IDENTITY_PROVIDER_token_destroy(struct GNUNET_IDENTITY_PROVIDER_Token *token)
+GNUNET_IDENTITY_PROVIDER_get_attributes_stop (struct GNUNET_IDENTITY_PROVIDER_AttributeIterator *it)
+{
+ struct GNUNET_IDENTITY_PROVIDER_Handle *h = it->h;
+ struct GNUNET_MQ_Envelope *env;
+ struct AttributeIterationStopMessage *msg;
+
+ if (NULL != h->mq)
+ {
+ env = GNUNET_MQ_msg (msg,
+ GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_ATTRIBUTE_ITERATION_STOP);
+ msg->id = htonl (it->r_id);
+ GNUNET_MQ_send (h->mq,
+ env);
+ }
+ free_it (it);
+}
+
+
+/** TODO
+ * Issues a ticket to another identity. The identity may use
+ * @GNUNET_IDENTITY_PROVIDER_authorization_ticket_consume to consume the ticket
+ * and retrieve the attributes specified in the AttributeList.
+ *
+ * @param h the identity provider to use
+ * @param iss the issuing identity
+ * @param rp the subject of the ticket (the relying party)
+ * @param attr the attributes that the relying party is given access to
+ * @param cb the callback
+ * @param cb_cls the callback closure
+ * @return handle to abort the operation
+ */
+struct GNUNET_IDENTITY_PROVIDER_Operation *
+GNUNET_IDENTITY_PROVIDER_ticket_issue (struct GNUNET_IDENTITY_PROVIDER_Handle *h,
+ const struct GNUNET_CRYPTO_EcdsaPrivateKey *iss,
+ const struct GNUNET_CRYPTO_EcdsaPublicKey *rp,
+ const struct GNUNET_IDENTITY_ATTRIBUTE_ClaimList *attrs,
+ GNUNET_IDENTITY_PROVIDER_TicketCallback cb,
+ void *cb_cls)
+{
+ struct GNUNET_IDENTITY_PROVIDER_Operation *op;
+ struct IssueTicketMessage *tim;
+ size_t attr_len;
+
+ op = GNUNET_new (struct GNUNET_IDENTITY_PROVIDER_Operation);
+ op->h = h;
+ op->tr_cb = cb;
+ op->cls = cb_cls;
+ op->r_id = h->r_id_gen++;
+ GNUNET_CONTAINER_DLL_insert_tail (h->op_head,
+ h->op_tail,
+ op);
+ attr_len = GNUNET_IDENTITY_ATTRIBUTE_list_serialize_get_size (attrs);
+ op->env = GNUNET_MQ_msg_extra (tim,
+ attr_len,
+ GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_ISSUE_TICKET);
+ tim->identity = *iss;
+ tim->rp = *rp;
+ tim->id = htonl (op->r_id);
+
+ GNUNET_IDENTITY_ATTRIBUTE_list_serialize (attrs,
+ (char*)&tim[1]);
+
+ tim->attr_len = htons (attr_len);
+ if (NULL != h->mq)
+ GNUNET_MQ_send_copy (h->mq,
+ op->env);
+ return op;
+}
+
+/**
+ * Consumes an issued ticket. The ticket is persisted
+ * and used to retrieve identity information from the issuer
+ *
+ * @param id the identity provider to use
+ * @param identity the identity that is the subject of the issued ticket (the relying party)
+ * @param ticket the issued ticket to consume
+ * @param cb the callback to call
+ * @param cb_cls the callback closure
+ * @return handle to abort the operation
+ */
+struct GNUNET_IDENTITY_PROVIDER_Operation *
+GNUNET_IDENTITY_PROVIDER_ticket_consume (struct GNUNET_IDENTITY_PROVIDER_Handle *h,
+ const struct GNUNET_CRYPTO_EcdsaPrivateKey *identity,
+ const struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket,
+ GNUNET_IDENTITY_PROVIDER_AttributeResult cb,
+ void *cb_cls)
{
- GNUNET_assert (NULL != token);
- if (NULL != token->data)
- GNUNET_free (token->data);
- GNUNET_free (token);
+ struct GNUNET_IDENTITY_PROVIDER_Operation *op;
+ struct ConsumeTicketMessage *ctm;
+
+ op = GNUNET_new (struct GNUNET_IDENTITY_PROVIDER_Operation);
+ op->h = h;
+ op->ar_cb = cb;
+ op->cls = cb_cls;
+ op->r_id = h->r_id_gen++;
+ GNUNET_CONTAINER_DLL_insert_tail (h->op_head,
+ h->op_tail,
+ op);
+ op->env = GNUNET_MQ_msg_extra (ctm,
+ sizeof (const struct GNUNET_IDENTITY_PROVIDER_Ticket),
+ GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_CONSUME_TICKET);
+ ctm->identity = *identity;
+ ctm->id = htonl (op->r_id);
+
+ GNUNET_memcpy ((char*)&ctm[1],
+ ticket,
+ sizeof (const struct GNUNET_IDENTITY_PROVIDER_Ticket));
+
+ if (NULL != h->mq)
+ GNUNET_MQ_send_copy (h->mq,
+ op->env);
+ return op;
+
}
+
/**
- * Returns string representation of token. A JSON-Web-Token.
+ * Lists all tickets that have been issued to remote
+ * identites (relying parties)
*
- * @param token the token
- * @return The JWT (must be freed)
+ * @param h the identity provider to use
+ * @param identity the issuing identity
+ * @param error_cb function to call on error (i.e. disconnect),
+ * the handle is afterwards invalid
+ * @param error_cb_cls closure for @a error_cb
+ * @param proc function to call on each ticket; it
+ * will be called repeatedly with a value (if available)
+ * @param proc_cls closure for @a proc
+ * @param finish_cb function to call on completion
+ * the handle is afterwards invalid
+ * @param finish_cb_cls closure for @a finish_cb
+ * @return an iterator handle to use for iteration
*/
-char *
-GNUNET_IDENTITY_PROVIDER_token_to_string (const struct GNUNET_IDENTITY_PROVIDER_Token *token)
+struct GNUNET_IDENTITY_PROVIDER_TicketIterator *
+GNUNET_IDENTITY_PROVIDER_ticket_iteration_start (struct GNUNET_IDENTITY_PROVIDER_Handle *h,
+ const struct GNUNET_CRYPTO_EcdsaPrivateKey *identity,
+ GNUNET_SCHEDULER_TaskCallback error_cb,
+ void *error_cb_cls,
+ GNUNET_IDENTITY_PROVIDER_TicketCallback proc,
+ void *proc_cls,
+ GNUNET_SCHEDULER_TaskCallback finish_cb,
+ void *finish_cb_cls)
{
- return GNUNET_strdup (token->data);
+ struct GNUNET_IDENTITY_PROVIDER_TicketIterator *it;
+ struct GNUNET_CRYPTO_EcdsaPublicKey identity_pub;
+ struct GNUNET_MQ_Envelope *env;
+ struct TicketIterationStartMessage *msg;
+ uint32_t rid;
+
+ GNUNET_CRYPTO_ecdsa_key_get_public (identity,
+ &identity_pub);
+ rid = h->r_id_gen++;
+ it = GNUNET_new (struct GNUNET_IDENTITY_PROVIDER_TicketIterator);
+ it->h = h;
+ it->error_cb = error_cb;
+ it->error_cb_cls = error_cb_cls;
+ it->finish_cb = finish_cb;
+ it->finish_cb_cls = finish_cb_cls;
+ it->tr_cb = proc;
+ it->cls = proc_cls;
+ it->r_id = rid;
+ GNUNET_CONTAINER_DLL_insert_tail (h->ticket_it_head,
+ h->ticket_it_tail,
+ it);
+ env = GNUNET_MQ_msg (msg,
+ GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_TICKET_ITERATION_START);
+ msg->id = htonl (rid);
+ msg->identity = identity_pub;
+ msg->is_audience = htonl (GNUNET_NO);
+ if (NULL == h->mq)
+ it->env = env;
+ else
+ GNUNET_MQ_send (h->mq,
+ env);
+ return it;
+
}
+
/**
- * Returns string representation of ticket. Base64-Encoded
+ * Lists all tickets that have been issued to remote
+ * identites (relying parties)
*
- * @param ticket the ticket
- * @return the Base64-Encoded ticket
+ * @param id the identity provider to use
+ * @param identity the issuing identity
+ * @param error_cb function to call on error (i.e. disconnect),
+ * the handle is afterwards invalid
+ * @param error_cb_cls closure for @a error_cb
+ * @param proc function to call on each ticket; it
+ * will be called repeatedly with a value (if available)
+ * @param proc_cls closure for @a proc
+ * @param finish_cb function to call on completion
+ * the handle is afterwards invalid
+ * @param finish_cb_cls closure for @a finish_cb
+ * @return an iterator handle to use for iteration
*/
-char *
-GNUNET_IDENTITY_PROVIDER_ticket_to_string (const struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket)
+struct GNUNET_IDENTITY_PROVIDER_TicketIterator *
+GNUNET_IDENTITY_PROVIDER_ticket_iteration_start_rp (struct GNUNET_IDENTITY_PROVIDER_Handle *h,
+ const struct GNUNET_CRYPTO_EcdsaPublicKey *identity,
+ GNUNET_SCHEDULER_TaskCallback error_cb,
+ void *error_cb_cls,
+ GNUNET_IDENTITY_PROVIDER_TicketCallback proc,
+ void *proc_cls,
+ GNUNET_SCHEDULER_TaskCallback finish_cb,
+ void *finish_cb_cls)
{
- return GNUNET_strdup (ticket->data);
+ struct GNUNET_IDENTITY_PROVIDER_TicketIterator *it;
+ struct GNUNET_MQ_Envelope *env;
+ struct TicketIterationStartMessage *msg;
+ uint32_t rid;
+
+ rid = h->r_id_gen++;
+ it = GNUNET_new (struct GNUNET_IDENTITY_PROVIDER_TicketIterator);
+ it->h = h;
+ it->error_cb = error_cb;
+ it->error_cb_cls = error_cb_cls;
+ it->finish_cb = finish_cb;
+ it->finish_cb_cls = finish_cb_cls;
+ it->tr_cb = proc;
+ it->cls = proc_cls;
+ it->r_id = rid;
+ GNUNET_CONTAINER_DLL_insert_tail (h->ticket_it_head,
+ h->ticket_it_tail,
+ it);
+ env = GNUNET_MQ_msg (msg,
+ GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_TICKET_ITERATION_START);
+ msg->id = htonl (rid);
+ msg->identity = *identity;
+ msg->is_audience = htonl (GNUNET_YES);
+ if (NULL == h->mq)
+ it->env = env;
+ else
+ GNUNET_MQ_send (h->mq,
+ env);
+ return it;
+
+
}
/**
- * Created a ticket from a string (Base64 encoded ticket)
+ * Calls the record processor specified in #GNUNET_IDENTITY_PROVIDER_ticket_iteration_start
+ * for the next record.
*
- * @param input Base64 encoded ticket
- * @param ticket pointer where the ticket is stored
- * @return GNUNET_OK
+ * @param it the iterator
*/
-int
-GNUNET_IDENTITY_PROVIDER_string_to_ticket (const char* input,
- struct GNUNET_IDENTITY_PROVIDER_Ticket **ticket)
+void
+GNUNET_IDENTITY_PROVIDER_ticket_iteration_next (struct GNUNET_IDENTITY_PROVIDER_TicketIterator *it)
{
- *ticket = GNUNET_malloc (sizeof (struct GNUNET_IDENTITY_PROVIDER_Ticket));
- (*ticket)->data = GNUNET_strdup (input);
- return GNUNET_OK;
+ struct GNUNET_IDENTITY_PROVIDER_Handle *h = it->h;
+ struct TicketIterationNextMessage *msg;
+ struct GNUNET_MQ_Envelope *env;
+
+ env = GNUNET_MQ_msg (msg,
+ GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_TICKET_ITERATION_NEXT);
+ msg->id = htonl (it->r_id);
+ GNUNET_MQ_send (h->mq,
+ env);
}
/**
- * Destroys a ticket
+ * Stops iteration and releases the idp handle for further calls. Must
+ * be called on any iteration that has not yet completed prior to calling
+ * #GNUNET_IDENTITY_PROVIDER_disconnect.
*
- * @param ticket the ticket to destroy
+ * @param it the iterator
*/
void
-GNUNET_IDENTITY_PROVIDER_ticket_destroy(struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket)
+GNUNET_IDENTITY_PROVIDER_ticket_iteration_stop (struct GNUNET_IDENTITY_PROVIDER_TicketIterator *it)
{
- GNUNET_assert (NULL != ticket);
- if (NULL != ticket->data)
- GNUNET_free (ticket->data);
- GNUNET_free (ticket);
+ struct GNUNET_IDENTITY_PROVIDER_Handle *h = it->h;
+ struct GNUNET_MQ_Envelope *env;
+ struct TicketIterationStopMessage *msg;
+
+ if (NULL != h->mq)
+ {
+ env = GNUNET_MQ_msg (msg,
+ GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_TICKET_ITERATION_STOP);
+ msg->id = htonl (it->r_id);
+ GNUNET_MQ_send (h->mq,
+ env);
+ }
+ GNUNET_free (it);
}
+/**
+ * Revoked an issued ticket. The relying party will be unable to retrieve
+ * updated attributes.
+ *
+ * @param id the identity provider to use
+ * @param identity the issuing identity
+ * @param ticket the ticket to revoke
+ * @param cb the callback
+ * @param cb_cls the callback closure
+ * @return handle to abort the operation
+ */
+struct GNUNET_IDENTITY_PROVIDER_Operation *
+GNUNET_IDENTITY_PROVIDER_ticket_revoke (struct GNUNET_IDENTITY_PROVIDER_Handle *h,
+ const struct GNUNET_CRYPTO_EcdsaPrivateKey *identity,
+ const struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket,
+ GNUNET_IDENTITY_PROVIDER_ContinuationWithStatus cb,
+ void *cb_cls)
+{
+ struct GNUNET_IDENTITY_PROVIDER_Operation *op;
+ struct GNUNET_MQ_Envelope *env;
+ struct RevokeTicketMessage *msg;
+ uint32_t rid;
+ rid = h->r_id_gen++;
+ op = GNUNET_new (struct GNUNET_IDENTITY_PROVIDER_Operation);
+ op->h = h;
+ op->rvk_cb = cb;
+ op->cls = cb_cls;
+ op->r_id = rid;
+ GNUNET_CONTAINER_DLL_insert_tail (h->op_head,
+ h->op_tail,
+ op);
+ env = GNUNET_MQ_msg_extra (msg,
+ sizeof (struct GNUNET_IDENTITY_PROVIDER_Ticket),
+ GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_REVOKE_TICKET);
+ msg->id = htonl (rid);
+ msg->identity = *identity;
+ memcpy (&msg[1],
+ ticket,
+ sizeof (struct GNUNET_IDENTITY_PROVIDER_Ticket));
+ if (NULL == h->mq)
+ op->env = env;
+ else
+ GNUNET_MQ_send (h->mq,
+ env);
+ return op;
+}
diff --git a/src/identity-provider/identity_token.c b/src/identity-provider/identity_token.c
deleted file mode 100644
index 31249840b0..0000000000
--- a/src/identity-provider/identity_token.c
+++ /dev/null
@@ -1,964 +0,0 @@
-/*
- This file is part of GNUnet
- Copyright (C) 2010-2015 GNUnet e.V.
-
- GNUnet is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published
- by the Free Software Foundation; either version 3, or (at your
- option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with GNUnet; see the file COPYING. If not, write to the
- Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA.
- */
-
-/**
- * @file identity-provider/identity_token.c
- * @brief helper library to manage identity tokens
- * @author Martin Schanzenbach
- */
-#include "platform.h"
-#include "gnunet_util_lib.h"
-#include "gnunet_signatures.h"
-#include "identity_token.h"
-#include <jansson.h>
-#include <inttypes.h>
-
-#define JWT_ALG "alg"
-
-#define JWT_ALG_VALUE "ED512"
-
-#define JWT_TYP "typ"
-
-#define JWT_TYP_VALUE "jwt"
-
-/**
- * Crypto helper functions
- */
-
-static int
-create_sym_key_from_ecdh(const struct GNUNET_HashCode *new_key_hash,
- struct GNUNET_CRYPTO_SymmetricSessionKey *skey,
- struct GNUNET_CRYPTO_SymmetricInitializationVector *iv)
-{
- struct GNUNET_CRYPTO_HashAsciiEncoded new_key_hash_str;
-
- GNUNET_CRYPTO_hash_to_enc (new_key_hash,
- &new_key_hash_str);
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Creating symmetric rsa key from %s\n", (char*)&new_key_hash_str);
- static const char ctx_key[] = "gnuid-aes-ctx-key";
- GNUNET_CRYPTO_kdf (skey, sizeof (struct GNUNET_CRYPTO_SymmetricSessionKey),
- new_key_hash, sizeof (struct GNUNET_HashCode),
- ctx_key, strlen (ctx_key),
- NULL, 0);
- static const char ctx_iv[] = "gnuid-aes-ctx-iv";
- GNUNET_CRYPTO_kdf (iv, sizeof (struct GNUNET_CRYPTO_SymmetricInitializationVector),
- new_key_hash, sizeof (struct GNUNET_HashCode),
- ctx_iv, strlen (ctx_iv),
- NULL, 0);
- return GNUNET_OK;
-}
-
-
-
-/**
- * Decrypts data part from a token code
- */
-static int
-decrypt_str_ecdhe (const struct GNUNET_CRYPTO_EcdsaPrivateKey *priv_key,
- const struct GNUNET_CRYPTO_EcdhePublicKey *ecdh_key,
- const char *cyphertext,
- size_t cyphertext_len,
- char **result_str)
-{
- struct GNUNET_HashCode new_key_hash;
- struct GNUNET_CRYPTO_SymmetricSessionKey enc_key;
- struct GNUNET_CRYPTO_SymmetricInitializationVector enc_iv;
-
- char *str_buf = GNUNET_malloc (cyphertext_len);
- size_t str_size;
-
- //Calculate symmetric key from ecdh parameters
- GNUNET_assert (GNUNET_OK == GNUNET_CRYPTO_ecdsa_ecdh (priv_key,
- ecdh_key,
- &new_key_hash));
-
- create_sym_key_from_ecdh (&new_key_hash,
- &enc_key,
- &enc_iv);
-
- str_size = GNUNET_CRYPTO_symmetric_decrypt (cyphertext,
- cyphertext_len,
- &enc_key,
- &enc_iv,
- str_buf);
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Decrypted bytes: %zd Expected bytes: %zd\n",
- str_size,
- cyphertext_len);
- if (-1 == str_size)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "ECDH invalid\n");
- GNUNET_free (str_buf);
- return GNUNET_SYSERR;
- }
- *result_str = GNUNET_malloc (str_size+1);
- GNUNET_memcpy (*result_str, str_buf, str_size);
- (*result_str)[str_size] = '\0';
- GNUNET_free (str_buf);
- return GNUNET_OK;
-
-}
-
-/**
- * Decrypt string using pubkey and ECDHE
-*/
-static int
-decrypt_str_ecdhe2 (const struct GNUNET_CRYPTO_EcdhePrivateKey *ecdh_privkey,
- const struct GNUNET_CRYPTO_EcdsaPublicKey *aud_key,
- const char *ciphertext,
- size_t ciphertext_len,
- char **plaintext)
-{
- struct GNUNET_CRYPTO_SymmetricSessionKey skey;
- struct GNUNET_CRYPTO_SymmetricInitializationVector iv;
- struct GNUNET_HashCode new_key_hash;
-
- //This is true see documentation for GNUNET_CRYPTO_symmetric_encrypt
- *plaintext = GNUNET_malloc (ciphertext_len);
-
- // Derived key K = H(eB)
- GNUNET_assert (GNUNET_OK == GNUNET_CRYPTO_ecdh_ecdsa (ecdh_privkey,
- aud_key,
- &new_key_hash));
- create_sym_key_from_ecdh(&new_key_hash, &skey, &iv);
- GNUNET_CRYPTO_symmetric_decrypt (ciphertext,
- ciphertext_len,
- &skey, &iv,
- *plaintext);
- return GNUNET_OK;
-}
-
-
-/**
- * Encrypt string using pubkey and ECDHE
- * Returns ECDHE pubkey to be used for decryption
- */
-static int
-encrypt_str_ecdhe (const char *plaintext,
- const struct GNUNET_CRYPTO_EcdsaPublicKey *pub_key,
- char **cyphertext,
- struct GNUNET_CRYPTO_EcdhePrivateKey **ecdh_privkey,
- struct GNUNET_CRYPTO_EcdhePublicKey *ecdh_pubkey)
-{
- struct GNUNET_CRYPTO_SymmetricSessionKey skey;
- struct GNUNET_CRYPTO_SymmetricInitializationVector iv;
- struct GNUNET_HashCode new_key_hash;
- ssize_t enc_size;
-
- // ECDH keypair E = eG
- *ecdh_privkey = GNUNET_CRYPTO_ecdhe_key_create();
- GNUNET_CRYPTO_ecdhe_key_get_public (*ecdh_privkey,
- ecdh_pubkey);
-
- //This is true see documentation for GNUNET_CRYPTO_symmetric_encrypt
- *cyphertext = GNUNET_malloc (strlen (plaintext));
-
- // Derived key K = H(eB)
- GNUNET_assert (GNUNET_OK == GNUNET_CRYPTO_ecdh_ecdsa (*ecdh_privkey,
- pub_key,
- &new_key_hash));
- create_sym_key_from_ecdh(&new_key_hash, &skey, &iv);
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Encrypting string %s\n (len=%zd)",
- plaintext,
- strlen (plaintext));
- enc_size = GNUNET_CRYPTO_symmetric_encrypt (plaintext,
- strlen (plaintext),
- &skey, &iv,
- *cyphertext);
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Encrypted (len=%zd)", enc_size);
- return GNUNET_OK;
-}
-
-
-/**
- * Identity Token API
- */
-
-
-/**
- * Create an Identity Token
- *
- * @param type the JSON API resource type
- * @param id the JSON API resource id
- * @return a new JSON API resource or NULL on error.
- */
-struct IdentityToken*
-token_create (const struct GNUNET_CRYPTO_EcdsaPublicKey* iss,
- const struct GNUNET_CRYPTO_EcdsaPublicKey* aud)
-{
- struct IdentityToken *token;
- char* audience;
- char* issuer;
-
- issuer = GNUNET_STRINGS_data_to_string_alloc (iss,
- sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey));
- audience = GNUNET_STRINGS_data_to_string_alloc (aud,
- sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey));
-
- token = GNUNET_malloc (sizeof (struct IdentityToken));
- token_add_attr (token, "iss", issuer);
- token_add_attr (token, "aud", audience);
- token_add_attr (token, "sub", issuer);
- token->aud_key = *aud;
- GNUNET_free (issuer);
- GNUNET_free (audience);
- return token;
-}
-
-void
-token_destroy (struct IdentityToken *token)
-{
- struct TokenAttr *attr;
- struct TokenAttr *tmp_attr;
- struct TokenAttrValue *val;
- struct TokenAttrValue *tmp_val;
-
- for (attr = token->attr_head; NULL != attr;)
- {
- tmp_attr = attr->next;
- GNUNET_CONTAINER_DLL_remove (token->attr_head,
- token->attr_tail,
- attr);
- for (val = attr->val_head; NULL != val;)
- {
- tmp_val = val->next;
- GNUNET_CONTAINER_DLL_remove (attr->val_head,
- attr->val_tail,
- val);
- if (NULL != val->value)
- GNUNET_free (val->value);
- GNUNET_free (val);
- val = tmp_val;
- }
- GNUNET_free (attr->name);
- GNUNET_free (attr);
- attr = tmp_attr;
- }
-
-
- GNUNET_free (token);
-}
-
-void
-token_add_attr (struct IdentityToken *token,
- const char* key,
- const char* value)
-{
- struct TokenAttr *attr;
- struct TokenAttrValue *new_val;
- GNUNET_assert (NULL != token);
-
- new_val = GNUNET_malloc (sizeof (struct TokenAttrValue));
- new_val->value = GNUNET_strdup (value);
- for (attr = token->attr_head; NULL != attr; attr = attr->next)
- {
- if (0 == strcmp (key, attr->name))
- break;
- }
-
- if (NULL == attr)
- {
- attr = GNUNET_malloc (sizeof (struct TokenAttr));
- attr->name = GNUNET_strdup (key);
- GNUNET_CONTAINER_DLL_insert (token->attr_head,
- token->attr_tail,
- attr);
- }
-
- GNUNET_CONTAINER_DLL_insert (attr->val_head,
- attr->val_tail,
- new_val);
-}
-
-void
-token_add_attr_int (struct IdentityToken *token,
- const char* key,
- uint64_t value)
-{
- struct TokenAttr *attr;
- struct TokenAttrValue *new_val;
- GNUNET_assert (NULL != token);
-
- new_val = GNUNET_malloc (sizeof (struct TokenAttrValue));
- new_val->int_value = value;
- for (attr = token->attr_head; NULL != attr; attr = attr->next)
- {
- if (0 == strcmp (key, attr->name))
- break;
- }
-
- if (NULL == attr)
- {
- attr = GNUNET_malloc (sizeof (struct TokenAttr));
- attr->name = GNUNET_strdup (key);
- GNUNET_CONTAINER_DLL_insert (token->attr_head,
- token->attr_tail,
- attr);
- }
-
- GNUNET_CONTAINER_DLL_insert (attr->val_head,
- attr->val_tail,
- new_val);
-}
-
-static void
-parse_json_payload(const char* payload_base64,
- struct IdentityToken *token)
-{
- const char *key;
- const json_t *value;
- const json_t *arr_value;
- char *payload;
- int idx;
- json_t *payload_json;
- json_error_t err_json;
-
- GNUNET_STRINGS_base64_decode (payload_base64,
- strlen (payload_base64),
- &payload);
- //TODO signature and aud key
- payload_json = json_loads (payload, JSON_DECODE_ANY, &err_json);
-
- json_object_foreach (payload_json, key, value)
- {
- if (json_is_array (value))
- {
- json_array_foreach (value, idx, arr_value)
- {
- if (json_is_integer (arr_value))
- token_add_attr_int (token, key,
- json_integer_value (arr_value));
- else
- token_add_attr (token,
- key,
- json_string_value (arr_value));
- }
- } else {
- if (json_is_integer (value))
- token_add_attr_int (token, key,
- json_integer_value (value));
- else
- token_add_attr (token, key, json_string_value (value));
- }
- }
-
- json_decref (payload_json);
- GNUNET_free (payload);
-}
-
-int
-token_parse2 (const char* raw_data,
- const struct GNUNET_CRYPTO_EcdhePrivateKey *priv_key,
- const struct GNUNET_CRYPTO_EcdsaPublicKey *aud_key,
- struct IdentityToken **result)
-{
- char *enc_token_str;
- char *tmp_buf;
- char *token_str;
- char *enc_token;
- char *payload_base64;
- size_t enc_token_len;
-
- GNUNET_asprintf (&tmp_buf, "%s", raw_data);
- strtok (tmp_buf, ",");
- enc_token_str = strtok (NULL, ",");
-
- enc_token_len = GNUNET_STRINGS_base64_decode (enc_token_str,
- strlen (enc_token_str),
- &enc_token);
- if (GNUNET_OK != decrypt_str_ecdhe2 (priv_key,
- aud_key,
- enc_token,
- enc_token_len,
- &token_str))
- {
- GNUNET_free (tmp_buf);
- GNUNET_free (enc_token);
- return GNUNET_SYSERR;
- }
-
- GNUNET_assert (NULL != strtok (token_str, "."));
- payload_base64 = strtok (NULL, ".");
-
- *result = GNUNET_malloc (sizeof (struct IdentityToken));
- parse_json_payload (payload_base64, *result);
-
- (*result)->aud_key = *aud_key;
- GNUNET_free (enc_token);
- GNUNET_free (token_str);
- GNUNET_free (tmp_buf);
- return GNUNET_OK;
-}
-
-int
-token_parse (const char* raw_data,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *priv_key,
- struct IdentityToken **result)
-{
- char *ecdh_pubkey_str;
- char *enc_token_str;
- char *tmp_buf;
- char *token_str;
- char *enc_token;
- char *payload_base64;
- size_t enc_token_len;
- struct GNUNET_CRYPTO_EcdhePublicKey ecdh_pubkey;
-
- GNUNET_asprintf (&tmp_buf, "%s", raw_data);
- ecdh_pubkey_str = strtok (tmp_buf, ",");
- enc_token_str = strtok (NULL, ",");
-
- GNUNET_assert (NULL != ecdh_pubkey_str);
- GNUNET_assert (NULL != enc_token_str);
-
- GNUNET_STRINGS_string_to_data (ecdh_pubkey_str,
- strlen (ecdh_pubkey_str),
- &ecdh_pubkey,
- sizeof (struct GNUNET_CRYPTO_EcdhePublicKey));
- enc_token_len = GNUNET_STRINGS_base64_decode (enc_token_str,
- strlen (enc_token_str),
- &enc_token);
- if (GNUNET_OK != decrypt_str_ecdhe (priv_key,
- &ecdh_pubkey,
- enc_token,
- enc_token_len,
- &token_str))
- {
- GNUNET_free (tmp_buf);
- GNUNET_free (enc_token);
- return GNUNET_SYSERR;
- }
-
- GNUNET_assert (NULL != strtok (token_str, "."));
- payload_base64 = strtok (NULL, ".");
-
- *result = GNUNET_malloc (sizeof (struct IdentityToken));
- parse_json_payload (payload_base64, *result);
-
- GNUNET_free (enc_token);
- GNUNET_free (token_str);
- GNUNET_free (tmp_buf);
- return GNUNET_OK;
-}
-
-static char*
-create_json_payload (const struct IdentityToken *token)
-{
- struct TokenAttr *attr;
- struct TokenAttrValue *val;
- json_t *root;
- char *json_str;
-
- root = json_object();
- for (attr = token->attr_head; NULL != attr; attr = attr->next)
- {
- for (val = attr->val_head; NULL != val; val = val->next)
- {
- if (NULL != val->value)
- {
- json_object_set_new (root,
- attr->name,
- json_string (val->value));
- } else {
- json_object_set_new (root,
- attr->name,
- json_integer (val->int_value));
- }
- }
- }
- json_str = json_dumps (root, JSON_INDENT(1));
- json_decref (root);
- return json_str;
-}
-
-static char*
-create_json_header(void)
-{
- json_t *root;
- char *json_str;
-
- root = json_object ();
- json_object_set_new (root, JWT_ALG, json_string (JWT_ALG_VALUE));
- json_object_set_new (root, JWT_TYP, json_string (JWT_TYP_VALUE));
-
- json_str = json_dumps (root, JSON_INDENT(1));
- json_decref (root);
- return json_str;
-}
-
-int
-token_to_string (const struct IdentityToken *token,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *priv_key,
- char **result)
-{
- char *payload_str;
- char *header_str;
- char *payload_base64;
- char *header_base64;
- char *padding;
- char *signature_target;
- char *signature_str;
- struct GNUNET_CRYPTO_EccSignaturePurpose *purpose;
- header_str = create_json_header();
- GNUNET_STRINGS_base64_encode (header_str,
- strlen (header_str),
- &header_base64);
- //Remove GNUNET padding of base64
- padding = strtok(header_base64, "=");
- while (NULL != padding)
- padding = strtok(NULL, "=");
-
- payload_str = create_json_payload (token);
- GNUNET_STRINGS_base64_encode (payload_str,
- strlen (payload_str),
- &payload_base64);
-
- //Remove GNUNET padding of base64
- padding = strtok(payload_base64, "=");
- while (NULL != padding)
- padding = strtok(NULL, "=");
-
- GNUNET_asprintf (&signature_target, "%s,%s", header_base64, payload_base64);
- purpose =
- GNUNET_malloc (sizeof (struct GNUNET_CRYPTO_EccSignaturePurpose) +
- strlen (signature_target));
- purpose->size =
- htonl (strlen (signature_target) + sizeof (struct GNUNET_CRYPTO_EccSignaturePurpose));
- purpose->purpose = htonl(GNUNET_SIGNATURE_PURPOSE_GNUID_TOKEN);
- GNUNET_memcpy (&purpose[1], signature_target, strlen (signature_target));
- if (GNUNET_OK != GNUNET_CRYPTO_ecdsa_sign (priv_key,
- purpose,
- (struct GNUNET_CRYPTO_EcdsaSignature *)&token->signature))
- {
- GNUNET_free (signature_target);
- GNUNET_free (payload_str);
- GNUNET_free (payload_base64);
- GNUNET_free (header_base64);
- GNUNET_free (purpose);
- return GNUNET_SYSERR;
- }
-
- GNUNET_STRINGS_base64_encode ((const char*)&token->signature,
- sizeof (struct GNUNET_CRYPTO_EcdsaSignature),
- &signature_str);
- GNUNET_asprintf (result, "%s.%s.%s",
- header_base64, payload_base64, signature_str);
- GNUNET_free (signature_target);
- GNUNET_free (payload_str);
- GNUNET_free (header_str);
- GNUNET_free (signature_str);
- GNUNET_free (payload_base64);
- GNUNET_free (header_base64);
- GNUNET_free (purpose);
- return GNUNET_OK;
-}
-
-int
-token_serialize (const struct IdentityToken *token,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *priv_key,
- struct GNUNET_CRYPTO_EcdhePrivateKey **ecdh_privkey,
- char **result)
-{
- char *token_str;
- char *enc_token;
- char *dh_key_str;
- char *enc_token_base64;
- struct GNUNET_CRYPTO_EcdhePublicKey ecdh_pubkey;
-
- GNUNET_assert (GNUNET_OK == token_to_string (token,
- priv_key,
- &token_str));
-
- GNUNET_assert (GNUNET_OK == encrypt_str_ecdhe (token_str,
- &token->aud_key,
- &enc_token,
- ecdh_privkey,
- &ecdh_pubkey));
- GNUNET_STRINGS_base64_encode (enc_token,
- strlen (token_str),
- &enc_token_base64);
- dh_key_str = GNUNET_STRINGS_data_to_string_alloc (&ecdh_pubkey,
- sizeof (struct GNUNET_CRYPTO_EcdhePublicKey));
- GNUNET_asprintf (result, "%s,%s", dh_key_str, enc_token_base64);
- GNUNET_free (dh_key_str);
- GNUNET_free (enc_token_base64);
- GNUNET_free (enc_token);
- GNUNET_free (token_str);
- return GNUNET_OK;
-}
-
-struct TokenTicketPayload*
-ticket_payload_create (uint64_t nonce,
- const struct GNUNET_CRYPTO_EcdsaPublicKey* identity_pkey,
- const char* lbl_str)
-{
- struct TokenTicketPayload* payload;
-
- payload = GNUNET_malloc (sizeof (struct TokenTicketPayload));
- payload->nonce = nonce;
- payload->identity_key = *identity_pkey;
- GNUNET_asprintf (&payload->label, lbl_str, strlen (lbl_str));
- return payload;
-}
-
-void
-ticket_payload_destroy (struct TokenTicketPayload* payload)
-{
- if (NULL != payload->label)
- GNUNET_free (payload->label);
- GNUNET_free (payload);
-}
-
-void
-ticket_payload_serialize (struct TokenTicketPayload *payload,
- char **result)
-{
- char* identity_key_str;
-
- identity_key_str = GNUNET_STRINGS_data_to_string_alloc (&payload->identity_key,
- sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey));
-
- GNUNET_asprintf (result,
- "{\"nonce\": \"%"SCNu64"\",\"identity\": \"%s\",\"label\": \"%s\"}",
- payload->nonce, identity_key_str, payload->label);
- GNUNET_free (identity_key_str);
-
-}
-
-
-/**
- * Create the token code
- * The data is encrypted with a share ECDH derived secret using B (aud_key)
- * and e (ecdh_privkey)
- * The ticket also contains E (ecdh_pubkey) and a signature over the
- * data and E
- */
-struct TokenTicket*
-ticket_create (uint64_t nonce,
- const struct GNUNET_CRYPTO_EcdsaPublicKey* identity_pkey,
- const char* lbl_str,
- const struct GNUNET_CRYPTO_EcdsaPublicKey *aud_key)
-{
- struct TokenTicket *ticket;
- struct TokenTicketPayload *code_payload;
-
- ticket = GNUNET_malloc (sizeof (struct TokenTicket));
- code_payload = ticket_payload_create (nonce,
- identity_pkey,
- lbl_str);
- ticket->aud_key = *aud_key;
- ticket->payload = code_payload;
-
-
- return ticket;
-}
-
-void
-ticket_destroy (struct TokenTicket *ticket)
-{
- ticket_payload_destroy (ticket->payload);
- GNUNET_free (ticket);
-}
-
-int
-ticket_serialize (struct TokenTicket *ticket,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *priv_key,
- char **result)
-{
- char *code_payload_str;
- char *enc_ticket_payload;
- char *ticket_payload_str;
- char *ticket_sig_str;
- char *ticket_str;
- char *dh_key_str;
- char *write_ptr;
- struct GNUNET_CRYPTO_EcdhePrivateKey *ecdhe_privkey;
-
- struct GNUNET_CRYPTO_EccSignaturePurpose *purpose;
-
- ticket_payload_serialize (ticket->payload,
- &code_payload_str);
-
- GNUNET_assert (GNUNET_OK == encrypt_str_ecdhe (code_payload_str,
- &ticket->aud_key,
- &enc_ticket_payload,
- &ecdhe_privkey,
- &ticket->ecdh_pubkey));
-
- GNUNET_free (ecdhe_privkey);
-
- purpose =
- GNUNET_malloc (sizeof (struct GNUNET_CRYPTO_EccSignaturePurpose) +
- sizeof (struct GNUNET_CRYPTO_EcdhePublicKey) + //E
- strlen (code_payload_str)); // E_K (code_str)
- purpose->size =
- htonl (sizeof (struct GNUNET_CRYPTO_EccSignaturePurpose) +
- sizeof (struct GNUNET_CRYPTO_EcdhePublicKey) +
- strlen (code_payload_str));
- purpose->purpose = htonl(GNUNET_SIGNATURE_PURPOSE_GNUID_TICKET);
- write_ptr = (char*) &purpose[1];
- GNUNET_memcpy (write_ptr,
- &ticket->ecdh_pubkey,
- sizeof (struct GNUNET_CRYPTO_EcdhePublicKey));
- write_ptr += sizeof (struct GNUNET_CRYPTO_EcdhePublicKey);
- GNUNET_memcpy (write_ptr, enc_ticket_payload, strlen (code_payload_str));
- GNUNET_assert (GNUNET_OK == GNUNET_CRYPTO_ecdsa_sign (priv_key,
- purpose,
- &ticket->signature));
- GNUNET_STRINGS_base64_encode (enc_ticket_payload,
- strlen (code_payload_str),
- &ticket_payload_str);
- ticket_sig_str = GNUNET_STRINGS_data_to_string_alloc (&ticket->signature,
- sizeof (struct GNUNET_CRYPTO_EcdsaSignature));
-
- dh_key_str = GNUNET_STRINGS_data_to_string_alloc (&ticket->ecdh_pubkey,
- sizeof (struct GNUNET_CRYPTO_EcdhePublicKey));
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Using ECDH pubkey %s to encrypt\n", dh_key_str);
- GNUNET_asprintf (&ticket_str, "{\"data\": \"%s\", \"ecdh\": \"%s\", \"signature\": \"%s\"}",
- ticket_payload_str, dh_key_str, ticket_sig_str);
- GNUNET_STRINGS_base64_encode (ticket_str, strlen (ticket_str), result);
- GNUNET_free (dh_key_str);
- GNUNET_free (purpose);
- GNUNET_free (ticket_str);
- GNUNET_free (ticket_sig_str);
- GNUNET_free (code_payload_str);
- GNUNET_free (enc_ticket_payload);
- GNUNET_free (ticket_payload_str);
- return GNUNET_OK;
-}
-
-int
-ticket_payload_parse(const char *raw_data,
- ssize_t data_len,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *priv_key,
- const struct GNUNET_CRYPTO_EcdhePublicKey *ecdhe_pkey,
- struct TokenTicketPayload **result)
-{
- const char* label_str;
- const char* nonce_str;
- const char* identity_key_str;
-
- json_t *root;
- json_t *label_json;
- json_t *identity_json;
- json_t *nonce_json;
- json_error_t err_json;
- char* data_str;
- uint64_t nonce;
- struct GNUNET_CRYPTO_EcdsaPublicKey id_pkey;
-
- if (GNUNET_OK != decrypt_str_ecdhe (priv_key,
- ecdhe_pkey,
- raw_data,
- data_len,
- &data_str))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Data decryption failed\n");
- return GNUNET_SYSERR;
- }
-
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Data: %s\n", data_str);
- root = json_loads (data_str, JSON_DECODE_ANY, &err_json);
- if (!root)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Error parsing data: %s\n", err_json.text);
- GNUNET_free (data_str);
- return GNUNET_SYSERR;
- }
-
- identity_json = json_object_get (root, "identity");
- if (!json_is_string (identity_json))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Error parsing data: %s\n", err_json.text);
- json_decref (root);
- GNUNET_free (data_str);
- return GNUNET_SYSERR;
- }
- identity_key_str = json_string_value (identity_json);
- GNUNET_STRINGS_string_to_data (identity_key_str,
- strlen (identity_key_str),
- &id_pkey,
- sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey));
-
-
- label_json = json_object_get (root, "label");
- if (!json_is_string (label_json))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Error parsing data: %s\n", err_json.text);
- json_decref (root);
- GNUNET_free (data_str);
- return GNUNET_SYSERR;
- }
-
- label_str = json_string_value (label_json);
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Found label: %s\n", label_str);
-
- nonce_json = json_object_get (root, "nonce");
- if (!json_is_string (label_json))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Error parsing data: %s\n", err_json.text);
- json_decref (root);
- GNUNET_free (data_str);
- return GNUNET_SYSERR;
- }
-
- nonce_str = json_string_value (nonce_json);
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Found nonce: %s\n", nonce_str);
-
- GNUNET_assert (0 != sscanf (nonce_str, "%"SCNu64, &nonce));
-
- *result = ticket_payload_create (nonce,
- (const struct GNUNET_CRYPTO_EcdsaPublicKey*)&id_pkey,
- label_str);
- GNUNET_free (data_str);
- json_decref (root);
- return GNUNET_OK;
-
-}
-
-int
-ticket_parse (const char *raw_data,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *priv_key,
- struct TokenTicket **result)
-{
- const char* enc_data_str;
- const char* ecdh_enc_str;
- const char* signature_enc_str;
-
- json_t *root;
- json_t *signature_json;
- json_t *ecdh_json;
- json_t *enc_data_json;
- json_error_t err_json;
- char* enc_data;
- char* ticket_decoded;
- char* write_ptr;
- size_t enc_data_len;
- struct GNUNET_CRYPTO_EccSignaturePurpose *purpose;
- struct TokenTicket *ticket;
- struct TokenTicketPayload *ticket_payload;
-
- ticket_decoded = NULL;
- GNUNET_STRINGS_base64_decode (raw_data, strlen (raw_data), &ticket_decoded);
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Ticket: %s\n", ticket_decoded);
- root = json_loads (ticket_decoded, JSON_DECODE_ANY, &err_json);
- if (!root)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "%s\n", err_json.text);
- return GNUNET_SYSERR;
- }
-
- signature_json = json_object_get (root, "signature");
- ecdh_json = json_object_get (root, "ecdh");
- enc_data_json = json_object_get (root, "data");
-
- signature_enc_str = json_string_value (signature_json);
- ecdh_enc_str = json_string_value (ecdh_json);
- enc_data_str = json_string_value (enc_data_json);
-
- ticket = GNUNET_malloc (sizeof (struct TokenTicket));
-
- if (GNUNET_OK != GNUNET_STRINGS_string_to_data (ecdh_enc_str,
- strlen (ecdh_enc_str),
- &ticket->ecdh_pubkey,
- sizeof (struct GNUNET_CRYPTO_EcdhePublicKey)))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "ECDH PKEY %s invalid in data\n", ecdh_enc_str);
- json_decref (root);
- GNUNET_free (ticket);
- return GNUNET_SYSERR;
- }
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Using ECDH pubkey %s for data decryption\n", ecdh_enc_str);
- if (GNUNET_OK != GNUNET_STRINGS_string_to_data (signature_enc_str,
- strlen (signature_enc_str),
- &ticket->signature,
- sizeof (struct GNUNET_CRYPTO_EcdsaSignature)))
- {
- json_decref (root);
- GNUNET_free (ticket_decoded);
- GNUNET_free (ticket);
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "ECDH signature invalid in data\n");
- return GNUNET_SYSERR;
- }
-
- enc_data_len = GNUNET_STRINGS_base64_decode (enc_data_str,
- strlen (enc_data_str),
- &enc_data);
-
-
- if (GNUNET_OK != ticket_payload_parse (enc_data,
- enc_data_len,
- priv_key,
- (const struct GNUNET_CRYPTO_EcdhePublicKey*)&ticket->ecdh_pubkey,
- &ticket_payload))
- {
- json_decref (root);
- GNUNET_free (enc_data);
- GNUNET_free (ticket_decoded);
- GNUNET_free (ticket);
- return GNUNET_SYSERR;
- }
-
- ticket->payload = ticket_payload;
- purpose =
- GNUNET_malloc (sizeof (struct GNUNET_CRYPTO_EccSignaturePurpose) +
- sizeof (struct GNUNET_CRYPTO_EcdhePublicKey) + //E
- enc_data_len); // E_K (code_str)
- purpose->size =
- htonl (sizeof (struct GNUNET_CRYPTO_EccSignaturePurpose) +
- sizeof (struct GNUNET_CRYPTO_EcdhePublicKey) +
- enc_data_len);
- purpose->purpose = htonl(GNUNET_SIGNATURE_PURPOSE_GNUID_TICKET);
- write_ptr = (char*) &purpose[1];
- GNUNET_memcpy (write_ptr, &ticket->ecdh_pubkey, sizeof (struct GNUNET_CRYPTO_EcdhePublicKey));
- write_ptr += sizeof (struct GNUNET_CRYPTO_EcdhePublicKey);
- GNUNET_memcpy (write_ptr, enc_data, enc_data_len);
-
- if (GNUNET_OK != GNUNET_CRYPTO_ecdsa_verify (GNUNET_SIGNATURE_PURPOSE_GNUID_TICKET,
- purpose,
- &ticket->signature,
- &ticket_payload->identity_key))
- {
- ticket_destroy (ticket);
- GNUNET_free (ticket_decoded);
- json_decref (root);
- GNUNET_free (purpose);
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Error verifying signature for ticket\n");
- return GNUNET_SYSERR;
- }
- *result = ticket;
- GNUNET_free (purpose);
-
- GNUNET_free (enc_data);
- GNUNET_free (ticket_decoded);
- json_decref (root);
- return GNUNET_OK;
-
-}
-
-
-
-/* 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 7ded6662ee..0000000000
--- a/src/identity-provider/identity_token.h
+++ /dev/null
@@ -1,346 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2012-2015 GNUnet e.V.
-
- GNUnet is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published
- by the Free Software Foundation; either version 3, or (at your
- option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with GNUnet; see the file COPYING. If not, write to the
- Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA.
- */
-/**
- * @author Martin Schanzenbach
- * @file identity-provider/identity_token.h
- * @brief GNUnet Identity Provider library
- *
- */
-#ifndef IDENTITY_TOKEN_H
-#define IDENTITY_TOKEN_H
-
-#include "gnunet_crypto_lib.h"
-#include <jansson.h>
-
-struct IdentityToken
-{
- /**
- * DLL
- */
- struct TokenAttr *attr_head;
-
- /**
- * DLL
- */
- struct TokenAttr *attr_tail;
-
- /**
- * Token Signature
- */
- struct GNUNET_CRYPTO_EcdsaSignature signature;
-
- /**
- * Audience Pubkey
- */
- struct GNUNET_CRYPTO_EcdsaPublicKey aud_key;
-};
-
-struct TokenAttr
-{
- /**
- * DLL
- */
- struct TokenAttr *next;
-
- /**
- * DLL
- */
- struct TokenAttr *prev;
-
- /**
- * Attribute name
- */
- char *name;
-
- /**
- * Attribute value DLL
- */
- struct TokenAttrValue *val_head;
-
- /**
- * Attribute value DLL
- */
- struct TokenAttrValue *val_tail;
-
-};
-
-struct TokenAttrValue
-{
- /**
- * DLL
- */
- struct TokenAttrValue *next;
-
- /**
- * DLL
- */
- struct TokenAttrValue *prev;
-
- /**
- * Attribute value
- */
- char *value;
-
- /**
- * Attribute int value
- * used if NULL == value
- */
- uint64_t int_value;
-};
-
-struct TokenTicketPayload
-{
- /**
- * Nonce
- */
- uint64_t nonce;
-
- /**
- * Label
- */
- char *label;
-
- /**
- * Issuing Identity
- */
- struct GNUNET_CRYPTO_EcdsaPublicKey identity_key;
-};
-
-
-struct TokenTicket
-{
- /**
- * Meta info
- */
- struct TokenTicketPayload *payload;
-
- /**
- * ECDH Pubkey
- */
- struct GNUNET_CRYPTO_EcdhePublicKey ecdh_pubkey;
-
- /**
- * Signature
- */
- struct GNUNET_CRYPTO_EcdsaSignature signature;
-
- /**
- * Target identity
- */
- struct GNUNET_CRYPTO_EcdsaPublicKey aud_key;
-};
-
-
-
-/**
- * Create an identity token
- *
- * @param iss the issuer string for the token
- * @param aud the audience of the token
- *
- * @return a new token
- */
-struct IdentityToken*
-token_create (const struct GNUNET_CRYPTO_EcdsaPublicKey *iss,
- const struct GNUNET_CRYPTO_EcdsaPublicKey* aud);
-
-/**
- * Destroy an identity token
- *
- * @param token the token to destroy
- */
-void
-token_destroy (struct IdentityToken*token);
-
-/**
- * Add a new key value pair to the token
- *
- * @param token the token to modify
- * @param key the key
- * @param value the value
- */
-void
-token_add_attr (struct IdentityToken *token,
- const char* key,
- const char* value);
-
-/**
- * Add a new key value pair to the token
- *
- * @param token the token to modify
- * @param key the key
- * @param value the value
- */
-void
-token_add_attr_int (struct IdentityToken *token,
- const char* key,
- uint64_t value);
-
-
-
-/**
- * Add a value to a TokenAttribute
- *
- * @param attr the token attribute
- * @param value value to add
- */
- void
- token_attr_add_value (const struct TokenAttr *attr,
- const char *value);
-
-/**
- * Add a new key value pair to the token with the value as json
- *
- * @param the token to modify
- * @param key the key
- * @param value the value
- *
- */
- void
- token_add_json (const struct IdentityToken *token,
- const char* key,
- json_t* value);
-
-/**
- * Serialize a token. The token will be signed and base64 according to the
- * JWT format. The signature is base32-encoded ECDSA.
- * The resulting JWT is encrypted using
- * ECDHE for the audience and Base64
- * encoded in result. The audience requires the ECDHE public key P
- * to decrypt the token T. The key P is included in the result and prepended
- * before the token
- *
- * @param token the token to serialize
- * @param priv_key the private key used to sign the token
- * @param ecdhe_privkey the ECDHE private key used to encrypt the token
- * @param result P,Base64(E(T))
- *
- * @return GNUNET_OK on success
- */
- int
- token_serialize (const struct IdentityToken*token,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *priv_key,
- struct GNUNET_CRYPTO_EcdhePrivateKey **ecdhe_privkey,
- char **result);
-
-/**
- * Parses the serialized token and returns a token
- *
- * @param data the serialized token
- * @param priv_key the private key of the audience
- * @param result the token
- *
- * @return GNUNET_OK on success
- */
- int
- token_parse (const char* data,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *priv_key,
- struct IdentityToken **result);
-
-/**
- * Parses the serialized token and returns a token
- * This variant is intended for the party that issued the token and also
- * wants to decrypt the serialized token.
- *
- * @param data the serialized token
- * @param priv_key the private (!) ECDHE key
- * @param aud_key the identity of the audience
- * @param result the token
- *
- * @return GNUNET_OK on success
- */
-int
-token_parse2 (const char* data,
- const struct GNUNET_CRYPTO_EcdhePrivateKey *priv_key,
- const struct GNUNET_CRYPTO_EcdsaPublicKey *aud_key,
- struct IdentityToken **result);
-
-
-/**
- *
- * Returns a JWT-string representation of the token
- *
- * @param token the token
- * @param priv_key the private key used to sign the JWT
- * @param result the JWT
- *
- * @return GNUNET_OK on success
- */
- int
- token_to_string (const struct IdentityToken *token,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *priv_key,
- char **result);
-
-/**
- *
- * Creates a ticket that can be exchanged by the audience for
- * the token. The token must be placed under the label
- *
- * @param nonce nonce provided by the audience that requested the ticket
- * @param iss_pkey the issuer pubkey used to sign the ticket
- * @param label the label encoded in the ticket
- * @param aud_ley the audience pubkey used to encrypt the ticket payload
- *
- * @return the ticket
- */
-struct TokenTicket*
-ticket_create (uint64_t nonce,
- const struct GNUNET_CRYPTO_EcdsaPublicKey* iss_pkey,
- const char* lbl_str,
- const struct GNUNET_CRYPTO_EcdsaPublicKey *aud_key);
-
-/**
- * Serialize a ticket. Returns the Base64 representation of the ticket.
- * Format: Base64( { payload: E(Payload), ecdhe: K, signature: signature } )
- *
- * @param ticket the ticket to serialize
- * @param priv_key the issuer private key to sign the ticket payload
- * @param result the serialized ticket
- *
- * @return GNUNET_OK on success
- */
- int
- ticket_serialize (struct TokenTicket *ticket,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *priv_key,
- char **result);
-
-/**
- * Destroys a ticket
- *
- * @param the ticket to destroy
- */
-void
-ticket_destroy (struct TokenTicket *ticket);
-
-/**
- * Parses a serialized ticket
- *
- * @param data the serialized ticket
- * @param priv_key the audience private key
- * @param ticket the ticket
- *
- * @return GNUNET_OK on success
- */
-int
-ticket_parse (const char* raw_data,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *priv_key,
- struct TokenTicket **ticket);
-
-#endif
diff --git a/src/identity-provider/jwt.c b/src/identity-provider/jwt.c
new file mode 100644
index 0000000000..c8bc67806b
--- /dev/null
+++ b/src/identity-provider/jwt.c
@@ -0,0 +1,172 @@
+/*
+ This file is part of GNUnet
+ Copyright (C) 2010-2015 GNUnet e.V.
+
+ GNUnet is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published
+ by the Free Software Foundation; either version 3, or (at your
+ option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GNUnet; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+ */
+
+/**
+ * @file identity-provider/jwt.c
+ * @brief helper library for JSON-Web-Tokens
+ * @author Martin Schanzenbach
+ */
+#include "platform.h"
+#include "gnunet_util_lib.h"
+#include "gnunet_signatures.h"
+#include "identity_attribute.h"
+#include <jansson.h>
+
+
+#define JWT_ALG "alg"
+
+/*TODO is this the correct way to define new algs? */
+#define JWT_ALG_VALUE "ED512"
+
+#define JWT_TYP "typ"
+
+#define JWT_TYP_VALUE "jwt"
+
+static char*
+create_jwt_header(void)
+{
+ json_t *root;
+ char *json_str;
+
+ root = json_object ();
+ json_object_set_new (root, JWT_ALG, json_string (JWT_ALG_VALUE));
+ json_object_set_new (root, JWT_TYP, json_string (JWT_TYP_VALUE));
+
+ json_str = json_dumps (root, JSON_INDENT(1));
+ json_decref (root);
+ return json_str;
+}
+
+/**
+ * Create a JWT from a ticket and attributes
+ *
+ * @param ticket the ticket
+ * @param attrs the attribute list
+ * @return a new base64-encoded JWT string.
+ */
+char*
+jwt_create (const struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket,
+ const struct GNUNET_IDENTITY_PROVIDER_AttributeList *attrs,
+ const struct GNUNET_CRYPTO_EcdsaPrivateKey *priv_key)
+{
+ struct GNUNET_IDENTITY_PROVIDER_AttributeListEntry *le;
+ struct GNUNET_CRYPTO_EcdsaSignature signature;
+ struct GNUNET_CRYPTO_EccSignaturePurpose *purpose;
+ char* audience;
+ char* issuer;
+ char* header;
+ char* padding;
+ char* body_str;
+ char* result;
+ char* header_base64;
+ char* body_base64;
+ char* signature_target;
+ char* signature_base64;
+ json_t* body;
+
+ /* TODO maybe we should use a local identity here */
+ issuer = GNUNET_STRINGS_data_to_string_alloc (&ticket->identity,
+ sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey));
+ audience = GNUNET_STRINGS_data_to_string_alloc (&ticket->audience,
+ sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey));
+ header = create_jwt_header ();
+ body = json_object ();
+ /* TODO who is the issuer? local IdP or subject ? See self-issued tokens? */
+ json_object_set_new (body,
+ "iss", json_string (issuer));
+ json_object_set_new (body,
+ "sub", json_string (issuer));
+ /* TODO what should be in here exactly? */
+ json_object_set_new (body,
+ "aud", json_string (audience));
+ for (le = attrs->list_head; NULL != le; le = le->next)
+ {
+ /**
+ * TODO here we should have a function that
+ * calls the Attribute plugins to create a
+ * json representation for its value
+ */
+ json_object_set_new (body,
+ le->attribute->name,
+ json_string (le->attribute->data));
+ }
+ body_str = json_dumps (body, JSON_INDENT(0));
+ json_decref (body);
+
+ GNUNET_STRINGS_base64_encode (header,
+ strlen (header),
+ &header_base64);
+ //Remove GNUNET padding of base64
+ padding = strtok(header_base64, "=");
+ while (NULL != padding)
+ padding = strtok(NULL, "=");
+
+ GNUNET_STRINGS_base64_encode (body_str,
+ strlen (body_str),
+ &body_base64);
+
+ //Remove GNUNET padding of base64
+ padding = strtok(body_base64, "=");
+ while (NULL != padding)
+ padding = strtok(NULL, "=");
+
+ GNUNET_free (issuer);
+ GNUNET_free (audience);
+
+ /**
+ * TODO
+ * Creating the JWT signature. This might not be
+ * standards compliant, check.
+ */
+ GNUNET_asprintf (&signature_target, "%s,%s", header_base64, body_base64);
+
+ purpose =
+ GNUNET_malloc (sizeof (struct GNUNET_CRYPTO_EccSignaturePurpose) +
+ strlen (signature_target));
+ purpose->size =
+ htonl (strlen (signature_target) + sizeof (struct GNUNET_CRYPTO_EccSignaturePurpose));
+ purpose->purpose = htonl(GNUNET_SIGNATURE_PURPOSE_GNUID_TOKEN);
+ GNUNET_memcpy (&purpose[1], signature_target, strlen (signature_target));
+ if (GNUNET_OK != GNUNET_CRYPTO_ecdsa_sign (priv_key,
+ purpose,
+ (struct GNUNET_CRYPTO_EcdsaSignature *)&signature))
+ {
+ GNUNET_free (signature_target);
+ GNUNET_free (body_str);
+ GNUNET_free (body_base64);
+ GNUNET_free (header_base64);
+ GNUNET_free (purpose);
+ return NULL;
+ }
+ GNUNET_STRINGS_base64_encode ((const char*)&signature,
+ sizeof (struct GNUNET_CRYPTO_EcdsaSignature),
+ &signature_base64);
+ GNUNET_asprintf (&result, "%s.%s.%s",
+ header_base64, body_base64, signature_base64);
+
+ GNUNET_free (signature_target);
+ GNUNET_free (header);
+ GNUNET_free (body_str);
+ GNUNET_free (signature_base64);
+ GNUNET_free (body_base64);
+ GNUNET_free (header_base64);
+ GNUNET_free (purpose);
+ return result;
+}
diff --git a/src/identity/plugin_gnsrecord_identity.c b/src/identity-provider/plugin_gnsrecord_identity_provider.c
index c26c040746..ad5a95dc71 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,
switch (type)
{
case GNUNET_GNSRECORD_TYPE_ID_ATTR:
- case GNUNET_GNSRECORD_TYPE_ID_TOKEN:
+ return GNUNET_STRINGS_data_to_string_alloc (data, data_size);
+ case GNUNET_GNSRECORD_TYPE_ID_TOKEN: //DEPRECATED
return GNUNET_strndup (data, data_size);
- case GNUNET_GNSRECORD_TYPE_ID_TOKEN_METADATA:
+ case GNUNET_GNSRECORD_TYPE_ABE_KEY:
+ case GNUNET_GNSRECORD_TYPE_ABE_MASTER:
+ return GNUNET_STRINGS_data_to_string_alloc (data, data_size);
+ case GNUNET_GNSRECORD_TYPE_ID_TOKEN_METADATA: //DEPRECATED
ecdhe_privkey = data;
audience_pubkey = data+sizeof (struct GNUNET_CRYPTO_EcdhePrivateKey);
scopes = (char*) audience_pubkey+(sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey));
@@ -106,12 +110,22 @@ string_to_value (void *cls,
switch (type)
{
case GNUNET_GNSRECORD_TYPE_ID_ATTR:
+ return GNUNET_STRINGS_string_to_data (s,
+ strlen (s),
+ *data,
+ *data_size);
case GNUNET_GNSRECORD_TYPE_ID_TOKEN:
*data = GNUNET_strdup (s);
*data_size = strlen (s);
return GNUNET_OK;
+ case GNUNET_GNSRECORD_TYPE_ABE_KEY:
+ case GNUNET_GNSRECORD_TYPE_ABE_MASTER:
+ return GNUNET_STRINGS_string_to_data (s,
+ strlen (s),
+ *data,
+ *data_size);
case GNUNET_GNSRECORD_TYPE_ID_TOKEN_METADATA:
- tmp_tok = GNUNET_strdup (s);
+ tmp_tok = GNUNET_strdup (s);
ecdhe_str = strtok (tmp_tok, ";");
if (NULL == ecdhe_str)
{
@@ -160,15 +174,17 @@ string_to_value (void *cls,
* Mapping of record type numbers to human-readable
* record type names.
*/
- static struct {
- const char *name;
- uint32_t number;
- } name_map[] = {
- { "ID_ATTR", GNUNET_GNSRECORD_TYPE_ID_ATTR },
- { "ID_TOKEN", GNUNET_GNSRECORD_TYPE_ID_TOKEN },
- { "ID_TOKEN_METADATA", GNUNET_GNSRECORD_TYPE_ID_TOKEN_METADATA },
- { NULL, UINT32_MAX }
- };
+static struct {
+ const char *name;
+ uint32_t number;
+} name_map[] = {
+ { "ID_ATTR", GNUNET_GNSRECORD_TYPE_ID_ATTR },
+ { "ID_TOKEN", GNUNET_GNSRECORD_TYPE_ID_TOKEN },
+ { "ABE_KEY", GNUNET_GNSRECORD_TYPE_ABE_KEY },
+ { "ABE_MASTER", GNUNET_GNSRECORD_TYPE_ABE_MASTER },
+ { "ID_TOKEN_METADATA", GNUNET_GNSRECORD_TYPE_ID_TOKEN_METADATA },
+ { NULL, UINT32_MAX }
+};
/**
@@ -220,7 +236,7 @@ number_to_typename (void *cls,
* @return the exported block API
*/
void *
-libgnunet_plugin_gnsrecord_identity_init (void *cls)
+libgnunet_plugin_gnsrecord_identity_provider_init (void *cls)
{
struct GNUNET_GNSRECORD_PluginFunctions *api;
@@ -240,7 +256,7 @@ libgnunet_plugin_gnsrecord_identity_init (void *cls)
* @return NULL
*/
void *
-libgnunet_plugin_gnsrecord_identity_done (void *cls)
+libgnunet_plugin_gnsrecord_identity_provider_done (void *cls)
{
struct GNUNET_GNSRECORD_PluginFunctions *api = cls;
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 0000000000..594e4788d4
--- /dev/null
+++ b/src/identity-provider/plugin_identity_provider_sqlite.c
@@ -0,0 +1,736 @@
+ /*
+ * This file is part of GNUnet
+ * Copyright (C) 2009-2017 GNUnet e.V.
+ *
+ * GNUnet is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published
+ * by the Free Software Foundation; either version 3, or (at your
+ * option) any later version.
+ *
+ * GNUnet is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNUnet; see the file COPYING. If not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+/**
+ * @file identity-provider/plugin_identity_provider_sqlite.c
+ * @brief sqlite-based idp backend
+ * @author Martin Schanzenbach
+ */
+
+#include "platform.h"
+#include "gnunet_identity_provider_service.h"
+#include "gnunet_identity_provider_plugin.h"
+#include "gnunet_identity_attribute_lib.h"
+#include "gnunet_sq_lib.h"
+#include <sqlite3.h>
+
+/**
+ * After how many ms "busy" should a DB operation fail for good? A
+ * low value makes sure that we are more responsive to requests
+ * (especially PUTs). A high value guarantees a higher success rate
+ * (SELECTs in iterate can take several seconds despite LIMIT=1).
+ *
+ * The default value of 1s should ensure that users do not experience
+ * huge latencies while at the same time allowing operations to
+ * succeed with reasonable probability.
+ */
+#define BUSY_TIMEOUT_MS 1000
+
+
+/**
+ * Log an error message at log-level 'level' that indicates
+ * a failure of the command 'cmd' on file 'filename'
+ * with the message given by strerror(errno).
+ */
+#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)
+
+#define LOG(kind,...) GNUNET_log_from (kind, "identity-provider-sqlite", __VA_ARGS__)
+
+
+/**
+ * Context for all functions in this plugin.
+ */
+struct Plugin
+{
+
+ const struct GNUNET_CONFIGURATION_Handle *cfg;
+
+ /**
+ * Database filename.
+ */
+ char *fn;
+
+ /**
+ * Native SQLite database handle.
+ */
+ sqlite3 *dbh;
+
+ /**
+ * Precompiled SQL to store ticket.
+ */
+ sqlite3_stmt *store_ticket;
+
+ /**
+ * Precompiled SQL to delete existing ticket.
+ */
+ sqlite3_stmt *delete_ticket;
+
+ /**
+ * Precompiled SQL to iterate tickets.
+ */
+ sqlite3_stmt *iterate_tickets;
+
+ /**
+ * Precompiled SQL to get ticket attributes.
+ */
+ sqlite3_stmt *get_ticket_attrs;
+
+ /**
+ * Precompiled SQL to iterate tickets by audience.
+ */
+ sqlite3_stmt *iterate_tickets_by_audience;
+};
+
+
+/**
+ * @brief Prepare a SQL statement
+ *
+ * @param dbh handle to the database
+ * @param zSql SQL statement, UTF-8 encoded
+ * @param ppStmt set to the prepared statement
+ * @return 0 on success
+ */
+static int
+sq_prepare (sqlite3 *dbh,
+ const char *zSql,
+ sqlite3_stmt **ppStmt)
+{
+ char *dummy;
+ int result;
+
+ result =
+ sqlite3_prepare_v2 (dbh,
+ zSql,
+ strlen (zSql),
+ ppStmt,
+ (const char **) &dummy);
+ LOG (GNUNET_ERROR_TYPE_DEBUG,
+ "Prepared `%s' / %p: %d\n",
+ zSql,
+ *ppStmt,
+ result);
+ return result;
+}
+
+/**
+ * Create our database indices.
+ *
+ * @param dbh handle to the database
+ */
+static void
+create_indices (sqlite3 * dbh)
+{
+ /* create indices */
+ if ( (SQLITE_OK !=
+ sqlite3_exec (dbh,
+ "CREATE INDEX IF NOT EXISTS identity_reverse ON identity001tickets (identity,audience)",
+ NULL, NULL, NULL)) ||
+ (SQLITE_OK !=
+ sqlite3_exec (dbh,
+ "CREATE INDEX IF NOT EXISTS it_iter ON identity001tickets (rnd)",
+ NULL, NULL, NULL)) )
+ LOG (GNUNET_ERROR_TYPE_ERROR,
+ "Failed to create indices: %s\n",
+ sqlite3_errmsg (dbh));
+}
+
+
+
+#if 0
+#define CHECK(a) GNUNET_break(a)
+#define ENULL NULL
+#else
+#define ENULL &e
+#define ENULL_DEFINED 1
+#define CHECK(a) if (! (a)) { GNUNET_log(GNUNET_ERROR_TYPE_ERROR, "%s\n", e); sqlite3_free(e); }
+#endif
+
+
+/**
+ * Initialize the database connections and associated
+ * data structures (create tables and indices
+ * as needed as well).
+ *
+ * @param plugin the plugin context (state for this module)
+ * @return #GNUNET_OK on success
+ */
+static int
+database_setup (struct Plugin *plugin)
+{
+ sqlite3_stmt *stmt;
+ char *afsdir;
+#if ENULL_DEFINED
+ char *e;
+#endif
+
+ if (GNUNET_OK !=
+ GNUNET_CONFIGURATION_get_value_filename (plugin->cfg,
+ "identity-provider-sqlite",
+ "FILENAME",
+ &afsdir))
+ {
+ GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR,
+ "identity-provider-sqlite",
+ "FILENAME");
+ return GNUNET_SYSERR;
+ }
+ if (GNUNET_OK !=
+ GNUNET_DISK_file_test (afsdir))
+ {
+ if (GNUNET_OK !=
+ GNUNET_DISK_directory_create_for_file (afsdir))
+ {
+ GNUNET_break (0);
+ GNUNET_free (afsdir);
+ return GNUNET_SYSERR;
+ }
+ }
+ /* afsdir should be UTF-8-encoded. If it isn't, it's a bug */
+ plugin->fn = afsdir;
+
+ /* Open database and precompile statements */
+ if (sqlite3_open (plugin->fn, &plugin->dbh) != SQLITE_OK)
+ {
+ LOG (GNUNET_ERROR_TYPE_ERROR,
+ _("Unable to initialize SQLite: %s.\n"),
+ sqlite3_errmsg (plugin->dbh));
+ return GNUNET_SYSERR;
+ }
+ CHECK (SQLITE_OK ==
+ sqlite3_exec (plugin->dbh,
+ "PRAGMA temp_store=MEMORY", NULL, NULL,
+ ENULL));
+ CHECK (SQLITE_OK ==
+ sqlite3_exec (plugin->dbh,
+ "PRAGMA synchronous=NORMAL", NULL, NULL,
+ ENULL));
+ CHECK (SQLITE_OK ==
+ sqlite3_exec (plugin->dbh,
+ "PRAGMA legacy_file_format=OFF", NULL, NULL,
+ ENULL));
+ CHECK (SQLITE_OK ==
+ sqlite3_exec (plugin->dbh,
+ "PRAGMA auto_vacuum=INCREMENTAL", NULL,
+ NULL, ENULL));
+ CHECK (SQLITE_OK ==
+ sqlite3_exec (plugin->dbh,
+ "PRAGMA encoding=\"UTF-8\"", NULL,
+ NULL, ENULL));
+ CHECK (SQLITE_OK ==
+ sqlite3_exec (plugin->dbh,
+ "PRAGMA locking_mode=EXCLUSIVE", NULL, NULL,
+ ENULL));
+ CHECK (SQLITE_OK ==
+ sqlite3_exec (plugin->dbh,
+ "PRAGMA page_size=4092", NULL, NULL,
+ ENULL));
+
+ CHECK (SQLITE_OK ==
+ sqlite3_busy_timeout (plugin->dbh,
+ BUSY_TIMEOUT_MS));
+
+
+ /* Create table */
+ CHECK (SQLITE_OK ==
+ sq_prepare (plugin->dbh,
+ "SELECT 1 FROM sqlite_master WHERE tbl_name = 'identity001tickets'",
+ &stmt));
+ if ((sqlite3_step (stmt) == SQLITE_DONE) &&
+ (sqlite3_exec
+ (plugin->dbh,
+ "CREATE TABLE identity001tickets ("
+ " identity BLOB NOT NULL DEFAULT '',"
+ " audience BLOB NOT NULL DEFAULT '',"
+ " rnd INT8 NOT NULL DEFAULT '',"
+ " attributes BLOB NOT NULL DEFAULT ''"
+ ")",
+ NULL, NULL, NULL) != SQLITE_OK))
+ {
+ LOG_SQLITE (plugin, GNUNET_ERROR_TYPE_ERROR,
+ "sqlite3_exec");
+ sqlite3_finalize (stmt);
+ return GNUNET_SYSERR;
+ }
+ sqlite3_finalize (stmt);
+
+ create_indices (plugin->dbh);
+
+ if ( (SQLITE_OK !=
+ sq_prepare (plugin->dbh,
+ "INSERT INTO identity001tickets (identity, audience, rnd, attributes)"
+ " VALUES (?, ?, ?, ?)",
+ &plugin->store_ticket)) ||
+ (SQLITE_OK !=
+ sq_prepare (plugin->dbh,
+ "DELETE FROM identity001tickets WHERE identity=? AND rnd=?",
+ &plugin->delete_ticket)) ||
+ (SQLITE_OK !=
+ sq_prepare (plugin->dbh,
+ "SELECT identity,audience,rnd,attributes"
+ " FROM identity001tickets WHERE identity=? AND rnd=?",
+ &plugin->get_ticket_attrs)) ||
+ (SQLITE_OK !=
+ sq_prepare (plugin->dbh,
+ "SELECT identity,audience,rnd,attributes"
+ " FROM identity001tickets WHERE identity=?"
+ " ORDER BY rnd LIMIT 1 OFFSET ?",
+ &plugin->iterate_tickets)) ||
+ (SQLITE_OK !=
+ sq_prepare (plugin->dbh,
+ "SELECT identity,audience,rnd,attributes"
+ " FROM identity001tickets WHERE audience=?"
+ " ORDER BY rnd LIMIT 1 OFFSET ?",
+ &plugin->iterate_tickets_by_audience)) )
+ {
+ LOG_SQLITE (plugin,
+ GNUNET_ERROR_TYPE_ERROR,
+ "precompiling");
+ return GNUNET_SYSERR;
+ }
+ return GNUNET_OK;
+}
+
+
+/**
+ * Shutdown database connection and associate data
+ * structures.
+ * @param plugin the plugin context (state for this module)
+ */
+static void
+database_shutdown (struct Plugin *plugin)
+{
+ int result;
+ sqlite3_stmt *stmt;
+
+ if (NULL != plugin->store_ticket)
+ sqlite3_finalize (plugin->store_ticket);
+ if (NULL != plugin->delete_ticket)
+ sqlite3_finalize (plugin->delete_ticket);
+ if (NULL != plugin->iterate_tickets)
+ sqlite3_finalize (plugin->iterate_tickets);
+ if (NULL != plugin->iterate_tickets_by_audience)
+ sqlite3_finalize (plugin->iterate_tickets_by_audience);
+ if (NULL != plugin->get_ticket_attrs)
+ sqlite3_finalize (plugin->get_ticket_attrs);
+ result = sqlite3_close (plugin->dbh);
+ if (result == SQLITE_BUSY)
+ {
+ LOG (GNUNET_ERROR_TYPE_WARNING,
+ _("Tried to close sqlite without finalizing all prepared statements.\n"));
+ stmt = sqlite3_next_stmt (plugin->dbh,
+ NULL);
+ while (NULL != stmt)
+ {
+ GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG,
+ "sqlite",
+ "Closing statement %p\n",
+ stmt);
+ result = sqlite3_finalize (stmt);
+ if (result != SQLITE_OK)
+ GNUNET_log_from (GNUNET_ERROR_TYPE_WARNING,
+ "sqlite",
+ "Failed to close statement %p: %d\n",
+ stmt,
+ result);
+ stmt = sqlite3_next_stmt (plugin->dbh,
+ NULL);
+ }
+ result = sqlite3_close (plugin->dbh);
+ }
+ if (SQLITE_OK != result)
+ LOG_SQLITE (plugin,
+ GNUNET_ERROR_TYPE_ERROR,
+ "sqlite3_close");
+
+ GNUNET_free_non_null (plugin->fn);
+}
+
+
+/**
+ * Store a ticket in the database.
+ *
+ * @param cls closure (internal context for the plugin)
+ * @param ticket the ticket to persist
+ * @return #GNUNET_OK on success, else #GNUNET_SYSERR
+ */
+static int
+identity_provider_sqlite_store_ticket (void *cls,
+ const struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket,
+ const struct GNUNET_IDENTITY_ATTRIBUTE_ClaimList *attrs)
+{
+ struct Plugin *plugin = cls;
+ size_t attrs_len;
+ char *attrs_ser;
+ int n;
+
+ {
+ /* First delete duplicates */
+ struct GNUNET_SQ_QueryParam dparams[] = {
+ GNUNET_SQ_query_param_auto_from_type (&ticket->identity),
+ GNUNET_SQ_query_param_uint64 (&ticket->rnd),
+ GNUNET_SQ_query_param_end
+ };
+ if (GNUNET_OK !=
+ GNUNET_SQ_bind (plugin->delete_ticket,
+ dparams))
+ {
+ LOG_SQLITE (plugin,
+ GNUNET_ERROR_TYPE_ERROR | GNUNET_ERROR_TYPE_BULK,
+ "sqlite3_bind_XXXX");
+ GNUNET_SQ_reset (plugin->dbh,
+ plugin->delete_ticket);
+ return GNUNET_SYSERR;
+ }
+ n = sqlite3_step (plugin->delete_ticket);
+ GNUNET_SQ_reset (plugin->dbh,
+ plugin->delete_ticket);
+
+ attrs_len = GNUNET_IDENTITY_ATTRIBUTE_list_serialize_get_size (attrs);
+ attrs_ser = GNUNET_malloc (attrs_len);
+ GNUNET_IDENTITY_ATTRIBUTE_list_serialize (attrs,
+ attrs_ser);
+ struct GNUNET_SQ_QueryParam sparams[] = {
+ GNUNET_SQ_query_param_auto_from_type (&ticket->identity),
+ GNUNET_SQ_query_param_auto_from_type (&ticket->audience),
+ GNUNET_SQ_query_param_uint64 (&ticket->rnd),
+ GNUNET_SQ_query_param_fixed_size (attrs_ser, attrs_len),
+ GNUNET_SQ_query_param_end
+ };
+
+ if (GNUNET_OK !=
+ GNUNET_SQ_bind (plugin->store_ticket,
+ sparams))
+ {
+ LOG_SQLITE (plugin,
+ GNUNET_ERROR_TYPE_ERROR | GNUNET_ERROR_TYPE_BULK,
+ "sqlite3_bind_XXXX");
+ GNUNET_SQ_reset (plugin->dbh,
+ plugin->store_ticket);
+ return GNUNET_SYSERR;
+ }
+ n = sqlite3_step (plugin->store_ticket);
+ GNUNET_SQ_reset (plugin->dbh,
+ plugin->store_ticket);
+ GNUNET_free (attrs_ser);
+ }
+ switch (n)
+ {
+ case SQLITE_DONE:
+ GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG,
+ "sqlite",
+ "Ticket stored\n");
+ return GNUNET_OK;
+ case SQLITE_BUSY:
+ LOG_SQLITE (plugin,
+ GNUNET_ERROR_TYPE_WARNING | GNUNET_ERROR_TYPE_BULK,
+ "sqlite3_step");
+ return GNUNET_NO;
+ default:
+ LOG_SQLITE (plugin,
+ GNUNET_ERROR_TYPE_ERROR | GNUNET_ERROR_TYPE_BULK,
+ "sqlite3_step");
+ return GNUNET_SYSERR;
+ }
+}
+
+
+/**
+ * Store a ticket in the database.
+ *
+ * @param cls closure (internal context for the plugin)
+ * @param ticket the ticket to delete
+ * @return #GNUNET_OK on success, else #GNUNET_SYSERR
+ */
+static int
+identity_provider_sqlite_delete_ticket (void *cls,
+ const struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket)
+{
+ struct Plugin *plugin = cls;
+ int n;
+
+ {
+ struct GNUNET_SQ_QueryParam sparams[] = {
+ GNUNET_SQ_query_param_auto_from_type (&ticket->identity),
+ GNUNET_SQ_query_param_uint64 (&ticket->rnd),
+ GNUNET_SQ_query_param_end
+ };
+
+ if (GNUNET_OK !=
+ GNUNET_SQ_bind (plugin->delete_ticket,
+ sparams))
+ {
+ LOG_SQLITE (plugin,
+ GNUNET_ERROR_TYPE_ERROR | GNUNET_ERROR_TYPE_BULK,
+ "sqlite3_bind_XXXX");
+ GNUNET_SQ_reset (plugin->dbh,
+ plugin->store_ticket);
+ return GNUNET_SYSERR;
+ }
+ n = sqlite3_step (plugin->delete_ticket);
+ GNUNET_SQ_reset (plugin->dbh,
+ plugin->delete_ticket);
+ }
+ switch (n)
+ {
+ case SQLITE_DONE:
+ GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG,
+ "sqlite",
+ "Ticket deleted\n");
+ return GNUNET_OK;
+ case SQLITE_BUSY:
+ LOG_SQLITE (plugin,
+ GNUNET_ERROR_TYPE_WARNING | GNUNET_ERROR_TYPE_BULK,
+ "sqlite3_step");
+ return GNUNET_NO;
+ default:
+ LOG_SQLITE (plugin,
+ GNUNET_ERROR_TYPE_ERROR | GNUNET_ERROR_TYPE_BULK,
+ "sqlite3_step");
+ return GNUNET_SYSERR;
+ }
+}
+
+
+/**
+ * The given 'sqlite' statement has been prepared to be run.
+ * It will return a record which should be given to the iterator.
+ * Runs the statement and parses the returned record.
+ *
+ * @param plugin plugin context
+ * @param stmt to run (and then clean up)
+ * @param iter iterator to call with the result
+ * @param iter_cls closure for @a iter
+ * @return #GNUNET_OK on success, #GNUNET_NO if there were no results, #GNUNET_SYSERR on error
+ */
+static int
+get_ticket_and_call_iterator (struct Plugin *plugin,
+ sqlite3_stmt *stmt,
+ GNUNET_IDENTITY_PROVIDER_TicketIterator iter,
+ void *iter_cls)
+{
+ struct GNUNET_IDENTITY_PROVIDER_Ticket ticket;
+ struct GNUNET_IDENTITY_ATTRIBUTE_ClaimList *attrs;
+ int ret;
+ int sret;
+ size_t attrs_len;
+ char *attrs_ser;
+
+ ret = GNUNET_NO;
+ if (SQLITE_ROW == (sret = sqlite3_step (stmt)))
+ {
+ struct GNUNET_SQ_ResultSpec rs[] = {
+ GNUNET_SQ_result_spec_auto_from_type (&ticket.identity),
+ GNUNET_SQ_result_spec_auto_from_type (&ticket.audience),
+ GNUNET_SQ_result_spec_uint64 (&ticket.rnd),
+ GNUNET_SQ_result_spec_variable_size ((void**)&attrs_ser,
+ &attrs_len),
+ GNUNET_SQ_result_spec_end
+
+ };
+ ret = GNUNET_SQ_extract_result (stmt,
+ rs);
+ if (GNUNET_OK != ret)
+ {
+ GNUNET_break (0);
+ ret = GNUNET_SYSERR;
+ }
+ else
+ {
+ attrs = GNUNET_IDENTITY_ATTRIBUTE_list_deserialize (attrs_ser,
+ attrs_len);
+ if (NULL != iter)
+ iter (iter_cls,
+ &ticket,
+ attrs);
+ GNUNET_IDENTITY_ATTRIBUTE_list_destroy (attrs);
+ ret = GNUNET_YES;
+ }
+ GNUNET_SQ_cleanup_result (rs);
+ }
+ else
+ {
+ if (SQLITE_DONE != sret)
+ LOG_SQLITE (plugin,
+ GNUNET_ERROR_TYPE_ERROR,
+ "sqlite_step");
+ }
+ GNUNET_SQ_reset (plugin->dbh,
+ stmt);
+ return ret;
+}
+
+
+/**
+ * Lookup tickets in the datastore.
+ *
+ * @param cls closure (internal context for the plugin)
+ * @param zone private key of the zone
+ * @param label name of the record in the zone
+ * @param iter function to call with the result
+ * @param iter_cls closure for @a iter
+ * @return #GNUNET_OK on success, else #GNUNET_SYSERR
+ */
+static int
+identity_provider_sqlite_ticket_get_attrs (void *cls,
+ const struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket,
+ GNUNET_IDENTITY_PROVIDER_TicketIterator iter,
+ void *iter_cls)
+{
+ struct Plugin *plugin = cls;
+ struct GNUNET_SQ_QueryParam params[] = {
+ GNUNET_SQ_query_param_auto_from_type (&ticket->identity),
+ GNUNET_SQ_query_param_uint64 (&ticket->rnd),
+ GNUNET_SQ_query_param_end
+ };
+
+ if (GNUNET_OK !=
+ GNUNET_SQ_bind (plugin->get_ticket_attrs,
+ params))
+ {
+ LOG_SQLITE (plugin, GNUNET_ERROR_TYPE_ERROR | GNUNET_ERROR_TYPE_BULK,
+ "sqlite3_bind_XXXX");
+ GNUNET_SQ_reset (plugin->dbh,
+ plugin->get_ticket_attrs);
+ return GNUNET_SYSERR;
+ }
+ return get_ticket_and_call_iterator (plugin,
+ plugin->get_ticket_attrs,
+ iter,
+ iter_cls);
+}
+
+
+/**
+ * Iterate over the results for a particular key and zone in the
+ * datastore. Will return at most one result to the iterator.
+ *
+ * @param cls closure (internal context for the plugin)
+ * @param identity the issuing identity or audience (depending on audience switch)
+ * @param audience GNUNET_YES if identity is audience
+ * @param offset offset in the list of all matching records
+ * @param iter function to call with the result
+ * @param iter_cls closure for @a iter
+ * @return #GNUNET_OK on success, #GNUNET_NO if there were no results, #GNUNET_SYSERR on error
+ */
+static int
+identity_provider_sqlite_iterate_tickets (void *cls,
+ const struct GNUNET_CRYPTO_EcdsaPublicKey *identity,
+ int audience,
+ uint64_t offset,
+ GNUNET_IDENTITY_PROVIDER_TicketIterator iter,
+ void *iter_cls)
+{
+ struct Plugin *plugin = cls;
+ sqlite3_stmt *stmt;
+ int err;
+
+ if (NULL == identity)
+ {
+ GNUNET_break (0);
+ return GNUNET_SYSERR;
+ }
+ struct GNUNET_SQ_QueryParam params[] = {
+ GNUNET_SQ_query_param_auto_from_type (identity),
+ GNUNET_SQ_query_param_uint64 (&offset),
+ GNUNET_SQ_query_param_end
+ };
+ if (GNUNET_YES == audience)
+ {
+ stmt = plugin->iterate_tickets_by_audience;
+ err = GNUNET_SQ_bind (stmt,
+ params);
+ }
+ else
+ {
+ stmt = plugin->iterate_tickets;
+ err = GNUNET_SQ_bind (stmt,
+ params);
+ }
+ if (GNUNET_OK != err)
+ {
+ LOG_SQLITE (plugin,
+ GNUNET_ERROR_TYPE_ERROR | GNUNET_ERROR_TYPE_BULK,
+ "sqlite3_bind_XXXX");
+ GNUNET_SQ_reset (plugin->dbh,
+ stmt);
+ return GNUNET_SYSERR;
+ }
+ return get_ticket_and_call_iterator (plugin,
+ stmt,
+ iter,
+ iter_cls);
+}
+
+
+/**
+ * Entry point for the plugin.
+ *
+ * @param cls the "struct GNUNET_IDENTITY_PROVIDER_PluginEnvironment*"
+ * @return NULL on error, otherwise the plugin context
+ */
+void *
+libgnunet_plugin_identity_provider_sqlite_init (void *cls)
+{
+ static struct Plugin plugin;
+ const struct GNUNET_CONFIGURATION_Handle *cfg = cls;
+ struct GNUNET_IDENTITY_PROVIDER_PluginFunctions *api;
+
+ if (NULL != plugin.cfg)
+ return NULL; /* can only initialize once! */
+ memset (&plugin, 0, sizeof (struct Plugin));
+ plugin.cfg = cfg;
+ if (GNUNET_OK != database_setup (&plugin))
+ {
+ database_shutdown (&plugin);
+ return NULL;
+ }
+ api = GNUNET_new (struct GNUNET_IDENTITY_PROVIDER_PluginFunctions);
+ api->cls = &plugin;
+ api->store_ticket = &identity_provider_sqlite_store_ticket;
+ api->delete_ticket = &identity_provider_sqlite_delete_ticket;
+ api->iterate_tickets = &identity_provider_sqlite_iterate_tickets;
+ api->get_ticket_attributes = &identity_provider_sqlite_ticket_get_attrs;
+ LOG (GNUNET_ERROR_TYPE_INFO,
+ _("Sqlite database running\n"));
+ return api;
+}
+
+
+/**
+ * Exit point from the plugin.
+ *
+ * @param cls the plugin context (as returned by "init")
+ * @return always NULL
+ */
+void *
+libgnunet_plugin_identity_provider_sqlite_done (void *cls)
+{
+ struct GNUNET_IDENTITY_PROVIDER_PluginFunctions *api = cls;
+ struct Plugin *plugin = api->cls;
+
+ database_shutdown (plugin);
+ plugin->cfg = NULL;
+ GNUNET_free (api);
+ LOG (GNUNET_ERROR_TYPE_DEBUG,
+ "sqlite plugin is finished\n");
+ return NULL;
+}
+
+/* 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 907b28ba9e..c27662a0d5 100644
--- a/src/identity-provider/plugin_rest_identity_provider.c
+++ b/src/identity-provider/plugin_rest_identity_provider.c
@@ -37,6 +37,7 @@
#include <jansson.h>
#include <inttypes.h>
#include "gnunet_signatures.h"
+#include "gnunet_identity_attribute_lib.h"
#include "gnunet_identity_provider_service.h"
/**
@@ -45,39 +46,40 @@
#define GNUNET_REST_API_NS_IDENTITY_PROVIDER "/idp"
/**
- * Issue namespace
+ * Attribute namespace
*/
-#define GNUNET_REST_API_NS_IDENTITY_TOKEN_ISSUE "/idp/issue"
+#define GNUNET_REST_API_NS_IDENTITY_ATTRIBUTES "/idp/attributes"
/**
- * Check namespace TODO
+ * Ticket namespace
*/
-#define GNUNET_REST_API_NS_IDENTITY_TOKEN_CHECK "/idp/check"
+#define GNUNET_REST_API_NS_IDENTITY_TICKETS "/idp/tickets"
/**
- * Token namespace
+ * Revoke namespace
*/
-#define GNUNET_REST_API_NS_IDENTITY_OAUTH2_TOKEN "/idp/token"
+#define GNUNET_REST_API_NS_IDENTITY_REVOKE "/idp/revoke"
/**
- * The parameter name in which the ticket must be provided
+ * Revoke namespace
*/
-#define GNUNET_REST_JSONAPI_IDENTITY_PROVIDER_TICKET "ticket"
+#define GNUNET_REST_API_NS_IDENTITY_CONSUME "/idp/consume"
/**
- * The parameter name in which the expected nonce must be provided
+ * Attribute key
*/
-#define GNUNET_REST_JSONAPI_IDENTITY_PROVIDER_EXPECTED_NONCE "expected_nonce"
+#define GNUNET_REST_JSONAPI_IDENTITY_ATTRIBUTE "attribute"
/**
- * The parameter name in which the ticket must be provided
+ * Ticket key
*/
-#define GNUNET_REST_JSONAPI_IDENTITY_PROVIDER_TOKEN "token"
+#define GNUNET_REST_JSONAPI_IDENTITY_TICKET "ticket"
+
/**
- * The URL parameter name in which the nonce must be provided
+ * Value key
*/
-#define GNUNET_IDENTITY_TOKEN_REQUEST_NONCE "nonce"
+#define GNUNET_REST_JSONAPI_IDENTITY_ATTRIBUTE_VALUE "value"
/**
* State while collecting all egos
@@ -89,41 +91,6 @@
*/
#define ID_REST_STATE_POST_INIT 1
-/**
- * Resource type
- */
-#define GNUNET_REST_JSONAPI_IDENTITY_TOKEN "token"
-
-/**
- * URL parameter to create a GNUid token for a specific audience
- */
-#define GNUNET_REST_JSONAPI_IDENTITY_AUD_REQUEST "audience"
-
-/**
- * URL parameter to create a GNUid token for a specific issuer (EGO)
- */
-#define GNUNET_REST_JSONAPI_IDENTITY_ISS_REQUEST "issuer"
-
-/**
- * Attributes passed to issue request
- */
-#define GNUNET_IDENTITY_TOKEN_ATTR_LIST "requested_attrs"
-
-/**
- * Token expiration string
- */
-#define GNUNET_IDENTITY_TOKEN_EXP_STRING "expiration"
-
-/**
- * Error messages
- */
-#define GNUNET_REST_ERROR_RESOURCE_INVALID "Resource location invalid"
-#define GNUNET_REST_ERROR_NO_DATA "No data"
-
-/**
- * GNUid token lifetime
- */
-#define GNUNET_GNUID_TOKEN_EXPIRATION_MICROSECONDS 300000000
/**
* The configuration handle
@@ -198,11 +165,6 @@ struct RequestHandle
const struct GNUNET_CRYPTO_EcdsaPrivateKey *priv_key;
/**
- * Handle to the rest connection
- */
- struct GNUNET_REST_RequestHandle *conndata_handle;
-
- /**
* The processing state
*/
int state;
@@ -213,6 +175,12 @@ struct RequestHandle
struct GNUNET_IDENTITY_Handle *identity_handle;
/**
+ * Rest connection
+ */
+ struct GNUNET_REST_RequestHandle *rest_handle;
+
+
+ /**
* IDENTITY Operation
*/
struct GNUNET_IDENTITY_Operation *op;
@@ -228,19 +196,14 @@ struct RequestHandle
struct GNUNET_IDENTITY_PROVIDER_Operation *idp_op;
/**
- * Handle to NS service
+ * Attribute iterator
*/
- struct GNUNET_NAMESTORE_Handle *ns_handle;
+ struct GNUNET_IDENTITY_PROVIDER_AttributeIterator *attr_it;
/**
- * NS iterator
+ * Ticket iterator
*/
- struct GNUNET_NAMESTORE_ZoneIterator *ns_it;
-
- /**
- * NS Handle
- */
- struct GNUNET_NAMESTORE_QueueEntry *ns_qe;
+ struct GNUNET_IDENTITY_PROVIDER_TicketIterator *ticket_it;
/**
* Desired timeout for the lookup (default is no timeout).
@@ -285,6 +248,7 @@ struct RequestHandle
};
+
/**
* Cleanup lookup handle
* @param handle Handle to clean up
@@ -302,14 +266,12 @@ cleanup_handle (struct RequestHandle *handle)
GNUNET_SCHEDULER_cancel (handle->timeout_task);
if (NULL != handle->identity_handle)
GNUNET_IDENTITY_disconnect (handle->identity_handle);
+ if (NULL != handle->attr_it)
+ GNUNET_IDENTITY_PROVIDER_get_attributes_stop (handle->attr_it);
+ if (NULL != handle->ticket_it)
+ GNUNET_IDENTITY_PROVIDER_ticket_iteration_stop (handle->ticket_it);
if (NULL != handle->idp)
GNUNET_IDENTITY_PROVIDER_disconnect (handle->idp);
- if (NULL != handle->ns_it)
- GNUNET_NAMESTORE_zone_iteration_stop (handle->ns_it);
- if (NULL != handle->ns_qe)
- GNUNET_NAMESTORE_cancel (handle->ns_qe);
- if (NULL != handle->ns_handle)
- GNUNET_NAMESTORE_disconnect (handle->ns_handle);
if (NULL != handle->url)
GNUNET_free (handle->url);
if (NULL != handle->emsg)
@@ -326,6 +288,12 @@ cleanup_handle (struct RequestHandle *handle)
GNUNET_free (handle);
}
+static void
+cleanup_handle_delayed (void *cls)
+{
+ cleanup_handle (cls);
+}
+
/**
* Task run on error, sends error message. Cleans up everything.
@@ -363,622 +331,663 @@ do_timeout (void *cls)
}
-/**
- * Task run on shutdown. Cleans up everything.
- *
- * @param cls unused
- */
static void
-do_cleanup_handle_delayed (void *cls)
+collect_error_cb (void *cls)
{
struct RequestHandle *handle = cls;
- cleanup_handle (handle);
+ do_error (handle);
}
-
-/**
- * Get a ticket for identity
- * @param cls the handle
- * @param ticket the ticket returned from the idp
- */
static void
-token_creat_cont (void *cls,
- const char *label,
- const struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket,
- const struct GNUNET_IDENTITY_PROVIDER_Token *token)
+finished_cont (void *cls,
+ int32_t success,
+ const char *emsg)
{
- struct GNUNET_JSONAPI_Resource *json_resource;
struct RequestHandle *handle = cls;
struct MHD_Response *resp;
- json_t *ticket_json;
- json_t *token_json;
- char *ticket_str;
- char *token_str;
- char *result_str;
- if (NULL == ticket)
+ resp = GNUNET_REST_create_response (emsg);
+ if (GNUNET_OK != success)
{
- handle->emsg = GNUNET_strdup ("Error in token issue");
GNUNET_SCHEDULER_add_now (&do_error, handle);
return;
}
+ handle->proc (handle->proc_cls, resp, MHD_HTTP_OK);
+ GNUNET_SCHEDULER_add_now (&cleanup_handle_delayed, handle);
+}
- handle->resp_object = GNUNET_JSONAPI_document_new ();
- json_resource = GNUNET_JSONAPI_resource_new (GNUNET_REST_JSONAPI_IDENTITY_PROVIDER_TICKET,
- label);
- ticket_str = GNUNET_IDENTITY_PROVIDER_ticket_to_string (ticket);
- token_str = GNUNET_IDENTITY_PROVIDER_token_to_string (token);
- ticket_json = json_string (ticket_str);
- token_json = json_string (token_str);
- GNUNET_JSONAPI_resource_add_attr (json_resource,
- GNUNET_REST_JSONAPI_IDENTITY_PROVIDER_TICKET,
- ticket_json);
- GNUNET_JSONAPI_resource_add_attr (json_resource,
- GNUNET_REST_JSONAPI_IDENTITY_PROVIDER_TOKEN,
- token_json);
- GNUNET_free (ticket_str);
- GNUNET_free (token_str);
- json_decref (ticket_json);
- json_decref (token_json);
- GNUNET_JSONAPI_document_resource_add (handle->resp_object, json_resource);
+
+/**
+ * Return attributes for identity
+ *
+ * @param cls the request handle
+ */
+static void
+return_response (void *cls)
+{
+ char* result_str;
+ struct RequestHandle *handle = cls;
+ struct MHD_Response *resp;
GNUNET_JSONAPI_document_serialize (handle->resp_object, &result_str);
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Result %s\n", result_str);
resp = GNUNET_REST_create_response (result_str);
handle->proc (handle->proc_cls, resp, MHD_HTTP_OK);
GNUNET_free (result_str);
- GNUNET_SCHEDULER_add_now (&do_cleanup_handle_delayed, handle);
+ cleanup_handle (handle);
+}
+
+
+static void
+collect_finished_cb (void *cls)
+{
+ struct RequestHandle *handle = cls;
+ //Done
+ handle->attr_it = NULL;
+ handle->ticket_it = NULL;
+ GNUNET_SCHEDULER_add_now (&return_response, handle);
}
/**
- * Continueationf for token issue request
+ * Collect all attributes for an ego
*
- * @param con the Rest handle
- * @param url the requested url
- * @param cls the request handle
*/
static void
-issue_token_cont (struct GNUNET_REST_RequestHandle *con,
- const char *url,
- void *cls)
+ticket_collect (void *cls,
+ const struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket)
{
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *priv_key;
- const char *egoname;
+ struct GNUNET_JSONAPI_Resource *json_resource;
+ struct RequestHandle *handle = cls;
+ json_t *value;
+ char* tmp;
+
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Adding ticket\n");
+ tmp = GNUNET_STRINGS_data_to_string_alloc (&ticket->rnd,
+ sizeof (uint64_t));
+ json_resource = GNUNET_JSONAPI_resource_new (GNUNET_REST_JSONAPI_IDENTITY_TICKET,
+ tmp);
+ GNUNET_free (tmp);
+ GNUNET_JSONAPI_document_resource_add (handle->resp_object, json_resource);
+
+ tmp = GNUNET_STRINGS_data_to_string_alloc (&ticket->identity,
+ sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey));
+ value = json_string (tmp);
+ GNUNET_JSONAPI_resource_add_attr (json_resource,
+ "issuer",
+ value);
+ GNUNET_free (tmp);
+ json_decref (value);
+ tmp = GNUNET_STRINGS_data_to_string_alloc (&ticket->audience,
+ sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey));
+ value = json_string (tmp);
+ GNUNET_JSONAPI_resource_add_attr (json_resource,
+ "audience",
+ value);
+ GNUNET_free (tmp);
+ json_decref (value);
+ tmp = GNUNET_STRINGS_data_to_string_alloc (&ticket->rnd,
+ sizeof (uint64_t));
+ value = json_string (tmp);
+ GNUNET_JSONAPI_resource_add_attr (json_resource,
+ "rnd",
+ value);
+ GNUNET_free (tmp);
+ json_decref (value);
+ GNUNET_IDENTITY_PROVIDER_ticket_iteration_next (handle->ticket_it);
+}
+
+
+/**
+ * List tickets for identity request
+ *
+ * @param con_handle the connection handle
+ * @param url the url
+ * @param cls the RequestHandle
+ */
+static void
+list_tickets_cont (struct GNUNET_REST_RequestHandle *con_handle,
+ const char* url,
+ void *cls)
+{
+ const struct GNUNET_CRYPTO_EcdsaPrivateKey *priv_key;
struct RequestHandle *handle = cls;
struct EgoEntry *ego_entry;
- struct GNUNET_HashCode key;
- struct MHD_Response *resp;
- struct GNUNET_CRYPTO_EcdsaPublicKey pub_key;
- struct GNUNET_CRYPTO_EcdsaPublicKey aud_key;
- struct GNUNET_TIME_Relative etime_rel;
- struct GNUNET_TIME_Absolute exp_time;
- char *ego_val;
- char *audience;
- char *exp_str;
- char *nonce_str;
- char *scopes;
- uint64_t time;
- uint64_t nonce;
-
- if (GNUNET_NO == GNUNET_REST_namespace_match (handle->url,
- GNUNET_REST_API_NS_IDENTITY_TOKEN_ISSUE))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "URL invalid: %s\n", handle->url);
- resp = GNUNET_REST_create_response (NULL);
- handle->proc (handle->proc_cls, resp, MHD_HTTP_BAD_REQUEST);
- cleanup_handle (handle);
- return;
- }
- egoname = NULL;
- ego_entry = NULL;
- GNUNET_CRYPTO_hash (GNUNET_REST_JSONAPI_IDENTITY_ISS_REQUEST,
- strlen (GNUNET_REST_JSONAPI_IDENTITY_ISS_REQUEST),
- &key);
- if ( GNUNET_YES !=
- GNUNET_CONTAINER_multihashmap_contains (handle->conndata_handle->url_param_map,
- &key) )
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Issuer not found\n");
- GNUNET_SCHEDULER_add_now (&do_error, handle);
- return;
- }
- ego_val = GNUNET_CONTAINER_multihashmap_get (handle->conndata_handle->url_param_map,
- &key);
- if (NULL == ego_val)
+ char *identity;
+
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Getting tickets for %s.\n",
+ handle->url);
+ if ( strlen (GNUNET_REST_API_NS_IDENTITY_TICKETS) >=
+ strlen (handle->url))
{
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "No identity given.\n");
GNUNET_SCHEDULER_add_now (&do_error, handle);
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Ego invalid: %s\n",
- ego_val);
return;
}
+ identity = handle->url + strlen (GNUNET_REST_API_NS_IDENTITY_TICKETS) + 1;
+
for (ego_entry = handle->ego_head;
NULL != ego_entry;
ego_entry = ego_entry->next)
+ if (0 == strcmp (identity, ego_entry->identifier))
+ break;
+ handle->resp_object = GNUNET_JSONAPI_document_new ();
+
+ if (NULL == ego_entry)
{
- if (0 != strcmp (ego_val, ego_entry->identifier))
- continue;
- egoname = ego_entry->identifier;
- break;
- }
- if ( (NULL == egoname) ||
- (NULL == ego_entry) )
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Ego not found: %s\n",
- ego_val);
- GNUNET_SCHEDULER_add_now (&do_error, handle);
+ //Done
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Ego %s not found.\n",
+ identity);
+ GNUNET_SCHEDULER_add_now (&return_response, handle);
return;
}
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Ego to issue token for: %s\n",
- egoname);
+ priv_key = GNUNET_IDENTITY_ego_get_private_key (ego_entry->ego);
+ handle->idp = GNUNET_IDENTITY_PROVIDER_connect (cfg);
+ handle->ticket_it = GNUNET_IDENTITY_PROVIDER_ticket_iteration_start (handle->idp,
+ priv_key,
+ &collect_error_cb,
+ handle,
+ &ticket_collect,
+ handle,
+ &collect_finished_cb,
+ handle);
+}
+
+static void
+add_attribute_cont (struct GNUNET_REST_RequestHandle *con_handle,
+ const char* url,
+ void *cls)
+{
+ const struct GNUNET_CRYPTO_EcdsaPrivateKey *identity_priv;
+ const char* identity;
+ const char* name_str;
+ const char* value_str;
- //Meta info
- GNUNET_CRYPTO_hash (GNUNET_IDENTITY_TOKEN_ATTR_LIST,
- strlen (GNUNET_IDENTITY_TOKEN_ATTR_LIST),
- &key);
+ struct RequestHandle *handle = cls;
+ struct EgoEntry *ego_entry;
+ struct MHD_Response *resp;
+ struct GNUNET_IDENTITY_ATTRIBUTE_Claim *attribute;
+ struct GNUNET_JSONAPI_Document *json_obj;
+ struct GNUNET_JSONAPI_Resource *json_res;
+ char term_data[handle->rest_handle->data_size+1];
+ json_t *value_json;
+ json_t *data_json;
+ json_error_t err;
+ struct GNUNET_JSON_Specification docspec[] = {
+ GNUNET_JSON_spec_jsonapi_document (&json_obj),
+ GNUNET_JSON_spec_end()
+ };
- scopes = NULL;
- if ( GNUNET_YES !=
- GNUNET_CONTAINER_multihashmap_contains (handle->conndata_handle->url_param_map,
- &key) )
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Adding an attribute for %s.\n",
+ handle->url);
+ if ( strlen (GNUNET_REST_API_NS_IDENTITY_ATTRIBUTES) >=
+ strlen (handle->url))
{
- handle->emsg = GNUNET_strdup ("Scopes missing!\n");
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "No identity given.\n");
GNUNET_SCHEDULER_add_now (&do_error, handle);
return;
}
- scopes = GNUNET_CONTAINER_multihashmap_get (handle->conndata_handle->url_param_map,
- &key);
-
-
- //Token audience
- GNUNET_CRYPTO_hash (GNUNET_REST_JSONAPI_IDENTITY_AUD_REQUEST,
- strlen (GNUNET_REST_JSONAPI_IDENTITY_AUD_REQUEST),
- &key);
- audience = NULL;
- if ( GNUNET_YES !=
- GNUNET_CONTAINER_multihashmap_contains (handle->conndata_handle->url_param_map,
- &key) )
+ identity = handle->url + strlen (GNUNET_REST_API_NS_IDENTITY_ATTRIBUTES) + 1;
+
+ for (ego_entry = handle->ego_head;
+ NULL != ego_entry;
+ ego_entry = ego_entry->next)
+ if (0 == strcmp (identity, ego_entry->identifier))
+ break;
+
+ if (NULL == ego_entry)
{
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Audience missing!\n");
- GNUNET_SCHEDULER_add_now (&do_error, handle);
+ "Identity unknown (%s)\n", identity);
+ GNUNET_JSONAPI_document_delete (json_obj);
return;
}
- audience = GNUNET_CONTAINER_multihashmap_get (handle->conndata_handle->url_param_map,
- &key);
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Audience to issue token for: %s\n",
- audience);
+ identity_priv = GNUNET_IDENTITY_ego_get_private_key (ego_entry->ego);
- priv_key = GNUNET_IDENTITY_ego_get_private_key (ego_entry->ego);
- GNUNET_IDENTITY_ego_get_public_key (ego_entry->ego,
- &pub_key);
- GNUNET_STRINGS_string_to_data (audience,
- strlen (audience),
- &aud_key,
- sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey));
-
- //Remote nonce
- nonce_str = NULL;
- GNUNET_CRYPTO_hash (GNUNET_IDENTITY_TOKEN_REQUEST_NONCE,
- strlen (GNUNET_IDENTITY_TOKEN_REQUEST_NONCE),
- &key);
- if ( GNUNET_YES !=
- GNUNET_CONTAINER_multihashmap_contains (handle->conndata_handle->url_param_map,
- &key) )
+ if (0 >= handle->rest_handle->data_size)
{
- handle->emsg = GNUNET_strdup ("Request nonce missing!\n");
GNUNET_SCHEDULER_add_now (&do_error, handle);
return;
}
- nonce_str = GNUNET_CONTAINER_multihashmap_get (handle->conndata_handle->url_param_map,
- &key);
- GNUNET_assert (NULL != nonce_str);
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Request nonce: %s\n",
- nonce_str);
- GNUNET_assert (1 == sscanf (nonce_str, "%"SCNu64, &nonce));
-
- //Get expiration for token from URL parameter
- GNUNET_CRYPTO_hash (GNUNET_IDENTITY_TOKEN_EXP_STRING,
- strlen (GNUNET_IDENTITY_TOKEN_EXP_STRING),
- &key);
-
- exp_str = NULL;
- if (GNUNET_YES == GNUNET_CONTAINER_multihashmap_contains (handle->conndata_handle->url_param_map,
- &key))
+
+ term_data[handle->rest_handle->data_size] = '\0';
+ GNUNET_memcpy (term_data,
+ handle->rest_handle->data,
+ handle->rest_handle->data_size);
+ data_json = json_loads (term_data,
+ JSON_DECODE_ANY,
+ &err);
+ GNUNET_assert (GNUNET_OK ==
+ GNUNET_JSON_parse (data_json, docspec,
+ NULL, NULL));
+ json_decref (data_json);
+ if (NULL == json_obj)
{
- exp_str = GNUNET_CONTAINER_multihashmap_get (handle->conndata_handle->url_param_map,
- &key);
- }
- if (NULL == exp_str) {
- handle->emsg = GNUNET_strdup ("No expiration given!\n");
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Unable to parse JSONAPI Object from %s\n",
+ term_data);
GNUNET_SCHEDULER_add_now (&do_error, handle);
return;
}
-
- if (GNUNET_OK !=
- GNUNET_STRINGS_fancy_time_to_relative (exp_str,
- &etime_rel))
+ if (1 != GNUNET_JSONAPI_document_resource_count (json_obj))
{
- handle->emsg = GNUNET_strdup ("Expiration invalid!\n");
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Cannot create more than 1 resource! (Got %d)\n",
+ GNUNET_JSONAPI_document_resource_count (json_obj));
+ GNUNET_JSONAPI_document_delete (json_obj);
GNUNET_SCHEDULER_add_now (&do_error, handle);
return;
}
- time = GNUNET_TIME_absolute_get().abs_value_us;
- exp_time.abs_value_us = time + etime_rel.rel_value_us;
-
+ json_res = GNUNET_JSONAPI_document_get_resource (json_obj, 0);
+ if (GNUNET_NO == GNUNET_JSONAPI_resource_check_type (json_res,
+ GNUNET_REST_JSONAPI_IDENTITY_ATTRIBUTE))
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Unsupported JSON data type\n");
+ GNUNET_JSONAPI_document_delete (json_obj);
+ resp = GNUNET_REST_create_response (NULL);
+ handle->proc (handle->proc_cls, resp, MHD_HTTP_CONFLICT);
+ cleanup_handle (handle);
+ return;
+ }
+ name_str = GNUNET_JSONAPI_resource_get_id (json_res);
+ value_json = GNUNET_JSONAPI_resource_read_attr (json_res,
+ "value");
+ value_str = json_string_value (value_json);
+ attribute = GNUNET_IDENTITY_ATTRIBUTE_claim_new (name_str,
+ GNUNET_IDENTITY_ATTRIBUTE_TYPE_STRING,
+ value_str,
+ strlen (value_str) + 1);
handle->idp = GNUNET_IDENTITY_PROVIDER_connect (cfg);
- handle->idp_op = GNUNET_IDENTITY_PROVIDER_issue_token (handle->idp,
- priv_key,
- &aud_key,
- scopes,
- exp_time,
- nonce,
- &token_creat_cont,
- handle);
-
-}
-
-
-/**
- * Build a GNUid token for identity
- *
- * @param cls the request handle
- */
-static void
-return_token_list (void *cls)
-{
- char* result_str;
- struct RequestHandle *handle = cls;
- struct MHD_Response *resp;
-
- GNUNET_JSONAPI_document_serialize (handle->resp_object, &result_str);
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Result %s\n", result_str);
- resp = GNUNET_REST_create_response (result_str);
- handle->proc (handle->proc_cls, resp, MHD_HTTP_OK);
- GNUNET_free (result_str);
- cleanup_handle (handle);
+ handle->idp_op = GNUNET_IDENTITY_PROVIDER_attribute_store (handle->idp,
+ identity_priv,
+ attribute,
+ &finished_cont,
+ handle);
+ GNUNET_free (attribute);
+ GNUNET_JSONAPI_document_delete (json_obj);
}
-static void
-token_collect_error_cb (void *cls)
-{
- struct RequestHandle *handle = cls;
-
- do_error (handle);
-}
-
/**
- * Collect all tokens for an ego
- *
- * TODO move this into the identity-provider service
+ * Collect all attributes for an ego
*
*/
static void
-token_collect (void *cls,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone,
- const char *label,
- unsigned int rd_count,
- const struct GNUNET_GNSRECORD_Data *rd);
-
-
-static void
-token_collect_finished_cb (void *cls)
+attr_collect (void *cls,
+ const struct GNUNET_CRYPTO_EcdsaPublicKey *identity,
+ const struct GNUNET_IDENTITY_ATTRIBUTE_Claim *attr)
{
+ struct GNUNET_JSONAPI_Resource *json_resource;
struct RequestHandle *handle = cls;
- struct EgoEntry *ego_tmp;
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *priv_key;
-
- ego_tmp = handle->ego_head;
- GNUNET_CONTAINER_DLL_remove (handle->ego_head,
- handle->ego_tail,
- ego_tmp);
- GNUNET_free (ego_tmp->identifier);
- GNUNET_free (ego_tmp->keystring);
- GNUNET_free (ego_tmp);
-
- if (NULL == handle->ego_head)
+ json_t *value;
+
+ if ((NULL == attr->name) || (NULL == attr->data))
{
- //Done
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Adding token END\n");
- handle->ns_it = NULL;
- GNUNET_SCHEDULER_add_now (&return_token_list, handle);
+ GNUNET_IDENTITY_PROVIDER_get_attributes_next (handle->attr_it);
return;
}
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Next ego: %s\n",
- handle->ego_head->identifier);
- priv_key = GNUNET_IDENTITY_ego_get_private_key (handle->ego_head->ego);
- handle->ns_it = GNUNET_NAMESTORE_zone_iteration_start (handle->ns_handle,
- priv_key,
- &token_collect_error_cb,
- handle,
- &token_collect,
- handle,
- &token_collect_finished_cb,
- handle);
-}
-
-
-/**
- * Collect all tokens for an ego
- *
- * TODO move this into the identity-provider service
- *
- */
-static void
-token_collect (void *cls,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone,
- const char *label,
- unsigned int rd_count,
- const struct GNUNET_GNSRECORD_Data *rd)
-{
- struct RequestHandle *handle = cls;
- int i;
- char* data;
- struct GNUNET_JSONAPI_Resource *json_resource;
- json_t *issuer;
- json_t *token;
-
- for (i = 0; i < rd_count; i++)
- {
- if (rd[i].record_type == GNUNET_GNSRECORD_TYPE_ID_TOKEN)
- {
- data = GNUNET_GNSRECORD_value_to_string (rd[i].record_type,
- rd[i].data,
- rd[i].data_size);
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Adding token: %s\n", data);
- json_resource = GNUNET_JSONAPI_resource_new (GNUNET_REST_JSONAPI_IDENTITY_TOKEN,
- label);
- issuer = json_string (handle->ego_head->identifier);
- GNUNET_JSONAPI_resource_add_attr (json_resource,
- GNUNET_REST_JSONAPI_IDENTITY_ISS_REQUEST,
- issuer);
- json_decref (issuer);
- token = json_string (data);
- GNUNET_JSONAPI_resource_add_attr (json_resource,
- GNUNET_REST_JSONAPI_IDENTITY_TOKEN,
- token);
- json_decref (token);
-
- GNUNET_JSONAPI_document_resource_add (handle->resp_object, json_resource);
- GNUNET_free (data);
- }
- }
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Adding attribute: %s\n",
+ attr->name);
+ json_resource = GNUNET_JSONAPI_resource_new (GNUNET_REST_JSONAPI_IDENTITY_ATTRIBUTE,
+ attr->name);
+ GNUNET_JSONAPI_document_resource_add (handle->resp_object, json_resource);
- GNUNET_NAMESTORE_zone_iterator_next (handle->ns_it);
+ value = json_string (attr->data);
+ GNUNET_JSONAPI_resource_add_attr (json_resource,
+ "value",
+ value);
+ json_decref (value);
+ GNUNET_IDENTITY_PROVIDER_get_attributes_next (handle->attr_it);
}
/**
- * Respond to OPTIONS request
+ * List attributes for identity request
*
* @param con_handle the connection handle
* @param url the url
* @param cls the RequestHandle
*/
static void
-list_token_cont (struct GNUNET_REST_RequestHandle *con_handle,
- const char* url,
- void *cls)
+list_attribute_cont (struct GNUNET_REST_RequestHandle *con_handle,
+ const char* url,
+ void *cls)
{
- char* ego_val;
- struct GNUNET_HashCode key;
const struct GNUNET_CRYPTO_EcdsaPrivateKey *priv_key;
struct RequestHandle *handle = cls;
struct EgoEntry *ego_entry;
- struct EgoEntry *ego_tmp;
-
- GNUNET_CRYPTO_hash (GNUNET_REST_JSONAPI_IDENTITY_ISS_REQUEST,
- strlen (GNUNET_REST_JSONAPI_IDENTITY_ISS_REQUEST),
- &key);
+ char *identity;
- if ( GNUNET_YES !=
- GNUNET_CONTAINER_multihashmap_contains (handle->conndata_handle->url_param_map,
- &key) )
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Getting attributes for %s.\n",
+ handle->url);
+ if ( strlen (GNUNET_REST_API_NS_IDENTITY_ATTRIBUTES) >=
+ strlen (handle->url))
{
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "No issuer given.\n");
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "No identity given.\n");
GNUNET_SCHEDULER_add_now (&do_error, handle);
return;
}
- ego_val = GNUNET_CONTAINER_multihashmap_get (handle->conndata_handle->url_param_map,
- &key);
- GNUNET_assert (NULL != ego_val);
- //Remove non-matching egos
+ identity = handle->url + strlen (GNUNET_REST_API_NS_IDENTITY_ATTRIBUTES) + 1;
+
for (ego_entry = handle->ego_head;
- NULL != ego_entry;)
- {
- ego_tmp = ego_entry;
- ego_entry = ego_entry->next;
- if (0 != strcmp (ego_val, ego_tmp->identifier))
- {
- GNUNET_CONTAINER_DLL_remove (handle->ego_head,
- handle->ego_tail,
- ego_tmp);
- GNUNET_free (ego_tmp->identifier);
- GNUNET_free (ego_tmp->keystring);
- GNUNET_free (ego_tmp);
- }
- }
+ NULL != ego_entry;
+ ego_entry = ego_entry->next)
+ if (0 == strcmp (identity, ego_entry->identifier))
+ break;
handle->resp_object = GNUNET_JSONAPI_document_new ();
- if (NULL == handle->ego_head)
+
+
+ if (NULL == ego_entry)
{
//Done
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "No results.\n");
- GNUNET_SCHEDULER_add_now (&return_token_list, handle);
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Ego %s not found.\n",
+ identity);
+ GNUNET_SCHEDULER_add_now (&return_response, handle);
return;
}
- priv_key = GNUNET_IDENTITY_ego_get_private_key (handle->ego_head->ego);
- handle->ns_handle = GNUNET_NAMESTORE_connect (cfg);
- handle->ns_it = GNUNET_NAMESTORE_zone_iteration_start (handle->ns_handle,
- priv_key,
- &token_collect_error_cb,
- handle,
- &token_collect,
- handle,
- &token_collect_finished_cb,
- handle);
-
+ priv_key = GNUNET_IDENTITY_ego_get_private_key (ego_entry->ego);
+ handle->idp = GNUNET_IDENTITY_PROVIDER_connect (cfg);
+ handle->attr_it = GNUNET_IDENTITY_PROVIDER_get_attributes_start (handle->idp,
+ priv_key,
+ &collect_error_cb,
+ handle,
+ &attr_collect,
+ handle,
+ &collect_finished_cb,
+ handle);
}
-/**
- * Return token to requestor
- *
- * @param cls request handle
- * @param token the token
- */
+
static void
-exchange_cont (void *cls,
- const struct GNUNET_IDENTITY_PROVIDER_Token *token,
- uint64_t ticket_nonce)
+revoke_ticket_cont (struct GNUNET_REST_RequestHandle *con_handle,
+ const char* url,
+ void *cls)
{
- json_t *root;
+ const struct GNUNET_CRYPTO_EcdsaPrivateKey *identity_priv;
+ const char* identity_str;
+ const char* audience_str;
+ const char* rnd_str;
+
struct RequestHandle *handle = cls;
+ struct EgoEntry *ego_entry;
struct MHD_Response *resp;
- struct GNUNET_HashCode key;
- char* result;
- char* token_str;
- char* nonce_str;
- uint64_t expected_nonce;
-
- //Get nonce
- GNUNET_CRYPTO_hash (GNUNET_REST_JSONAPI_IDENTITY_PROVIDER_EXPECTED_NONCE,
- strlen (GNUNET_REST_JSONAPI_IDENTITY_PROVIDER_EXPECTED_NONCE),
- &key);
-
- if ( GNUNET_NO ==
- GNUNET_CONTAINER_multihashmap_contains (handle->conndata_handle->url_param_map,
- &key) )
+ struct GNUNET_IDENTITY_PROVIDER_Ticket ticket;
+ struct GNUNET_JSONAPI_Document *json_obj;
+ struct GNUNET_JSONAPI_Resource *json_res;
+ struct GNUNET_CRYPTO_EcdsaPublicKey tmp_pk;
+ char term_data[handle->rest_handle->data_size+1];
+ json_t *rnd_json;
+ json_t *identity_json;
+ json_t *audience_json;
+ json_t *data_json;
+ json_error_t err;
+ struct GNUNET_JSON_Specification docspec[] = {
+ GNUNET_JSON_spec_jsonapi_document (&json_obj),
+ GNUNET_JSON_spec_end()
+ };
+
+ if (0 >= handle->rest_handle->data_size)
{
- handle->emsg = GNUNET_strdup ("No nonce given.");
GNUNET_SCHEDULER_add_now (&do_error, handle);
return;
}
- nonce_str = GNUNET_CONTAINER_multihashmap_get (handle->conndata_handle->url_param_map,
- &key);
- GNUNET_assert (NULL != nonce_str);
- GNUNET_assert (1 == sscanf (nonce_str, "%"SCNu64, &expected_nonce));
- if (ticket_nonce != expected_nonce)
+ term_data[handle->rest_handle->data_size] = '\0';
+ GNUNET_memcpy (term_data,
+ handle->rest_handle->data,
+ handle->rest_handle->data_size);
+ data_json = json_loads (term_data,
+ JSON_DECODE_ANY,
+ &err);
+ GNUNET_assert (GNUNET_OK ==
+ GNUNET_JSON_parse (data_json, docspec,
+ NULL, NULL));
+ json_decref (data_json);
+ if (NULL == json_obj)
{
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Ticket nonce %"SCNu64" does not match expected nonce %"SCNu64"\n",
- ticket_nonce, expected_nonce);
- handle->emsg = GNUNET_strdup ("Ticket nonce does not match expected nonce\n");
+ "Unable to parse JSONAPI Object from %s\n",
+ term_data);
GNUNET_SCHEDULER_add_now (&do_error, handle);
return;
}
+ if (1 != GNUNET_JSONAPI_document_resource_count (json_obj))
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Cannot create more than 1 resource! (Got %d)\n",
+ GNUNET_JSONAPI_document_resource_count (json_obj));
+ GNUNET_JSONAPI_document_delete (json_obj);
+ GNUNET_SCHEDULER_add_now (&do_error, handle);
+ return;
+ }
+ json_res = GNUNET_JSONAPI_document_get_resource (json_obj, 0);
+ if (GNUNET_NO == GNUNET_JSONAPI_resource_check_type (json_res,
+ GNUNET_REST_JSONAPI_IDENTITY_TICKET))
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Unsupported JSON data type\n");
+ GNUNET_JSONAPI_document_delete (json_obj);
+ resp = GNUNET_REST_create_response (NULL);
+ handle->proc (handle->proc_cls, resp, MHD_HTTP_CONFLICT);
+ cleanup_handle (handle);
+ return;
+ }
+ rnd_json = GNUNET_JSONAPI_resource_read_attr (json_res,
+ "rnd");
+ identity_json = GNUNET_JSONAPI_resource_read_attr (json_res,
+ "identity");
+ audience_json = GNUNET_JSONAPI_resource_read_attr (json_res,
+ "audience");
+ rnd_str = json_string_value (rnd_json);
+ identity_str = json_string_value (identity_json);
+ audience_str = json_string_value (audience_json);
+
+ GNUNET_STRINGS_string_to_data (rnd_str,
+ strlen (rnd_str),
+ &ticket.rnd,
+ sizeof (uint64_t));
+ GNUNET_STRINGS_string_to_data (identity_str,
+ strlen (identity_str),
+ &ticket.identity,
+ sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey));
+ GNUNET_STRINGS_string_to_data (audience_str,
+ strlen (audience_str),
+ &ticket.audience,
+ sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey));
- root = json_object ();
- token_str = GNUNET_IDENTITY_PROVIDER_token_to_string (token);
- json_object_set_new (root, "token", json_string (token_str));
- json_object_set_new (root, "token_type", json_string ("jwt"));
- GNUNET_free (token_str);
+ for (ego_entry = handle->ego_head;
+ NULL != ego_entry;
+ ego_entry = ego_entry->next)
+ {
+ GNUNET_IDENTITY_ego_get_public_key (ego_entry->ego,
+ &tmp_pk);
+ if (0 == memcmp (&ticket.identity,
+ &tmp_pk,
+ sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey)))
+ break;
+ }
+ if (NULL == ego_entry)
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Identity unknown (%s)\n", identity_str);
+ GNUNET_JSONAPI_document_delete (json_obj);
+ return;
+ }
+ identity_priv = GNUNET_IDENTITY_ego_get_private_key (ego_entry->ego);
- result = json_dumps (root, JSON_INDENT(1));
- resp = GNUNET_REST_create_response (result);
- GNUNET_free (result);
- handle->proc (handle->proc_cls, resp, MHD_HTTP_OK);
- cleanup_handle (handle);
- json_decref (root);
+ handle->idp = GNUNET_IDENTITY_PROVIDER_connect (cfg);
+ handle->idp_op = GNUNET_IDENTITY_PROVIDER_ticket_revoke (handle->idp,
+ identity_priv,
+ &ticket,
+ &finished_cont,
+ handle);
+ GNUNET_JSONAPI_document_delete (json_obj);
}
-
-/**
- *
- * Callback called when identity for token exchange has been found
- *
- * @param cls request handle
- * @param ego the identity to use as issuer
- * @param ctx user context
- * @param name identity name
- *
- */
static void
-exchange_token_ticket_cb (void *cls,
- struct GNUNET_IDENTITY_Ego *ego,
- void **ctx,
- const char *name)
+consume_cont (void *cls,
+ const struct GNUNET_CRYPTO_EcdsaPublicKey *identity,
+ const struct GNUNET_IDENTITY_ATTRIBUTE_Claim *attr)
{
struct RequestHandle *handle = cls;
- struct GNUNET_HashCode key;
- struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket;
- char* ticket_str;
+ struct GNUNET_JSONAPI_Resource *json_resource;
+ json_t *value;
+
+ if (NULL == identity)
+ {
+ GNUNET_SCHEDULER_add_now (&return_response, handle);
+ return;
+ }
- handle->op = NULL;
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Adding attribute: %s\n",
+ attr->name);
+ json_resource = GNUNET_JSONAPI_resource_new (GNUNET_REST_JSONAPI_IDENTITY_ATTRIBUTE,
+ attr->name);
+ GNUNET_JSONAPI_document_resource_add (handle->resp_object, json_resource);
- if (NULL == ego)
+ value = json_string (attr->data);
+ GNUNET_JSONAPI_resource_add_attr (json_resource,
+ "value",
+ value);
+ json_decref (value);
+}
+
+static void
+consume_ticket_cont (struct GNUNET_REST_RequestHandle *con_handle,
+ const char* url,
+ void *cls)
+{
+ const struct GNUNET_CRYPTO_EcdsaPrivateKey *identity_priv;
+ const char* identity_str;
+ const char* audience_str;
+ const char* rnd_str;
+
+ struct RequestHandle *handle = cls;
+ struct EgoEntry *ego_entry;
+ struct MHD_Response *resp;
+ struct GNUNET_IDENTITY_PROVIDER_Ticket ticket;
+ struct GNUNET_JSONAPI_Document *json_obj;
+ struct GNUNET_JSONAPI_Resource *json_res;
+ struct GNUNET_CRYPTO_EcdsaPublicKey tmp_pk;
+ char term_data[handle->rest_handle->data_size+1];
+ json_t *rnd_json;
+ json_t *identity_json;
+ json_t *audience_json;
+ json_t *data_json;
+ json_error_t err;
+ struct GNUNET_JSON_Specification docspec[] = {
+ GNUNET_JSON_spec_jsonapi_document (&json_obj),
+ GNUNET_JSON_spec_end()
+ };
+
+ if (0 >= handle->rest_handle->data_size)
{
- handle->emsg = GNUNET_strdup ("No identity found.");
GNUNET_SCHEDULER_add_now (&do_error, handle);
return;
}
- //Get ticket
- GNUNET_CRYPTO_hash (GNUNET_REST_JSONAPI_IDENTITY_PROVIDER_TICKET,
- strlen (GNUNET_REST_JSONAPI_IDENTITY_PROVIDER_TICKET),
- &key);
-
- if ( GNUNET_NO ==
- GNUNET_CONTAINER_multihashmap_contains (handle->conndata_handle->url_param_map,
- &key) )
+ term_data[handle->rest_handle->data_size] = '\0';
+ GNUNET_memcpy (term_data,
+ handle->rest_handle->data,
+ handle->rest_handle->data_size);
+ data_json = json_loads (term_data,
+ JSON_DECODE_ANY,
+ &err);
+ GNUNET_assert (GNUNET_OK ==
+ GNUNET_JSON_parse (data_json, docspec,
+ NULL, NULL));
+ json_decref (data_json);
+ if (NULL == json_obj)
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Unable to parse JSONAPI Object from %s\n",
+ term_data);
+ GNUNET_SCHEDULER_add_now (&do_error, handle);
+ return;
+ }
+ if (1 != GNUNET_JSONAPI_document_resource_count (json_obj))
{
- handle->emsg = GNUNET_strdup ("No ticket given.");
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Cannot create more than 1 resource! (Got %d)\n",
+ GNUNET_JSONAPI_document_resource_count (json_obj));
+ GNUNET_JSONAPI_document_delete (json_obj);
GNUNET_SCHEDULER_add_now (&do_error, handle);
return;
}
- ticket_str = GNUNET_CONTAINER_multihashmap_get (handle->conndata_handle->url_param_map,
- &key);
- handle->priv_key = GNUNET_IDENTITY_ego_get_private_key (ego);
- GNUNET_IDENTITY_PROVIDER_string_to_ticket (ticket_str,
- &ticket);
+ json_res = GNUNET_JSONAPI_document_get_resource (json_obj, 0);
+ if (GNUNET_NO == GNUNET_JSONAPI_resource_check_type (json_res,
+ GNUNET_REST_JSONAPI_IDENTITY_TICKET))
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Unsupported JSON data type\n");
+ GNUNET_JSONAPI_document_delete (json_obj);
+ resp = GNUNET_REST_create_response (NULL);
+ handle->proc (handle->proc_cls, resp, MHD_HTTP_CONFLICT);
+ cleanup_handle (handle);
+ return;
+ }
+ rnd_json = GNUNET_JSONAPI_resource_read_attr (json_res,
+ "rnd");
+ identity_json = GNUNET_JSONAPI_resource_read_attr (json_res,
+ "identity");
+ audience_json = GNUNET_JSONAPI_resource_read_attr (json_res,
+ "audience");
+ rnd_str = json_string_value (rnd_json);
+ identity_str = json_string_value (identity_json);
+ audience_str = json_string_value (audience_json);
+
+ GNUNET_STRINGS_string_to_data (rnd_str,
+ strlen (rnd_str),
+ &ticket.rnd,
+ sizeof (uint64_t));
+ GNUNET_STRINGS_string_to_data (identity_str,
+ strlen (identity_str),
+ &ticket.identity,
+ sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey));
+ GNUNET_STRINGS_string_to_data (audience_str,
+ strlen (audience_str),
+ &ticket.audience,
+ sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey));
+ for (ego_entry = handle->ego_head;
+ NULL != ego_entry;
+ ego_entry = ego_entry->next)
+ {
+ GNUNET_IDENTITY_ego_get_public_key (ego_entry->ego,
+ &tmp_pk);
+ if (0 == memcmp (&ticket.audience,
+ &tmp_pk,
+ sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey)))
+ break;
+ }
+ if (NULL == ego_entry)
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Identity unknown (%s)\n", identity_str);
+ GNUNET_JSONAPI_document_delete (json_obj);
+ return;
+ }
+ identity_priv = GNUNET_IDENTITY_ego_get_private_key (ego_entry->ego);
+ handle->resp_object = GNUNET_JSONAPI_document_new ();
handle->idp = GNUNET_IDENTITY_PROVIDER_connect (cfg);
- handle->idp_op = GNUNET_IDENTITY_PROVIDER_exchange_ticket (handle->idp,
- ticket,
- handle->priv_key,
- &exchange_cont,
- handle);
- GNUNET_IDENTITY_PROVIDER_ticket_destroy (ticket);
-
+ handle->idp_op = GNUNET_IDENTITY_PROVIDER_ticket_consume (handle->idp,
+ identity_priv,
+ &ticket,
+ &consume_cont,
+ handle);
+ GNUNET_JSONAPI_document_delete (json_obj);
}
/**
- * Respond to issue request
- *
- * @param con_handle the connection handle
- * @param url the url
- * @param cls the RequestHandle
- */
-static void
-exchange_token_ticket_cont (struct GNUNET_REST_RequestHandle *con_handle,
- const char* url,
- void *cls)
-{
- struct RequestHandle *handle = cls;
-
- //Get token from GNS
- handle->op = GNUNET_IDENTITY_get (handle->identity_handle,
- "gns-master",
- &exchange_token_ticket_cb,
- handle);
-}
-
-/**
* Respond to OPTIONS request
*
* @param con_handle the connection handle
@@ -1013,15 +1022,17 @@ init_cont (struct RequestHandle *handle)
{
struct GNUNET_REST_RequestHandlerError err;
static const struct GNUNET_REST_RequestHandler handlers[] = {
- {MHD_HTTP_METHOD_GET, GNUNET_REST_API_NS_IDENTITY_TOKEN_ISSUE, &issue_token_cont},
- //{MHD_HTTP_METHOD_POST, GNUNET_REST_API_NS_IDENTITY_TOKEN_CHECK, &check_token_cont},
- {MHD_HTTP_METHOD_GET, GNUNET_REST_API_NS_IDENTITY_PROVIDER, &list_token_cont},
- {MHD_HTTP_METHOD_OPTIONS, GNUNET_REST_API_NS_IDENTITY_PROVIDER, &options_cont},
- {MHD_HTTP_METHOD_POST, GNUNET_REST_API_NS_IDENTITY_OAUTH2_TOKEN, &exchange_token_ticket_cont},
+ {MHD_HTTP_METHOD_GET, GNUNET_REST_API_NS_IDENTITY_ATTRIBUTES, &list_attribute_cont},
+ {MHD_HTTP_METHOD_POST, GNUNET_REST_API_NS_IDENTITY_ATTRIBUTES, &add_attribute_cont},
+ {MHD_HTTP_METHOD_GET, GNUNET_REST_API_NS_IDENTITY_TICKETS, &list_tickets_cont},
+ {MHD_HTTP_METHOD_POST, GNUNET_REST_API_NS_IDENTITY_REVOKE, &revoke_ticket_cont},
+ {MHD_HTTP_METHOD_POST, GNUNET_REST_API_NS_IDENTITY_CONSUME, &consume_ticket_cont},
+ {MHD_HTTP_METHOD_OPTIONS, GNUNET_REST_API_NS_IDENTITY_PROVIDER,
+ &options_cont},
GNUNET_REST_HANDLER_END
};
- if (GNUNET_NO == GNUNET_REST_handle_request (handle->conndata_handle,
+ if (GNUNET_NO == GNUNET_REST_handle_request (handle->rest_handle,
handlers,
&err,
handle))
@@ -1104,7 +1115,7 @@ list_ego (void *cls,
* @return GNUNET_OK if request accepted
*/
static void
-rest_identity_process_request(struct GNUNET_REST_RequestHandle *conndata_handle,
+rest_identity_process_request(struct GNUNET_REST_RequestHandle *rest_handle,
GNUNET_REST_ResultProcessor proc,
void *proc_cls)
{
@@ -1114,10 +1125,9 @@ rest_identity_process_request(struct GNUNET_REST_RequestHandle *conndata_handle,
handle->proc_cls = proc_cls;
handle->proc = proc;
handle->state = ID_REST_STATE_INIT;
- handle->conndata_handle = conndata_handle;
+ handle->rest_handle = rest_handle;
-
- handle->url = GNUNET_strdup (conndata_handle->url);
+ handle->url = GNUNET_strdup (rest_handle->url);
if (handle->url[strlen (handle->url)-1] == '/')
handle->url[strlen (handle->url)-1] = '\0';
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
@@ -1162,8 +1172,8 @@ libgnunet_plugin_rest_identity_provider_init (void *cls)
MHD_HTTP_METHOD_DELETE,
MHD_HTTP_METHOD_OPTIONS);
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- _("Identity Token REST API initialized\n"));
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ _("Identity Provider REST API initialized\n"));
return api;
}
@@ -1184,8 +1194,8 @@ libgnunet_plugin_rest_identity_provider_done (void *cls)
GNUNET_free_non_null (allow_methods);
GNUNET_free (api);
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Identity Token REST plugin is finished\n");
+ "Identity Provider REST plugin is finished\n");
return NULL;
}
-/* end of plugin_rest_gns.c */
+/* 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 0000000000..2b76c7bf27
--- /dev/null
+++ b/src/identity-provider/test_idp.conf
@@ -0,0 +1,28 @@
+@INLINE@ test_idp_defaults.conf
+
+[PATHS]
+GNUNET_TEST_HOME = /tmp/test-gnunet-idp-peer-1/
+
+[dht]
+AUTOSTART = YES
+
+[rest]
+AUTOSTART = YES
+#PREFIX = valgrind --leak-check=full --track-origins=yes --log-file=/tmp/restlog
+
+[transport]
+PLUGINS =
+
+[identity-provider]
+AUTOSTART = YES
+#PREFIX = valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes --log-file=/tmp/idplog
+
+[gns]
+#PREFIX = valgrind --leak-check=full --track-origins=yes
+AUTOSTART = YES
+AUTO_IMPORT_PKEY = YES
+MAX_PARALLEL_BACKGROUND_QUERIES = 10
+DEFAULT_LOOKUP_TIMEOUT = 15 s
+RECORD_PUT_INTERVAL = 1 h
+ZONE_PUBLISH_TIME_WINDOW = 1 h
+DNS_ROOT=PD67SGHF3E0447TU9HADIVU9OM7V4QHTOG0EBU69TFRI2LG63DR0
diff --git a/src/identity-provider/test_idp.sh b/src/identity-provider/test_idp.sh
new file mode 100755
index 0000000000..598d1008ce
--- /dev/null
+++ b/src/identity-provider/test_idp.sh
@@ -0,0 +1,31 @@
+#!/bin/bash
+#trap "gnunet-arm -e -c test_idp_lookup.conf" SIGINT
+
+LOCATION=$(which gnunet-config)
+if [ -z $LOCATION ]
+then
+ LOCATION="gnunet-config"
+fi
+$LOCATION --version 1> /dev/null
+if test $? != 0
+then
+ echo "GNUnet command line tools cannot be found, check environmental variables PATH and GNUNET_PREFIX"
+ exit 77
+fi
+
+rm -rf `gnunet-config -c test_idp.conf -s PATHS -o GNUNET_HOME -f`
+
+# (1) PKEY1.user -> PKEY2.resu.user
+# (2) PKEY2.resu -> PKEY3
+# (3) PKEY3.user -> PKEY4
+
+
+which timeout &> /dev/null && DO_TIMEOUT="timeout 30"
+
+TEST_ATTR="test"
+gnunet-arm -s -c test_idp.conf
+gnunet-identity -C testego -c test_idp.conf
+valgrind gnunet-idp -e testego -a email -V john@doe.gnu -c test_idp.conf
+gnunet-idp -e testego -a name -V John -c test_idp.conf
+gnunet-idp -e testego -D -c test_idp.conf
+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 0000000000..7f0f06dacd
--- /dev/null
+++ b/src/identity-provider/test_idp_attribute.sh
@@ -0,0 +1,40 @@
+#!/bin/bash
+trap "gnunet-arm -e -c test_idp.conf" SIGINT
+
+LOCATION=$(which gnunet-config)
+if [ -z $LOCATION ]
+then
+ LOCATION="gnunet-config"
+fi
+$LOCATION --version 1> /dev/null
+if test $? != 0
+then
+ echo "GNUnet command line tools cannot be found, check environmental variables PATH and GNUNET_PREFIX"
+ exit 77
+fi
+
+rm -rf `gnunet-config -c test_idp.conf -s PATHS -o GNUNET_HOME -f`
+
+# (1) PKEY1.user -> PKEY2.resu.user
+# (2) PKEY2.resu -> PKEY3
+# (3) PKEY3.user -> PKEY4
+
+
+which timeout &> /dev/null && DO_TIMEOUT="timeout 30"
+
+TEST_ATTR="test"
+gnunet-arm -s -c test_idp.conf
+#gnunet-arm -i rest -c test_idp.conf
+gnunet-identity -C testego -c test_idp.conf
+gnunet-identity -C rpego -c test_idp.conf
+TEST_KEY=$(gnunet-identity -d -c test_idp.conf | grep testego | awk '{print $3}')
+gnunet-idp -e testego -a email -V john@doe.gnu -c test_idp.conf
+gnunet-idp -e testego -a name -V John -c test_idp.conf > /dev/null 2>&1
+if test $? != 0
+then
+ echo "Failed."
+ exit 1
+fi
+
+#curl localhost:7776/idp/attributes/testego
+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 0000000000..11f6865a4b
--- /dev/null
+++ b/src/identity-provider/test_idp_consume.sh
@@ -0,0 +1,43 @@
+#!/bin/bash
+trap "gnunet-arm -e -c test_idp.conf" SIGINT
+
+LOCATION=$(which gnunet-config)
+if [ -z $LOCATION ]
+then
+ LOCATION="gnunet-config"
+fi
+$LOCATION --version 1> /dev/null
+if test $? != 0
+then
+ echo "GNUnet command line tools cannot be found, check environmental variables PATH and GNUNET_PREFIX"
+ exit 77
+fi
+
+rm -rf `gnunet-config -c test_idp.conf -s PATHS -o GNUNET_HOME -f`
+
+# (1) PKEY1.user -> PKEY2.resu.user
+# (2) PKEY2.resu -> PKEY3
+# (3) PKEY3.user -> PKEY4
+
+
+which timeout &> /dev/null && DO_TIMEOUT="timeout 30"
+
+TEST_ATTR="test"
+gnunet-arm -s -c test_idp.conf
+#gnunet-arm -i rest -c test_idp.conf
+gnunet-identity -C testego -c test_idp.conf
+gnunet-identity -C rpego -c test_idp.conf
+SUBJECT_KEY=$(gnunet-identity -d -c test_idp.conf | grep rpego | awk '{print $3}')
+TEST_KEY=$(gnunet-identity -d -c test_idp.conf | grep testego | awk '{print $3}')
+gnunet-idp -e testego -a email -V john@doe.gnu -c test_idp.conf
+gnunet-idp -e testego -a name -V John -c test_idp.conf
+TICKET=$(gnunet-idp -e testego -i "email,name" -r $SUBJECT_KEY -c test_idp.conf | awk '{print $1}')
+gnunet-idp -e rpego -C $TICKET -c test_idp.conf > /dev/null 2>&1
+
+if test $? != 0
+then
+ "Failed."
+ exit 1
+fi
+#curl http://localhost:7776/idp/tickets/testego
+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 0000000000..10d89c2fbc
--- /dev/null
+++ b/src/identity-provider/test_idp_defaults.conf
@@ -0,0 +1,24 @@
+@INLINE@ ../../contrib/no_forcestart.conf
+
+[PATHS]
+GNUNET_TEST_HOME = /tmp/test-gnunet-idp-testing/
+
+[namestore-sqlite]
+FILENAME = $GNUNET_TEST_HOME/namestore/sqlite_test.db
+
+[namecache-sqlite]
+FILENAME=$GNUNET_TEST_HOME/namecache/namecache.db
+
+[identity]
+# Directory where we store information about our egos
+EGODIR = $GNUNET_TEST_HOME/identity/egos/
+
+[dhtcache]
+DATABASE = heap
+
+[transport]
+PLUGINS = tcp
+
+[transport-tcp]
+BINDTO = 127.0.0.1
+
diff --git a/src/identity-provider/test_idp_issue.sh b/src/identity-provider/test_idp_issue.sh
new file mode 100755
index 0000000000..90487ee736
--- /dev/null
+++ b/src/identity-provider/test_idp_issue.sh
@@ -0,0 +1,42 @@
+#!/bin/bash
+trap "gnunet-arm -e -c test_idp.conf" SIGINT
+
+LOCATION=$(which gnunet-config)
+if [ -z $LOCATION ]
+then
+ LOCATION="gnunet-config"
+fi
+$LOCATION --version 1> /dev/null
+if test $? != 0
+then
+ echo "GNUnet command line tools cannot be found, check environmental variables PATH and GNUNET_PREFIX"
+ exit 77
+fi
+
+rm -rf `gnunet-config -c test_idp.conf -s PATHS -o GNUNET_HOME -f`
+
+# (1) PKEY1.user -> PKEY2.resu.user
+# (2) PKEY2.resu -> PKEY3
+# (3) PKEY3.user -> PKEY4
+
+
+which timeout &> /dev/null && DO_TIMEOUT="timeout 30"
+
+TEST_ATTR="test"
+gnunet-arm -s -c test_idp.conf
+#gnunet-arm -i rest -c test_idp.conf
+gnunet-identity -C testego -c test_idp.conf
+gnunet-identity -C rpego -c test_idp.conf
+SUBJECT_KEY=$(gnunet-identity -d -c test_idp.conf | grep rpego | awk '{print $3}')
+TEST_KEY=$(gnunet-identity -d -c test_idp.conf | grep testego | awk '{print $3}')
+gnunet-idp -e testego -a email -V john@doe.gnu -c test_idp.conf > /dev/null 2>&1
+gnunet-idp -e testego -a name -V John -c test_idp.conf > /dev/null 2>&1
+#gnunet-idp -e testego -D -c test_idp.conf
+gnunet-idp -e testego -i "email,name" -r $SUBJECT_KEY -c test_idp.conf > /dev/null 2>&1
+if test $? != 0
+then
+ echo "Failed."
+ exit 1
+fi
+#curl http://localhost:7776/idp/attributes/testego
+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 0000000000..d5c2c3f771
--- /dev/null
+++ b/src/identity-provider/test_idp_revoke.sh
@@ -0,0 +1,60 @@
+#!/bin/bash
+trap "gnunet-arm -e -c test_idp.conf" SIGINT
+
+LOCATION=$(which gnunet-config)
+if [ -z $LOCATION ]
+then
+ LOCATION="gnunet-config"
+fi
+$LOCATION --version 1> /dev/null
+if test $? != 0
+then
+ echo "GNUnet command line tools cannot be found, check environmental variables PATH and GNUNET_PREFIX"
+ exit 77
+fi
+
+rm -rf `gnunet-config -c test_idp.conf -s PATHS -o GNUNET_HOME -f`
+
+# (1) PKEY1.user -> PKEY2.resu.user
+# (2) PKEY2.resu -> PKEY3
+# (3) PKEY3.user -> PKEY4
+
+
+which timeout &> /dev/null && DO_TIMEOUT="timeout 30"
+
+TEST_ATTR="test"
+gnunet-arm -s -c test_idp.conf
+gnunet-identity -C alice -c test_idp.conf
+gnunet-identity -C bob -c test_idp.conf
+gnunet-identity -C eve -c test_idp.conf
+ALICE_KEY=$(gnunet-identity -d -c test_idp.conf | grep alice | awk '{print $3}')
+BOB_KEY=$(gnunet-identity -d -c test_idp.conf | grep bob | awk '{print $3}')
+EVE_KEY=$(gnunet-identity -d -c test_idp.conf | grep eve | awk '{print $3}')
+
+gnunet-idp -e alice -a email -V john@doe.gnu -c test_idp.conf
+gnunet-idp -e alice -a name -V John -c test_idp.conf
+TICKET_BOB=$(gnunet-idp -e alice -i "email,name" -r $BOB_KEY -c test_idp.conf | awk '{print $1}')
+#gnunet-idp -e bob -C $TICKET_BOB -c test_idp.conf
+TICKET_EVE=$(gnunet-idp -e alice -i "email" -r $EVE_KEY -c test_idp.conf | awk '{print $1}')
+
+
+#echo "Consuming $TICKET"
+#gnunet-idp -e eve -C $TICKET_EVE -c test_idp.conf
+gnunet-idp -e alice -R $TICKET_EVE -c test_idp.conf
+
+gnunet-idp -e eve -C $TICKET_EVE -c test_idp.conf > /dev/null 2>&1
+if test $? == 0
+then
+ echo "Eve can still resolve attributes..."
+ gnunet-arm -e -c test_idp.conf
+ exit 1
+fi
+gnunet-idp -e bob -C $TICKET_BOB -c test_idp.conf > /dev/null 2>&1
+if test $? != 0
+then
+ echo "Bob cannot resolve attributes..."
+ gnunet-arm -e -c test_idp.conf
+ exit 1
+fi
+
+gnunet-arm -e -c test_idp.conf
diff --git a/src/identity/Makefile.am b/src/identity/Makefile.am
index 94e8c5e94e..b8e70fffb7 100644
--- a/src/identity/Makefile.am
+++ b/src/identity/Makefile.am
@@ -42,8 +42,7 @@ libexec_PROGRAMS = \
if HAVE_MHD
if HAVE_JSON
plugin_LTLIBRARIES = \
- libgnunet_plugin_rest_identity.la \
- libgnunet_plugin_gnsrecord_identity.la
+ libgnunet_plugin_rest_identity.la
endif
endif
@@ -55,14 +54,6 @@ gnunet_service_identity_LDADD = \
$(top_builddir)/src/util/libgnunetutil.la \
$(GN_LIBINTL)
-libgnunet_plugin_gnsrecord_identity_la_SOURCES = \
- plugin_gnsrecord_identity.c
-libgnunet_plugin_gnsrecord_identity_la_LIBADD = \
- $(top_builddir)/src/util/libgnunetutil.la \
- $(LTLIBINTL)
-libgnunet_plugin_gnsrecord_identity_la_LDFLAGS = \
- $(GN_PLUGIN_LDFLAGS)
-
libgnunet_plugin_rest_identity_la_SOURCES = \
plugin_rest_identity.c
diff --git a/src/identity/plugin_rest_identity.c b/src/identity/plugin_rest_identity.c
index e64b2685a2..5f34d0f1bf 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,
continue;
json_resource = GNUNET_JSONAPI_resource_new (GNUNET_REST_JSONAPI_IDENTITY_EGO,
ego_entry->keystring);
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Egoname: %s\n",
- ego_entry->identifier);
name_str = json_string (ego_entry->identifier);
GNUNET_JSONAPI_resource_add_attr (
json_resource,
diff --git a/src/include/gnunet_credential_service.h b/src/include/gnunet_credential_service.h
index 9e765c12b2..67c2f2b4c6 100644
--- a/src/include/gnunet_credential_service.h
+++ b/src/include/gnunet_credential_service.h
@@ -20,6 +20,7 @@
/**
* @author Martin Schanzenbach
+ * @author Adnan Husain
*
* @file
* API to the Credential service
@@ -34,6 +35,7 @@
#include "gnunet_util_lib.h"
#include "gnunet_gns_service.h"
+#include "gnunet_identity_service.h"
#ifdef __cplusplus
extern "C"
@@ -52,7 +54,157 @@ struct GNUNET_CREDENTIAL_Handle;
/**
* Handle to control a lookup operation.
*/
-struct GNUNET_CREDENTIAL_LookupRequest;
+struct GNUNET_CREDENTIAL_Request;
+
+/*
+* Enum used for checking whether the issuer has the authority to issue credentials or is just a subject
+*/
+enum GNUNET_CREDENTIAL_CredentialFlags {
+
+ //Subject had credentials before, but have been revoked now
+ GNUNET_CREDENTIAL_FLAG_REVOKED=0,
+
+ //Subject flag indicates that the subject is a holder of this credential and may present it as such
+ GNUNET_CREDENTIAL_FLAG_SUBJECT=1,
+
+ //Issuer flag is used to signify that the subject is allowed to issue this credential and delegate issuance
+ GNUNET_CREDENTIAL_FLAG_ISSUER=2
+
+};
+
+GNUNET_NETWORK_STRUCT_BEGIN
+/**
+ * The attribute delegation record
+ */
+struct GNUNET_CREDENTIAL_DelegationRecord {
+
+ /**
+ * Number of delegation sets in this record
+ */
+ uint32_t set_count;
+
+ /**
+ * Length of delegation sets
+ */
+ uint64_t data_size;
+ /**
+ * Followed by set_count DelegationSetRecords
+ *
+ */
+};
+
+/**
+ * The attribute delegation record
+ */
+struct GNUNET_CREDENTIAL_DelegationRecordSet {
+
+ /**
+ * Public key of the subject this attribute was delegated to
+ */
+ struct GNUNET_CRYPTO_EcdsaPublicKey subject_key;
+
+ /**
+ * Length of attribute, may be 0
+ */
+ uint32_t subject_attribute_len;
+};
+
+
+GNUNET_NETWORK_STRUCT_END
+
+/**
+ * The attribute delegation record
+ */
+struct GNUNET_CREDENTIAL_DelegationSet {
+
+ /**
+ * Public key of the subject this attribute was delegated to
+ */
+ struct GNUNET_CRYPTO_EcdsaPublicKey subject_key;
+
+ uint32_t subject_attribute_len;
+
+ /**
+ * The subject attribute
+ */
+ const char *subject_attribute;
+};
+
+
+/**
+ * A delegation
+ */
+struct GNUNET_CREDENTIAL_Delegation {
+
+ /**
+ * The issuer of the delegation
+ */
+ struct GNUNET_CRYPTO_EcdsaPublicKey issuer_key;
+
+ /**
+ * Public key of the subject this attribute was delegated to
+ */
+ struct GNUNET_CRYPTO_EcdsaPublicKey subject_key;
+
+ /**
+ * Length of the attribute
+ */
+ uint32_t issuer_attribute_len;
+
+ /**
+ * The attribute
+ */
+ const char *issuer_attribute;
+
+ /**
+ * Length of the attribute
+ */
+ uint32_t subject_attribute_len;
+
+ /**
+ * The attribute
+ */
+ const char *subject_attribute;
+};
+
+
+/**
+ * A credential
+ */
+struct GNUNET_CREDENTIAL_Credential {
+
+ /**
+ * The issuer of the credential
+ */
+ struct GNUNET_CRYPTO_EcdsaPublicKey issuer_key;
+
+ /**
+ * Public key of the subject this credential was issued to
+ */
+ struct GNUNET_CRYPTO_EcdsaPublicKey subject_key;
+
+ /**
+ * Signature of this credential
+ */
+ struct GNUNET_CRYPTO_EcdsaSignature signature;
+
+ /**
+ * Expiration of this credential
+ */
+ struct GNUNET_TIME_Absolute expiration;
+
+ /**
+ * Length of the attribute
+ */
+ uint32_t issuer_attribute_len;
+
+ /**
+ * The attribute
+ */
+ const char *issuer_attribute;
+
+};
+
/**
@@ -61,7 +213,7 @@ struct GNUNET_CREDENTIAL_LookupRequest;
* @param cfg configuration to use
* @return handle to the Credential service, or NULL on error
*/
-struct GNUNET_Credential_Handle *
+struct GNUNET_CREDENTIAL_Handle *
GNUNET_CREDENTIAL_connect (const struct GNUNET_CONFIGURATION_Handle *cfg);
@@ -75,56 +227,129 @@ GNUNET_CREDENTIAL_disconnect (struct GNUNET_CREDENTIAL_Handle *handle);
/**
- * Iterator called on obtained result for a Credential lookup.
+ * Iterator called on obtained result for an attribute verification.
*
* @param cls closure
- * @param issuer the issuer chain
- * @param issuer_len length of issuer chain
- * @param value the value returned
+ * @param d_count the number of delegations processed
+ * @param delegation_chain the delegations processed
+ * @param c_count the number of credentials found
+ * @param credential the credentials
*/
-typedef void
-(*GNUNET_CREDENTIAL_LookupResultProcessor) (void *cls,
- struct GNUNET_IDENTITY_Ego *issuer,
- uint16_t issuer_len,
- const struct GNUNET_CREDENTIAL_Value *value);
+typedef void (*GNUNET_CREDENTIAL_CredentialResultProcessor) (void *cls,
+ unsigned int d_count,
+ struct GNUNET_CREDENTIAL_Delegation *delegation_chain,
+ unsigned int c_count,
+ struct GNUNET_CREDENTIAL_Credential *credential);
+/**
+ * Iterator called on obtained result for an attribute delegation.
+ *
+ * @param cls closure
+ * @param success GNUNET_YES if successful
+ * @param result the record data that can be handed to the subject
+ */
+typedef void (*GNUNET_CREDENTIAL_DelegateResultProcessor) (void *cls,
+ uint32_t success);
/**
- * Perform an asynchronous lookup operation for a credential.
+ * Iterator called on obtained result for an attribute delegation removal.
+ *
+ * @param cls closure
+ * @param success GNUNET_YES if successful
+ * @param result the record data that can be handed to the subject
+ */
+typedef void (*GNUNET_CREDENTIAL_RemoveDelegateResultProcessor) (void *cls,
+ uint32_t success);
+
+
+/**
+ * Performs attribute verification.
+ * Checks if there is a delegation chain from
+ * attribute ``issuer_attribute'' issued by the issuer
+ * with public key ``issuer_key'' maps to the attribute
+ * ``subject_attribute'' claimed by the subject with key
+ * ``subject_key''
*
* @param handle handle to the Credential service
- * @param credential the credential to look up
- * @param subject Ego to check the credential for
+ * @param issuer_key the issuer public key
+ * @param issuer_attribute the issuer attribute
+ * @param subject_key the subject public key
+ * @param subject_attribute the attribute claimed by the subject
* @param proc function to call on result
* @param proc_cls closure for processor
* @return handle to the queued request
*/
-struct GNUNET_CREDENTIAL_LookupRequest *
-GNUNET_CREDENTIAL_lookup (struct GNUNET_CREDENTIAL_Handle *handle,
- const char *credential,
- const struct GNUNET_IDENTITY_Ego *subject,
- GNUNET_CREDENTIAL_LookupResultProcessor proc,
+struct GNUNET_CREDENTIAL_Request*
+GNUNET_CREDENTIAL_verify (struct GNUNET_CREDENTIAL_Handle *handle,
+ const struct GNUNET_CRYPTO_EcdsaPublicKey *issuer_key,
+ const char *issuer_attribute,
+ const struct GNUNET_CRYPTO_EcdsaPublicKey *subject_key,
+ uint32_t credential_count,
+ const struct GNUNET_CREDENTIAL_Credential *credentials,
+ GNUNET_CREDENTIAL_CredentialResultProcessor proc,
void *proc_cls);
+struct GNUNET_CREDENTIAL_Request*
+GNUNET_CREDENTIAL_collect (struct GNUNET_CREDENTIAL_Handle *handle,
+ const struct GNUNET_CRYPTO_EcdsaPublicKey *issuer_key,
+ const char *issuer_attribute,
+ const struct GNUNET_CRYPTO_EcdsaPrivateKey *subject_key,
+ GNUNET_CREDENTIAL_CredentialResultProcessor proc,
+ void *proc_cls);
/**
- * Issue a credential to an identity
+ * Delegate an attribute
*
* @param handle handle to the Credential service
- * @param issuer the identity that issues the credential
- * @param subject the subject of the credential
- * @param credential the name of the credential
- * @param value the value of the credential
+ * @param issuer the ego that should be used to delegate the attribute
+ * @param attribute the name of the attribute to delegate
+ * @param subject the subject of the delegation
+ * @param delegated_attribute the name of the attribute that is delegated to
+ * @return handle to the queued request
+ */
+struct GNUNET_CREDENTIAL_Request *
+GNUNET_CREDENTIAL_add_delegation (struct GNUNET_CREDENTIAL_Handle *handle,
+ struct GNUNET_IDENTITY_Ego *issuer,
+ const char *attribute,
+ struct GNUNET_CRYPTO_EcdsaPublicKey *subject,
+ const char *delegated_attribute,
+ GNUNET_CREDENTIAL_DelegateResultProcessor proc,
+ void *proc_cls);
+
+/**
+ * Remove a delegation
+ *
+ * @param handle handle to the Credential service
+ * @param issuer the ego that was used to delegate the attribute
+ * @param attribute the name of the attribute that is delegated
* @return handle to the queued request
*/
-struct GNUNET_CREDENTIAL_IssueRequest *
-GNUNET_CREDENTIAL_issue (struct GNUNET_CREDENTIAL_Handle *handle,
- struct GNUNET_IDENTITY_Ego *issuer,
- struct GNUNET_IDENTITY_Ego *subject,
- const char *credential,
- struct GNUNET_CREDENTIAL_Value *value,
- GNUNET_CREDENTIAL_IssueResultProcessor proc,
- void *proc_cls);
+struct GNUNET_CREDENTIAL_Request *
+GNUNET_CREDENTIAL_remove_delegation (struct GNUNET_CREDENTIAL_Handle *handle,
+ struct GNUNET_IDENTITY_Ego *issuer,
+ const char *attribute,
+ GNUNET_CREDENTIAL_RemoveDelegateResultProcessor proc,
+ void *proc_cls);
+
+
+
+/**
+ * Issue an attribute to a subject
+ *
+ * @param handle handle to the Credential service
+ * @param issuer the ego that should be used to issue the attribute
+ * @param subject the subject of the attribute
+ * @param attribute the name of the attribute
+ * @param expiration the TTL of the credential
+ * @return handle to the queued request
+ */
+struct GNUNET_CREDENTIAL_Credential*
+GNUNET_CREDENTIAL_credential_issue (
+ const struct GNUNET_CRYPTO_EcdsaPrivateKey *issuer,
+ struct GNUNET_CRYPTO_EcdsaPublicKey *subject,
+ const char *attribute,
+ struct GNUNET_TIME_Absolute *expiration);
+
/**
* Remove a credential
@@ -135,14 +360,15 @@ GNUNET_CREDENTIAL_issue (struct GNUNET_CREDENTIAL_Handle *handle,
* @param credential the name of the credential
* @return handle to the queued request
*/
-struct GNUNET_CREDENTIAL_IssueRequest *
-GNUNET_CREDENTIAL_remove (struct GNUNET_CREDENTIAL_Handle *handle,
- struct GNUNET_IDENTITY_Ego *issuer,
- struct GNUNET_IDENTITY_Ego *subject,
- const char *credential,
- GNUNET_CREDENTIAL_IssueResultProcessor proc,
- void *proc_cls);
-
+/**
+ struct GNUNET_CREDENTIAL_IssueRequest *
+ GNUNET_CREDENTIAL_remove (struct GNUNET_CREDENTIAL_Handle *handle,
+ struct GNUNET_IDENTITY_Ego *issuer,
+ struct GNUNET_IDENTITY_Ego *subject,
+ const char *credential,
+ GNUNET_CREDENTIAL_IssueResultProcessor proc,
+ void *proc_cls);
+ */
/**
@@ -151,7 +377,7 @@ GNUNET_CREDENTIAL_remove (struct GNUNET_CREDENTIAL_Handle *handle,
* @param lr the lookup request to cancel
*/
void
-GNUNET_CREDENTIAL_lookup_cancel (struct GNUNET_CREDENTIAL_LookupRequest *lr);
+GNUNET_CREDENTIAL_request_cancel (struct GNUNET_CREDENTIAL_Request *vr);
#if 0 /* keep Emacsens' auto-indent happy */
diff --git a/src/include/gnunet_crypto_lib.h b/src/include/gnunet_crypto_lib.h
index e886a561cd..2fd67ae1b1 100644
--- a/src/include/gnunet_crypto_lib.h
+++ b/src/include/gnunet_crypto_lib.h
@@ -395,6 +395,11 @@ struct GNUNET_CRYPTO_PaillierCiphertext
unsigned char bits[GNUNET_CRYPTO_PAILLIER_BITS * 2 / 8];
};
+/**
+ * @brief type for ABE master keys
+ */
+struct GNUNET_CRYPTO_AbeMasterKey;
+
/* **************** Functions and Macros ************* */
@@ -2137,6 +2142,83 @@ GNUNET_CRYPTO_rsa_verify (const struct GNUNET_HashCode *hash,
const struct GNUNET_CRYPTO_RsaPublicKey *public_key);
+/**
+ * @ingroup crypto
+ * Create a new CP-ABE master key. Caller must free return value.
+ *
+ * @return fresh private key; free using #GNUNET_free
+ */
+struct GNUNET_CRYPTO_AbeMasterKey *
+GNUNET_CRYPTO_cpabe_create_master_key (void);
+void
+GNUNET_CRYPTO_cpabe_delete_master_key (struct GNUNET_CRYPTO_AbeMasterKey *key);
+
+/**
+ * @ingroup crypto
+ * Create a new CP-ABE key. Caller must free return value.
+ *
+ * @return fresh private key; free using #GNUNET_free
+ */
+struct GNUNET_CRYPTO_AbeKey *
+GNUNET_CRYPTO_cpabe_create_key (struct GNUNET_CRYPTO_AbeMasterKey *msk,
+ char **attrs);
+void
+GNUNET_CRYPTO_cpabe_delete_key (struct GNUNET_CRYPTO_AbeKey *key,
+ int delete_pub);
+
+
+/**
+ * @ingroup crypto
+ * Encrypt a block using sessionkey.
+ *
+ * @param block the block to encrypt
+ * @param size the size of the @a block
+ * @param sessionkey the key used to encrypt
+ * @param iv the initialization vector to use, use INITVALUE
+ * for streams.
+ * @return the size of the encrypted block, -1 for errors
+ */
+ssize_t
+GNUNET_CRYPTO_cpabe_encrypt (const void *block,
+ size_t size,
+ const char *policy,
+ const struct GNUNET_CRYPTO_AbeMasterKey *key,
+ void **result);
+
+/**
+ * @ingroup crypto
+ * Encrypt a block using sessionkey.
+ *
+ * @param block the block to encrypt
+ * @param size the size of the @a block
+ * @param sessionkey the key used to encrypt
+ * @param iv the initialization vector to use, use INITVALUE
+ * for streams.
+ * @return the size of the encrypted block, -1 for errors
+ */
+ssize_t
+GNUNET_CRYPTO_cpabe_decrypt (const void *block,
+ size_t size,
+ const struct GNUNET_CRYPTO_AbeKey *key,
+ void **result);
+
+ssize_t
+GNUNET_CRYPTO_cpabe_serialize_key (const struct GNUNET_CRYPTO_AbeKey *key,
+ void **result);
+
+struct GNUNET_CRYPTO_AbeKey*
+GNUNET_CRYPTO_cpabe_deserialize_key (const void *data,
+ size_t len);
+
+ssize_t
+GNUNET_CRYPTO_cpabe_serialize_master_key (const struct GNUNET_CRYPTO_AbeMasterKey *key,
+ void **result);
+
+struct GNUNET_CRYPTO_AbeMasterKey*
+GNUNET_CRYPTO_cpabe_deserialize_master_key (const void *data,
+ size_t len);
+
+
#if 0 /* keep Emacsens' auto-indent happy */
{
#endif
diff --git a/src/include/gnunet_gnsrecord_lib.h b/src/include/gnunet_gnsrecord_lib.h
index 985ae1f7ab..d03b4db3b0 100644
--- a/src/include/gnunet_gnsrecord_lib.h
+++ b/src/include/gnunet_gnsrecord_lib.h
@@ -109,9 +109,29 @@ extern "C"
#define GNUNET_GNSRECORD_TYPE_ID_TOKEN_METADATA 65546
/**
+ * Record type for credential
+ */
+#define GNUNET_GNSRECORD_TYPE_CREDENTIAL 65547
+
+/**
+ * Record type for policies
+ */
+#define GNUNET_GNSRECORD_TYPE_POLICY 65548
+
+/**
* Record type for reverse lookups
*/
-#define GNUNET_GNSRECORD_TYPE_REVERSE 65548
+#define GNUNET_GNSRECORD_TYPE_ATTRIBUTE 65549
+
+/**
+ * Record type for ABE records
+ */
+#define GNUNET_GNSRECORD_TYPE_ABE_KEY 65550
+
+/**
+ * Record type for ABE master keys
+ */
+#define GNUNET_GNSRECORD_TYPE_ABE_MASTER 65551
/**
* 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 0000000000..039b50351b
--- /dev/null
+++ b/src/include/gnunet_identity_attribute_lib.h
@@ -0,0 +1,231 @@
+/*
+ This file is part of GNUnet.
+ Copyright (C) 2017 GNUnet e.V.
+
+ GNUnet is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published
+ by the Free Software Foundation; either version 3, or (at your
+ option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GNUnet; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+/**
+ * @author Martin Schanzenbach
+ *
+ * @file
+ * Identity attribute definitions
+ *
+ * @defgroup identity-provider Identity Provider service
+ * @{
+ */
+#ifndef GNUNET_IDENTITY_ATTRIBUTE_LIB_H
+#define GNUNET_IDENTITY_ATTRIBUTE_LIB_H
+
+#ifdef __cplusplus
+extern "C"
+{
+#if 0 /* keep Emacsens' auto-indent happy */
+}
+#endif
+#endif
+
+#include "gnunet_util_lib.h"
+
+
+/**
+ * No value attribute.
+ */
+#define GNUNET_IDENTITY_ATTRIBUTE_TYPE_NONE 0
+
+/**
+ * String attribute.
+ */
+#define GNUNET_IDENTITY_ATTRIBUTE_TYPE_STRING 1
+
+
+
+/**
+ * An attribute.
+ */
+struct GNUNET_IDENTITY_ATTRIBUTE_Claim
+{
+ /**
+ * The name of the attribute. Note "name" must never be individually
+ * free'd
+ */
+ const char* name;
+
+ /**
+ * Type of Claim
+ */
+ uint32_t type;
+
+ /**
+ * Version
+ */
+ uint32_t version;
+
+ /**
+ * Number of bytes in @e data.
+ */
+ size_t data_size;
+
+ /**
+ * Binary value stored as attribute value. Note: "data" must never
+ * be individually 'malloc'ed, but instead always points into some
+ * existing data area.
+ */
+ const void *data;
+
+};
+
+struct GNUNET_IDENTITY_ATTRIBUTE_ClaimList
+{
+ /**
+ * List head
+ */
+ struct GNUNET_IDENTITY_ATTRIBUTE_ClaimListEntry *list_head;
+
+ /**
+ * List tail
+ */
+ struct GNUNET_IDENTITY_ATTRIBUTE_ClaimListEntry *list_tail;
+};
+
+struct GNUNET_IDENTITY_ATTRIBUTE_ClaimListEntry
+{
+ /**
+ * DLL
+ */
+ struct GNUNET_IDENTITY_ATTRIBUTE_ClaimListEntry *prev;
+
+ /**
+ * DLL
+ */
+ struct GNUNET_IDENTITY_ATTRIBUTE_ClaimListEntry *next;
+
+ /**
+ * The attribute claim
+ */
+ struct GNUNET_IDENTITY_ATTRIBUTE_Claim *claim;
+};
+
+/**
+ * Create a new attribute claim.
+ *
+ * @param name the attribute name
+ * @param type the attribute type
+ * @param data the attribute value
+ * @param data_size the attribute value size
+ * @return the new attribute
+ */
+struct GNUNET_IDENTITY_ATTRIBUTE_Claim *
+GNUNET_IDENTITY_ATTRIBUTE_claim_new (const char* attr_name,
+ uint32_t type,
+ const void* data,
+ size_t data_size);
+
+
+/**
+ * Get required size for serialization buffer
+ *
+ * @param attrs the attribute list to serialize
+ *
+ * @return the required buffer size
+ */
+size_t
+GNUNET_IDENTITY_ATTRIBUTE_list_serialize_get_size (const struct GNUNET_IDENTITY_ATTRIBUTE_ClaimList *attrs);
+
+void
+GNUNET_IDENTITY_ATTRIBUTE_list_destroy (struct GNUNET_IDENTITY_ATTRIBUTE_ClaimList *attrs);
+
+
+/**
+ * Serialize an attribute list
+ *
+ * @param attrs the attribute list to serialize
+ * @param result the serialized attribute
+ *
+ * @return length of serialized data
+ */
+size_t
+GNUNET_IDENTITY_ATTRIBUTE_list_serialize (const struct GNUNET_IDENTITY_ATTRIBUTE_ClaimList *attrs,
+ char *result);
+
+/**
+ * Deserialize an attribute list
+ *
+ * @param data the serialized attribute list
+ * @param data_size the length of the serialized data
+ *
+ * @return a GNUNET_IDENTITY_PROVIDER_AttributeList, must be free'd by caller
+ */
+struct GNUNET_IDENTITY_ATTRIBUTE_ClaimList *
+GNUNET_IDENTITY_ATTRIBUTE_list_deserialize (const char* data,
+ size_t data_size);
+
+
+/**
+ * Get required size for serialization buffer
+ *
+ * @param attr the attribute to serialize
+ *
+ * @return the required buffer size
+ */
+size_t
+GNUNET_IDENTITY_ATTRIBUTE_serialize_get_size (const struct GNUNET_IDENTITY_ATTRIBUTE_Claim *attr);
+
+
+
+/**
+ * Serialize an attribute
+ *
+ * @param attr the attribute to serialize
+ * @param result the serialized attribute
+ *
+ * @return length of serialized data
+ */
+size_t
+GNUNET_IDENTITY_ATTRIBUTE_serialize (const struct GNUNET_IDENTITY_ATTRIBUTE_Claim *attr,
+ char *result);
+
+/**
+ * Deserialize an attribute
+ *
+ * @param data the serialized attribute
+ * @param data_size the length of the serialized data
+ *
+ * @return a GNUNET_IDENTITY_PROVIDER_Attribute, must be free'd by caller
+ */
+struct GNUNET_IDENTITY_ATTRIBUTE_Claim *
+GNUNET_IDENTITY_ATTRIBUTE_deserialize (const char* data,
+ size_t data_size);
+
+struct GNUNET_IDENTITY_ATTRIBUTE_ClaimList*
+GNUNET_IDENTITY_ATTRIBUTE_list_dup (const struct GNUNET_IDENTITY_ATTRIBUTE_ClaimList *attrs);
+
+
+
+#if 0 /* keep Emacsens' auto-indent happy */
+{
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+
+/* ifndef GNUNET_IDENTITY_ATTRIBUTE_LIB_H */
+#endif
+
+/** @} */ /* end of group identity */
+
+/* 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 0000000000..edeed57fd4
--- /dev/null
+++ b/src/include/gnunet_identity_attribute_plugin.h
@@ -0,0 +1,149 @@
+/*
+ This file is part of GNUnet
+ Copyright (C) 2012, 2013 GNUnet e.V.
+
+ GNUnet is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published
+ by the Free Software Foundation; either version 3, or (at your
+ option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GNUnet; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+/**
+ * @author Martin Schanzenbach
+ *
+ * @file
+ * Plugin API for the idp database backend
+ *
+ * @defgroup identity-provider-plugin IdP service plugin API
+ * Plugin API for the idp database backend
+ * @{
+ */
+#ifndef GNUNET_IDENTITY_ATTRIBUTE_PLUGIN_H
+#define GNUNET_IDENTITY_ATTRIBUTE_PLUGIN_H
+
+#include "gnunet_util_lib.h"
+#include "gnunet_identity_attribute_lib.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#if 0 /* keep Emacsens' auto-indent happy */
+}
+#endif
+#endif
+
+
+/**
+ * Function called to convert the binary value @a data of an attribute of
+ * type @a type to a human-readable string.
+ *
+ * @param cls closure
+ * @param type type of the attribute
+ * @param data value in binary encoding
+ * @param data_size number of bytes in @a data
+ * @return NULL on error, otherwise human-readable representation of the value
+ */
+typedef char * (*GNUNET_IDENTITY_ATTRIBUTE_ValueToStringFunction) (void *cls,
+ uint32_t type,
+ const void *data,
+ size_t data_size);
+
+
+/**
+ * Function called to convert human-readable version of the value @a s
+ * of an attribute of type @a type to the respective binary
+ * representation.
+ *
+ * @param cls closure
+ * @param type type of the attribute
+ * @param s human-readable string
+ * @param data set to value in binary encoding (will be allocated)
+ * @param data_size set to number of bytes in @a data
+ * @return #GNUNET_OK on success
+ */
+typedef int (*GNUNET_IDENTITY_ATTRIBUTE_StringToValueFunction) (void *cls,
+ uint32_t type,
+ const char *s,
+ void **data,
+ size_t *data_size);
+
+
+/**
+ * Function called to convert a type name to the
+ * corresponding number.
+ *
+ * @param cls closure
+ * @param typename name to convert
+ * @return corresponding number, UINT32_MAX on error
+ */
+typedef uint32_t (*GNUNET_IDENTITY_ATTRIBUTE_TypenameToNumberFunction) (void *cls,
+ const char *typename);
+
+
+/**
+ * Function called to convert a type number (i.e. 1) to the
+ * corresponding type string
+ *
+ * @param cls closure
+ * @param type number of a type to convert
+ * @return corresponding typestring, NULL on error
+ */
+typedef const char * (*GNUNET_IDENTITY_ATTRIBUTE_NumberToTypenameFunction) (void *cls,
+ uint32_t type);
+
+
+/**
+ * Each plugin is required to return a pointer to a struct of this
+ * type as the return value from its entry point.
+ */
+struct GNUNET_IDENTITY_ATTRIBUTE_PluginFunctions
+{
+
+ /**
+ * Closure for all of the callbacks.
+ */
+ void *cls;
+
+ /**
+ * Conversion to string.
+ */
+ GNUNET_IDENTITY_ATTRIBUTE_ValueToStringFunction value_to_string;
+
+ /**
+ * Conversion to binary.
+ */
+ GNUNET_IDENTITY_ATTRIBUTE_StringToValueFunction string_to_value;
+
+ /**
+ * Typename to number.
+ */
+ GNUNET_IDENTITY_ATTRIBUTE_TypenameToNumberFunction typename_to_number;
+
+ /**
+ * Number to typename.
+ */
+ GNUNET_IDENTITY_ATTRIBUTE_NumberToTypenameFunction number_to_typename;
+
+};
+
+
+#if 0 /* keep Emacsens' auto-indent happy */
+{
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
+/** @} */ /* 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 0000000000..4b5098d585
--- /dev/null
+++ b/src/include/gnunet_identity_provider_plugin.h
@@ -0,0 +1,123 @@
+/*
+ This file is part of GNUnet
+ Copyright (C) 2012, 2013 GNUnet e.V.
+
+ GNUnet is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published
+ by the Free Software Foundation; either version 3, or (at your
+ option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GNUnet; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+/**
+ * @author Martin Schanzenbach
+ *
+ * @file
+ * Plugin API for the idp database backend
+ *
+ * @defgroup identity-provider-plugin IdP service plugin API
+ * Plugin API for the idp database backend
+ * @{
+ */
+#ifndef GNUNET_IDENTITY_PROVIDER_PLUGIN_H
+#define GNUNET_IDENTITY_PROVIDER_PLUGIN_H
+
+#include "gnunet_util_lib.h"
+#include "gnunet_identity_provider_service.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#if 0 /* keep Emacsens' auto-indent happy */
+}
+#endif
+#endif
+
+
+/**
+ * Function called by for each matching ticket.
+ *
+ * @param cls closure
+ * @param ticket the ticket
+ */
+typedef void (*GNUNET_IDENTITY_PROVIDER_TicketIterator) (void *cls,
+ const struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket,
+ const struct GNUNET_IDENTITY_ATTRIBUTE_ClaimList *attrs);
+
+
+/**
+ * @brief struct returned by the initialization function of the plugin
+ */
+struct GNUNET_IDENTITY_PROVIDER_PluginFunctions
+{
+
+ /**
+ * Closure to pass to all plugin functions.
+ */
+ void *cls;
+
+ /**
+ * Store a ticket in the database.
+ *
+ * @param cls closure (internal context for the plugin)
+ * @param ticket the ticket to store
+ * @return #GNUNET_OK on success, else #GNUNET_SYSERR
+ */
+ int (*store_ticket) (void *cls,
+ const struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket,
+ const struct GNUNET_IDENTITY_ATTRIBUTE_ClaimList *attrs);
+
+ /**
+ * Delete a ticket from the database.
+ *
+ * @param cls closure (internal context for the plugin)
+ * @param ticket the ticket to store
+ * @return #GNUNET_OK on success, else #GNUNET_SYSERR
+ */
+ int (*delete_ticket) (void *cls,
+ const struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket);
+
+
+
+ /**
+ * Iterate over all tickets
+ *
+ * @param cls closure (internal context for the plugin)
+ * @param identity the identity
+ * @param audience GNUNET_YES if the identity is the audience of the ticket
+ * else it is considered the issuer
+ * @param iter function to call with the result
+ * @param iter_cls closure for @a iter
+ * @return #GNUNET_OK on success, #GNUNET_NO if there were no results, #GNUNET_SYSERR on error
+ */
+ int (*iterate_tickets) (void *cls,
+ const struct GNUNET_CRYPTO_EcdsaPublicKey *identity,
+ int audience,
+ uint64_t offset,
+ GNUNET_IDENTITY_PROVIDER_TicketIterator iter, void *iter_cls);
+
+ int (*get_ticket_attributes) (void* cls,
+ const struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket,
+ GNUNET_IDENTITY_PROVIDER_TicketIterator iter,
+ void *iter_cls);
+};
+
+#if 0 /* keep Emacsens' auto-indent happy */
+{
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
+/** @} */ /* end of group */
diff --git a/src/include/gnunet_identity_provider_service.h b/src/include/gnunet_identity_provider_service.h
index e533f6f8cf..6bc05d0f4d 100644
--- a/src/include/gnunet_identity_provider_service.h
+++ b/src/include/gnunet_identity_provider_service.h
@@ -39,7 +39,7 @@ extern "C"
#endif
#include "gnunet_util_lib.h"
-
+#include "gnunet_identity_attribute_lib.h"
/**
* Version number of GNUnet Identity Provider API.
@@ -57,169 +57,309 @@ struct GNUNET_IDENTITY_PROVIDER_Handle;
struct GNUNET_IDENTITY_PROVIDER_Token;
/**
- * Handle for a ticket
+ * The ticket
*/
-struct GNUNET_IDENTITY_PROVIDER_Ticket;
+struct GNUNET_IDENTITY_PROVIDER_Ticket
+{
+ /**
+ * The ticket issuer
+ */
+ struct GNUNET_CRYPTO_EcdsaPublicKey identity;
+
+ /**
+ * The ticket audience
+ */
+ struct GNUNET_CRYPTO_EcdsaPublicKey audience;
+
+ /**
+ * The ticket random (NBO)
+ */
+ uint64_t rnd;
+};
/**
* Handle for an operation with the identity provider service.
*/
struct GNUNET_IDENTITY_PROVIDER_Operation;
+
/**
- * Method called when a token has been exchanged for a ticket.
- * On success returns a token
+ * Connect to the identity provider service.
*
- * @param cls closure
- * @param token the token
+ * @param cfg Configuration to contact the identity provider service.
+ * @return handle to communicate with identity provider service
*/
-typedef void
-(*GNUNET_IDENTITY_PROVIDER_ExchangeCallback)(void *cls,
- const struct GNUNET_IDENTITY_PROVIDER_Token *token,
- uint64_t ticket_nonce);
+struct GNUNET_IDENTITY_PROVIDER_Handle *
+GNUNET_IDENTITY_PROVIDER_connect (const struct GNUNET_CONFIGURATION_Handle *cfg);
/**
- * Method called when a token has been issued.
- * On success returns a ticket that can be given to the audience to retrive the
- * token
+ * Continuation called to notify client about result of the
+ * operation.
*
* @param cls closure
- * @param grant the label in GNS pointing to the token
- * @param ticket the ticket
- * @param token the issued token
- * @param name name assigned by the user for this ego,
- * NULL if the user just deleted the ego and it
- * must thus no longer be used
+ * @param success #GNUNET_SYSERR on failure (including timeout/queue drop/failure to validate)
+ * #GNUNET_NO if content was already there or not found
+ * #GNUNET_YES (or other positive value) on success
+ * @param emsg NULL on success, otherwise an error message
*/
typedef void
-(*GNUNET_IDENTITY_PROVIDER_IssueCallback)(void *cls,
- const char *grant,
- const struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket,
- const struct GNUNET_IDENTITY_PROVIDER_Token *token);
+(*GNUNET_IDENTITY_PROVIDER_ContinuationWithStatus) (void *cls,
+ int32_t success,
+ const char *emsg);
/**
- * Connect to the identity provider service.
+ * Store an attribute. If the attribute is already present,
+ * it is replaced with the new attribute.
*
- * @param cfg Configuration to contact the identity provider service.
- * @return handle to communicate with identity provider service
+ * @param h handle to the identity provider
+ * @param pkey private key of the identity
+ * @param attr the attribute
+ * @param cont continuation to call when done
+ * @param cont_cls closure for @a cont
+ * @return handle to abort the request
*/
-struct GNUNET_IDENTITY_PROVIDER_Handle *
-GNUNET_IDENTITY_PROVIDER_connect (const struct GNUNET_CONFIGURATION_Handle *cfg);
+struct GNUNET_IDENTITY_PROVIDER_Operation *
+GNUNET_IDENTITY_PROVIDER_attribute_store (struct GNUNET_IDENTITY_PROVIDER_Handle *h,
+ const struct GNUNET_CRYPTO_EcdsaPrivateKey *pkey,
+ const struct GNUNET_IDENTITY_ATTRIBUTE_Claim *attr,
+ GNUNET_IDENTITY_PROVIDER_ContinuationWithStatus cont,
+ void *cont_cls);
/**
- * Issue a token for a specific audience.
+ * Process an attribute that was stored in the idp.
*
- * @param id identity provider service to use
- * @param iss issuer (identity)
- * @param aud audience (identity)
- * @param scope the identity attributes requested, comman separated
- * @param expiration the token expiration
- * @param nonce the nonce that will be included in token and ticket
- * @param cb callback to call with result
- * @param cb_cls closure
- * @return handle to abort the operation
+ * @param cls closure
+ * @param attr the attribute
*/
-struct GNUNET_IDENTITY_PROVIDER_Operation *
-GNUNET_IDENTITY_PROVIDER_issue_token (struct GNUNET_IDENTITY_PROVIDER_Handle *id,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *iss_key,
- const struct GNUNET_CRYPTO_EcdsaPublicKey *aud_key,
- const char* scope,
- struct GNUNET_TIME_Absolute expiration,
- uint64_t nonce,
- GNUNET_IDENTITY_PROVIDER_IssueCallback cb,
- void *cb_cls);
+typedef void
+(*GNUNET_IDENTITY_PROVIDER_AttributeResult) (void *cls,
+ const struct GNUNET_CRYPTO_EcdsaPublicKey *identity,
+ const struct GNUNET_IDENTITY_ATTRIBUTE_Claim *attr);
+
/**
- * Exchange a ticket for a token. Intended to be used by audience that
- * received a ticket.
+ * List all attributes for a local identity.
+ * This MUST lock the `struct GNUNET_IDENTITY_PROVIDER_Handle`
+ * for any other calls than #GNUNET_IDENTITY_PROVIDER_get_attributes_next() and
+ * #GNUNET_IDENTITY_PROVIDER_get_attributes_stop. @a proc will be called once
+ * immediately, and then again after
+ * #GNUNET_IDENTITY_PROVIDER_get_attributes_next() is invoked.
*
- * @param id identity provider service to use
- * @param ticket the ticket to exchange
- * @param aud_privkey the audience of the ticket
- * @param cont function to call once the operation finished
- * @param cont_cls closure for @a cont
- * @return handle to abort the operation
+ * On error (disconnect), @a error_cb will be invoked.
+ * On normal completion, @a finish_cb proc will be
+ * invoked.
+ *
+ * @param h handle to the idp
+ * @param identity identity to access
+ * @param error_cb function to call on error (i.e. disconnect),
+ * the handle is afterwards invalid
+ * @param error_cb_cls closure for @a error_cb
+ * @param proc function to call on each attribute; it
+ * will be called repeatedly with a value (if available)
+ * @param proc_cls closure for @a proc
+ * @param finish_cb function to call on completion
+ * the handle is afterwards invalid
+ * @param finish_cb_cls closure for @a finish_cb
+ * @return an iterator handle to use for iteration
*/
-struct GNUNET_IDENTITY_PROVIDER_Operation *
-GNUNET_IDENTITY_PROVIDER_exchange_ticket (struct GNUNET_IDENTITY_PROVIDER_Handle *id,
- const struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket,
- const struct GNUNET_CRYPTO_EcdsaPrivateKey *aud_privkey,
- GNUNET_IDENTITY_PROVIDER_ExchangeCallback cont,
- void *cont_cls);
+struct GNUNET_IDENTITY_PROVIDER_AttributeIterator *
+GNUNET_IDENTITY_PROVIDER_get_attributes_start (struct GNUNET_IDENTITY_PROVIDER_Handle *h,
+ const struct GNUNET_CRYPTO_EcdsaPrivateKey *identity,
+ GNUNET_SCHEDULER_TaskCallback error_cb,
+ void *error_cb_cls,
+ GNUNET_IDENTITY_PROVIDER_AttributeResult proc,
+ void *proc_cls,
+ GNUNET_SCHEDULER_TaskCallback finish_cb,
+ void *finish_cb_cls);
/**
- * Disconnect from identity provider service.
+ * Calls the record processor specified in #GNUNET_IDENTITY_PROVIDER_get_attributes_start
+ * for the next record.
*
- * @param h identity provider service to disconnect
+ * @param it the iterator
*/
void
-GNUNET_IDENTITY_PROVIDER_disconnect (struct GNUNET_IDENTITY_PROVIDER_Handle *h);
+GNUNET_IDENTITY_PROVIDER_get_attributes_next (struct GNUNET_IDENTITY_PROVIDER_AttributeIterator *it);
/**
- * Cancel an identity provider operation. Note that the operation MAY still
- * be executed; this merely cancels the continuation; if the request
- * was already transmitted, the service may still choose to complete
- * the operation.
+ * Stops iteration and releases the idp handle for further calls. Must
+ * be called on any iteration that has not yet completed prior to calling
+ * #GNUNET_IDENTITY_PROVIDER_disconnect.
*
- * @param op operation to cancel
+ * @param it the iterator
*/
void
-GNUNET_IDENTITY_PROVIDER_cancel (struct GNUNET_IDENTITY_PROVIDER_Operation *op);
+GNUNET_IDENTITY_PROVIDER_get_attributes_stop (struct GNUNET_IDENTITY_PROVIDER_AttributeIterator *it);
/**
- * Convenience API
+ * Method called when a token has been issued.
+ * On success returns a ticket that can be given to the audience to retrive the
+ * token
+ *
+ * @param cls closure
+ * @param ticket the ticket
*/
+typedef void
+(*GNUNET_IDENTITY_PROVIDER_TicketCallback)(void *cls,
+ const struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket);
/**
- * Destroy token
+ * Issues a ticket to another identity. The identity may use
+ * @GNUNET_IDENTITY_PROVIDER_authorization_ticket_consume to consume the ticket
+ * and retrieve the attributes specified in the AttributeList.
*
- * @param token the token
+ * @param id the identity provider to use
+ * @param iss the issuing identity
+ * @param rp the subject of the ticket (the relying party)
+ * @param attr the attributes that the relying party is given access to
+ * @param cb the callback
+ * @param cb_cls the callback closure
+ * @return handle to abort the operation
*/
-void
-GNUNET_IDENTITY_PROVIDER_token_destroy(struct GNUNET_IDENTITY_PROVIDER_Token *token);
+struct GNUNET_IDENTITY_PROVIDER_Operation *
+GNUNET_IDENTITY_PROVIDER_ticket_issue (struct GNUNET_IDENTITY_PROVIDER_Handle *id,
+ const struct GNUNET_CRYPTO_EcdsaPrivateKey *iss,
+ const struct GNUNET_CRYPTO_EcdsaPublicKey *rp,
+ const struct GNUNET_IDENTITY_ATTRIBUTE_ClaimList *attrs,
+ GNUNET_IDENTITY_PROVIDER_TicketCallback cb,
+ void *cb_cls);
/**
- * Returns string representation of token. A JSON-Web-Token.
+ * Revoked an issued ticket. The relying party will be unable to retrieve
+ * updated attributes.
*
- * @param token the token
- * @return The JWT (must be freed)
+ * @param id the identity provider to use
+ * @param identity the issuing identity
+ * @param ticket the ticket to revoke
+ * @param cb the callback
+ * @param cb_cls the callback closure
+ * @return handle to abort the operation
*/
-char *
-GNUNET_IDENTITY_PROVIDER_token_to_string (const struct GNUNET_IDENTITY_PROVIDER_Token *token);
+struct GNUNET_IDENTITY_PROVIDER_Operation *
+GNUNET_IDENTITY_PROVIDER_ticket_revoke (struct GNUNET_IDENTITY_PROVIDER_Handle *id,
+ const struct GNUNET_CRYPTO_EcdsaPrivateKey *identity,
+ const struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket,
+ GNUNET_IDENTITY_PROVIDER_ContinuationWithStatus cb,
+ void *cb_cls);
+
+
/**
- * Returns string representation of ticket. Base64-Encoded
+ * Consumes an issued ticket. The ticket is persisted
+ * and used to retrieve identity information from the issuer
*
- * @param ticket the ticket
- * @return the Base64-Encoded ticket
+ * @param id the identity provider to use
+ * @param identity the identity that is the subject of the issued ticket (the audience)
+ * @param ticket the issued ticket to consume
+ * @param cb the callback to call
+ * @param cb_cls the callback closure
+ * @return handle to abort the operation
+ */
+struct GNUNET_IDENTITY_PROVIDER_Operation *
+GNUNET_IDENTITY_PROVIDER_ticket_consume (struct GNUNET_IDENTITY_PROVIDER_Handle *id,
+ const struct GNUNET_CRYPTO_EcdsaPrivateKey *identity,
+ const struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket,
+ GNUNET_IDENTITY_PROVIDER_AttributeResult cb,
+ void *cb_cls);
+
+/**
+ * Lists all tickets that have been issued to remote
+ * identites (relying parties)
+ *
+ * @param h the identity provider to use
+ * @param identity the issuing identity
+ * @param error_cb function to call on error (i.e. disconnect),
+ * the handle is afterwards invalid
+ * @param error_cb_cls closure for @a error_cb
+ * @param proc function to call on each ticket; it
+ * will be called repeatedly with a value (if available)
+ * @param proc_cls closure for @a proc
+ * @param finish_cb function to call on completion
+ * the handle is afterwards invalid
+ * @param finish_cb_cls closure for @a finish_cb
+ * @return an iterator handle to use for iteration
+ */
+struct GNUNET_IDENTITY_PROVIDER_TicketIterator *
+GNUNET_IDENTITY_PROVIDER_ticket_iteration_start (struct GNUNET_IDENTITY_PROVIDER_Handle *h,
+ const struct GNUNET_CRYPTO_EcdsaPrivateKey *identity,
+ GNUNET_SCHEDULER_TaskCallback error_cb,
+ void *error_cb_cls,
+ GNUNET_IDENTITY_PROVIDER_TicketCallback proc,
+ void *proc_cls,
+ GNUNET_SCHEDULER_TaskCallback finish_cb,
+ void *finish_cb_cls);
+
+/**
+ * Lists all tickets that have been issued to remote
+ * identites (relying parties)
+ *
+ * @param id the identity provider to use
+ * @param identity the issuing identity
+ * @param error_cb function to call on error (i.e. disconnect),
+ * the handle is afterwards invalid
+ * @param error_cb_cls closure for @a error_cb
+ * @param proc function to call on each ticket; it
+ * will be called repeatedly with a value (if available)
+ * @param proc_cls closure for @a proc
+ * @param finish_cb function to call on completion
+ * the handle is afterwards invalid
+ * @param finish_cb_cls closure for @a finish_cb
+ * @return an iterator handle to use for iteration
*/
-char *
-GNUNET_IDENTITY_PROVIDER_ticket_to_string (const struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket);
+struct GNUNET_IDENTITY_PROVIDER_TicketIterator *
+GNUNET_IDENTITY_PROVIDER_ticket_iteration_start_rp (struct GNUNET_IDENTITY_PROVIDER_Handle *h,
+ const struct GNUNET_CRYPTO_EcdsaPublicKey *identity,
+ GNUNET_SCHEDULER_TaskCallback error_cb,
+ void *error_cb_cls,
+ GNUNET_IDENTITY_PROVIDER_TicketCallback proc,
+ void *proc_cls,
+ GNUNET_SCHEDULER_TaskCallback finish_cb,
+ void *finish_cb_cls);
/**
- * Created a ticket from a string (Base64 encoded ticket)
+ * Calls the record processor specified in #GNUNET_IDENTITY_PROVIDER_ticket_iteration_start
+ * for the next record.
*
- * @param input Base64 encoded ticket
- * @param ticket pointer where the ticket is stored
- * @return GNUNET_OK
+ * @param it the iterator
*/
-int
-GNUNET_IDENTITY_PROVIDER_string_to_ticket (const char* input,
- struct GNUNET_IDENTITY_PROVIDER_Ticket **ticket);
+void
+GNUNET_IDENTITY_PROVIDER_ticket_iteration_next (struct GNUNET_IDENTITY_PROVIDER_TicketIterator *it);
/**
- * Destroys a ticket
+ * Stops iteration and releases the idp handle for further calls. Must
+ * be called on any iteration that has not yet completed prior to calling
+ * #GNUNET_IDENTITY_PROVIDER_disconnect.
*
- * @param ticket the ticket to destroy
+ * @param it the iterator
*/
void
-GNUNET_IDENTITY_PROVIDER_ticket_destroy(struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket);
+GNUNET_IDENTITY_PROVIDER_ticket_iteration_stop (struct GNUNET_IDENTITY_PROVIDER_TicketIterator *it);
+
+/**
+ * Disconnect from identity provider service.
+ *
+ * @param h identity provider service to disconnect
+ */
+void
+GNUNET_IDENTITY_PROVIDER_disconnect (struct GNUNET_IDENTITY_PROVIDER_Handle *h);
+
+
+/**
+ * Cancel an identity provider operation. Note that the operation MAY still
+ * be executed; this merely cancels the continuation; if the request
+ * was already transmitted, the service may still choose to complete
+ * the operation.
+ *
+ * @param op operation to cancel
+ */
+void
+GNUNET_IDENTITY_PROVIDER_cancel (struct GNUNET_IDENTITY_PROVIDER_Operation *op);
#if 0 /* keep Emacsens' auto-indent happy */
{
diff --git a/src/include/gnunet_jsonapi_lib.h b/src/include/gnunet_jsonapi_lib.h
index f95bff8362..2f6b810f0b 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
* @param res the JSON resource
* @return the resource id
*/
-char*
+const char*
GNUNET_JSONAPI_resource_get_id (const struct GNUNET_JSONAPI_Resource *resource);
diff --git a/src/include/gnunet_protocols.h b/src/include/gnunet_protocols.h
index 72054913f7..6710d749f1 100644
--- a/src/include/gnunet_protocols.h
+++ b/src/include/gnunet_protocols.h
@@ -2620,13 +2620,47 @@ extern "C"
*
* IDENTITY PROVIDER MESSAGE TYPES
*/
-#define GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_ISSUE 961
+#define GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_ATTRIBUTE_STORE 961
-#define GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_EXCHANGE 962
+#define GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_ATTRIBUTE_STORE_RESPONSE 962
-#define GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_ISSUE_RESULT 963
+#define GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_ATTRIBUTE_ITERATION_START 963
-#define GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_EXCHANGE_RESULT 964
+#define GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_ATTRIBUTE_ITERATION_STOP 964
+
+#define GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_ATTRIBUTE_ITERATION_NEXT 965
+
+#define GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_ATTRIBUTE_RESULT 966
+
+#define GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_ISSUE_TICKET 967
+
+#define GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_TICKET_RESULT 968
+
+#define GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_REVOKE_TICKET 969
+
+#define GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_REVOKE_TICKET_RESULT 970
+
+#define GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_CONSUME_TICKET 971
+
+#define GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_CONSUME_TICKET_RESULT 972
+
+#define GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_TICKET_ITERATION_START 973
+
+#define GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_TICKET_ITERATION_STOP 974
+
+#define GNUNET_MESSAGE_TYPE_IDENTITY_PROVIDER_TICKET_ITERATION_NEXT 975
+
+/**************************************************
+ *
+ * CREDENTIAL MESSAGE TYPES
+ */
+#define GNUNET_MESSAGE_TYPE_CREDENTIAL_VERIFY 981
+
+#define GNUNET_MESSAGE_TYPE_CREDENTIAL_VERIFY_RESULT 982
+
+#define GNUNET_MESSAGE_TYPE_CREDENTIAL_COLLECT 983
+
+#define GNUNET_MESSAGE_TYPE_CREDENTIAL_COLLECT_RESULT 984
/******************************************************************************/
diff --git a/src/include/gnunet_signatures.h b/src/include/gnunet_signatures.h
index c1e0d005c2..03bc4575ed 100644
--- a/src/include/gnunet_signatures.h
+++ b/src/include/gnunet_signatures.h
@@ -185,6 +185,11 @@ extern "C"
*/
#define GNUNET_SIGNATURE_PURPOSE_GNUID_TICKET 27
+/**
+ * Signature for a GNUnet credential
+ */
+#define GNUNET_SIGNATURE_PURPOSE_CREDENTIAL 28
+
#if 0 /* keep Emacsens' auto-indent happy */
{
#endif
diff --git a/src/jsonapi/jsonapi_document.c b/src/jsonapi/jsonapi_document.c
index 600b7ee6aa..3a60940f6e 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,
GNUNET_JSONAPI_KEY_ERRORS,
res_json);
} else {
- switch (doc->res_count)
+ if (0 == doc->res_count)
{
- case 0:
- res_json = json_null();
- break;
- case 1:
+ res_json = json_null();
+ } else {
+ res_json = json_array ();
+ for (res = doc->res_list_head;
+ res != NULL;
+ res = res->next)
+ {
GNUNET_assert (GNUNET_OK ==
- GNUNET_JSONAPI_resource_to_json (doc->res_list_head,
- &res_json));
- break;
- default:
- res_json = json_array ();
- for (res = doc->res_list_head;
- res != NULL;
- res = res->next)
- {
- GNUNET_assert (GNUNET_OK ==
- GNUNET_JSONAPI_resource_to_json (res,
- &res_json_tmp));
- json_array_append (res_json, res_json_tmp);
- }
- break;
+ GNUNET_JSONAPI_resource_to_json (res,
+ &res_json_tmp));
+ json_array_append_new (res_json, res_json_tmp);
+ }
}
json_object_set_new (*root_json,
GNUNET_JSONAPI_KEY_DATA,
diff --git a/src/jsonapi/jsonapi_resource.c b/src/jsonapi/jsonapi_resource.c
index 85bca10eeb..be28ad5df3 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)
{
struct GNUNET_JSONAPI_Resource *res;
- if ( (NULL == type) || (0 == strlen (type)) )
+ if (NULL == type)
return NULL;
- if ( (NULL == id) || (0 == strlen (id)) )
+ if (NULL == id)
return NULL;
res = GNUNET_new (struct GNUNET_JSONAPI_Resource);
@@ -245,7 +245,7 @@ GNUNET_JSONAPI_resource_check_id (const struct GNUNET_JSONAPI_Resource *resource
* @param res the JSON resource
* @return the resource id
*/
-char*
+const char*
GNUNET_JSONAPI_resource_get_id (const struct GNUNET_JSONAPI_Resource *resource)
{
return resource->id;
diff --git a/src/namestore/plugin_rest_namestore.c b/src/namestore/plugin_rest_namestore.c
index 50957a5b40..05776801be 100644
--- a/src/namestore/plugin_rest_namestore.c
+++ b/src/namestore/plugin_rest_namestore.c
@@ -401,11 +401,16 @@ namestore_list_finished (void *cls)
struct MHD_Response *resp;
handle->list_it = NULL;
+ if (NULL == handle->resp_object)
+ handle->resp_object = GNUNET_JSONAPI_document_new ();
+
if (GNUNET_SYSERR ==
GNUNET_JSONAPI_document_serialize (handle->resp_object,
&result))
{
- do_error (handle);
+ handle->response_code = MHD_HTTP_INTERNAL_SERVER_ERROR;
+ GNUNET_SCHEDULER_add_now (&do_error,
+ handle);
return;
}
resp = GNUNET_REST_create_response (result);
@@ -467,10 +472,10 @@ namestore_list_response (void *cls,
if (0 < json_array_size(result_array))
{
json_resource = GNUNET_JSONAPI_resource_new (GNUNET_REST_JSONAPI_NAMESTORE_TYPEINFO,
- rname);
+ rname);
GNUNET_JSONAPI_resource_add_attr (json_resource,
- GNUNET_REST_JSONAPI_NAMESTORE_RECORD,
- result_array);
+ GNUNET_REST_JSONAPI_NAMESTORE_RECORD,
+ result_array);
GNUNET_JSONAPI_document_resource_add (handle->resp_object, json_resource);
}
@@ -767,8 +772,8 @@ namestore_create_cont (struct GNUNET_REST_RequestHandle *con,
}
term_data[handle->rest_handle->data_size] = '\0';
GNUNET_memcpy (term_data,
- handle->rest_handle->data,
- handle->rest_handle->data_size);
+ handle->rest_handle->data,
+ handle->rest_handle->data_size);
data_js = json_loads (term_data,
JSON_DECODE_ANY,
&err);
@@ -902,7 +907,7 @@ namestore_zkey_cont (struct GNUNET_REST_RequestHandle *con,
if ((NULL == handle->zkey_str) ||
(GNUNET_OK !=
GNUNET_CRYPTO_ecdsa_public_key_from_string (handle->zkey_str,
- strlen (handle->zkey_str),
+ strlen (handle->zkey_str),
&pubkey)))
{
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
@@ -1021,13 +1026,13 @@ identity_cb (void *cls,
if (GNUNET_OK !=
GNUNET_JSONAPI_handle_request (handle->rest_handle,
- handlers,
- &err,
- handle))
+ handlers,
+ &err,
+ handle))
{
handle->response_code = err.error_code;
GNUNET_SCHEDULER_add_now (&do_error,
- (void *) handle);
+ (void *) handle);
}
}
diff --git a/src/rest/rest.conf b/src/rest/rest.conf
index 6cd0133459..b86e6c1a00 100644
--- a/src/rest/rest.conf
+++ b/src/rest/rest.conf
@@ -1,4 +1,5 @@
[rest]
+UNIXPATH = $GNUNET_USER_RUNTIME_DIR/gnunet-service-rest.sock
BINARY=gnunet-rest-server
REST_PORT=7776
REST_ALLOW_HEADERS=Authorization,Accept,Content-Type
diff --git a/src/util/Makefile.am b/src/util/Makefile.am
index c26e3e84b7..cc9ff47452 100644
--- a/src/util/Makefile.am
+++ b/src/util/Makefile.am
@@ -119,11 +119,22 @@ libgnunetutil_la_LIBADD = \
$(LTLIBINTL) \
-lltdl $(Z_LIBS) -lunistring $(XLIB)
+if HAVE_PBC
+if HAVE_ABE
+libgnunetutil_la_SOURCES += \
+ crypto_abe.c
+libgnunetutil_la_LIBADD += \
+ $(ABE_LIBADD) \
+ -lgabe \
+ -lpbc \
+ -lglib-2.0
+endif
+endif
+
libgnunetutil_la_LDFLAGS = \
$(GN_LIB_LDFLAGS) \
-version-info 13:0:0
-
libgnunetutil_taler_wallet_la_SOURCES = \
common_allocation.c \
common_endian.c \
@@ -553,6 +564,17 @@ test_speedup_SOURCES = \
test_speedup_LDADD = \
libgnunetutil.la
+if HAVE_PBC
+if HAVE_ABE
+test_crypto_abe_SOURCES = \
+ test_crypto_abe.c
+test_crypto_abe_LDADD = \
+ libgnunetutil.la
+check_PROGRAMS += \
+ test_crypto_abe
+endif
+endif
+
perf_crypto_hash_SOURCES = \
perf_crypto_hash.c
perf_crypto_hash_LDADD = \
diff --git a/src/util/crypto_abe.c b/src/util/crypto_abe.c
new file mode 100644
index 0000000000..fcaa826eda
--- /dev/null
+++ b/src/util/crypto_abe.c
@@ -0,0 +1,416 @@
+/*
+ This file is part of GNUnet. Copyright (C) 2001-2014 Christian Grothoff
+ (and other contributing authors)
+
+ GNUnet is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published
+ by the Free Software Foundation; either version 3, or (at your
+ option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GNUnet; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+
+*/
+
+/**
+ * @file util/crypto_random.c
+ * @brief functions to gather random numbers
+ * @author Christian Grothoff
+ */
+
+
+#include "platform.h"
+#include <pbc/pbc.h>
+#include <gabe.h>
+
+#include "gnunet_crypto_lib.h"
+
+struct GNUNET_CRYPTO_AbeMasterKey
+{
+ gabe_pub_t* pub;
+ gabe_msk_t* msk;
+};
+
+struct GNUNET_CRYPTO_AbeKey
+{
+ gabe_pub_t* pub;
+ gabe_prv_t* prv;
+};
+
+static int
+init_aes( element_t k, int enc,
+ gcry_cipher_hd_t* handle,
+ struct GNUNET_CRYPTO_SymmetricSessionKey *key,
+ unsigned char* iv)
+{
+ int rc;
+ int key_len;
+ unsigned char* key_buf;
+
+ key_len = element_length_in_bytes(k) < 33 ? 3 : element_length_in_bytes(k);
+ key_buf = (unsigned char*) malloc(key_len);
+ element_to_bytes(key_buf, k);
+
+ memcpy (key->aes_key, key_buf, GNUNET_CRYPTO_AES_KEY_LENGTH);
+ GNUNET_assert (0 ==
+ gcry_cipher_open (handle, GCRY_CIPHER_AES256,
+ GCRY_CIPHER_MODE_CFB, 0));
+ rc = gcry_cipher_setkey (*handle,
+ key->aes_key,
+ sizeof (key->aes_key));
+ GNUNET_assert ((0 == rc) || ((char) rc == GPG_ERR_WEAK_KEY));
+ memset (iv, 0, 16); //TODO make reasonable
+ rc = gcry_cipher_setiv (*handle,
+ iv,
+ 16);
+ GNUNET_assert ((0 == rc) || ((char) rc == GPG_ERR_WEAK_KEY));
+
+ free(key_buf);
+ return rc;
+}
+
+static int
+aes_128_cbc_encrypt( char* pt,
+ int size,
+ element_t k,
+ char **ct )
+{
+ gcry_cipher_hd_t handle;
+ struct GNUNET_CRYPTO_SymmetricSessionKey skey;
+ unsigned char iv[16];
+ char* buf;
+ int padding;
+ int buf_size;
+ uint8_t len[4];
+ init_aes(k, 1, &handle, &skey, iv);
+
+ /* TODO make less crufty */
+
+ /* stuff in real length (big endian) before padding */
+ len[0] = (size & 0xff000000)>>24;
+ len[1] = (size & 0xff0000)>>16;
+ len[2] = (size & 0xff00)>>8;
+ len[3] = (size & 0xff)>>0;
+ padding = 16 - ((4+size) % 16);
+ buf_size = 4 + size + padding;
+ buf = GNUNET_malloc (buf_size);
+ GNUNET_memcpy (buf, len, 4);
+ GNUNET_memcpy (buf+4, pt, size);
+ *ct = GNUNET_malloc (buf_size);
+
+ GNUNET_assert (0 == gcry_cipher_encrypt (handle, *ct, buf_size, buf, buf_size));
+ gcry_cipher_close (handle);
+ //AES_cbc_encrypt(pt->data, ct->data, pt->len, &key, iv, AES_ENCRYPT);
+ GNUNET_free (buf);
+ return buf_size;
+}
+
+static int
+aes_128_cbc_decrypt( char* ct,
+ int size,
+ element_t k,
+ char **pt )
+{
+ struct GNUNET_CRYPTO_SymmetricSessionKey skey;
+ gcry_cipher_hd_t handle;
+ unsigned char iv[16];
+ char* tmp;
+ uint32_t len;
+
+ init_aes(k, 1, &handle, &skey, iv);
+
+ tmp = GNUNET_malloc (size);
+
+ //AES_cbc_encrypt(ct->data, pt->data, ct->len, &key, iv, AES_DECRYPT);
+ GNUNET_assert (0 == gcry_cipher_decrypt (handle, tmp, size, ct, size));
+ gcry_cipher_close (handle);
+ /* TODO make less crufty */
+
+ /* get real length */
+ len = 0;
+ len = len
+ | ((tmp[0])<<24) | ((tmp[1])<<16)
+ | ((tmp[2])<<8) | ((tmp[3])<<0);
+ /* truncate any garbage from the padding */
+ *pt = GNUNET_malloc (len);
+ GNUNET_memcpy (*pt, tmp+4, len);
+ GNUNET_free (tmp);
+ return len;
+}
+
+struct GNUNET_CRYPTO_AbeMasterKey*
+GNUNET_CRYPTO_cpabe_create_master_key (void)
+{
+ struct GNUNET_CRYPTO_AbeMasterKey* key;
+ key = GNUNET_new (struct GNUNET_CRYPTO_AbeMasterKey);
+ gabe_setup(&key->pub, &key->msk);
+ GNUNET_assert (NULL != key->pub);
+ GNUNET_assert (NULL != key->msk);
+ return key;
+}
+
+void
+GNUNET_CRYPTO_cpabe_delete_master_key (struct GNUNET_CRYPTO_AbeMasterKey *key)
+{
+ gabe_msk_free (key->msk);
+ gabe_pub_free (key->pub);
+ //GNUNET_free (key->msk);
+ //gabe_msk_free (key->msk); //For some reason free of pub implicit?
+ GNUNET_free (key);
+}
+
+struct GNUNET_CRYPTO_AbeKey*
+GNUNET_CRYPTO_cpabe_create_key (struct GNUNET_CRYPTO_AbeMasterKey *key,
+ char **attrs)
+{
+ struct GNUNET_CRYPTO_AbeKey *prv_key;
+ int size;
+ char *tmp;
+
+ prv_key = GNUNET_new (struct GNUNET_CRYPTO_AbeKey);
+ prv_key->prv = gabe_keygen(key->pub, key->msk, attrs);
+ size = gabe_pub_serialize(key->pub, &tmp);
+ prv_key->pub = gabe_pub_unserialize(tmp, size);
+ GNUNET_free (tmp);
+ GNUNET_assert (NULL != prv_key->prv);
+ return prv_key;
+}
+
+void
+GNUNET_CRYPTO_cpabe_delete_key (struct GNUNET_CRYPTO_AbeKey *key,
+ int delete_pub)
+{
+ //Memory management in gabe is buggy
+ gabe_prv_free (key->prv);
+ if (GNUNET_YES == delete_pub)
+ gabe_pub_free (key->pub);
+ GNUNET_free (key);
+}
+
+ssize_t
+write_cpabe (void **result,
+ uint32_t file_len,
+ char* cph_buf,
+ int cph_buf_len,
+ char* aes_buf,
+ int aes_buf_len)
+{
+ char *ptr;
+ uint32_t *len;
+
+ *result = GNUNET_malloc (12 + cph_buf_len + aes_buf_len);
+ ptr = *result;
+ len = (uint32_t*) ptr;
+ *len = htonl (file_len);
+ ptr += 4;
+ len = (uint32_t*) ptr;
+ *len = htonl (aes_buf_len);
+ ptr += 4;
+ memcpy (ptr, aes_buf, aes_buf_len);
+ ptr += aes_buf_len;
+ len = (uint32_t*) ptr;
+ *len = htonl (cph_buf_len);
+ ptr += 4;
+ memcpy (ptr, cph_buf, cph_buf_len);
+ return 12 + cph_buf_len + aes_buf_len;
+}
+
+ssize_t
+read_cpabe (const void *data,
+ char** cph_buf,
+ int *cph_buf_len,
+ char** aes_buf,
+ int *aes_buf_len)
+{
+ int buf_len;
+ char *ptr;
+ uint32_t *len;
+
+ ptr = (char*)data;
+ len = (uint32_t*)ptr;
+ buf_len = ntohl (*len);
+ ptr += 4;
+ len = (uint32_t*)ptr;
+ *aes_buf_len = ntohl (*len);
+ ptr += 4;
+ *aes_buf = GNUNET_malloc (*aes_buf_len);
+ memcpy(*aes_buf, ptr, *aes_buf_len);
+ ptr += *aes_buf_len;
+ len = (uint32_t*)ptr;
+ *cph_buf_len = ntohl (*len);
+ ptr += 4;
+ *cph_buf = GNUNET_malloc (*cph_buf_len);
+ memcpy(*cph_buf, ptr, *cph_buf_len);
+
+ return buf_len;
+}
+
+ssize_t
+GNUNET_CRYPTO_cpabe_encrypt (const void *block,
+ size_t size,
+ const char *policy,
+ const struct GNUNET_CRYPTO_AbeMasterKey *key,
+ void **result)
+{
+ gabe_cph_t* cph;
+ char* plt;
+ char* cph_buf;
+ char* aes_buf;
+ element_t m;
+ int cph_buf_len;
+ int aes_buf_len;
+ ssize_t result_len;
+
+ if( !(cph = gabe_enc(key->pub, m, (char*)policy)) )
+ return GNUNET_SYSERR;
+ cph_buf_len = gabe_cph_serialize(cph,
+ &cph_buf);
+ gabe_cph_free(cph);
+ GNUNET_free (cph);
+ plt = GNUNET_memdup (block, size);
+ aes_buf_len = aes_128_cbc_encrypt(plt, size, m, &aes_buf);
+ GNUNET_free (plt);
+ element_clear(m);
+ result_len = write_cpabe(result, size, cph_buf, cph_buf_len, aes_buf, aes_buf_len);
+ GNUNET_free(cph_buf);
+ GNUNET_free(aes_buf);
+ return result_len;
+}
+
+ssize_t
+GNUNET_CRYPTO_cpabe_decrypt (const void *block,
+ size_t size,
+ const struct GNUNET_CRYPTO_AbeKey *key,
+ void **result)
+{
+ char* aes_buf;
+ char* cph_buf;
+ gabe_cph_t* cph;
+ element_t m;
+ int cph_buf_size;
+ int aes_buf_size;
+ int plt_len;
+
+ read_cpabe(block, &cph_buf, &cph_buf_size, &aes_buf, &aes_buf_size);
+ cph = gabe_cph_unserialize(key->pub, cph_buf, cph_buf_size);
+ if( !gabe_dec(key->pub, key->prv, cph, m) ) {
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "%s\n", gabe_error());
+ GNUNET_free (aes_buf);
+ GNUNET_free (cph_buf);
+ gabe_cph_free(cph);
+ GNUNET_free (cph);
+ element_clear (m);
+ return GNUNET_SYSERR;
+ }
+ gabe_cph_free(cph);
+ GNUNET_free (cph);
+ plt_len = aes_128_cbc_decrypt(aes_buf, aes_buf_size, m, (char**)result);
+ GNUNET_free (cph_buf);
+ GNUNET_free (aes_buf);
+ element_clear (m);
+ //freeing is buggy in gabe
+ //gabe_prv_free (prv);
+ //gabe_pub_free (pub);
+ return plt_len;
+}
+
+ssize_t
+GNUNET_CRYPTO_cpabe_serialize_key (const struct GNUNET_CRYPTO_AbeKey *key,
+ void **result)
+{
+ ssize_t len;
+ char *pub;
+ char *prv;
+ int pub_len;
+ int prv_len;
+
+ pub_len = gabe_pub_serialize (key->pub, &pub);
+ prv_len = gabe_prv_serialize (key->prv, &prv);
+
+ len = pub_len + prv_len + 12;
+ write_cpabe (result, len, pub, pub_len, prv, prv_len);
+
+ GNUNET_free (pub);
+ GNUNET_free (prv);
+
+ return len;
+}
+
+struct GNUNET_CRYPTO_AbeKey*
+GNUNET_CRYPTO_cpabe_deserialize_key (const void *data,
+ size_t len)
+{
+ struct GNUNET_CRYPTO_AbeKey *key;
+ char *pub;
+ char *prv;
+ int prv_len;
+ int pub_len;
+
+ key = GNUNET_new (struct GNUNET_CRYPTO_AbeKey);
+ read_cpabe (data,
+ &pub,
+ &pub_len,
+ &prv,
+ &prv_len);
+ key->pub = gabe_pub_unserialize (pub, pub_len);
+ key->prv = gabe_prv_unserialize (key->pub, prv, prv_len);
+
+ GNUNET_free (pub);
+ GNUNET_free (prv);
+ return key;
+}
+
+ssize_t
+GNUNET_CRYPTO_cpabe_serialize_master_key (const struct GNUNET_CRYPTO_AbeMasterKey *key,
+ void **result)
+{
+ ssize_t len;
+ char *pub;
+ char *msk;
+ int pub_len;
+ int msk_len;
+
+ pub_len = gabe_pub_serialize (key->pub, &pub);
+ msk_len = gabe_msk_serialize (key->msk, &msk);
+
+ len = pub_len + msk_len + 12;
+ write_cpabe (result, len, pub, pub_len, msk, msk_len);
+
+ GNUNET_free (pub);
+ GNUNET_free (msk);
+
+ return len;
+}
+
+struct GNUNET_CRYPTO_AbeMasterKey*
+GNUNET_CRYPTO_cpabe_deserialize_master_key (const void *data,
+ size_t len)
+{
+ struct GNUNET_CRYPTO_AbeMasterKey *key;
+ char *msk;
+ char *pub;
+ int msk_len;
+ int pub_len;
+
+ key = GNUNET_new (struct GNUNET_CRYPTO_AbeMasterKey);
+ read_cpabe (data,
+ &pub,
+ &pub_len,
+ &msk,
+ &msk_len);
+ key->pub = gabe_pub_unserialize (pub, pub_len);
+ key->msk = gabe_msk_unserialize (key->pub, msk, msk_len);
+
+ GNUNET_free (pub);
+ GNUNET_free (msk);
+
+ return key;
+}
diff --git a/src/util/test_crypto_abe.c b/src/util/test_crypto_abe.c
new file mode 100644
index 0000000000..cb36dccaec
--- /dev/null
+++ b/src/util/test_crypto_abe.c
@@ -0,0 +1,86 @@
+/*
+ This file is part of GNUnet.
+ Copyright (C) 2002, 2003, 2004, 2006 GNUnet e.V.
+
+ GNUnet is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published
+ by the Free Software Foundation; either version 3, or (at your
+ option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GNUnet; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+
+*/
+/**
+ * @author Martin Schanzenbach
+ * @file util/test_crypto_abe.c
+ * @brief test for ABE ciphers
+ */
+#include "platform.h"
+#include "gnunet_util_lib.h"
+
+#define TESTSTRING "Hello World!"
+
+static int
+testAbecipher ()
+{
+ struct GNUNET_CRYPTO_AbeMasterKey *msk;
+ struct GNUNET_CRYPTO_AbeKey *key;
+ char *result;
+ char **attrs;
+ int size;
+ char *res;
+ msk = GNUNET_CRYPTO_cpabe_create_master_key ();
+ size = GNUNET_CRYPTO_cpabe_encrypt (TESTSTRING, strlen (TESTSTRING) + 1,
+ "testattr", //Policy
+ msk,
+ (void*)&result);
+ GNUNET_assert (-1 != size);
+ attrs = GNUNET_malloc (2 * sizeof (char*));
+ attrs[0] = "testattr";
+ attrs[1] = NULL;
+ key = GNUNET_CRYPTO_cpabe_create_key (msk,
+ attrs);
+
+ size = GNUNET_CRYPTO_cpabe_decrypt (result, size,
+ key,
+ (void*)&res);
+ if (strlen (TESTSTRING) + 1 != size)
+ {
+ printf ("abeciphertest failed: decryptBlock returned %d\n", size);
+ return 1;
+ }
+ if (0 != strcmp (res, TESTSTRING))
+ {
+ printf ("abeciphertest failed: %s != %s\n", res, TESTSTRING);
+ return 1;
+ }
+ else
+ return 0;
+}
+
+
+int
+main (int argc, char *argv[])
+{
+ int failureCount = 0;
+
+ GNUNET_log_setup ("test-crypto-abe", "WARNING", NULL);
+ failureCount += testAbecipher ();
+
+ if (failureCount != 0)
+ {
+ printf ("%d TESTS FAILED!\n", failureCount);
+ return -1;
+ }
+ return 0;
+}
+
+/* end of test_crypto_aes.c */