dnscrypto-proxy: Update to release 1.3.0
[tomato.git] / release / src / router / dnscrypt / src / plugins / example-ldns-opendns-deviceid / example-ldns-opendns-deviceid.c
blobb3410b1a100361c27b0da66190f0a0096f3ea33d
2 #include <assert.h>
3 #include <stdio.h>
4 #include <stdlib.h>
5 #include <string.h>
7 #include <dnscrypt/plugin.h>
8 #include <ldns/ldns.h>
10 DCPLUGIN_MAIN(__FILE__);
12 #define EDNS_HEADER "0004000f4f70656e444e53"
13 #define EDNS_DEV_ID "cafebabedeadbeef"
15 const char *
16 dcplugin_description(DCPlugin * const dcplugin)
18 return "Add an OpenDNS device identifier to outgoing queries";
21 const char *
22 dcplugin_long_description(DCPlugin * const dcplugin)
24 return
25 "This plugin tags outgoing packets with a 64-bit shared secret key\n"
26 "for the OpenDNS Umbrella Mobility service.\n"
27 "\n"
28 "If you happen to have an OpenDNS Umbrella Mobility account,\n"
29 "your secret key ('device id') can be retrieved with:\n"
30 "\n"
31 "$ dig txt debug.opendns.com\n"
32 "\n"
33 "# env OPENDNS_DEVICE_ID='<device id>' dnscrypt-proxy --plugin \\\n"
34 " libdcplugin_example_ldns_opendns_deviceid.la";
37 int
38 dcplugin_init(DCPlugin * const dcplugin, int argc, char *argv[])
40 char *device_id;
41 char *device_id_env;
42 char *edns_hex;
43 size_t edns_hex_size = sizeof EDNS_HEADER EDNS_DEV_ID;
45 edns_hex = malloc(sizeof EDNS_HEADER EDNS_DEV_ID);
46 dcplugin_set_user_data(dcplugin, edns_hex);
47 if (edns_hex == NULL) {
48 return -1;
50 memcpy(edns_hex, EDNS_HEADER EDNS_DEV_ID, edns_hex_size);
51 assert(sizeof EDNS_DEV_ID - 1U == (size_t) 16U);
52 device_id = device_id_env = getenv("OPENDNS_DEVICE_ID");
53 if (argc > 1 && strlen(argv[1]) == (size_t) 16U) {
54 device_id = argv[1];
56 if (device_id != NULL) {
57 memcpy(edns_hex + sizeof EDNS_HEADER - (size_t) 1U,
58 device_id, sizeof EDNS_DEV_ID);
60 if (device_id_env != NULL) {
61 memset(device_id_env, 0, strlen(device_id_env));
63 return 0;
66 int
67 dcplugin_destroy(DCPlugin *dcplugin)
69 free(dcplugin_get_user_data(dcplugin));
71 return 0;
74 DCPluginSyncFilterResult
75 dcplugin_sync_pre_filter(DCPlugin *dcplugin, DCPluginDNSPacket *dcp_packet)
77 uint8_t *new_packet;
78 ldns_rdf *edns_data;
79 ldns_pkt *packet;
80 size_t new_packet_size;
82 ldns_wire2pkt(&packet, dcplugin_get_wire_data(dcp_packet),
83 dcplugin_get_wire_data_len(dcp_packet));
85 edns_data = ldns_rdf_new_frm_str(LDNS_RDF_TYPE_HEX,
86 dcplugin_get_user_data(dcplugin));
87 ldns_pkt_set_edns_data(packet, edns_data);
89 ldns_pkt2wire(&new_packet, packet, &new_packet_size);
90 if (dcplugin_get_wire_data_max_len(dcp_packet) >= new_packet_size) {
91 dcplugin_set_wire_data(dcp_packet, new_packet, new_packet_size);
94 free(new_packet);
95 ldns_pkt_free(packet);
97 return DCP_SYNC_FILTER_RESULT_OK;