fixes to hint for incomplete data
This commit is contained in:
@@ -1565,19 +1565,42 @@ class GraphManager {
|
||||
}
|
||||
|
||||
/**
|
||||
* Unhide all hidden nodes, excluding those within a large entity.
|
||||
* FIXED: Unhide all hidden nodes, excluding large entity members and disconnected nodes.
|
||||
* This prevents orphaned large entity members from appearing as free-floating nodes.
|
||||
*/
|
||||
unhideAll() {
|
||||
const allHiddenNodes = this.nodes.get({
|
||||
filter: (node) => {
|
||||
// Condition: Node is hidden AND it is NOT part of a large entity.
|
||||
return node.hidden === true && !(node.metadata && node.metadata.large_entity_id);
|
||||
// Skip nodes that are part of a large entity
|
||||
if (node.metadata && node.metadata.large_entity_id) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Skip nodes that are not hidden
|
||||
if (node.hidden !== true) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Skip nodes that have no edges (would appear disconnected)
|
||||
const nodeId = node.id;
|
||||
const hasIncomingEdges = this.edges.get().some(edge => edge.to === nodeId && !edge.hidden);
|
||||
const hasOutgoingEdges = this.edges.get().some(edge => edge.from === nodeId && !edge.hidden);
|
||||
|
||||
if (!hasIncomingEdges && !hasOutgoingEdges) {
|
||||
console.log(`Skipping disconnected node ${nodeId} from unhide`);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
});
|
||||
|
||||
if (allHiddenNodes.length > 0) {
|
||||
console.log(`Unhiding ${allHiddenNodes.length} nodes with valid connections`);
|
||||
const updates = allHiddenNodes.map(node => ({ id: node.id, hidden: false }));
|
||||
this.nodes.update(updates);
|
||||
} else {
|
||||
console.log('No eligible nodes to unhide');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1397,28 +1397,62 @@ class DNSReconApp {
|
||||
}
|
||||
|
||||
/**
|
||||
* UPDATED: Generate details for standard nodes with organized attribute grouping
|
||||
* UPDATED: Generate details for standard nodes with organized attribute grouping and data warnings
|
||||
*/
|
||||
generateStandardNodeDetails(node) {
|
||||
let html = '';
|
||||
|
||||
|
||||
// Check for and display a crt.sh data warning if it exists
|
||||
const crtshWarningAttr = this.findAttributeByName(node.attributes, 'crtsh_data_warning');
|
||||
if (crtshWarningAttr) {
|
||||
html += `
|
||||
<div class="modal-section" style="border-left: 3px solid #ff9900; background: rgba(255, 153, 0, 0.05);">
|
||||
<details open>
|
||||
<summary style="color: #ff9900;">
|
||||
<span>⚠️ Data Integrity Warning</span>
|
||||
</summary>
|
||||
<div class="modal-section-content">
|
||||
<p class="placeholder-subtext" style="color: #e0e0e0; font-size: 0.8rem; line-height: 1.5;">
|
||||
${this.escapeHtml(crtshWarningAttr.value)}
|
||||
<br><br>
|
||||
This can occur for very large domains (e.g., google.com) where crt.sh may return a limited subset of all available certificates. As a result, the certificate status may not be fully representative.
|
||||
</p>
|
||||
</div>
|
||||
</details>
|
||||
</div>
|
||||
`;
|
||||
}
|
||||
|
||||
// Relationships sections
|
||||
html += this.generateRelationshipsSection(node);
|
||||
|
||||
|
||||
// UPDATED: Enhanced attributes section with intelligent grouping (no formatting)
|
||||
if (node.attributes && Array.isArray(node.attributes) && node.attributes.length > 0) {
|
||||
html += this.generateOrganizedAttributesSection(node.attributes, node.type);
|
||||
}
|
||||
|
||||
|
||||
// Description section
|
||||
html += this.generateDescriptionSection(node);
|
||||
|
||||
|
||||
// Metadata section (collapsed by default)
|
||||
html += this.generateMetadataSection(node);
|
||||
|
||||
|
||||
return html;
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper method to find an attribute by name in the standardized attributes list
|
||||
* @param {Array} attributes - List of StandardAttribute objects
|
||||
* @param {string} name - Attribute name to find
|
||||
* @returns {Object|null} The attribute object if found, null otherwise
|
||||
*/
|
||||
findAttributeByName(attributes, name) {
|
||||
if (!Array.isArray(attributes)) {
|
||||
return null;
|
||||
}
|
||||
return attributes.find(attr => attr.name === name) || null;
|
||||
}
|
||||
|
||||
generateOrganizedAttributesSection(attributes, nodeType) {
|
||||
if (!Array.isArray(attributes) || attributes.length === 0) {
|
||||
return '';
|
||||
|
||||
Reference in New Issue
Block a user