blob: 09c1bb7cc3d58a661a955a1ce6fa12c270788a34 [file] [log] [blame]
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/ui/views/signed_certificate_timestamp_info_view.h"
#include <algorithm>
#include "base/i18n/time_formatting.h"
#include "base/strings/string16.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/utf_string_conversions.h"
#include "chrome/common/net/x509_certificate_model.h"
#include "grit/generated_resources.h"
#include "net/cert/signed_certificate_timestamp.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/native_theme/native_theme.h"
#include "ui/views/controls/label.h"
#include "ui/views/layout/grid_layout.h"
#include "ui/views/layout/layout_constants.h"
namespace {
// Adjustment to the spacing between subsequent label-field lines.
const int kExtraLineHeightPadding = 3;
int HashAlgorithmToResourceID(
net::ct::DigitallySigned::HashAlgorithm hash_algorithm) {
switch (hash_algorithm) {
case net::ct::DigitallySigned::HASH_ALGO_NONE:
return IDS_SCT_HASH_ALGORITHM_NONE;
case net::ct::DigitallySigned::HASH_ALGO_MD5:
return IDS_SCT_HASH_ALGORITHM_MD5;
case net::ct::DigitallySigned::HASH_ALGO_SHA1:
return IDS_SCT_HASH_ALGORITHM_SHA1;
case net::ct::DigitallySigned::HASH_ALGO_SHA224:
return IDS_SCT_HASH_ALGORITHM_SHA224;
case net::ct::DigitallySigned::HASH_ALGO_SHA256:
return IDS_SCT_HASH_ALGORITHM_SHA256;
case net::ct::DigitallySigned::HASH_ALGO_SHA384:
return IDS_SCT_HASH_ALGORITHM_SHA384;
case net::ct::DigitallySigned::HASH_ALGO_SHA512:
return IDS_SCT_HASH_ALGORITHM_SHA512;
}
return IDS_SCT_HASH_ALGORITHM_NONE;
}
int SignatureAlgorithmToResourceID(
net::ct::DigitallySigned::SignatureAlgorithm signature_algorithm) {
switch (signature_algorithm) {
case net::ct::DigitallySigned::SIG_ALGO_ANONYMOUS:
return IDS_SCT_SIGNATURE_ALGORITHM_ANONYMOUS;
case net::ct::DigitallySigned::SIG_ALGO_RSA:
return IDS_SCT_SIGNATURE_ALGORITHM_RSA;
case net::ct::DigitallySigned::SIG_ALGO_DSA:
return IDS_SCT_SIGNATURE_ALGORITHM_DSA;
case net::ct::DigitallySigned::SIG_ALGO_ECDSA:
return IDS_SCT_SIGNATURE_ALGORITHM_ECDSA;
}
return IDS_SCT_SIGNATURE_ALGORITHM_ANONYMOUS;
}
int VersionToResourceID(int version) {
return version == 0 ? IDS_SCT_VERSION_V1 : IDS_SCT_VERSION_UNKNOWN;
}
} // namespace
namespace chrome {
namespace ct {
int StatusToResourceID(net::ct::SCTVerifyStatus status) {
switch (status) {
case net::ct::SCT_STATUS_NONE:
return IDS_SCT_STATUS_NONE;
case net::ct::SCT_STATUS_LOG_UNKNOWN:
return IDS_SCT_STATUS_LOG_UNKNOWN;
case net::ct::SCT_STATUS_INVALID:
return IDS_SCT_STATUS_INVALID;
case net::ct::SCT_STATUS_OK:
return IDS_SCT_STATUS_OK;
case net::ct::SCT_STATUS_MAX:
break;
}
return IDS_SCT_STATUS_NONE;
}
int SCTOriginToResourceID(const net::ct::SignedCertificateTimestamp& sct) {
switch (sct.origin) {
case net::ct::SignedCertificateTimestamp::SCT_EMBEDDED:
return IDS_SCT_ORIGIN_EMBEDDED;
case net::ct::SignedCertificateTimestamp::SCT_FROM_TLS_EXTENSION:
return IDS_SCT_ORIGIN_TLS_EXTENSION;
case net::ct::SignedCertificateTimestamp::SCT_FROM_OCSP_RESPONSE:
return IDS_SCT_ORIGIN_OCSP;
case net::ct::SignedCertificateTimestamp::SCT_ORIGIN_MAX:
break;
}
return IDS_SCT_ORIGIN_UNKNOWN;
}
} // namespace ct
} // namespace chrome
// SignedCertificateTimestampInfoView, public:
SignedCertificateTimestampInfoView::SignedCertificateTimestampInfoView()
: status_value_field_(NULL),
origin_value_field_(NULL),
version_value_field_(NULL),
log_id_value_field_(NULL),
timestamp_value_field_(NULL),
hash_algorithm_value_field_(NULL),
signature_algorithm_value_field_(NULL),
signature_data_value_field_(NULL) {}
SignedCertificateTimestampInfoView::~SignedCertificateTimestampInfoView() {}
void SignedCertificateTimestampInfoView::SetSignedCertificateTimestamp(
const net::ct::SignedCertificateTimestamp& sct,
net::ct::SCTVerifyStatus status) {
status_value_field_->SetText(
l10n_util::GetStringUTF16(chrome::ct::StatusToResourceID(status)));
origin_value_field_->SetText(
l10n_util::GetStringUTF16(chrome::ct::SCTOriginToResourceID(sct)));
version_value_field_->SetText(
l10n_util::GetStringUTF16(VersionToResourceID(sct.version)));
log_description_value_field_->SetText(base::UTF8ToUTF16(sct.log_description));
timestamp_value_field_->SetText(
base::TimeFormatFriendlyDateAndTime(sct.timestamp));
hash_algorithm_value_field_->SetText(l10n_util::GetStringUTF16(
HashAlgorithmToResourceID(sct.signature.hash_algorithm)));
signature_algorithm_value_field_->SetText(l10n_util::GetStringUTF16(
SignatureAlgorithmToResourceID(sct.signature.signature_algorithm)));
// The log_id and signature_data fields contain binary data, format it
// accordingly before displaying.
log_id_value_field_->SetText(
base::UTF8ToUTF16(x509_certificate_model::ProcessRawBytes(
reinterpret_cast<const unsigned char*>(sct.log_id.c_str()),
sct.log_id.length())));
signature_data_value_field_->SetText(
base::UTF8ToUTF16(x509_certificate_model::ProcessRawBytes(
reinterpret_cast<const unsigned char*>(
sct.signature.signature_data.c_str()),
sct.signature.signature_data.length())));
Layout();
}
void SignedCertificateTimestampInfoView::ViewHierarchyChanged(
const ViewHierarchyChangedDetails& details) {
if (details.is_add && details.child == this)
Init();
}
void SignedCertificateTimestampInfoView::AddLabelRow(int layout_id,
views::GridLayout* layout,
int label_message_id,
views::Label* data_label) {
layout->StartRow(0, layout_id);
layout->AddView(
new views::Label(l10n_util::GetStringUTF16(label_message_id)));
layout->AddView(
data_label, 2, 1, views::GridLayout::LEADING, views::GridLayout::CENTER);
layout->AddPaddingRow(0, kExtraLineHeightPadding);
}
void SignedCertificateTimestampInfoView::Init() {
status_value_field_ = new views::Label;
origin_value_field_ = new views::Label;
version_value_field_ = new views::Label;
log_description_value_field_ = new views::Label;
log_id_value_field_ = new views::Label;
log_id_value_field_->SetMultiLine(true);
log_id_value_field_->SetAllowCharacterBreak(true);
log_id_value_field_->SetTooltipText(
l10n_util::GetStringUTF16(IDS_SCT_RAW_DATA_HELP));
timestamp_value_field_ = new views::Label;
hash_algorithm_value_field_ = new views::Label;
signature_algorithm_value_field_ = new views::Label;
signature_data_value_field_ = new views::Label;
signature_data_value_field_->SetMultiLine(true);
signature_data_value_field_->SetAllowCharacterBreak(true);
signature_data_value_field_->SetTooltipText(
l10n_util::GetStringUTF16(IDS_SCT_RAW_DATA_HELP));
views::GridLayout* layout = new views::GridLayout(this);
layout->SetInsets(
0, views::kButtonHEdgeMarginNew, 0, views::kButtonHEdgeMarginNew);
SetLayoutManager(layout);
const int three_column_layout_id = 0;
views::ColumnSet* column_set = layout->AddColumnSet(three_column_layout_id);
column_set->AddColumn(views::GridLayout::LEADING,
views::GridLayout::CENTER,
0,
views::GridLayout::USE_PREF,
0,
0);
column_set->AddPaddingColumn(0, views::kRelatedControlHorizontalSpacing);
column_set->AddColumn(views::GridLayout::TRAILING,
views::GridLayout::CENTER,
0,
views::GridLayout::USE_PREF,
0,
0);
column_set->AddColumn(views::GridLayout::FILL,
views::GridLayout::CENTER,
1,
views::GridLayout::USE_PREF,
0,
0);
AddLabelRow(three_column_layout_id,
layout,
IDS_SCT_VALIDATION_INFO,
status_value_field_);
AddLabelRow(
three_column_layout_id, layout, IDS_SCT_ORIGIN, origin_value_field_);
AddLabelRow(
three_column_layout_id, layout, IDS_SCT_VERSION, version_value_field_);
AddLabelRow(three_column_layout_id,
layout,
IDS_SCT_LOG_DESCRIPTION,
log_description_value_field_);
AddLabelRow(
three_column_layout_id, layout, IDS_SCT_LOGID, log_id_value_field_);
AddLabelRow(three_column_layout_id,
layout,
IDS_SCT_TIMESTAMP,
timestamp_value_field_);
AddLabelRow(three_column_layout_id,
layout,
IDS_SCT_HASH_ALGORITHM,
hash_algorithm_value_field_);
AddLabelRow(three_column_layout_id,
layout,
IDS_SCT_SIGNATURE_ALGORITHM,
signature_algorithm_value_field_);
AddLabelRow(three_column_layout_id,
layout,
IDS_SCT_SIGNATURE_DATA,
signature_data_value_field_);
}