]> git.ipfire.org Git - thirdparty/knot-dns.git/commitdiff
offline KSK: improved deleting offline records
authorLibor Peltan <libcha.p@gmail.com>
Mon, 8 Oct 2018 12:11:53 +0000 (14:11 +0200)
committerLibor Peltan <libor.peltan@nic.cz>
Mon, 5 Nov 2018 09:49:33 +0000 (10:49 +0100)
src/knot/dnssec/kasp/kasp_db.c
src/knot/dnssec/kasp/kasp_db.h
src/utils/keymgr/main.c
src/utils/keymgr/offline_ksk.c
src/utils/keymgr/offline_ksk.h

index e15cc5eb50470434c993733c285e6a06a0eaf0cd..194f58cdbb5061f054c155bc43296f373c190e89 100644 (file)
@@ -186,6 +186,21 @@ static knot_db_val_t make_key(keyclass_t kclass, const knot_dname_t *dname, cons
        return res;
 }
 
+static keyclass_t key_class(const knot_db_val_t *key)
+{
+       return ((uint8_t *)key->data)[0];
+}
+
+static const knot_dname_t *key_dname(const knot_db_val_t *key)
+{
+       return (key->data + 1);
+}
+
+static const char *key_str(const knot_db_val_t *key)
+{
+       return (key->data + 1 + knot_dname_size(key_dname(key)));
+}
+
 static void free_key(knot_db_val_t *key)
 {
        free(key->data);
@@ -837,9 +852,8 @@ int kasp_db_load_offline_rrsig(kasp_db_t *db, const knot_dname_t *for_dname, kno
 #undef CHK_RET
        *next_time = 0;
        if ((it = db_api->iter_next(it)) != NULL && db_api->iter_key(it, &key) == KNOT_EOK) {
-               const knot_dname_t *next_name = (const knot_dname_t *)key.data + 1;
-               if (knot_dname_cmp(next_name, rrsig->owner) == 0) {
-                       *next_time = atol((char *)key.data + 1 + knot_dname_size(next_name));
+               if (knot_dname_cmp(key_dname(&key), rrsig->owner) == 0) {
+                       *next_time = atol(key_str(&key));
                }
        }
 cleanup:
@@ -849,7 +863,7 @@ cleanup:
        return ret;
 }
 
-int kasp_db_delete_offline_rrsig(kasp_db_t *db, const knot_dname_t *zone, knot_time_t until)
+int kasp_db_delete_offline_rrsig(kasp_db_t *db, const knot_dname_t *zone, knot_time_t from, knot_time_t to)
 {
        if (db == NULL) {
                return KNOT_EINVAL;
@@ -858,16 +872,20 @@ int kasp_db_delete_offline_rrsig(kasp_db_t *db, const knot_dname_t *zone, knot_t
        with_txn(KEYS_RW, NULL);
        knot_db_iter_t *iter = db_api->iter_begin(txn, KNOT_DB_NOOP);
 
-       knot_db_val_t key = make_key(KASPDBKEY_OFFLINE_RRSIG, zone, "00000000000000000000");
+       char for_time_str[21];
+       for_time2string(for_time_str, from);
+       knot_db_val_t key = make_key(KASPDBKEY_OFFLINE_RRSIG, zone, for_time_str);
        iter = db_api->iter_seek(iter, &key, KNOT_DB_GEQ);
        free_key(&key);
 
        while (ret == KNOT_EOK && iter != NULL && (ret = db_api->iter_key(iter, &key)) == KNOT_EOK &&
-              key.len > 20 && *(uint8_t *)key.data == KASPDBKEY_OFFLINE_RRSIG && atoll(key.data + key.len - 21) <= until &&
-              knot_dname_cmp((const knot_dname_t *)(key.data + 1), zone) == 0) {
+              key.len > 20 && key_class(&key) == KASPDBKEY_OFFLINE_RRSIG &&
+              knot_time_cmp(atol(key_str(&key)), to) <= 0 &&
+              knot_dname_cmp(key_dname(&key), zone) == 0) {
                ret = knot_db_lmdb_iter_del(iter);
                iter = db_api->iter_next(iter);
        }
+       db_api->iter_finish(iter);
        with_txn_end(NULL);
        return ret;
 }
index c022c8723205951b6d133671f1aebdbbd67436e3..6446a69e55a31790928f20b68b390521a2da34f4 100644 (file)
@@ -268,4 +268,4 @@ int kasp_db_load_offline_rrsig(kasp_db_t *db, const knot_dname_t *for_dname, kno
  *
  * \return KNOT_E*
  */
-int kasp_db_delete_offline_rrsig(kasp_db_t *db, const knot_dname_t *zone, knot_time_t until);
+int kasp_db_delete_offline_rrsig(kasp_db_t *db, const knot_dname_t *zone, knot_time_t from, knot_time_t to);
index ee169d455741b309ae0ce0ead74eea4dcd871b2b..e26da649e6bd26a56e26e7dd3a7e95c92c1548a0 100644 (file)
@@ -219,8 +219,12 @@ static int key_command(int argc, char *argv[], int optind)
                CHECK_MISSING_ARG("Timestamp not specified");
                ret = keymgr_print_rrsig(&kctx, atol(argv[2]));
        } else if (strcmp(argv[1], "del-rrsig") == 0) {
-               CHECK_MISSING_ARG("Timestamp not specified");
-               ret = keymgr_delete_rrsig(&kctx, knot_time() + atol(argv[2]));
+               if (argc < 4) {
+                       printf("Timestamps from-to not specified\n");
+                       ret = KNOT_EINVAL;
+                       goto main_end;
+               }
+               ret = keymgr_delete_rrsig(&kctx, atol(argv[2]), atol(argv[3]));
        } else if (strcmp(argv[1], "del-all-old") == 0) {
                ret = keymgr_del_all_old(&kctx);
        } else if (strcmp(argv[1], "generate-ksr") == 0) {
index 843bb745d8fce82116ad8f085b78f4e43b25c855..a4c73b8cb34b44da05ce5450cc064f4d1d08e555 100644 (file)
@@ -143,9 +143,9 @@ int keymgr_print_rrsig(kdnssec_ctx_t *ctx, knot_time_t when)
        return ret;
 }
 
-int keymgr_delete_rrsig(kdnssec_ctx_t *ctx, knot_time_t until)
+int keymgr_delete_rrsig(kdnssec_ctx_t *ctx, knot_time_t from, knot_time_t to)
 {
-       return kasp_db_delete_offline_rrsig(*ctx->kasp_db, ctx->zone->dname, until);
+       return kasp_db_delete_offline_rrsig(*ctx->kasp_db, ctx->zone->dname, from, to);
 }
 
 int keymgr_del_all_old(kdnssec_ctx_t *ctx)
index a6e8df6c35ebb83ba110950e8c3ffbc51999784b..9d24ca0a1f8e1188ae7b5b94942757a2b436db9d 100644 (file)
@@ -22,7 +22,7 @@ int keymgr_pregenerate_zsks(kdnssec_ctx_t *ctx, knot_time_t upto);
 
 int keymgr_print_rrsig(kdnssec_ctx_t *ctx, knot_time_t when);
 
-int keymgr_delete_rrsig(kdnssec_ctx_t *ctx, knot_time_t until);
+int keymgr_delete_rrsig(kdnssec_ctx_t *ctx, knot_time_t from, knot_time_t to);
 
 int keymgr_del_all_old(kdnssec_ctx_t *ctx);