summaryrefslogtreecommitdiffstats
path: root/chromium/device/nfc/nfc_ndef_record.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/device/nfc/nfc_ndef_record.cc')
-rw-r--r--chromium/device/nfc/nfc_ndef_record.cc55
1 files changed, 51 insertions, 4 deletions
diff --git a/chromium/device/nfc/nfc_ndef_record.cc b/chromium/device/nfc/nfc_ndef_record.cc
index ec13c2f3587..5b8bb994a81 100644
--- a/chromium/device/nfc/nfc_ndef_record.cc
+++ b/chromium/device/nfc/nfc_ndef_record.cc
@@ -7,6 +7,7 @@
#include <map>
#include "base/logging.h"
+#include "url/gurl.h"
using base::DictionaryValue;
using base::ListValue;
@@ -17,6 +18,23 @@ namespace {
typedef std::map<std::string, base::Value::Type> FieldValueMap;
+bool ValidateURI(const DictionaryValue* data) {
+ std::string uri;
+ if (!data->GetString(NfcNdefRecord::kFieldURI, &uri)) {
+ VLOG(1) << "No URI entry in data.";
+ return false;
+ }
+ DCHECK(!uri.empty());
+
+ // Use GURL to check validity.
+ GURL url(uri);
+ if (!url.is_valid()) {
+ LOG(ERROR) << "Invalid URI given: " << uri;
+ return false;
+ }
+ return true;
+}
+
bool CheckFieldsAreValid(
const FieldValueMap& required_fields,
const FieldValueMap& optional_fields,
@@ -47,6 +65,12 @@ bool CheckFieldsAreValid(
<< field_iter->second;
return false;
}
+ // Make sure that the value is non-empty, if the value is a string.
+ std::string string_value;
+ if (iter.value().GetAsString(&string_value) && string_value.empty()) {
+ VLOG(1) << "Empty value given for field of type string: " << iter.key();
+ return false;
+ }
}
// Check for required fields.
if (required_count != required_fields.size()) {
@@ -63,13 +87,23 @@ bool HandleTypeText(const DictionaryValue* data) {
VLOG(1) << "Populating record with type \"Text\".";
FieldValueMap required_fields;
required_fields[NfcNdefRecord::kFieldText] = base::Value::TYPE_STRING;
+ required_fields[NfcNdefRecord::kFieldEncoding] = base::Value::TYPE_STRING;
+ required_fields[NfcNdefRecord::kFieldLanguageCode] = base::Value::TYPE_STRING;
FieldValueMap optional_fields;
- optional_fields[NfcNdefRecord::kFieldEncoding] = base::Value::TYPE_STRING;
- optional_fields[NfcNdefRecord::kFieldLanguageCode] = base::Value::TYPE_STRING;
if (!CheckFieldsAreValid(required_fields, optional_fields, data)) {
VLOG(1) << "Failed to populate record.";
return false;
}
+
+ // Verify that the "Encoding" property has valid values.
+ std::string encoding;
+ if (!data->GetString(NfcNdefRecord::kFieldEncoding, &encoding)) {
+ if (encoding != NfcNdefRecord::kEncodingUtf8 ||
+ encoding != NfcNdefRecord::kEncodingUtf16) {
+ VLOG(1) << "Invalid \"Encoding\" value:" << encoding;
+ return false;
+ }
+ }
return true;
}
@@ -113,7 +147,7 @@ bool HandleTypeSmartPoster(const DictionaryValue* data) {
}
}
}
- return true;
+ return ValidateURI(data);
}
// Verifies that the contents of |data| conform to the fields of NDEF type
@@ -125,11 +159,13 @@ bool HandleTypeUri(const DictionaryValue* data) {
FieldValueMap optional_fields;
optional_fields[NfcNdefRecord::kFieldMimeType] = base::Value::TYPE_STRING;
optional_fields[NfcNdefRecord::kFieldTargetSize] = base::Value::TYPE_DOUBLE;
+
+ // Allow passing TargetSize as an integer, but convert it to a double.
if (!CheckFieldsAreValid(required_fields, optional_fields, data)) {
VLOG(1) << "Failed to populate record.";
return false;
}
- return true;
+ return ValidateURI(data);
}
} // namespace
@@ -210,4 +246,15 @@ void NfcNdefMessage::AddRecord(NfcNdefRecord* record) {
records_.push_back(record);
}
+bool NfcNdefMessage::RemoveRecord(NfcNdefRecord* record) {
+ for (RecordList::iterator iter = records_.begin();
+ iter != records_.end(); ++iter) {
+ if (*iter == record) {
+ records_.erase(iter);
+ return true;
+ }
+ }
+ return false;
+}
+
} // namespace device