Skip to content
This repository has been archived by the owner on Apr 26, 2024. It is now read-only.

Do not use canonicaljson to magically handle decoding bytes from JSON #7802

Merged
merged 7 commits into from
Jul 10, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions changelog.d/7802.misc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Switch from simplejson to the standard library json.
6 changes: 2 additions & 4 deletions synapse/api/errors.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,11 @@
# limitations under the License.

"""Contains exceptions and error codes."""

import json
import logging
from http import HTTPStatus
from typing import Dict, List

from canonicaljson import json

from twisted.web import http

logger = logging.getLogger(__name__)
Expand Down Expand Up @@ -573,7 +571,7 @@ def to_synapse_error(self):
# try to parse the body as json, to get better errcode/msg, but
# default to M_UNKNOWN with the HTTP status as the error text
try:
j = json.loads(self.response)
j = json.loads(self.response.decode("utf-8"))
except ValueError:
j = {}

Expand Down
6 changes: 3 additions & 3 deletions synapse/federation/federation_server.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,10 @@
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import json
import logging
from typing import Any, Callable, Dict, List, Match, Optional, Tuple, Union

from canonicaljson import json
from prometheus_client import Counter, Histogram

from twisted.internet import defer
Expand Down Expand Up @@ -526,9 +526,9 @@ async def on_claim_client_keys(
json_result = {} # type: Dict[str, Dict[str, dict]]
for user_id, device_keys in results.items():
for device_id, keys in device_keys.items():
for key_id, json_bytes in keys.items():
for key_id, json_str in keys.items():
json_result.setdefault(user_id, {})[device_id] = {
key_id: json.loads(json_bytes)
key_id: json.loads(json_str)
}

logger.info(
Expand Down
2 changes: 1 addition & 1 deletion synapse/handlers/cas_handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ async def _validate_ticket(
return user, displayname

def _parse_cas_response(
self, cas_response_body: str
self, cas_response_body: bytes
) -> Tuple[str, Dict[str, Optional[str]]]:
"""
Retrieve the user and other parameters from the CAS response.
Expand Down
14 changes: 7 additions & 7 deletions synapse/http/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,13 @@
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import json
import logging
import urllib
from io import BytesIO

import treq
from canonicaljson import encode_canonical_json, json
from canonicaljson import encode_canonical_json
from netaddr import IPAddress
from prometheus_client import Counter
from zope.interface import implementer, provider
Expand Down Expand Up @@ -371,7 +371,7 @@ def post_urlencoded_get_json(self, uri, args={}, headers=None):
body = yield make_deferred_yieldable(readBody(response))

if 200 <= response.code < 300:
return json.loads(body)
return json.loads(body.decode("utf-8"))
else:
raise HttpResponseException(response.code, response.phrase, body)

Expand Down Expand Up @@ -412,7 +412,7 @@ def post_json_get_json(self, uri, post_json, headers=None):
body = yield make_deferred_yieldable(readBody(response))

if 200 <= response.code < 300:
return json.loads(body)
return json.loads(body.decode("utf-8"))
else:
raise HttpResponseException(response.code, response.phrase, body)

Expand Down Expand Up @@ -441,7 +441,7 @@ def get_json(self, uri, args={}, headers=None):
actual_headers.update(headers)

body = yield self.get_raw(uri, args, headers=headers)
return json.loads(body)
return json.loads(body.decode("utf-8"))

@defer.inlineCallbacks
def put_json(self, uri, json_body, args={}, headers=None):
Expand Down Expand Up @@ -485,7 +485,7 @@ def put_json(self, uri, json_body, args={}, headers=None):
body = yield make_deferred_yieldable(readBody(response))

if 200 <= response.code < 300:
return json.loads(body)
return json.loads(body.decode("utf-8"))
else:
raise HttpResponseException(response.code, response.phrase, body)

Expand All @@ -503,7 +503,7 @@ def get_raw(self, uri, args={}, headers=None):
header name to a list of values for that header
Returns:
Deferred: Succeeds when we get *any* 2xx HTTP response, with the
HTTP body at text.
HTTP body as bytes.
Raises:
HttpResponseException on a non-2xx HTTP response.
"""
Expand Down
14 changes: 2 additions & 12 deletions synapse/http/servlet.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,9 @@
# limitations under the License.

""" This module contains base REST classes for constructing REST servlets. """

import json
import logging

from canonicaljson import json

from synapse.api.errors import Codes, SynapseError

logger = logging.getLogger(__name__)
Expand Down Expand Up @@ -214,16 +212,8 @@ def parse_json_value_from_request(request, allow_empty_body=False):
if not content_bytes and allow_empty_body:
return None

# Decode to Unicode so that simplejson will return Unicode strings on
# Python 2
try:
content_unicode = content_bytes.decode("utf8")
except UnicodeDecodeError:
logger.warning("Unable to decode UTF-8")
raise SynapseError(400, "Content not JSON.", errcode=Codes.NOT_JSON)

try:
content = json.loads(content_unicode)
content = json.loads(content_bytes.decode("utf-8"))
except Exception as e:
logger.warning("Unable to parse JSON: %s", e)
raise SynapseError(400, "Content not JSON.", errcode=Codes.NOT_JSON)
Expand Down
2 changes: 1 addition & 1 deletion tests/rest/client/v1/test_login.py
Original file line number Diff line number Diff line change
Expand Up @@ -398,7 +398,7 @@ async def get_raw(uri, args):
</cas:serviceResponse>
"""
% cas_user_id
)
).encode("utf-8")

mocked_http_client = Mock(spec=["get_raw"])
mocked_http_client.get_raw.side_effect = get_raw
Expand Down