summary refs log tree commit diff
path: root/synapse (follow)
Commit message (Expand)AuthorAgeFilesLines
* Remove useless commentsErik Johnston2014-11-101-23/+0
* Add auth to the various server-server APIsErik Johnston2014-11-103-9/+23
* Fix backfill to work. Add auth to backfill requestErik Johnston2014-11-106-18/+56
* Notify users about invites.Erik Johnston2014-11-103-10/+14
* Fix invite authErik Johnston2014-11-101-3/+5
* Tidy up some of the unused sql tablesErik Johnston2014-11-104-109/+9
* Finish redaction algorithm.Erik Johnston2014-11-105-25/+33
* Use current state to get room hosts, rather than querying the databaseErik Johnston2014-11-072-7/+32
* Add '/event_auth/' federation apiErik Johnston2014-11-074-7/+55
* Implement invite part of invite join danceErik Johnston2014-11-074-22/+75
* Remove /context/ requestErik Johnston2014-11-072-16/+0
* Add hash of current state to eventsErik Johnston2014-11-072-1/+11
* Return auth chain when handling send_joinErik Johnston2014-11-072-8/+27
* Fix bug in _get_auth_chain_txnErik Johnston2014-11-071-14/+11
* Merge branch 'develop' of github.com:matrix-org/synapse into federation_autho...Erik Johnston2014-11-072-4/+7
|\
| * Fix url decoding bugs with /redact and /send APIs.Kegan Dougal2014-11-051-2/+2
| * Be sure to urlencode/decode event types correctly in both the web client and HS.Kegan Dougal2014-11-051-1/+1
| * Determine webclient path by the python module it is contained inMark Haines2014-11-041-1/+4
* | Fix joining over federationErik Johnston2014-11-075-56/+55
* | Implement method to get auth_chain from a given event_idErik Johnston2014-11-071-0/+35
* | Start implementing auth chainsErik Johnston2014-11-078-6/+115
* | Neaten things up a bitErik Johnston2014-11-071-5/+2
* | Don't query the DB for user power levelsErik Johnston2014-11-071-10/+16
* | Amalgamate all power levels.Erik Johnston2014-11-068-395/+102
* | Update to use replaces_state rather than prev_stateErik Johnston2014-11-061-2/+4
* | Don't send prev_state to clients anymoreErik Johnston2014-11-061-1/+1
* | Implement new replace_state and changed prev_stateErik Johnston2014-11-0613-128/+220
* | Get correct prev_eventsErik Johnston2014-11-052-15/+26
* | Fix auth checks to all use the given old_event_stateErik Johnston2014-11-054-34/+54
* | Fix room handler testsErik Johnston2014-11-041-1/+0
* | Don't bother lockingErik Johnston2014-11-041-6/+5
* | Fix bug in replicationErik Johnston2014-11-041-1/+1
* | On AuthError, raise a FederationErrorErik Johnston2014-11-041-1/+9
* | Move FederationError to synapse.api.errorsErik Johnston2014-11-042-34/+34
* | PEP8Erik Johnston2014-11-041-4/+13
* | Add support for sending failuresErik Johnston2014-11-043-2/+63
* | Remove unused interfaceErik Johnston2014-11-041-8/+0
* | Remove unused importsErik Johnston2014-11-045-13/+2
* | Fix bugs in generating event signatures and hashingErik Johnston2014-11-034-83/+42
* | Add option to not bind to HTTPS port. This is useful if running behind an ssl...Erik Johnston2014-11-032-1/+7
* | Rename PDU fields to match that of events.Erik Johnston2014-11-036-316/+80
* | For now, don't store txn -> pdu mappings.Erik Johnston2014-11-032-5/+3
* | FormattingErik Johnston2014-11-031-1/+4
* | Sign events we create.Erik Johnston2014-11-031-0/+9
* | Add 'origin' key to eventsErik Johnston2014-11-031-0/+4
* | Don't assume event has hashes key alreadyErik Johnston2014-11-031-0/+2
* | Remove dead code.Erik Johnston2014-11-031-84/+0
* | Merge branch 'develop' of github.com:matrix-org/synapse into federation_autho...Erik Johnston2014-11-032-3/+2
|\|
| * Use python logger, not the twisted loggerErik Johnston2014-11-031-2/+1
| * Bump version numbers and change logErik Johnston2014-10-311-1/+1
* | Sign evnetsErik Johnston2014-10-312-0/+26
* | Remove unused signature storage methodsErik Johnston2014-10-311-138/+1
* | Remove unused sql file.Erik Johnston2014-10-311-31/+0
* | Make prev_event signing work again.Erik Johnston2014-10-313-8/+18
* | Remove more references to dead PDU tablesErik Johnston2014-10-314-94/+8
* | Remove PDU tables.Erik Johnston2014-10-316-1230/+2
* | Remove unused functions.Erik Johnston2014-10-311-90/+0
* | Actually don't store any PDUsErik Johnston2014-10-313-14/+42
* | old_state_events should be a dict not listErik Johnston2014-10-311-2/+4
* | Don't store any PDUsErik Johnston2014-10-312-32/+33
* | Move the impl of backfill to use events.Erik Johnston2014-10-313-5/+114
* | Fix bug in redaction auth.Erik Johnston2014-10-311-2/+2
* | Convert event ids to be of the form :example.comErik Johnston2014-10-306-28/+54
* | Make federation return the old current state, so that we can use it to do authErik Johnston2014-10-302-10/+32
* | Merge branch 'develop' of github.com:matrix-org/synapse into federation_autho...Erik Johnston2014-10-3040-186/+224
|\|
| * Fix pep8 warningsMark Haines2014-10-3035-135/+179
| * Use floating-point rather than integer division to handle timeouts so that no...Paul "LeoNerd" Evans2014-10-291-1/+1
| * Fix an off-by-one bug in presence event stream pagination; this might be resp...Paul "LeoNerd" Evans2014-10-291-1/+1
| * Construct a source-specific 'SourcePaginationConfig' to pass into get_paginat...Paul "LeoNerd" Evans2014-10-296-40/+43
| * Remove redundant (and incorrect) presence pagination fetching codePaul "LeoNerd" Evans2014-10-291-3/+0
| * Remove duplicate join_event from create_roomMark Haines2014-10-271-5/+0
| * Remove test_pyflakes.Kegan Dougal2014-10-271-1/+0
* | Fix SQL so that accepts we may want to persist events twice.Erik Johnston2014-10-302-25/+47
* | Add a run_on_reactor functionErik Johnston2014-10-291-0/+7
* | Start filling out and using new events tablesErik Johnston2014-10-298-93/+159
* | Don't reference PDU when persisting eventErik Johnston2014-10-282-4/+5
* | Begin implementing all the PDU storage stuff in Events landErik Johnston2014-10-289-42/+485
* | Add transaction level logging and timing information. Add a _simple_delete me...Erik Johnston2014-10-289-21/+91
* | Clean up LoggingTransactionErik Johnston2014-10-281-10/+4
* | Add timer to LoggingTransactionErik Johnston2014-10-281-3/+10
* | Remove duplicate importErik Johnston2014-10-271-1/+0
* | Merge branch 'event_signing' of github.com:matrix-org/synapse into federation...Erik Johnston2014-10-2716-51/+450
|\ \
| * | fix pyflakes warningsMark Haines2014-10-273-6/+6
| * | Merge branch 'develop' into event_signingMark Haines2014-10-2714-21/+108
| |\|
| | * Test pyflakes jenikns integrationMark Haines2014-10-271-0/+1
| | * Fix pyflakes warningsMark Haines2014-10-274-4/+2
| * | Remove signatures from pdu when computing hashes to use for prev pdus, make s...Mark Haines2014-10-172-2/+6
| * | Merge branch 'develop' into event_signingMark Haines2014-10-1710-37/+32
| |\ \
| * | | Rename 'meta' to 'unsigned'Mark Haines2014-10-173-9/+10
| * | | move 'age' into 'meta' subdict so that it is clearer that it is not part of t...Mark Haines2014-10-172-7/+19
| * | | Hash the same content covered by the signature when referencing previous PDUs...Mark Haines2014-10-176-16/+84
| * | | Include hashes of previous pdus when referencing themMark Haines2014-10-169-28/+92
| * | | Sign outgoing PDUs.Mark Haines2014-10-164-9/+14
| * | | persist hashes and origin signatures for PDUsMark Haines2014-10-156-14/+132
| * | | Merge branch 'develop' into event_signingMark Haines2014-10-152-3/+7
| |\ \ \
| * | | | Storage for pdu signaturesMark Haines2014-10-142-0/+126
* | | | | Merge branch 'develop' of github.com:matrix-org/synapse into federation_autho...Erik Johnston2014-10-2719-59/+138
|\ \ \ \ \ | | |_|_|/ | |/| | |
| * | | | Add log message if we can't enable ECC. Require pyopenssl>=0.14 since 0.13 do...Mark Haines2014-10-241-1/+4
| * | | | Wrap preparing the database in a transaction. Otherwise it will take many sec...Mark Haines2014-10-241-3/+4
| * | | | Coturn's timestamps are in seconds, not millisecondsDavid Baker2014-10-211-1/+1
| * | | | Add get_json method to 3pid http client. Better logging for errors in 3pid re...Mark Haines2014-10-202-2/+41
| * | | | Fix auto generating signing_keysMark Haines2014-10-181-1/+1
| * | | | Bump the other version v0.4.1Erik Johnston2014-10-181-1/+1
| * | | | Check that we have auth headers and fail nicelyErik Johnston2014-10-171-0/+5
| * | | | More log lines.Erik Johnston2014-10-171-7/+15
| * | | | add log line for checking verifying signaturesMark Haines2014-10-171-0/+1
| * | | | Bump version and changelogErik Johnston2014-10-171-1/+1
| * | | | Bump database version number.Erik Johnston2014-10-172-1/+32
| | |_|/ | |/| |
| * | | keep 'origin_server_ts' as 'ts' in the database to avoid needlessly updating ...Mark Haines2014-10-177-11/+16
| * | | SPEC-7: Rename 'ts' to 'origin_server_ts'Mark Haines2014-10-1710-27/+27
| * | | SPEC-7: Don't stamp event contents with 'hsob_ts'Mark Haines2014-10-171-13/+3
| * | | Make sure to return an empty JSON object ({}) from presence PUT/POST requests...Paul "LeoNerd" Evans2014-10-141-2/+2
| | |/ | |/|
| * | SYN-103: Ignore the 'origin' key in received EDUs. Instead take the origin fr...Mark Haines2014-10-142-3/+7
| |/
| * remove debugging logging for signing requestsMark Haines2014-10-141-4/+0
* | It doesn't want a dictErik Johnston2014-10-171-2/+0
* | Fix bug where people could join private roomsErik Johnston2014-10-173-45/+63
* | Use state groups to get current state. Make join dance actually work.Erik Johnston2014-10-1710-67/+226
* | Finish implementing the new join dance.Erik Johnston2014-10-176-126/+222
* | Start implementing the invite/join dance. Continue moving auth to use event.s...Erik Johnston2014-10-164-22/+133
* | Begin making auth use event.old_state_eventsErik Johnston2014-10-1510-83/+115
* | Add missing package storate.stateErik Johnston2014-10-151-0/+97
* | Begin implementing state groups.Erik Johnston2014-10-143-3/+123
|/
* Better response message when signature is missing or unsupportedMark Haines2014-10-131-1/+1
* Respond with more helpful error messages for unsigned requestsMark Haines2014-10-136-10/+45
* Raise a SynapseError if the authorisation header is missing or malformedMark Haines2014-10-131-19/+27
* Remove debug logging, raise a proper SynapseError if the auth header is missingMark Haines2014-10-131-5/+4
* Verify signatures for server2server requestsMark Haines2014-10-133-25/+96
* SYN-75 sign at the request level rather than the transaction levelMark Haines2014-10-134-35/+53
* Merge branch 'develop' into server2server_signingMark Haines2014-10-131-11/+35
|\
| * Replace on_send_callback with something a bit clearer so that we can sign mes...Mark Haines2014-10-131-11/+35
* | Merge branch develop into server2server_signingMark Haines2014-10-138-170/+162
|\|
| * Fix pyflakes errorsMark Haines2014-10-022-9/+3
| * Add a keyword argument to get_json to avoid retrying on DNS failures. Rather ...Mark Haines2014-10-024-15/+11
| * Merge branch 'master' into developDavid Baker2014-10-021-1/+2
| |\
| | * Fix ncorrect ports in documentation and add notes on how generate-config also...David Baker2014-10-021-1/+2
| * | Split PlainHttpClient into separate clients for talking to Identity servers a...Mark Haines2014-10-025-154/+161
| * | Merge remote-tracking branch 'origin/master' into developMark Haines2014-10-021-0/+1
| |\|
| | * Update README setup instructions to be correct. Make synapse spit out explana...David Baker2014-10-021-0/+1
| * | remove "red", "blue" and "green" server_name mappingsMark Haines2014-10-011-7/+0
* | | Merge branch 'develop' into server2server_signingMark Haines2014-09-3035-100/+781
|\| |
| * | pyflakes cleanupErik Johnston2014-09-303-3/+1
| * | SYN-2: Allow server admins to delete room aliasesErik Johnston2014-09-303-17/+78
| * | Update docstringErik Johnston2014-09-292-2/+3
| * | SYN-48: Delete dead codeErik Johnston2014-09-291-26/+0
| * | SYN-48: Fix typo. Get the whois for requested user rather tahan the requesterErik Johnston2014-09-291-1/+1
| * | SYN-48: Implement WHOIS rest servletErik Johnston2014-09-299-25/+190
| * | Add auth check to test if a user is an admin or not.Erik Johnston2014-09-292-0/+11
| * | SYN-48: Track User-Agents as well as IPs for client devices.Erik Johnston2014-09-294-5/+20
| * | Track the IP users connect with. Add an admin column to users table.Erik Johnston2014-09-266-9/+57
| |/
| * Just use a yaml list for turn serversDavid Baker2014-09-251-1/+1
| * Bump version and changelogErik Johnston2014-09-251-1/+1
| * Merge branch 'deletions' of github.com:matrix-org/synapse into developErik Johnston2014-09-2515-26/+268
| |\
| | * Don't strip out null's in serialized events, as that is not need anymore and ...Erik Johnston2014-09-251-1/+2
| | * Don't strip of False values from events when serializingErik Johnston2014-09-251-1/+1
| | * Add LIMIT to scalar subqueryErik Johnston2014-09-253-5/+10
| | * Rename deletions to redactionsErik Johnston2014-09-2416-74/+77
| | * Make deleting deletes not undeleteErik Johnston2014-09-241-14/+4
| | * Fix bug where we didn't correctly pull out the event_id of the deletionErik Johnston2014-09-242-3/+8
| | * Fill out the prune_event method.Erik Johnston2014-09-241-6/+31
| | * Add v4 deltas to current sql.Erik Johnston2014-09-243-1/+10
| | * Rename 'pruned' to 'pruned_because'Erik Johnston2014-09-233-3/+3
| | * SYN-12: Implement auth for deletion by adding a 'delete_level' on the ops lev...Erik Johnston2014-09-234-6/+43
| | * Add prune_event methodErik Johnston2014-09-231-0/+39
| | * Make sure we don't persist the 'pruned' keyErik Johnston2014-09-231-1/+1
| | * Add m.room.deletion. If an event is deleted it will be returned to clients 'p...Erik Johnston2014-09-239-21/+144
| | * Add a deletions tableErik Johnston2014-09-221-0/+5
| * | Fix bug where we tried to insert state events with null state keyErik Johnston2014-09-251-1/+2
| * | Merge branch 'turn' into developDavid Baker2014-09-254-2/+105
| |\ \
| | * | Make turn server endpoint return an empty object if no turn servers toDavid Baker2014-09-252-2/+2
| | * | The REST API spec only alows for returning a single server so name theDavid Baker2014-09-241-1/+1
| | * | OopsDavid Baker2014-09-241-1/+1
| | * | rename endpoint to better reflect what it is and allow specifying multiple urisDavid Baker2014-09-242-8/+6
| | * | Use standard base64 encoding with padding to get the same result asDavid Baker2014-09-241-2/+5
| | * | The config is not hierarchicalDavid Baker2014-09-231-3/+3
| | * | Add support for TURN servers as per the TURN REST API (http://tools.ietf.org/...David Baker2014-09-234-2/+104
| * | | SYN-46: An invite received from fedearation didn't wake up the event stream f...Erik Johnston2014-09-251-1/+9
| * | | Don't set the room name to be the room alias on room creation if the client d...Erik Johnston2014-09-241-11/+0
| * | | SYN-70: And fix another bug where I can't typeErik Johnston2014-09-241-1/+1
| * | | SYN-70: Fix typoErik Johnston2014-09-241-1/+1
| * | | Bugfix for older Pythons that lack hmac.compare_digest()Paul "LeoNerd" Evans2014-09-231-1/+11
| * | | Merge branch 'jira/SYN-60' into developPaul "LeoNerd" Evans2014-09-232-6/+44
| |\ \ \
| | * | | Send an HMAC(SHA1) protecting the User ID for the ReCAPTCHA bypass, rather th...Paul "LeoNerd" Evans2014-09-231-7/+26
| | * | | Config values are almost never 'None', but they might be empty string. Detect...Paul "LeoNerd" Evans2014-09-231-1/+1
| | * | | Make sure the config actually /has/ a captcha_bypass_secret set before trying...Paul "LeoNerd" Evans2014-09-231-2/+3
| | * | | Allow a (hidden undocumented) key to m.login.recaptcha to specify a shared se...Paul "LeoNerd" Evans2014-09-232-6/+24
| | |/ /
| * / / Implemented /rooms/$roomid/state API.Kegan Dougal2014-09-232-6/+23
| |/ /
* | | SYN-75 Verify signatures on server to server transactionsMark Haines2014-09-3011-232/+237
* | | Sign federation transactionsMark Haines2014-09-241-1/+8
* | | Fix a few pyflakes errors in the server_key_resourceMark Haines2014-09-231-5/+1
* | | Add a _matrix/key/v1 resource with the verification keys of the local serverMark Haines2014-09-235-164/+104
* | | Read signing keys using methods from syutil. convert keys that are in the wro...Mark Haines2014-09-231-9/+30
|/ /
* / Bump versions and changelog v0.3.3Erik Johnston2014-09-221-1/+1
|/
* SYN-47: Fix bug where we still returned events for rooms we had left.Erik Johnston2014-09-191-1/+1
* formattingKegan Dougal2014-09-191-5/+9
* Merge branch 'master' of github.com:matrix-org/synapse into developErik Johnston2014-09-181-1/+1
|\
| * Bump Changelog and version v0.3.2Erik Johnston2014-09-181-1/+1
* | Merge branch 'master' of github.com:matrix-org/synapse into developErik Johnston2014-09-181-1/+1
|\|
| * Bump changelog and versions v0.3.1Erik Johnston2014-09-181-1/+1
* | Merge branch 'test-sqlite-memory' of github.com:matrix-org/synapse into developErik Johnston2014-09-1811-115/+164
|\ \ | |/ |/|
| * Merge branch 'develop' into test-sqlite-memoryPaul "LeoNerd" Evans2014-09-1714-140/+500
| |\
| * | Print expected-vs-actual data types on typecheck failure from check_json()Paul "LeoNerd" Evans2014-09-171-1/+2
| * | Merge remote-tracking branch 'origin/develop' into test-sqlite-memoryPaul "LeoNerd" Evans2014-09-1513-19/+61
| |\ \
| * \ \ Merge remote-tracking branch 'origin/develop' into test-sqlite-memoryPaul "LeoNerd" Evans2014-09-125-95/+100
| |\ \ \
| * | | | More accurate docs / clearer paramter names in RoomMemberStorePaul "LeoNerd" Evans2014-09-121-6/+7
| * | | | Revert recent changes to RoomMemberStorePaul "LeoNerd" Evans2014-09-122-28/+10
| * | | | Now don't need the other logger.debug() call in _executePaul "LeoNerd" Evans2014-09-121-5/+0
| * | | | Logging of all SQL queries via the 'synapse.storage.SQL' loggerPaul "LeoNerd" Evans2014-09-121-2/+43
| * | | | Add a .runInteraction() method on SQLBaseStore itself to wrap the .db_poolPaul "LeoNerd" Evans2014-09-128-33/+42
| * | | | Add a better _store_room_member_txn() method that takes separated fields inst...Paul "LeoNerd" Evans2014-09-111-8/+21
| * | | | Rename _store_room_member_txn to _store_room_member_from_event_txn so we can ...Paul "LeoNerd" Evans2014-09-112-2/+2
| * | | | prepare_database() on db_conn, not plain name, so we can pass in the connecti...Paul "LeoNerd" Evans2014-09-102-32/+35
| * | | | Make sure not to open our TCP ports until /after/ the DB is nicely prepared r...Paul "LeoNerd" Evans2014-09-101-1/+2
| * | | | No need for a tiny run() function any more, just use reactor.run() directlyPaul "LeoNerd" Evans2014-09-101-6/+2
| * | | | Move database preparing code out of homserver.py into storage where it belongsPaul "LeoNerd" Evans2014-09-103-64/+71
* | | | | Bump versionsErik Johnston2014-09-171-1/+1
* | | | | SYWEB-3 : Added 'visibility' key to rooms returned via /initialSyncKegan Dougal2014-09-171-0/+5
* | | | | SYN-40: When a user updates their displayname or avatar update all their join...Erik Johnston2014-09-171-3/+43
| |_|_|/ |/| | |
* | | | Comment out password reset for now, until the mechanism is fully discussed (I...Kegan Dougal2014-09-161-1/+1
* | | | Added support for the HS to send emails. Use it to send password resets. Adde...Kegan Dougal2014-09-164-2/+130
* | | | Added PasswordResetRestServlet. Hit the IS to confirm the email/user. Need to...Kegan Dougal2014-09-162-1/+50
* | | | Fix bug where we didn't always get 'prev_content' keyErik Johnston2014-09-151-4/+1
* | | | Fix bug where we incorrectly calculated 'age_ts' from 'age' key rather than t...Erik Johnston2014-09-152-2/+4
* | | | Correctly handle receiving 'missing' Pdus from federation, rather than just d...Erik Johnston2014-09-152-12/+15
* | | | Improve logging in federation handler.Erik Johnston2014-09-151-1/+3
* | | | Fix 'age' key to update on retriesErik Johnston2014-09-153-8/+41
* | | | More helpful 400 error messages.Kegan Dougal2014-09-151-1/+5
* | | | Be consistent when associating keys with login types for registration/login.Kegan Dougal2014-09-151-1/+1
* | | | Merge branch 'develop' of github.com:matrix-org/synapse into registration-api...Kegan Dougal2014-09-1510-15/+51
|\ \ \ \ | | |_|/ | |/| |
| * | | Correctly handle the 'age' key in events and pdusErik Johnston2014-09-1510-15/+51
* | | | Make captcha work again with the new registration logic.Kegan Dougal2014-09-151-0/+1
* | | | Split out password/captcha/email logic.Kegan Dougal2014-09-152-140/+217
* | | | Added LoginType constants. Created general structure for processing registrat...Kegan Dougal2014-09-152-20/+84
|/ / /
* | | Bump version and change logErik Johnston2014-09-121-1/+1
* | | Fix bug where we relied on the current_state_events being updated when we are...Erik Johnston2014-09-121-2/+2
* | | Fix bug where we no longer stored user_id on PdusErik Johnston2014-09-121-1/+7
| |/ |/|
* | Make the state resolution use actual power levels rather than taking them fro...Erik Johnston2014-09-124-82/+54
* | Fix bug where we incorrectly removed a remote host from the list of hosts in ...Erik Johnston2014-09-121-12/+45
* | Fix bug where we didn't return a tuple when expected.Erik Johnston2014-09-121-1/+1
|/
* Fix bug where we used an unbound local variable if we ended up rolling back t...Erik Johnston2014-09-091-4/+1
* Apparently we can't do txn.rollback(), so raise and catch an exception instead.Erik Johnston2014-09-081-11/+19
* Added num_joined_users key to /publicRooms for each room. Show this informati...Kegan Dougal2014-09-081-0/+6
* Handle the case where we don't have a common ancestorErik Johnston2014-09-081-9/+18
* Fix bug in state handling where we incorrectly identified a missing pdu. Upda...Erik Johnston2014-09-082-52/+49
* Rollback if we try and insert duplicate eventsErik Johnston2014-09-081-0/+1
* Fix race in presence handler where we evicted things from cache while handlin...Erik Johnston2014-09-081-2/+3
* Bump version and changelogErik Johnston2014-09-081-1/+1
* Fix bug where we used an event_id as a pdu_idErik Johnston2014-09-061-3/+5
* Added captcha support on both the HS and web client.Kegan Dougal2014-09-056-10/+182
|\
| * Reload captchas when they fail. Cleanup on success.Kegan Dougal2014-09-051-2/+2
| * 80 chars pleaseKegan Dougal2014-09-052-11/+23