Skip to content

Commit

Permalink
Add is_base64_characters functions.
Browse files Browse the repository at this point in the history
GitOrigin-RevId: 5b3e8642e9d9788788ee1343af4eee9acf7dddc9
  • Loading branch information
levlam committed Jan 9, 2020
1 parent 5551021 commit d6dca91
Show file tree
Hide file tree
Showing 4 changed files with 59 additions and 9 deletions.
2 changes: 1 addition & 1 deletion td/telegram/InlineQueriesManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -330,7 +330,7 @@ void InlineQueriesManager::answer_inline_query(int64 inline_query_id, bool is_pe
if (switch_pm_parameter.size() > 64) {
return promise.set_error(Status::Error(400, "Too long switch_pm_parameter specified"));
}
if (!is_base64url(switch_pm_parameter)) {
if (!is_base64url_characters(switch_pm_parameter)) {
return promise.set_error(Status::Error(400, "Unallowed characters in switch_pm_parameter are used"));
}
}
Expand Down
39 changes: 31 additions & 8 deletions tdutils/td/utils/base64.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -216,6 +216,17 @@ Result<string> base64url_decode(Slice base64) {
return output;
}

template <bool is_url>
static const unsigned char *get_character_table() {
if (is_url) {
init_base64url_table();
return url_char_to_value;
} else {
init_base64_table();
return char_to_value;
}
}

template <bool is_url>
static bool is_base64_impl(Slice input) {
size_t padding_length = 0;
Expand All @@ -233,14 +244,7 @@ static bool is_base64_impl(Slice input) {
return false;
}

unsigned char *table;
if (is_url) {
init_base64url_table();
table = url_char_to_value;
} else {
init_base64_table();
table = char_to_value;
}
auto table = get_character_table<is_url>();
for (auto c : input) {
if (table[static_cast<unsigned char>(c)] == 64) {
return false;
Expand Down Expand Up @@ -271,6 +275,25 @@ bool is_base64url(Slice input) {
return is_base64_impl<true>(input);
}

template <bool is_url>
static bool is_base64_characters_impl(Slice input) {
auto table = get_character_table<is_url>();
for (auto c : input) {
if (table[static_cast<unsigned char>(c)] == 64) {
return false;
}
}
return true;
}

bool is_base64_characters(Slice input) {
return is_base64_characters_impl<false>(input);
}

bool is_base64url_characters(Slice input) {
return is_base64_characters_impl<true>(input);
}

string base64_filter(Slice input) {
string res;
res.reserve(input.size());
Expand Down
3 changes: 3 additions & 0 deletions tdutils/td/utils/base64.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,9 @@ Result<string> base64url_decode(Slice base64);
bool is_base64(Slice input);
bool is_base64url(Slice input);

bool is_base64_characters(Slice input);
bool is_base64url_characters(Slice input);

string base64_filter(Slice input);

} // namespace td
24 changes: 24 additions & 0 deletions tdutils/test/misc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -183,6 +183,30 @@ TEST(Misc, base64) {
ASSERT_TRUE(is_base64url("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/") == false);
ASSERT_TRUE(is_base64url("====") == false);

ASSERT_TRUE(is_base64_characters("dGVzdA==") == false);
ASSERT_TRUE(is_base64_characters("dGVzdB==") == false);
ASSERT_TRUE(is_base64_characters("dGVzdA=") == false);
ASSERT_TRUE(is_base64_characters("dGVzdA") == true);
ASSERT_TRUE(is_base64_characters("dGVz") == true);
ASSERT_TRUE(is_base64_characters("") == true);
ASSERT_TRUE(is_base64_characters("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/") == true);
ASSERT_TRUE(is_base64_characters("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=") == false);
ASSERT_TRUE(is_base64_characters("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-/") == false);
ASSERT_TRUE(is_base64_characters("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_") == false);
ASSERT_TRUE(is_base64_characters("====") == false);

ASSERT_TRUE(is_base64url_characters("dGVzdA==") == false);
ASSERT_TRUE(is_base64url_characters("dGVzdB==") == false);
ASSERT_TRUE(is_base64url_characters("dGVzdA=") == false);
ASSERT_TRUE(is_base64url_characters("dGVzdA") == true);
ASSERT_TRUE(is_base64url_characters("dGVz") == true);
ASSERT_TRUE(is_base64url_characters("") == true);
ASSERT_TRUE(is_base64url_characters("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_") == true);
ASSERT_TRUE(is_base64url_characters("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_=") == false);
ASSERT_TRUE(is_base64url_characters("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-/") == false);
ASSERT_TRUE(is_base64url_characters("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/") == false);
ASSERT_TRUE(is_base64url_characters("====") == false);

for (int l = 0; l < 300000; l += l / 20 + l / 1000 * 500 + 1) {
for (int t = 0; t < 10; t++) {
string s = rand_string(std::numeric_limits<char>::min(), std::numeric_limits<char>::max(), l);
Expand Down

0 comments on commit d6dca91

Please sign in to comment.