/** * @author n1474335 [n1474335@gmail.com] * @copyright Crown Copyright 2016 * @license Apache-2.0 */ import HTMLIngredient from "./HTMLIngredient"; /** * Object to handle the creation of operations. */ class HTMLOperation { /** * HTMLOperation constructor. * * @param {string} name - The name of the operation. * @param {Object} config - The configuration object for this operation. * @param {App} app - The main view object for CyberChef. * @param {Manager} manager - The CyberChef event manager. */ constructor(name, config, app, manager) { this.app = app; this.manager = manager; this.name = name; this.description = config.description; this.infoURL = config.infoURL; this.manualBake = config.manualBake || false; this.config = config; this.ingList = []; for (let i = 0; i < config.args.length; i++) { const ing = new HTMLIngredient(config.args[i], this.app, this.manager); this.ingList.push(ing); } } /** * Renders the operation in HTML as a stub operation with no ingredients. * * @returns {string} */ toStubHtml(removeIcon) { let html = "
  • ${titleFromWikiLink(this.infoURL)}` : ""; html += ` data-container='body' data-toggle='popover' data-placement='right' data-content="${this.description}${infoLink}" data-html='true' data-trigger='hover' data-boundary='viewport'`; } html += ">" + this.name; if (removeIcon) { html += "delete"; } html += "
  • "; return html; } /** * Renders the operation in HTML as a full operation with ingredients. * * @returns {string} */ toFullHtml() { let html = `
    ${this.name}
    `; for (let i = 0; i < this.ingList.length; i++) { html += this.ingList[i].toHtml(); } html += `
    pause not_interested
     
    `; return html; } /** * Highlights the searched string in the name and description of the operation. * * @param {string} searchStr * @param {number} namePos - The position of the search string in the operation name * @param {number} descPos - The position of the search string in the operation description */ highlightSearchString(searchStr, namePos, descPos) { if (namePos >= 0) { this.name = this.name.slice(0, namePos) + "" + this.name.slice(namePos, namePos + searchStr.length) + "" + this.name.slice(namePos + searchStr.length); } if (this.description && descPos >= 0) { // Find HTML tag offsets const re = /<[^>]+>/g; let match; while ((match = re.exec(this.description))) { // If the search string occurs within an HTML tag, return without highlighting it. if (descPos >= match.index && descPos <= (match.index + match[0].length)) return; } this.description = this.description.slice(0, descPos) + "" + this.description.slice(descPos, descPos + searchStr.length) + "" + this.description.slice(descPos + searchStr.length); } } } /** * Given a URL for a Wikipedia (or other wiki) page, this function returns a link to that page. * * @param {string} url * @returns {string} */ function titleFromWikiLink(url) { const splitURL = url.split("/"); if (splitURL.indexOf("wikipedia.org") < 0 && splitURL.indexOf("forensicswiki.org") < 0) { // Not a wiki link, return full URL return `More Informationopen_in_new`; } const wikiName = splitURL.indexOf("forensicswiki.org") < 0 ? "Wikipedia" : "Forensics Wiki"; const pageTitle = decodeURIComponent(splitURL[splitURL.length - 1]) .replace(/_/g, " "); return `${pageTitle}open_in_new on ${wikiName}`; } export default HTMLOperation;