secrets.js 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. $(document).ready(function() {
  2. // Unlocking a secret
  3. $('button.unlock-secret').click(function(event) {
  4. var secret_id = $(this).attr('secret-id');
  5. unlock_secret(secret_id);
  6. event.preventDefault();
  7. });
  8. // Locking a secret
  9. $('button.lock-secret').click(function(event) {
  10. var secret_id = $(this).attr('secret-id');
  11. lock_secret(secret_id);
  12. event.preventDefault();
  13. });
  14. // Adding/editing a secret
  15. $('form').submit(function(event) {
  16. $(this).find('.requires-session-key').each(function() {
  17. if (this.value && document.cookie.indexOf('session_key') == -1) {
  18. console.log('Field ' + this.name + ' requires a session key');
  19. $('#privkey_modal').modal('show');
  20. event.preventDefault();
  21. return false;
  22. }
  23. });
  24. });
  25. // Retrieve a session key
  26. $('#request_session_key').click(function() {
  27. var private_key_field = $('#user_privkey');
  28. var private_key = private_key_field.val();
  29. get_session_key(private_key);
  30. private_key_field.val("");
  31. });
  32. // Retrieve a secret via the API
  33. function unlock_secret(secret_id) {
  34. $.ajax({
  35. url: netbox_api_path + 'secrets/secrets/' + secret_id + '/',
  36. type: 'GET',
  37. dataType: 'json',
  38. success: function (response, status) {
  39. if (response.plaintext) {
  40. console.log("Secret retrieved successfully");
  41. $('#secret_' + secret_id).text(response.plaintext);
  42. $('button.unlock-secret[secret-id=' + secret_id + ']').hide();
  43. $('button.lock-secret[secret-id=' + secret_id + ']').show();
  44. } else {
  45. console.log("Secret was not decrypted. Prompt user for private key.");
  46. $('#privkey_modal').modal('show');
  47. }
  48. },
  49. error: function (xhr, ajaxOptions, thrownError) {
  50. console.log("Error: " + xhr.responseText);
  51. if (xhr.status == 403) {
  52. alert("Permission denied");
  53. } else {
  54. alert(xhr.responseText);
  55. }
  56. }
  57. });
  58. }
  59. // Remove secret data from the DOM
  60. function lock_secret(secret_id) {
  61. var secret_div = $('#secret_' + secret_id);
  62. secret_div.html('********');
  63. $('button.lock-secret[secret-id=' + secret_id + ']').hide();
  64. $('button.unlock-secret[secret-id=' + secret_id + ']').show();
  65. }
  66. // Request a session key via the API
  67. function get_session_key(private_key) {
  68. var csrf_token = $('input[name=csrfmiddlewaretoken]').val();
  69. $.ajax({
  70. url: netbox_api_path + 'secrets/get-session-key/',
  71. type: 'POST',
  72. data: {
  73. private_key: private_key
  74. },
  75. dataType: 'json',
  76. beforeSend: function(xhr, settings) {
  77. xhr.setRequestHeader("X-CSRFToken", csrf_token);
  78. },
  79. success: function (response, status) {
  80. console.log("Received a new session key");
  81. alert('Session key received! You may now unlock secrets.');
  82. },
  83. error: function (xhr, ajaxOptions, thrownError) {
  84. if (xhr.status == 403) {
  85. alert("Permission denied");
  86. } else {
  87. var json = jQuery.parseJSON(xhr.responseText);
  88. alert("Failed to retrieve a session key: " + json['error']);
  89. }
  90. }
  91. });
  92. }
  93. // Generate a new public/private key pair via the API
  94. $('#generate_keypair').click(function() {
  95. $('#new_keypair_modal').modal('show');
  96. $.ajax({
  97. url: netbox_api_path + 'secrets/generate-rsa-key-pair/',
  98. type: 'GET',
  99. dataType: 'json',
  100. success: function (response, status) {
  101. var public_key = response.public_key;
  102. var private_key = response.private_key;
  103. $('#new_pubkey').val(public_key);
  104. $('#new_privkey').val(private_key);
  105. },
  106. error: function (xhr, ajaxOptions, thrownError) {
  107. alert("There was an error generating a new key pair.");
  108. }
  109. });
  110. });
  111. // Accept a new RSA key pair generated via the API
  112. $('#use_new_pubkey').click(function() {
  113. var new_pubkey = $('#new_pubkey');
  114. if (new_pubkey.val()) {
  115. $('#id_public_key').val(new_pubkey.val());
  116. }
  117. });
  118. });