mirror of
https://github.com/mongodb/mongo.git
synced 2024-12-01 09:32:32 +01:00
Don't allow field names starting with $, added some tests
This commit is contained in:
parent
6626d2d9a9
commit
f1a538c7c8
@ -179,6 +179,9 @@ struct fieldNameEnd {
|
|||||||
fieldNameEnd( ObjectBuilder &_b ) : b( _b ) {}
|
fieldNameEnd( ObjectBuilder &_b ) : b( _b ) {}
|
||||||
void operator() ( const char *start, const char *end ) const {
|
void operator() ( const char *start, const char *end ) const {
|
||||||
b.fieldNames.back() = b.popString();
|
b.fieldNames.back() = b.popString();
|
||||||
|
massert( "Field name cannot start with '$'",
|
||||||
|
b.fieldNames.back().length() == 0 ||
|
||||||
|
b.fieldNames.back()[ 0 ] != '$' );
|
||||||
}
|
}
|
||||||
ObjectBuilder &b;
|
ObjectBuilder &b;
|
||||||
};
|
};
|
||||||
@ -381,6 +384,9 @@ struct regexEnd {
|
|||||||
// worth noting here that this parser follows a short-circuit convention. So,
|
// worth noting here that this parser follows a short-circuit convention. So,
|
||||||
// in the original z example on line 3, if the input was "ab", foo() would only
|
// in the original z example on line 3, if the input was "ab", foo() would only
|
||||||
// be called once.
|
// be called once.
|
||||||
|
// 2009-01-08 I've disallowed field names beginning with '$' (except those matching
|
||||||
|
// our special types). If we go with this convention long term, parser
|
||||||
|
// backtracking is less of a concern.
|
||||||
struct JsonGrammar : public grammar< JsonGrammar > {
|
struct JsonGrammar : public grammar< JsonGrammar > {
|
||||||
public:
|
public:
|
||||||
JsonGrammar( ObjectBuilder &_b ) : b( _b ) {}
|
JsonGrammar( ObjectBuilder &_b ) : b( _b ) {}
|
||||||
|
@ -409,6 +409,15 @@ namespace FromJsonTests {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class Bad {
|
||||||
|
public:
|
||||||
|
void run() {
|
||||||
|
ASSERT_EXCEPTION( fromjson( json() ), MsgAssertionException );
|
||||||
|
}
|
||||||
|
protected:
|
||||||
|
virtual string json() const = 0;
|
||||||
|
};
|
||||||
|
|
||||||
class Empty : public Base {
|
class Empty : public Base {
|
||||||
virtual BSONObj bson() const {
|
virtual BSONObj bson() const {
|
||||||
BSONObjBuilder b;
|
BSONObjBuilder b;
|
||||||
@ -440,6 +449,23 @@ namespace FromJsonTests {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class EmptyStrings : public Base {
|
||||||
|
virtual BSONObj bson() const {
|
||||||
|
BSONObjBuilder b;
|
||||||
|
b.append( "", "" );
|
||||||
|
return b.doneAndDecouple();
|
||||||
|
}
|
||||||
|
virtual string json() const {
|
||||||
|
return "{ \"\" : \"\" }";
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class ReservedFieldName : public Bad {
|
||||||
|
virtual string json() const {
|
||||||
|
return "{ \"$a\" : \"b\" }";
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
class SingleNumber : public Base {
|
class SingleNumber : public Base {
|
||||||
virtual BSONObj bson() const {
|
virtual BSONObj bson() const {
|
||||||
BSONObjBuilder b;
|
BSONObjBuilder b;
|
||||||
@ -665,21 +691,6 @@ namespace FromJsonTests {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
class DBRefLike : public Base {
|
|
||||||
virtual BSONObj bson() const {
|
|
||||||
BSONObjBuilder b;
|
|
||||||
b.append( "$ns", "foo" );
|
|
||||||
b.append( "$id", "000000000000000000000000" );
|
|
||||||
b.append( "foo", "bar" );
|
|
||||||
BSONObjBuilder c;
|
|
||||||
c.append( "a", b.done() );
|
|
||||||
return c.doneAndDecouple();
|
|
||||||
}
|
|
||||||
virtual string json() const {
|
|
||||||
return "{ \"a\" : { \"$ns\" : \"foo\", \"$id\" : \"000000000000000000000000\", \"foo\" : \"bar\" } }";
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
class Oid : public Base {
|
class Oid : public Base {
|
||||||
virtual BSONObj bson() const {
|
virtual BSONObj bson() const {
|
||||||
BSONObjBuilder b;
|
BSONObjBuilder b;
|
||||||
@ -732,6 +743,24 @@ namespace FromJsonTests {
|
|||||||
return "{ \"a\" : { \"$binary\" : \"YQ==\", \"$type\" : \"02\" } }";
|
return "{ \"a\" : { \"$binary\" : \"YQ==\", \"$type\" : \"02\" } }";
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class BinDataAllChars : public Base {
|
||||||
|
virtual BSONObj bson() const {
|
||||||
|
char z[] = {
|
||||||
|
0x00, 0x10, 0x83, 0x10, 0x51, 0x87, 0x20, 0x92, 0x8B, 0x30,
|
||||||
|
0xD3, 0x8F, 0x41, 0x14, 0x93, 0x51, 0x55, 0x97, 0x61, 0x96,
|
||||||
|
0x9B, 0x71, 0xD7, 0x9F, 0x82, 0x18, 0xA3, 0x92, 0x59, 0xA7,
|
||||||
|
0xA2, 0x9A, 0xAB, 0xB2, 0xDB, 0xAF, 0xC3, 0x1C, 0xB3, 0xD3,
|
||||||
|
0x5D, 0xB7, 0xE3, 0x9E, 0xBB, 0xF3, 0xDF, 0xBF
|
||||||
|
};
|
||||||
|
BSONObjBuilder b;
|
||||||
|
b.appendBinData( "a", 48, ByteArray, z );
|
||||||
|
return b.doneAndDecouple();
|
||||||
|
}
|
||||||
|
virtual string json() const {
|
||||||
|
return "{ \"a\" : { \"$binary\" : \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\", \"$type\" : \"02\" } }";
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
class Date : public Base {
|
class Date : public Base {
|
||||||
virtual BSONObj bson() const {
|
virtual BSONObj bson() const {
|
||||||
@ -744,6 +773,25 @@ namespace FromJsonTests {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class DateNonzero : public Base {
|
||||||
|
virtual BSONObj bson() const {
|
||||||
|
BSONObjBuilder b;
|
||||||
|
b.appendDate( "a", 100 );
|
||||||
|
return b.doneAndDecouple();
|
||||||
|
}
|
||||||
|
virtual string json() const {
|
||||||
|
return "{ \"a\" : { \"$date\" : 100 } }";
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class DateTooLong : public Bad {
|
||||||
|
virtual string json() const {
|
||||||
|
stringstream ss;
|
||||||
|
ss << "{ \"a\" : { \"$date\" : " << ~(0LL) << "0" << " } }";
|
||||||
|
return ss.str();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
class Regex : public Base {
|
class Regex : public Base {
|
||||||
virtual BSONObj bson() const {
|
virtual BSONObj bson() const {
|
||||||
BSONObjBuilder b;
|
BSONObjBuilder b;
|
||||||
@ -777,12 +825,8 @@ namespace FromJsonTests {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
class Malformed {
|
class Malformed : public Bad {
|
||||||
public:
|
string json() const { return "{"; }
|
||||||
void run() {
|
|
||||||
string bad( "{" );
|
|
||||||
ASSERT_EXCEPTION( fromjson( bad ), MsgAssertionException );
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace FromJsonTests
|
} // namespace FromJsonTests
|
||||||
@ -823,6 +867,8 @@ public:
|
|||||||
add< FromJsonTests::Empty >();
|
add< FromJsonTests::Empty >();
|
||||||
add< FromJsonTests::EmptyWithSpace >();
|
add< FromJsonTests::EmptyWithSpace >();
|
||||||
add< FromJsonTests::SingleString >();
|
add< FromJsonTests::SingleString >();
|
||||||
|
add< FromJsonTests::EmptyStrings >();
|
||||||
|
add< FromJsonTests::ReservedFieldName >();
|
||||||
add< FromJsonTests::SingleNumber >();
|
add< FromJsonTests::SingleNumber >();
|
||||||
add< FromJsonTests::FancyNumber >();
|
add< FromJsonTests::FancyNumber >();
|
||||||
add< FromJsonTests::TwoElements >();
|
add< FromJsonTests::TwoElements >();
|
||||||
@ -839,12 +885,14 @@ public:
|
|||||||
add< FromJsonTests::Utf8AllOnes >();
|
add< FromJsonTests::Utf8AllOnes >();
|
||||||
add< FromJsonTests::Utf8FirstByteOnes >();
|
add< FromJsonTests::Utf8FirstByteOnes >();
|
||||||
add< FromJsonTests::DBRef >();
|
add< FromJsonTests::DBRef >();
|
||||||
add< FromJsonTests::DBRefLike >();
|
|
||||||
add< FromJsonTests::Oid >();
|
add< FromJsonTests::Oid >();
|
||||||
add< FromJsonTests::BinData >();
|
add< FromJsonTests::BinData >();
|
||||||
add< FromJsonTests::BinDataPaddedSingle >();
|
add< FromJsonTests::BinDataPaddedSingle >();
|
||||||
add< FromJsonTests::BinDataPaddedDouble >();
|
add< FromJsonTests::BinDataPaddedDouble >();
|
||||||
|
add< FromJsonTests::BinDataAllChars >();
|
||||||
add< FromJsonTests::Date >();
|
add< FromJsonTests::Date >();
|
||||||
|
add< FromJsonTests::DateNonzero >();
|
||||||
|
add< FromJsonTests::DateTooLong >();
|
||||||
add< FromJsonTests::Regex >();
|
add< FromJsonTests::Regex >();
|
||||||
add< FromJsonTests::RegexEscape >();
|
add< FromJsonTests::RegexEscape >();
|
||||||
add< FromJsonTests::RegexWithQuotes >();
|
add< FromJsonTests::RegexWithQuotes >();
|
||||||
|
Loading…
Reference in New Issue
Block a user