NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript==
// @name Security Impact Score Calculator
// @namespace http://tampermonkey.net/
// @include https://*.atlassian.net/browse/*
// @version 0.3
// @description This tool calculates security impact score automaticaly based on selected "Security - Affected Areas". Please note that you should first add 2 fields to Jira: "Security - Affected Areas" and "Security Impact Score". Also this version of script works only with Cloud version of Jira
// @author Aliaksei Tatarynchyk
// @license MIT
// @copyright 2019, aliaksei_tatarynchykepam.com (https://openuserjs.org/users/aliaksei_tatarynchykepam.com)
// @grant none
// ==/UserScript==
function initSecurityImpactScoreCalculator($) {
const selectors = {
affectedAreas: "#edit-issue-dialog label:contains(Security - Affected Areas) + select option, .jira-dialog-content label:contains(Security - Affected Areas) + select option",
securityScore: "#edit-issue-dialog label:contains(Security Impact Score) + input, .jira-dialog-content label:contains(Security Impact Score) + input"
}
const impactScoreMapping = {
"None": -100,
"No impact": 0,
"Authentication / Authorization": 5,
"Auditing, monitoring and alerting": 1,
"Cryptography": 5,
"New API": 2,
"New pages": 1,
"New 3rd party dependency": 1,
"New data storage": 3,
"New data flow": 3,
"Handling sensitive data": 5,
"Handling new type of data": 2
};
$('#edit-issue').on('click', function() {
checkThatContentIsLoadedAndRunCallback("#edit-issue-dialog .content", function makeSecurityBlockNavigationEasier() {
$(selectors.affectedAreas).prev().attr('id', 'security-area');
$('#edit-issue-dialog .content').prepend("<a href=\"javascript:void(0)\" onclick=\"$('#security-area').get(0).scrollIntoView()\"><strong>Scroll to Security section</strong></a>");
});
});
$('#jira').on('click', selectors.affectedAreas, function() {
var $affectedAreasDropdown = $(this).parent();
var $selectedAffectedAreas = $affectedAreasDropdown.find("option:selected");
// validation that if 'None' is selected it is the only selected option
var noAffectedAreasAreSelected = false;
var isError = false;
$selectedAffectedAreas.each(function(){
if ($(this).text().trim() === 'None') {
noAffectedAreasAreSelected = true;
if ($selectedAffectedAreas.size() > 1) {
isError = true;
}
}
});
if (isError) {
if ($affectedAreasDropdown.next('.errortext').size() == 0) {
$affectedAreasDropdown.css('border', '2px solid red').after('<span class="errortext" style="color: red">"None" option can\'t be selected together with another option</span>')
}
} else {
$affectedAreasDropdown.css('border', 'none').next('.errortext').remove();
}
if (noAffectedAreasAreSelected) {
$(selectors.securityScore).val('');
return;
}
var impactScore = $selectedAffectedAreas.map(function(i, e) {
return $(e).text().trim();
}).get().reduce(function(acc, val) {
return acc + impactScoreMapping[val];
}, 0);
$(selectors.securityScore).val(impactScore);
});
var runsCount = 0;
function checkThatContentIsLoadedAndRunCallback(contentSelector, callback) {
if (runsCount++ > 15) {
return;
}
if ($(contentSelector).size() > 0) {
runsCount = 0;
callback();
} else {
setTimeout(checkThatContentIsLoadedAndRunCallback, 500, contentSelector, callback);
}
}
}
(function() {
if (typeof(jQuery) !== "undefined") {
initSecurityImpactScoreCalculator(jQuery);
} else {
getScript('https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js', function() {
initSecurityImpactScoreCalculator(jQuery);
});
}
function getScript(url, success) {
var script = document.createElement('script');
script.src = url;
var head = document.getElementsByTagName('head')[0],
done = false;
// Attach handlers for all browsers
script.onload = script.onreadystatechange = function() {
if (!done && (!this.readyState
|| this.readyState == 'loaded'
|| this.readyState == 'complete')) {
done = true;
success();
script.onload = script.onreadystatechange = null;
head.removeChild(script);
}
};
head.appendChild(script);
}
})();