summary refs log tree commit diff
path: root/synapse/rest (follow)
Commit message (Expand)AuthorAgeFilesLines
* Don't log stack trace when client has gone away during media download (#4738)Erik Johnston2019-02-251-2/+9
* switch from google.com to recaptcha.net for reCAPTCHA (#4731)Matthew Hodgson2019-02-251-1/+1
* Fix registration on workers (#4682)Erik Johnston2019-02-204-138/+15
* Merge pull request #4666 from matrix-org/erikj/register_login_splitErik Johnston2019-02-182-69/+28
|\
| * Move register_device into handlerErik Johnston2019-02-182-84/+24
| * Update docsErik Johnston2019-02-181-1/+1
| * Split out registration to workerErik Johnston2019-02-181-27/+46
* | FixupErik Johnston2019-02-181-0/+1
* | fix missig importMatthew Hodgson2019-02-181-0/+1
* | tabsMatthew Hodgson2019-02-141-1/+1
* | set CORS on .well-known URI to unbreak modularMatthew Hodgson2019-02-141-0/+1
|/
* Merge pull request #4580 from matrix-org/uhoreg/e2e_backup_add_updatingErik Johnston2019-02-111-0/+34
|\
| * make sure version is in body and wrap in linearizer queueHubert Chathi2019-02-081-1/+2
| * add new endpoint to update backup versionsHubert Chathi2019-02-061-0/+33
* | Allow "unavailable" presence status for /sync (#4592)Valentin Anger2019-02-082-1/+2
|/
* Merge branch 'neilj/room_capabilities' of github.com:matrix-org/synapse into ...Neil Johnson2019-01-302-14/+5
|\
| * Merge branch 'develop' into neilj/room_capabilitiesNeil Johnson2019-01-302-14/+5
| |\
| | * Check consent dir path on startupAndrew Morgan2019-01-291-10/+1
| | * Merge branch 'develop' of github.com:matrix-org/synapse into anoa/dm_room_upg...Andrew Morgan2019-01-251-13/+10
| | |\
| | * | Fix typosAndrew Morgan2019-01-221-4/+4
* | | | isortNeil Johnson2019-01-301-2/+1
|/ / /
* | | formatting and use constants where availableNeil Johnson2019-01-301-19/+17
* | | Populate default room version from ConstantsNeil Johnson2019-01-301-1/+2
* | | reflect that rooms v3 is a stable room versionNeil Johnson2019-01-301-0/+1
* | | rework format of change password capabilityNeil Johnson2019-01-291-1/+3
* | | support change_password in capabilities end-pointNeil Johnson2019-01-291-2/+12
* | | enforce auth for capabilities endpointNeil Johnson2019-01-291-10/+17
* | | register capabilities servletNeil Johnson2019-01-291-0/+2
* | | backout v3Neil Johnson2019-01-251-1/+0
* | | Support room version capabilities in CS API (MSC1804)Neil Johnson2019-01-251-0/+49
| |/ |/|
* | move guard out of is_threepid_reserved and into register.pyNeil Johnson2019-01-221-4/+5
* | Fix None guard in config.server.is_threepid_reservedNeil Johnson2019-01-221-1/+3
* | Config option to disable requesting MSISDN on registrationNeil Johnson2019-01-211-11/+5
|/
* Refactor request sending to have better excpetions (#4358)Erik Johnston2019-01-081-3/+4
* Add GET account data routes (#4303)Travis Ralston2019-01-071-1/+33
* Remove v1 only REST APIs now we don't ship matrix console (#4334)Amber Brown2018-12-294-445/+0
* Return well_known in /login response (#4319)Richard van der Hoff2018-12-241-7/+11
* Fix IP URL previews on Python 3 (#4215)Amber Brown2018-12-221-2/+12
* create support user (#4141)Neil Johnson2018-12-141-1/+10
* Add 'sandbox' to CSP for media repo (#4284)David Baker2018-12-111-1/+2
* Move imports to one lineWill Hunt2018-12-101-4/+1
* Use `send_cors`Will Hunt2018-12-101-4/+1
* changelog & isortWill Hunt2018-12-091-1/+5
* Make /config more CORS-yWill Hunt2018-12-091-1/+3
* Initialise user displayname from SAML2 data (#4272)Richard van der Hoff2018-12-072-0/+8
* Implement SAML2 authentication (#4267)Richard van der Hoff2018-12-073-0/+136
* Factor SSO success handling out of CAS login (#4264)Richard van der Hoff2018-12-071-29/+76
* Rip out half-implemented m.login.saml2 support (#4265)Richard van der Hoff2018-12-061-67/+2
* Implement .well-known handling (#4262)Richard van der Hoff2018-12-051-0/+70
* Fix non-ASCII pushrules (#4248)Amber Brown2018-12-041-12/+23
* fix type errorAmber Brown2018-12-031-1/+1
* Neilj/fix autojoin (#4223)Neil Johnson2018-11-282-0/+3
* Support m.login.sso (#4220)Richard van der Hoff2018-11-271-4/+9
* Fix fallback auth on Python 3 (#4197)Amber Brown2018-11-191-22/+16
* Remove duplicate slashes in generated consent URLsTravis Ralston2018-11-151-2/+2
* Fix Content-Disposition in media repository (#4176)Amber Brown2018-11-153-90/+110
* Use <meta> tags to discover the per-page encoding of html previews (#4183)Amber Brown2018-11-151-9/+22
* Add a test for the public T&Cs formRichard van der Hoff2018-11-141-1/+1
* Fix an internal server error when viewing the public privacy policyRichard van der Hoff2018-11-141-4/+7
* Fix encoding error for consent form on python3hera2018-11-081-1/+3
* Fix URL preview bugs (type error when loading cache from db, content-type inc...Amber Brown2018-11-081-6/+16
* Add config variables for enabling terms auth and the policy name (#4142)Travis Ralston2018-11-062-2/+2
* handle empty backups according to latest spec proposal (#4123)Hubert Chathi2018-11-051-3/+18
* Tests for user consent resource (#4140)Amber Brown2018-11-061-1/+1
* Fix logic error that prevented guests from seeing the privacy policyTravis Ralston2018-11-011-1/+1
* Include a version query string arg for the consent routeTravis Ralston2018-10-311-2/+4
* Merge branch 'develop' into travis/login-termsTravis Ralston2018-10-317-177/+93
|\
| * Remove deprecated v1 key exchange endpoint (#4119)Amber Brown2018-10-312-106/+0
| * Delete the disused & unspecced identicon functionality (#4106)Amber Brown2018-10-292-70/+0
| * Address review commentsRichard van der Hoff2018-10-261-5/+16
| * Basic initial support for room upgradesRichard van der Hoff2018-10-252-0/+80
| * Refactor state group lookup to reduce DB hits (#4011)Erik Johnston2018-10-251-1/+2
* | Merge branch 'develop' into travis/login-termsTravis Ralston2018-10-246-49/+30
|\|
| * Fix a number of flake8 errorsRichard van der Hoff2018-10-242-2/+2
| * Merge pull request #4063 from matrix-org/erikj/cleaup_alias_creationErik Johnston2018-10-241-32/+5
| |\
| | * Clean up room alias creationErik Johnston2018-10-191-32/+5
| * | Correctly account for cpu usage by background threads (#4074)Richard van der Hoff2018-10-233-15/+23
| |/
* | Merge branch 'develop' into travis/login-termsTravis Ralston2018-10-181-2/+5
|\|
| * Fix bug where we raised StopIteration in a generatorErik Johnston2018-10-171-2/+5
* | pep8Travis Ralston2018-10-152-13/+2
* | Merge branch 'develop' into travis/login-termsTravis Ralston2018-10-152-0/+374
|\|
| * missed oneDavid Baker2018-10-121-0/+1
| * Don't mangle exceptionsDavid Baker2018-10-121-4/+2
| * Split /room_keys/version into 2 servletsDavid Baker2018-10-121-9/+21
| * PR feedback pt. 1David Baker2018-10-121-1/+1
| * isortDavid Baker2018-10-091-1/+1
| * Merge remote-tracking branch 'origin/develop' into dbkr/e2e_backupsDavid Baker2018-10-0921-123/+197
| |\
| * | WIP e2e key backupsDavid Baker2018-09-131-4/+10
| * | try to make flake8 and isort happyHubert Chathi2018-09-061-1/+4
| * | Merge branch 'develop' into e2e_backupsHubert Chathi2018-08-2413-79/+143
| |\ \
| * | | missing importMatthew Hodgson2018-08-121-1/+1
| * | | use parse_stringMatthew Hodgson2018-08-121-3/+3
| * | | support DELETE /version with no argsMatthew Hodgson2018-08-121-2/+3
| * | | implement remaining tests and make them workMatthew Hodgson2018-08-121-0/+6
| * | | improve docstringMatthew Hodgson2018-08-121-1/+5
| * | | add a tonne of docstring; make upload_room_keys properly assert versionMatthew Hodgson2018-08-121-1/+10
| * | | more docstring for the e2e_room_keys restMatthew Hodgson2018-08-121-0/+51
| * | | blindly incorporate PR review - needs testing & fixingMatthew Hodgson2018-08-121-0/+2
| * | | make /room_keys/version workMatthew Hodgson2018-08-121-1/+8
| * | | implement /room_keys/version too (untested)Matthew Hodgson2018-08-121-0/+47
| * | | document the APIMatthew Hodgson2018-08-121-0/+133
| * | | make it work and fix pep8Matthew Hodgson2018-08-122-13/+22
| * | | interim WIP checkin; doesn't build yetMatthew Hodgson2018-08-121-4/+33
| * | | total WIP skeleton for /room_keys APIMatthew Hodgson2018-08-121-0/+56
* | | | Rely on the lack of ?u to represent public accessTravis Ralston2018-10-122-10/+6
* | | | Use a flag rather than a new route for the public policyTravis Ralston2018-10-032-16/+24
* | | | Auto-consent to the privacy policy if the user registered with termsTravis Ralston2018-10-031-0/+6
* | | | Make the terms flow requriedTravis Ralston2018-10-031-4/+4
* | | | Flesh out the fallback auth for termsTravis Ralston2018-10-031-7/+67
* | | | Incorporate Dave's work for GDPR login flowsTravis Ralston2018-10-032-0/+35
| |_|/ |/| |
* | | Merge pull request #3932 from matrix-org/erikj/auto_start_expiring_cachesRichard van der Hoff2018-09-251-1/+0
|\ \ \
| * | | Fix some instances of ExpiringCache not expiring cache itemsErik Johnston2018-09-211-1/+0
* | | | added "media-src: 'self'" to CSP for resources (#3578)Jérémy Farnaud2018-09-251-0/+1
|/ / /
* | | Merge pull request #3835 from krombel/fix_3821Amber Brown2018-09-121-1/+5
|\ \ \
| * | | fix VOIP crashes under Python 3 (#3821)Krombel2018-09-101-1/+5
* | | | Port rest/ to Python 3 (#3823)Amber Brown2018-09-1217-100/+112
|/ / /
* | | Merge pull request #3790 from matrix-org/rav/respect_event_format_in_filterRichard van der Hoff2018-09-051-13/+38
|\ \ \
| * | | Implement 'event_format' filter param in /syncRichard van der Hoff2018-09-041-13/+38
* | | | improve human readable error messageNeil Johnson2018-09-041-1/+2
* | | | improve human readable error messagesNeil Johnson2018-09-042-7/+20
|/ / /
* | | move threepid checker to config, add missing yieldsNeil Johnson2018-08-312-5/+7
* | | ensure post registration auth checks do not fail erroneouslyNeil Johnson2018-08-312-0/+8
* | | fix bug where preserved threepid user comes to sign up and server is mau blockedNeil Johnson2018-08-312-1/+10
| |/ |/|
* | Merge pull request #3724 from Half-Shot/hs/guest-fetch-eventErik Johnston2018-08-221-1/+1
|\ \
| * | Allow guests to access /rooms/:roomId/event/:eventIdWill Hunt2018-08-201-1/+1
* | | fix another consent encoding failRichard van der Hoff2018-08-211-1/+1
* | | Fix 500 error from /consent formRichard van der Hoff2018-08-211-2/+11
|/ /
* | Port over enough to get some sytests running on Python 3 (#3668)Amber Brown2018-08-202-6/+6
* | Integrate presence from hotfixes (#3694)Amber Brown2018-08-181-1/+2
* | Remove v1/register's broken shared secret functionality (#3703)Amber Brown2018-08-181-54/+0
* | Add GET media/v1/config (#3184)Will Hunt2018-08-162-1/+50
* | lazyload aware /messages (#3589)Matthew Hodgson2018-08-161-1/+12
* | initial cut at a room summary API (#3574)Matthew Hodgson2018-08-161-0/+1
* | speed up /members and add at= and membership params (#3568)Matthew Hodgson2018-08-151-3/+29
* | Merge pull request #3667 from matrix-org/erikj/fixup_unbindErik Johnston2018-08-152-6/+27
|\ \
| * | Don't fail requests to unbind 3pids for non supporting ID serversErik Johnston2018-08-082-6/+27
| |/
* / Rename async to async_helpers because `async` is a keyword on Python 3.7 (#3678)Amber Brown2018-08-103-3/+3
|/
* Merge pull request #3639 from matrix-org/rav/refactor_error_handlingRichard van der Hoff2018-08-021-1/+1
|\
| * Refactor code for turning HttpResponseException into SynapseErrorRichard van der Hoff2018-08-011-1/+1
* | Merge branch 'master' into developRichard van der Hoff2018-08-022-2/+2
|\ \
| * | Check room visibility for /event/ requestsRichard van der Hoff2018-08-022-2/+2
* | | Merge pull request #3620 from fuzzmz/return-404-room-not-foundRichard van der Hoff2018-08-011-2/+2
|\ \ \ | |_|/ |/| |
| * | return NotFoundError if room not foundSerban Constantin2018-07-311-2/+2
* | | Python 3: Convert some unicode/bytes uses (#3569)Amber Brown2018-08-023-14/+22
|/ /
* | make /context lazyload & filter aware (#3567)Matthew Hodgson2018-07-271-0/+9
* | Fix some looping_call calls which were broken in #3604Richard van der Hoff2018-07-262-2/+2
* | Wrap a number of things that run in the backgroundRichard van der Hoff2018-07-252-2/+14
* | Merge branch 'develop' of github.com:matrix-org/synapse into erikj/client_api...Erik Johnston2018-07-236-13/+206
|\ \
| * | Admin API for creating new users (#3415)Amber Brown2018-07-201-0/+122
| * | Move v1-only APIs into their own module & isolate deprecated ones (#3460)Amber Brown2018-07-195-13/+84
| |/
* | Move RoomContextHandler out of HandlersErik Johnston2018-07-181-2/+2
* | Split MessageHandler into read only and writersErik Johnston2018-07-182-15/+13
|/
* Refactor REST API tests to use explicit reactors (#3351)Amber Brown2018-07-171-1/+1
* rerun isort with latest versionKrombel2018-07-161-13/+3
* check isort by travisKrombel2018-07-165-9/+19
* Fix develop because I broke it :( (#3535)Amber Brown2018-07-141-2/+2
* Merge pull request #3534 from krombel/use_parse_and_asserts_from_servletAmber Brown2018-07-1414-139/+92
|\
| * fix sytestsAmber Brown2018-07-141-1/+1
| * add changelogKrombel2018-07-131-1/+1
| * rename assert_params_in_request to assert_params_in_dictKrombel2018-07-139-30/+30
| * Use parse_{int,str} and assert from http.servletKrombel2018-07-1313-132/+85
* | Make auth & transactions more testable (#3499)Amber Brown2018-07-147-35/+31
|/
* Merge branch 'develop' into rav/enforce_report_apiRichard van der Hoff2018-07-1251-339/+338
|\
| * run isortAmber Brown2018-07-0950-307/+288
| * Attempt to be more performant on PyPy (#3462)Amber Brown2018-06-285-5/+8
| * update doc for deactivate APIMatthew Hodgson2018-06-261-1/+1
| * add GDPR erase param to deactivate APIMatthew Hodgson2018-06-261-1/+12
| * Revert "Revert "Merge pull request #3431 from matrix-org/rav/erasure_visibili...Erik Johnston2018-06-252-3/+14
| * Revert "Merge pull request #3431 from matrix-org/rav/erasure_visibility"Richard van der Hoff2018-06-222-14/+3
| * Merge pull request #3431 from matrix-org/rav/erasure_visibilityErik Johnston2018-06-222-3/+14
| |\
| | * mark accounts as erased when requestedRichard van der Hoff2018-06-122-3/+14
| * | Pass around the reactor explicitly (#3385)Amber Brown2018-06-222-3/+7
| * | Remove run_on_reactor (#3395)Amber Brown2018-06-143-17/+0
| |/
| * Merge pull request #3276 from matrix-org/dbkr/unbindDavid Baker2018-06-111-3/+10
| |\
| | * Merge remote-tracking branch 'origin/develop' into dbkr/unbindDavid Baker2018-05-241-3/+5
| | |\
| | * | pep8David Baker2018-05-241-1/+1
| | * | Unbind 3pids when they're deleted tooDavid Baker2018-05-241-3/+10
| * | | fix logRichard van der Hoff2018-06-071-1/+1
| * | | Fix event-purge-by-ts admin APIRichard van der Hoff2018-06-071-6/+4
| * | | Consistently use six's iteritems and wrap lazy keys/values in list() if they'...Amber Brown2018-05-311-1/+1
* | | | Enforce the specified API for report_eventRichard van der Hoff2018-05-311-2/+23
|/ / /
* | | Merge pull request #3244 from NotAFile/py3-six-4Amber Brown2018-05-241-1/+2
|\ \ \
| * | | replace some iteritems with sixAdrian Tschira2018-05-191-1/+2
* | | | Merge pull request #3247 from NotAFile/py3-miscAmber Brown2018-05-241-3/+5
|\ \ \ \ | |_|_|/ |/| | |
| * | | py3-ize url previewAdrian Tschira2018-05-191-3/+5
| |/ /
* | | Merge pull request #3243 from NotAFile/py3-six-3Erik Johnston2018-05-241-3/+5
|\ \ \ | |_|/ |/| |
| * | Replace some more comparisons with sixAdrian Tschira2018-05-191-3/+5
| |/
* | Add a 'has_consented' template var to consent formsRichard van der Hoff2018-05-221-3/+14
* | Enable auto-escaping for the consent templatesRichard van der Hoff2018-05-221-1/+4
* | Stub out ServerNoticesSender on the workersRichard van der Hoff2018-05-221-0/+4
* | Move consent config parsing into ConsentConfigRichard van der Hoff2018-05-221-5/+3
* | Rename 'version' param on user consent configRichard van der Hoff2018-05-221-1/+1
* | Fix logcontext leak in HttpTransactionCacheRichard van der Hoff2018-05-211-25/+21
* | Stop the transaction cache caching failuresRichard van der Hoff2018-05-211-9/+13
|/
* Merge pull request #3221 from matrix-org/erikj/purge_tokenErik Johnston2018-05-181-7/+10
|\
| * Make purge_history operate on tokensErik Johnston2018-05-151-7/+10
* | Move RoomCreationHandler out of synapse.handlers.HandlersRichard van der Hoff2018-05-172-5/+4
* | Merge pull request #3213 from matrix-org/rav/consent_handlerRichard van der Hoff2018-05-162-0/+210
|\ \ | |/ |/|
| * ConsentResource to gather policy consent from usersRichard van der Hoff2018-05-152-0/+210
* | Set Server header in SynapseRequestRichard van der Hoff2018-05-109-14/+1
|/
* Remove redundant request_handler decoratorRichard van der Hoff2018-05-105-29/+38
* notifications: Convert next_token to string according to the specKonstantinos Sideris2018-05-051-1/+1
* Merge pull request #3161 from NotAFile/remove-v1authRichard van der Hoff2018-05-032-2/+6
|\
| * Burminate v1authAdrian Tschira2018-04-302-2/+6
* | Fix logcontext leak in media repoRichard van der Hoff2018-05-022-1/+4
|/
* add guard for None on purge_history apiKrombel2018-04-301-1/+14
* Merge pull request #3155 from NotAFile/py3-bytes-1Richard van der Hoff2018-04-301-3/+3
|\
| * more bytes stringsAdrian Tschira2018-04-291-3/+3
* | Merge pull request #3140 from matrix-org/rav/use_run_in_backgroundRichard van der Hoff2018-04-301-2/+3
|\ \
| * | Merge remote-tracking branch 'origin/develop' into rav/use_run_in_backgroundRichard van der Hoff2018-04-271-2/+7
| |\|
| * | Use run_in_background in preference to preserve_fnRichard van der Hoff2018-04-271-2/+3
* | | Merge pull request #3156 from NotAFile/py3-hmac-bytesRichard van der Hoff2018-04-302-11/+15
|\ \ \
| * | | Construct HMAC as bytes on py3Adrian Tschira2018-04-292-11/+15
| | |/ | |/|
* | | Merge pull request #3108 from NotAFile/py3-six-urlparseRichard van der Hoff2018-04-304-7/+8
|\ \ \ | |/ / |/| |
| * | Use six.moves.urlparseAdrian Tschira2018-04-154-7/+8
| |/
* / Improve exception handling for background processesRichard van der Hoff2018-04-271-2/+7
|/
* Merge pull request #3079 from matrix-org/erikj/limit_concurrent_sendsErik Johnston2018-04-101-6/+1
|\
| * Use create_and_send_nonmember_event everywhereErik Johnston2018-04-091-6/+1
* | Merge pull request #2996 from krombel/allow_auto_join_roomsRichard van der Hoff2018-04-101-32/+0
|\ \
| * \ Merge branch 'develop' of into allow_auto_join_roomsKrombel2018-03-283-3/+3
| |\ \
| * | | move handling of auto_join_rooms to RegisterHandlerKrombel2018-03-141-32/+0
* | | | Merge pull request #3061 from NotAFile/add-some-byte-stringsRichard van der Hoff2018-04-091-2/+2
|\ \ \ \
| * | | | Add b prefixes to some strings that are bytes in py3Adrian Tschira2018-04-041-2/+2
| | |/ / | |/| |
* | | | Merge pull request #3073 from NotAFile/use-six-reraiseRichard van der Hoff2018-04-091-1/+3
|\ \ \ \
| * | | | Replace old-style raise with six.reraiseAdrian Tschira2018-04-061-1/+3
| | |_|/ | |/| |
* | | | Merge pull request #2938 from dklug/developRichard van der Hoff2018-04-091-1/+4
|\ \ \ \ | |/ / / |/| | |
| * | | Return 401 for invalid access_token on logoutdklug2018-03-021-1/+4
* | | | Merge pull request #2986 from jplatte/join_reponse_room_idRichard van der Hoff2018-04-051-1/+6
|\ \ \ \
| * | | | Add room_id to the response of `rooms/{roomId}/join`Jonas Platte2018-03-131-1/+6
| | |_|/ | |/| |
* | | | Use "/settings/" (plural)Luke Barnard2018-04-051-1/+1
* | | | Use join_policy API instead of joinableLuke Barnard2018-04-031-6/+6
* | | | This should probably be a PUTDavid Baker2018-03-281-1/+1
* | | | Add joinability for groupsDavid Baker2018-03-281-0/+28
| |_|/ |/| |
* | | Merge branch 'master' of github.com:matrix-org/synapse into developErik Johnston2018-03-192-2/+2
|\ \ \
| * | | Replace ujson with simplejsonErik Johnston2018-03-153-3/+3
* | | | Replace some ujson with simplejson to make it workErik Johnston2018-03-161-1/+1
| |/ / |/| |
* | | RoomMembershipRestServlet doesn't handle /forgetErik Johnston2018-03-131-1/+1
* | | Add transactional API to history purgeRichard van der Hoff2018-03-121-3/+35
* | | Provide a means to pass a timestamp to purge_historyRichard van der Hoff2018-03-051-3/+55
| |/ |/|
* | Move RoomMemberHandler out of HandlersErik Johnston2018-03-013-13/+15
* | Make store_file use store_into_fileErik Johnston2018-02-141-26/+11
* | Merge pull request #2854 from matrix-org/erikj/event_create_workerErik Johnston2018-02-131-1/+0
|\ \
| * | Add event_creator workerErik Johnston2018-02-071-1/+0
* | | Fix typos in purge api & docRichard van der Hoff2018-02-131-3/+1
* | | Merge pull request #2857 from matrix-org/erikj/upload_storeErik Johnston2018-02-121-0/+6
|\ \ \
| * | | Tell storage providers about new file so they can uploadErik Johnston2018-02-071-0/+6
| |/ /
* | | Merge pull request #2858 from matrix-org/rav/purge_updatesRichard van der Hoff2018-02-091-1/+10
|\ \ \ | |/ / |/| |
| * | delete_local_events for purge_historyRichard van der Hoff2018-02-091-1/+10
* | | Update copyrightErik Johnston2018-02-062-0/+2
* | | Update places where we create eventsErik Johnston2018-02-052-9/+11