19 package org.sleuthkit.autopsy.contentviewers.osaccount;
21 import java.awt.BorderLayout;
23 import java.awt.GridBagConstraints;
24 import java.awt.GridBagLayout;
25 import java.awt.Insets;
26 import java.text.SimpleDateFormat;
27 import java.util.ArrayList;
28 import java.util.Date;
29 import java.util.HashMap;
30 import java.util.List;
31 import static java.util.Locale.US;
33 import java.util.Optional;
34 import java.util.concurrent.ExecutionException;
35 import java.util.logging.Level;
36 import java.util.logging.Logger;
37 import javax.swing.Box;
38 import javax.swing.JLabel;
39 import javax.swing.JPanel;
40 import javax.swing.SwingWorker;
41 import javax.swing.UIManager;
42 import javax.swing.border.EmptyBorder;
43 import org.openide.util.NbBundle.Messages;
76 private static final SimpleDateFormat
DATE_FORMAT =
new SimpleDateFormat(
"MMM dd yyyy", US);
89 this.setLayout(
new GridBagLayout());
99 void setOsAccountId(Long osAccountId) {
103 if (osAccountId != null) {
104 setLayout(
new BorderLayout());
105 add(
new JLabel(
"Loading OsAccount Data..."), BorderLayout.NORTH);
107 if (dataFetcher != null && !dataFetcher.isDone()) {
108 dataFetcher.cancel(
true);
111 dataFetcher =
new PanelDataFetcher(osAccountId);
112 dataFetcher.execute();
116 void setOsAccount(OsAccount account) {
120 if (account != null) {
121 setLayout(
new BorderLayout());
122 add(
new JLabel(
"Loading OsAccount Data..."), BorderLayout.NORTH);
124 if (dataFetcher != null && !dataFetcher.isDone()) {
125 dataFetcher.cancel(
true);
128 dataFetcher =
new PanelDataFetcher(account);
129 dataFetcher.execute();
142 for (Section section : panelData) {
143 addTitle(section.getTitle(), rowCnt++);
144 for (SectionData data : section) {
145 String subtitle = data.getTitle();
146 if (subtitle != null) {
150 for (RowData<String, String> rowData : data) {
151 String key = rowData.getKey();
152 String value = rowData.getValue();
167 GridBagConstraints constraints =
new GridBagConstraints();
168 constraints.gridx = 0;
169 constraints.gridy = rowCnt;
170 constraints.gridwidth = 2;
171 constraints.fill = GridBagConstraints.BOTH;
172 constraints.weightx = 1;
173 constraints.weighty = 1;
174 add(Box.createVerticalGlue(), constraints);
178 "OsAccountDataPanel_basic_title=Basic Properties",
179 "OsAccountDataPanel_basic_login=Login",
180 "OsAccountDataPanel_basic_fullname=Full Name",
181 "OsAccountDataPanel_basic_address=Address",
182 "OsAccountDataPanel_basic_admin=Administrator",
183 "OsAccountDataPanel_basic_type=Type",
184 "OsAccountDataPanel_basic_creationDate=Creation Date",
185 "OsAccountDataPanel_basic_objId=Object ID"})
195 Section section =
new Section(Bundle.OsAccountDataPanel_basic_title());
197 SectionData data =
new SectionData();
200 data.addData(Bundle.OsAccountDataPanel_basic_login(),
201 optional.isPresent() ? optional.get() :
"");
204 data.addData(Bundle.OsAccountDataPanel_basic_fullname(),
205 optional.isPresent() ? optional.get() :
"");
207 data.addData(Bundle.OsAccountDataPanel_basic_address(),
210 data.addData(Bundle.OsAccountDataPanel_basic_type(),
216 data.addData(Bundle.OsAccountDataPanel_basic_objId(), Long.toString(account.
getId()));
218 section.addSectionData(data);
223 "OsAccountDataPanel_realm_title=Realm Properties",
224 "OsAccountDataPanel_realm_name=Name",
225 "OsAccountDataPanel_realm_address=Address",
226 "OsAccountDataPanel_realm_confidence=Confidence",
227 "OsAccountDataPanel_realm_unknown=Unknown",
228 "OsAccountDataPanel_realm_scope=Scope",})
238 Section section =
new Section(Bundle.OsAccountDataPanel_realm_title());
239 SectionData data =
new SectionData();
241 String realmName = realm.
getRealmNames().isEmpty() ? Bundle.OsAccountDataPanel_realm_unknown() : realm.
getRealmNames().get(0);
242 data.addData(Bundle.OsAccountDataPanel_realm_name(), realmName);
245 data.addData(Bundle.OsAccountDataPanel_realm_address(),
246 optional.isPresent() ? optional.get() :
"");
248 data.addData(Bundle.OsAccountDataPanel_realm_scope(),
251 data.addData(Bundle.OsAccountDataPanel_realm_confidence(),
254 section.addSectionData(data);
260 "OsAccountDataPanel_host_section_title={0} Details",
261 "OsAccountDataPanel_host_count_title=Login Count",
262 "OsAccountDataPanel_data_accessed_title=Last Login",
263 "OsAccountDataPanel_administrator_title=Administrator"
266 String sectionTitle =
"Global Host Details";
269 sectionTitle = Bundle.OsAccountDataPanel_host_section_title(host.
getName());
272 Section section =
new Section(sectionTitle);
274 for (
DataSource dataSource : attributeDataSourceMap.keySet()) {
275 List<OsAccountAttribute> attributeList = attributeDataSourceMap.get(dataSource);
276 SectionData data =
new SectionData((attributeDataSourceMap.size() > 1 && dataSource != null) ? dataSource.getName() : null);
277 if (attributeList != null) {
279 String displayName = attribute.getAttributeType().getDisplayName();
280 String value = attribute.getDisplayString();
283 displayName = Bundle.OsAccountDataPanel_host_count_title();
285 displayName = Bundle.OsAccountDataPanel_administrator_title();
286 if (attribute.getValueInt() == 0) {
292 displayName = Bundle.OsAccountDataPanel_data_accessed_title();
295 data.addData(displayName, value);
298 data.addData(
"No details available", null);
301 section.addSectionData(data);
314 JLabel label =
new JLabel(title);
321 JLabel label =
new JLabel(title);
323 label.setFont(label.getFont().deriveFont(Font.BOLD));
334 JLabel label =
new JLabel(key +
":");
345 JLabel label =
new JLabel(text);
357 JLabel label =
new JLabel(value);
369 GridBagConstraints constraints =
new GridBagConstraints();
371 constraints.gridx = 0;
372 constraints.gridy = row;
373 constraints.gridwidth = 2;
374 constraints.gridheight = 1;
375 constraints.anchor = GridBagConstraints.NORTHWEST;
376 constraints.fill = GridBagConstraints.HORIZONTAL;
377 constraints.weightx = 1;
378 constraints.insets = (row == 0)
379 ? FIRST_HEADER_INSETS
386 GridBagConstraints constraints =
new GridBagConstraints();
388 constraints.gridx = 0;
389 constraints.gridy = row;
390 constraints.gridwidth = 2;
391 constraints.gridheight = 1;
392 constraints.anchor = GridBagConstraints.NORTHWEST;
393 constraints.fill = GridBagConstraints.HORIZONTAL;
394 constraints.weightx = 1;
408 GridBagConstraints constraints =
new GridBagConstraints();
411 constraints.gridy = row;
412 constraints.gridwidth = 1;
413 constraints.gridheight = 1;
414 constraints.anchor = GridBagConstraints.WEST;
428 GridBagConstraints constraints =
new GridBagConstraints();
431 constraints.gridy = row;
432 constraints.gridwidth = 1;
433 constraints.gridheight = 1;
434 constraints.fill = GridBagConstraints.HORIZONTAL;
436 constraints.weightx = 1;
461 this.accountId = null;
466 Map<Host, Map<DataSource, List<OsAccountAttribute>>> hostMap =
new HashMap<>();
467 Map<Host, DataSource> instanceMap =
new HashMap<>();
471 if (account == null) {
477 List<Host> hosts = osAccountManager.
getHosts(account);
481 Map<Long, Map<DataSource, List<OsAccountAttribute>>> idMap2 =
new HashMap<>();
482 if (attributeList != null) {
485 Long key = attribute.getHostId().orElse(null);
486 Long sourceID = attribute.getSourceObjectId().orElse(null);
489 if (sourceID != null) {
490 Content sourceContent = skCase.getContentById(sourceID);
491 if (sourceContent != null) {
496 Map<DataSource, List<OsAccountAttribute>> atMap = idMap2.get(key);
498 atMap =
new HashMap<>();
499 idMap2.put(key, atMap);
502 List<OsAccountAttribute> mapList = atMap.get(dataSource);
503 if (mapList == null) {
504 mapList =
new ArrayList<>();
505 atMap.put(dataSource, mapList);
507 mapList.add(attribute);
513 for (
Host host : hosts) {
514 hostMap.put(host, idMap2.get(host.
getHostId()));
518 hostMap.put(null, idMap2.get(null));
519 Map<DataSource, List<OsAccountAttribute>> atMap = idMap2.get(null);
521 hostMap.put(null, atMap);
527 instanceMap.put(instance.getDataSource().getHost(), instance.getDataSource());
538 if (this.isCancelled()) {
543 }
catch (ExecutionException | InterruptedException ex) {
544 logger.log(Level.SEVERE, String.format(
"Failed to retrieve data for OsAccount (%d)", account.
getId()), ex);
547 if (results != null) {
549 setLayout(
new GridBagLayout());
551 List<Section> data =
new ArrayList<>();
553 Map<Host, Map<DataSource, List<OsAccountAttribute>>> hostDataMap = results.getAttributeMap();
554 if (hostDataMap != null && !hostDataMap.isEmpty()) {
555 hostDataMap.entrySet().stream().forEach(pair -> {
556 if (pair.getKey() != null && pair.getValue() != null) {
590 private final Map<Host, Map<DataSource, List<OsAccountAttribute>>>
attributeMap;
615 Map<Host, Map<DataSource, List<OsAccountAttribute>>> getAttributeMap() {
624 Map<Host, DataSource> getDataSourceMap() {
628 OsAccountRealm getRealm() {
void addPropertyName(String key, int row)
static final long serialVersionUID
final Map< Host, DataSource > instanceMap
GridBagConstraints getSubtitleContraints(int row)
GridBagConstraints getPropertyValueContraints(int row)
PanelDataFetcher dataFetcher
List< Host > getHosts(OsAccount account)
OsAccount getOsAccountByObjectId(long osAccountObjId)
ScopeConfidence getScopeConfidence()
static Integer getLineSpacing()
Section buildBasicProperties(OsAccount account)
Optional< OsAccountType > getOsAccountType()
WorkerResults doInBackground()
static String getFormattedTime(long epochTime)
final OsAccountRealm realm
final Map< Host, Map< DataSource, List< OsAccountAttribute > > > attributeMap
synchronized List< OsAccountInstance > getOsAccountInstances()
static Insets getPanelInsets()
void addTitle(String title, int row)
GridBagConstraints getPropertyNameContraints(int row)
static final int VALUE_COLUMN
static Integer getSectionIndent()
static final Insets SUBHEADER_COLUMN_INSETS
final static Logger logger
void addLabel(String text, int row)
static final Insets VALUE_COLUMN_INSETS
static final Insets KEY_COLUMN_INSETS
static Font getHeaderFont()
void addPropertyValue(String value, int row)
static final int KEY_COLUMN
void addSubTitle(String title, int row)
Optional< Long > getCreationTime()
SleuthkitCase getSleuthkitCase()
GridBagConstraints getTitleContraints(int row)
Section buildHostData(Host host, Map< DataSource, List< OsAccountAttribute >> attributeDataSourceMap)
static int getColumnSpacing()
Optional< String > getRealmAddr()
Optional< String > getLoginName()
static final Insets HEADER_INSETS
static Integer getSectionSpacing()
static Case getCurrentCase()
synchronized static Logger getLogger(String name)
static final SimpleDateFormat DATE_FORMAT
Section buildRealmProperties(OsAccountRealm realm)
static final Insets FIRST_HEADER_INSETS
void addDataComponents(List< Section > panelData)
Optional< String > getFullName()
synchronized List< OsAccountAttribute > getExtendedOsAccountAttributes()
List< String > getRealmNames()