sql.lua 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. local sha256 = require("util.hashes").sha256;
  2. local sha512 = require("util.hashes").sha512;
  3. function execute_and_get_id(dbh, q, ...)
  4. local stm = assert(dbh:prepare(q .. " RETURNING *;"));
  5. local _, err = stm:execute(...);
  6. if err then return nil, err end
  7. dbh:commit();
  8. local result = stm:fetch();
  9. if result then
  10. return result[1];
  11. else
  12. return nil, "Not found";
  13. end
  14. end
  15. function insert_cert(dbh, cert, srv_result_id, chain_index, errors, root)
  16. local stm = assert(dbh:prepare("SELECT certificate_id FROM certificates WHERE pem = ?"));
  17. local pem = cert:pem();
  18. assert(stm:execute(pem));
  19. dbh:commit();
  20. local cert_id = nil;
  21. local results = stm:fetch();
  22. if not results or #results == 0 then
  23. local q = "INSERT INTO certificates ( pem, notbefore, notafter, digest_sha1, digest_sha256," ..
  24. " digest_sha512, pubkey_bitsize, pubkey_type, rsa_modulus," ..
  25. " debian_weak_key, sign_algorithm, trusted_root, crl_url, ocsp_url," ..
  26. " subject_key_info, subject_key_info_sha256, subject_key_info_sha512)" ..
  27. " SELECT ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? WHERE NOT EXISTS (SELECT 1 FROM certificates WHERE digest_sha512 = ?)";
  28. local spki = cert:spki();
  29. local _, pubkey_type, pubkey_bitsize = cert:pubkey();
  30. cert_id, err = execute_and_get_id(dbh, q, pem, date(cert:notbefore()):fmt("%Y-%m-%d %T"), date(cert:notafter()):fmt("%Y-%m-%d %T"), cert:digest("sha1"), cert:digest("sha256"),
  31. cert:digest("sha512"), pubkey_bitsize, pubkey_type, cert:modulus(),
  32. debian_weak_key(cert), cert:signature_alg(), root, cert:crl(), cert:ocsp(),
  33. hex(spki), hex(sha256(spki)), hex(sha512(spki)), cert:digest("sha512"));
  34. -- A race condition, great. Lets retry the lookup.
  35. if err then
  36. assert(stm:execute(pem));
  37. dbh:commit();
  38. cert_id = stm:fetch()[1];
  39. else
  40. stm = assert(dbh:prepare("INSERT INTO certificate_subjects (certificate_id, name, oid, value) VALUES (?, ?, ?, ?)"));
  41. for k,v in pairs(cert:subject()) do
  42. assert(stm:execute(cert_id, v.name, v.oid, v.value));
  43. end
  44. end
  45. else
  46. cert_id = results[1];
  47. end
  48. stm = assert(dbh:prepare("SELECT COUNT(*) FROM certificate_sans WHERE certificate_id = ?"));
  49. assert(stm:execute(cert_id));
  50. local count = stm:fetch()[1];
  51. if cert:extensions()["2.5.29.17"] and count == 0 then
  52. local sans = cert:extensions()["2.5.29.17"];
  53. local dnsnames = {};
  54. local xmppaddrs = {};
  55. local srvnames = {};
  56. stm = assert(dbh:prepare("INSERT INTO certificate_sans (certificate_id, san_type, san_value) VALUES (?, ?, ?)"));
  57. if sans.dNSName then
  58. for k,v in ipairs(sans.dNSName) do
  59. assert(stm:execute(cert_id, "DNSName", v));
  60. end
  61. end
  62. if sans["1.3.6.1.5.5.7.8.5"] then
  63. for k,v in ipairs(sans["1.3.6.1.5.5.7.8.5"]) do -- xmppAddr
  64. assert(stm:execute(cert_id, "XMPPAddr", v));
  65. end
  66. end
  67. if sans["1.3.6.1.5.5.7.8.7"] then
  68. for k,v in ipairs(sans["1.3.6.1.5.5.7.8.7"]) do --= SRVName
  69. assert(stm:execute(cert_id, "SRVName", v));
  70. end
  71. end
  72. end
  73. if srv_result_id then
  74. local srv_certificate_id = assert(execute_and_get_id(dbh, "INSERT INTO srv_certificates (srv_result_id, certificate_id, chain_index) VALUES (?, ?, ?)", srv_result_id, cert_id, chain_index));
  75. print(srv_certificate_id);
  76. local stm = assert(dbh:prepare("INSERT INTO srv_certificate_errors (srv_certificates_id, message) VALUES (?, ?)"));
  77. for k,v in pairs(errors) do
  78. assert(stm:execute(srv_certificate_id, v));
  79. end
  80. end
  81. dbh:commit();
  82. return cert_id;
  83. end
  84. return {
  85. insert_cert = insert_cert,
  86. execute_and_get_id = execute_and_get_id
  87. }