Mark Haines
9aed791fc3
SYN-103: Ignore the 'origin' key in received EDUs. Instead take the origin from the transaction itself
2014-10-14 16:44:27 +01:00
Mark Haines
25d80f35f1
Raise a SynapseError if the authorisation header is missing or malformed
2014-10-13 15:53:18 +01:00
Mark Haines
6684855767
Verify signatures for server2server requests
2014-10-13 14:37:46 +01:00
Mark Haines
10ef8e6e4b
SYN-75 sign at the request level rather than the transaction level
2014-10-13 11:49:55 +01:00
Mark Haines
984e207b59
Merge branch develop into server2server_signing
...
Conflicts:
synapse/app/homeserver.py
2014-10-13 10:58:50 +01:00
Kegan Dougal
868eb478d8
Fixed test.
2014-10-09 15:55:07 +01:00
Kegan Dougal
3db09c4d15
Still broken.
2014-10-09 15:53:40 +01:00
Kegan Dougal
83c53113af
Break a test.
2014-10-09 15:51:05 +01:00
Kegan Dougal
72aef114ab
Fix unit test.
2014-10-08 15:18:19 +01:00
Kegan Dougal
6045bd89fb
Break unit test.
2014-10-08 15:16:03 +01:00
Mark Haines
574377636e
Add a keyword argument to get_json to avoid retrying on DNS failures. Rather than passing MatrixHttpClient.RETRY_DNS_LOOKUP_FAILURES as a fake query string parameter
2014-10-02 14:26:13 +01:00
Mark Haines
4f11518934
Split PlainHttpClient into separate clients for talking to Identity servers and talking to Capatcha servers
2014-10-02 14:03:26 +01:00
Mark Haines
9605593d11
Merge branch 'develop' into server2server_signing
...
Conflicts:
synapse/storage/__init__.py
tests/rest/test_presence.py
2014-09-30 17:55:06 +01:00
Mark Haines
b95a178584
SYN-75 Verify signatures on server to server transactions
2014-09-30 15:15:10 +01:00
Erik Johnston
e06adc6d7e
SYN-2: Allow server admins to delete room aliases
2014-09-30 11:31:42 +01:00
Erik Johnston
d96cb61f26
Unbreak tests after changing storage API
2014-09-29 15:35:57 +01:00
Erik Johnston
0fdf308874
Track the IP users connect with. Add an admin column to users table.
2014-09-26 16:36:24 +01:00
Erik Johnston
37bfe44046
Merge branch 'deletions' of github.com:matrix-org/synapse into develop
2014-09-25 17:02:53 +01:00
Erik Johnston
72e80dbe0e
Rename redaction test case to something helpful
2014-09-25 15:52:23 +01:00
Erik Johnston
59f2bef187
Fix test where we changed arguments used to call the notifier
2014-09-25 13:04:33 +01:00
Erik Johnston
24e4c48468
More tests.
2014-09-25 10:19:16 +01:00
Erik Johnston
2721f5ccc9
Add test for redactions
2014-09-25 10:02:20 +01:00
Mark Haines
52ca867670
Sign federation transactions
2014-09-24 17:25:41 +01:00
Erik Johnston
3d2cca6762
Fix test.
2014-09-24 11:17:43 +01:00
Erik Johnston
dcc1965bfe
Test that prev_content get's added if there is a prev_state key (in the event stream).
2014-09-19 16:44:16 +01:00
Erik Johnston
28bcd01e8d
SYN-47: Fix bug where we still returned events for rooms we had left.
...
SYN-47 #resolve
2014-09-19 14:45:21 +01:00
Erik Johnston
335e5d131c
Merge branch 'test-sqlite-memory' of github.com:matrix-org/synapse into develop
...
Conflicts:
tests/handlers/test_profile.py
2014-09-18 14:31:47 +01:00
Paul "LeoNerd" Evans
4571cf7baa
Merge branch 'develop' into test-sqlite-memory
2014-09-17 18:27:47 +01:00
Paul "LeoNerd" Evans
bfae582fa3
Remark on remaining storage modules that still need unit tests
2014-09-17 18:27:30 +01:00
Paul "LeoNerd" Evans
bcf5121937
Neaten more of the storage layer tests with assertObjectHasAttributes; more standardisation on test layout
2014-09-17 16:58:59 +01:00
Paul "LeoNerd" Evans
b588ce920d
Unit tests for (some) room events via the RoomStore
2014-09-17 16:31:11 +01:00
Paul "LeoNerd" Evans
ba41ca45fa
Use new assertObjectHasAttributes() in tests/storage/test_room.py
2014-09-17 16:04:05 +01:00
Paul "LeoNerd" Evans
7aacd6834a
Added a useful unit test primitive for asserting object attributes
2014-09-17 15:56:40 +01:00
Paul "LeoNerd" Evans
de14853237
More RoomStore tests
2014-09-17 15:33:10 +01:00
Erik Johnston
b6818fd4d2
SYN-40: When a user updates their displayname or avatar update all their join events for all the rooms they are currently in.
2014-09-17 15:05:14 +01:00
Paul "LeoNerd" Evans
e32cfed1d8
Initial pass at a RoomStore test
2014-09-15 18:41:24 +01:00
Erik Johnston
59516a8bb1
Correctly handle receiving 'missing' Pdus from federation, rather than just discarding them.
2014-09-15 16:40:44 +01:00
Erik Johnston
0897a09f49
Fix unit tests after adding extra argument on put_json
2014-09-15 16:24:03 +01:00
Kegan Dougal
2c00e1ecd9
Be consistent when associating keys with login types for registration/login.
2014-09-15 15:38:29 +01:00
Kegan Dougal
c04caff55c
Fix unit tests.
2014-09-15 15:14:19 +01:00
Paul "LeoNerd" Evans
1aaa429081
Also unittest RoomMemberStore's joined_hosts_for_room()
2014-09-15 15:00:14 +01:00
Paul "LeoNerd" Evans
ae7dfeb5b6
Use new 'tests.unittest' in new storage level tests
2014-09-15 14:19:16 +01:00
Paul "LeoNerd" Evans
b0406b9ead
Merge remote-tracking branch 'origin/develop' into test-sqlite-memory
2014-09-15 14:15:10 +01:00
Paul "LeoNerd" Evans
7a77aabb4b
Define a CLOS-like 'around' modifier as a decorator, to neaten up the 'orig_*' noise of wrapping the setUp()/tearDown() methods
2014-09-12 19:07:29 +01:00
Paul "LeoNerd" Evans
aeb69c0f8c
Add some docstrings
2014-09-12 18:46:13 +01:00
Paul "LeoNerd" Evans
d9f3f322c5
Additionally look first for a 'loglevel' attribute on the running test method, before the TestCase
2014-09-12 18:46:13 +01:00
Paul "LeoNerd" Evans
33c4dd4c2d
Define a (class) decorator for easily setting a DEBUG logging level on a TestCase
2014-09-12 18:46:13 +01:00
Paul "LeoNerd" Evans
ca8349a897
Allow a TestCase to set a 'loglevel' attribute, which overrides the logging level while that testcase runs
2014-09-12 18:46:13 +01:00
Paul "LeoNerd" Evans
cd62ee3f29
Have all unit tests import from our own subclass of trial's unittest TestCase; set up logging in ONE PLACE ONLY
2014-09-12 18:46:13 +01:00
Paul "LeoNerd" Evans
1c51c8ab7d
Merge remote-tracking branch 'origin/develop' into test-sqlite-memory
...
Conflicts:
synapse/storage/pdu.py
2014-09-12 17:20:06 +01:00
Erik Johnston
39e3fc69e5
Make the state resolution use actual power levels rather than taking them from a Pdu key.
2014-09-12 17:11:09 +01:00
Paul "LeoNerd" Evans
2026942b05
Initial hack at some RoomMemberStore unit tests
2014-09-12 16:44:07 +01:00
Paul "LeoNerd" Evans
3d6aee079e
Unit-test for RegistrationStore using SQLiteMemoryDbPool
2014-09-11 17:44:00 +01:00
Paul "LeoNerd" Evans
fb93a4a9e3
Perform PresenceInvitesTestCase against real SQLiteMemoryDbPool
2014-09-11 16:22:44 +01:00
Paul "LeoNerd" Evans
493b1e6d3c
Need to prepare() the SQLiteMemoryDbPool before passing it to HomeServer constructor, as DataStore's constructor will want it ready
2014-09-11 15:21:15 +01:00
Paul "LeoNerd" Evans
4385eadc28
Start of converting PresenceHandler unit tests to use SQLiteMemoryDbPool - just the 'State' test case for now
2014-09-11 13:57:17 +01:00
Paul "LeoNerd" Evans
d13d0bba51
Unit-test DirectoryHandler against (real) SQLite memory store, not mocked storage layer
2014-09-11 11:59:48 +01:00
Paul "LeoNerd" Evans
d83202b938
Added unit tests of DirectoryStore
2014-09-11 11:32:46 +01:00
Paul "LeoNerd" Evans
79fe6083eb
Test ProfileHandler against the real datastore layer using SQLite :memory:
2014-09-10 18:11:32 +01:00
Paul "LeoNerd" Evans
dd1a9100c5
Added unit tests for PresenceDataStore too
2014-09-10 17:51:05 +01:00
Paul "LeoNerd" Evans
dc7f39677f
Remember to kill now-dead import in test_profile.py
2014-09-10 16:56:52 +01:00
Paul "LeoNerd" Evans
08f5c48fc8
Move SQLiteMemoryDbPool implementation into tests.utils
2014-09-10 16:56:02 +01:00
Paul "LeoNerd" Evans
9774949cc9
It's considered polite to actually wait for DB prepare before running tests
2014-09-10 16:50:09 +01:00
Paul "LeoNerd" Evans
53d0f69dc3
Also test avatar_url profile field
2014-09-10 16:49:34 +01:00
Paul "LeoNerd" Evans
6081f4947e
Tiny trivial PoC unit-test using SQLite in :memory: mode
2014-09-10 16:42:31 +01:00
Erik Johnston
942d8412c4
Handle the case where we don't have a common ancestor
2014-09-08 20:13:27 +01:00
Erik Johnston
83ce57302d
Fix bug in state handling where we incorrectly identified a missing pdu. Update tests to catch this case.
2014-09-08 19:50:59 +01:00
Erik Johnston
ea5b5b1f64
Fix state unit test
2014-09-06 07:44:00 +01:00
Kegan Dougal
027f51763e
Unit tests do not need captchas.
2014-09-05 23:41:18 -07:00
Erik Johnston
34a7f0ca93
Fix test to assert that we don't do auth
2014-09-03 19:13:29 +01:00
Matthew Hodgson
8a7c1d6a00
fix the copyright holder from matrix.org to OpenMarket Ltd, as matrix.org hasn't been incorporated in time for launch.
2014-09-03 17:31:57 +01:00
Erik Johnston
30bcbc433a
Fix up directory server to not require uploading room hosts. Update the room hosts table with the current room hosts (if we have them) on GET.
2014-09-03 16:04:27 +01:00
Paul "LeoNerd" Evans
cda31fb755
Kill the state
...
... key from all the Presence messages
2014-09-03 15:37:10 +01:00
Kegan Dougal
7fc84c7019
Make retrying requests on DNS failures configurable, and turn off retrying only in directory.get_association
2014-09-03 14:26:52 +01:00
Paul "LeoNerd" Evans
da31b96b55
Implement presence state visibilty limiting when polling eventsource for stream
2014-09-03 13:46:52 +01:00
Paul "LeoNerd" Evans
86d6232236
Don't eat federation transmit errors during unit tests; fix remote presence EDU-sending test because of this
2014-09-03 13:46:52 +01:00
Paul "LeoNerd" Evans
da3e04df8b
Rename the 'do_users_share_a_room' to something slightly less verb-sounding
2014-09-03 10:40:48 +01:00
Paul "LeoNerd" Evans
967b45bc1a
Allow optional non-suppression of exceptions through the Distributor
2014-09-03 10:40:21 +01:00
Mark Haines
cdd8602e74
Fix tests to support ratelimiting
2014-09-03 09:15:22 +01:00
Mark Haines
dd2cd9312a
Test ratelimiter
2014-09-02 15:16:26 +01:00
Erik Johnston
a808c06a10
Fix room permissions test
2014-09-02 11:03:03 +01:00
Paul "LeoNerd" Evans
7e22afbc7c
Ensure that event source unit tests could cope with get_new_events_for_user() returning a Deferred
2014-09-02 10:53:16 +01:00
Paul "LeoNerd" Evans
270d302834
Reënable presence visibility permission checking now it's not used on redundant code paths
2014-09-01 22:15:02 +01:00
Erik Johnston
3f5ebccbff
Fix the tests to include new db calls
2014-09-01 19:57:17 +01:00
Paul "LeoNerd" Evans
59d3955db1
Have MemoryDataStore's get_rooms_for_user_where_membership_is() return room membership event objects, as per interface contract
2014-09-01 16:15:45 +01:00
Paul "LeoNerd" Evans
fd696f1243
Perform room unit tests with 'local' users actually in the right domain ;)
2014-09-01 15:58:30 +01:00
Paul "LeoNerd" Evans
468d94c920
Rename API-visible 'mtime' presence field to 'last_active'; slightly different semantics
2014-09-01 15:39:50 +01:00
Paul "LeoNerd" Evans
02f4e3b3ff
Rename 'state' presence key to the much more obvious 'presence'; maintain a legacy 'state' copy for now
2014-09-01 14:45:41 +01:00
Matthew Hodgson
8fe912d95c
change the world: make the default matrix API URL prefix /_matrix rather than /matrix to make it easier for existing websites to mount a HS in their namespace without collisions.
...
perl -pi -e 's#/matrix#/_matrix#g' ./cmdclient/console.py ./docs/client-server/howto.rst ./docs/client-server/specification.rst ./docs/client-server/swagger_matrix/directory ./docs/client-server/swagger_matrix/events ./docs/client-server/swagger_matrix/login ./docs/client-server/swagger_matrix/presence ./docs/client-server/swagger_matrix/profile ./docs/client-server/swagger_matrix/registration ./docs/client-server/swagger_matrix/rooms ./docs/server-server/specification.rst ./graph/graph.py ./jsfiddles/create_room_send_msg/demo.js ./jsfiddles/event_stream/demo.js ./jsfiddles/example_app/demo.js ./jsfiddles/register_login/demo.js ./jsfiddles/room_memberships/demo.js ./synapse/api/urls.py ./tests/federation/test_federation.py ./tests/handlers/test_presence.py ./tests/handlers/test_typing.py ./tests/rest/test_events.py ./tests/rest/test_presence.py ./tests/rest/test_profile.py ./tests/rest/test_rooms.py ./webclient/components/fileUpload/file-upload-service.js ./webclient/components/matrix/matrix-service.js
2014-08-31 14:51:37 +01:00
Paul "LeoNerd" Evans
93407cf7cf
Bugfixes on presence pushes on user joining:
...
* No need to inform clients of status of remote users; as that will
arrive in due course anyway. We don't -have- the state currently, so
we'd only send an unknown message
* Remember to bump the presence serial for the event source, so the
notifiers will wake up and report it
2014-08-29 19:53:33 +01:00
Paul "LeoNerd" Evans
56424eca5c
Bugfix for rest presence test - datastore needs to implement profile methods
2014-08-29 19:12:22 +01:00
Paul "LeoNerd" Evans
6dd50da54e
Define a new event stream data source for typing notifications (currently null)
2014-08-29 17:39:33 +01:00
Paul "LeoNerd" Evans
20d0db6cfb
Move the *EventSource classes into the handlers they relate to, so it's easier to find the code
2014-08-29 17:10:28 +01:00
Erik Johnston
5dd38d579b
Fix a couple of bugs in presence handler related to pushing updatesto the correct user. Fix presence tests.
2014-08-29 12:08:33 +01:00
Paul "LeoNerd" Evans
efc5f3440d
Only send presence "poll"/"unpoll" EDUs when changing from/to zero remotes
2014-08-28 16:43:55 +01:00
Paul "LeoNerd" Evans
113342a756
Ability to assert a DeferredMockCallable has received no calls
2014-08-28 16:40:06 +01:00
Paul "LeoNerd" Evans
c46c806126
Re-enable presence, un-skip presence tests
2014-08-28 16:00:14 +01:00
Mark Haines
7b079a26a5
Remove get_state_for_room function from federation handler
2014-08-28 15:32:38 +01:00
Paul "LeoNerd" Evans
d027e859cd
Fix up the various presence-related tests so that if they're not skipped, they still PASS
2014-08-27 18:30:09 +01:00
Mark Haines
357dd1871d
Merge branch 'develop' into storage_transactions
...
Conflicts:
tests/handlers/test_federation.py
tests/handlers/test_room.py
2014-08-27 17:28:55 +01:00
Erik Johnston
e111a06e0a
Fix tests.
2014-08-27 17:21:48 +01:00
Mark Haines
1d95e78759
Merge branch 'develop' into storage_transactions
2014-08-27 16:54:12 +01:00
Mark Haines
a0d1f5a014
Start updating state handling to use snapshots
2014-08-27 15:11:51 +01:00
Mark Haines
a03c7f27a8
Fill out prev_events before calling persist_event
2014-08-27 14:32:19 +01:00
Paul "LeoNerd" Evans
5eff05a4ce
Initial typing notification support - EDU federation, but no timers, and no actual push to clients
2014-08-27 11:45:16 +01:00
Kegan Dougal
135a1aa229
Final url modifications: renamed /presence_list to /presence/list to keep the top-level namespace clean. Updated tests.
2014-08-27 11:37:53 +01:00
Kegan Dougal
dd661769e1
Renamed /rooms to /createRoom. Removed ability to PUT raw room IDs, and removed tests which tested that. Updated cmdclient and webclient.
2014-08-27 11:33:56 +01:00
Mark Haines
bf05218c4b
Merge branch 'develop' into storage_transactions
2014-08-27 11:19:37 +01:00
Mark Haines
d2798de660
Fold federation/handler into handlers/federation
2014-08-26 19:49:42 +01:00
Mark Haines
64e2a5d58e
Move pdu and event persistence into a single persist_event function
2014-08-26 18:01:36 +01:00
Kegan Dougal
5a93bfe1f0
Removed MessageRestServlet, use RoomSendEventRestServlet instead. Updated cmdclient, tests and webclient. All appears to work.
2014-08-26 17:21:48 +01:00
Mark Haines
66a4d33524
Merge branch 'develop' into storage_transactions
2014-08-26 16:20:50 +01:00
Kegan Dougal
2e70de09b9
Renaming: /im/sync >> /initialSync. /rooms/$roomid/members/list >> /rooms/$roomid/members. /rooms$roomid/messages/list >> /room/$roomid/messages. Updated cmdclient, tests and webclient.
2014-08-26 16:19:17 +01:00
Mark Haines
4b63b06cad
Merge branch 'develop' into storage_transactions
...
Conflicts:
synapse/api/auth.py
synapse/handlers/room.py
synapse/storage/__init__.py
2014-08-26 16:07:05 +01:00
Kegan Dougal
8bd55cfdcb
Fix ALL THE UNIT TESTS
2014-08-26 15:54:25 +01:00
Mark Haines
104808107a
skip presence tests which broke when presence polling was disabled
2014-08-22 18:40:31 +01:00
Mark Haines
1379dcae6f
Take a snapshot of the state of the room before performing updates
2014-08-22 17:00:10 +01:00
Paul "LeoNerd" Evans
583add34fe
Use the "collect_presencelike_data" distributor signal instead of re-implementing its behaviour
2014-08-20 16:06:47 +01:00
Erik Johnston
d100ac8c82
Fix test. get_joined_hosts_for_room get's called multiple times
2014-08-20 15:10:36 +01:00
Erik Johnston
5c4c591c61
Fix federation test, since we now hit store.get_room
2014-08-20 14:59:43 +01:00
Erik Johnston
849627b82e
Don't generate room membership messages. Include previous state of in membership messages.
2014-08-20 11:53:57 +01:00
Erik Johnston
cc48e920d6
Don't expect a reflection from events stream
2014-08-19 15:54:07 +01:00
Erik Johnston
41333452e5
Update tests
2014-08-19 15:52:20 +01:00
Erik Johnston
22dd0b37c4
Fix typo in merge conflict
2014-08-19 15:02:47 +01:00
Erik Johnston
347242a5c4
Merge branch 'master' of github.com:matrix-org/synapse into sql_refactor
...
Conflicts:
tests/rest/test_presence.py
tests/rest/test_rooms.py
tests/utils.py
2014-08-19 14:48:19 +01:00
Paul "LeoNerd" Evans
d7cfb91a7a
Rewrite of PresenceHandler test to ensure it covers the interaction with Federation as well
2014-08-19 14:26:06 +01:00
Paul "LeoNerd" Evans
fcdc40a5dd
Add a DeferredMockCallable; like mock's MockCallable but allows awaiting
...
on method calls to be made later
2014-08-19 14:25:43 +01:00
Paul "LeoNerd" Evans
88f7482b92
Perform the 'REST'-level tests of Presence against the real Presence handler as well, mocking out the datastore beneath it
2014-08-19 11:16:23 +01:00
Paul "LeoNerd" Evans
83f031207e
Implement and test presence dropping of remote users
2014-08-19 11:16:23 +01:00
Paul "LeoNerd" Evans
bb793019a5
Rename MockHttpServer to MockHttpResource as it stands for one server resource rather than an entire server
2014-08-19 11:16:23 +01:00
Erik Johnston
709a92cee8
SQL doesn't allow AUTOINCREMENT on non PRIMARY KEY columns.
2014-08-18 16:00:46 +01:00
Erik Johnston
b4a1f2ccb5
Merge branch 'master' of github.com:matrix-org/synapse into sql_refactor
2014-08-18 15:53:40 +01:00
Paul "LeoNerd" Evans
faf25e3a83
Allow room presence visibility between users who share a room
2014-08-18 13:41:43 +01:00
Erik Johnston
663a259d64
Change the MemoryDataStore to implement new storage api
2014-08-18 11:08:03 +01:00
Erik Johnston
dccb2f57be
Disable the ability to GET individualy messages. We need to think about the correct API to do this, as the current one doesn't make much sense.
2014-08-18 10:59:04 +01:00
Erik Johnston
f5fca6f787
Fix some of the tests to reflect changes in the storage layer.
2014-08-15 17:42:21 +01:00
Erik Johnston
c5f2da5875
Add a check to make sure that during state conflict res we only request a PDU we don't have.
2014-08-15 11:47:01 +01:00
Kegan Dougal
9a1638ed21
Removed http_server from HomeServer. Updated unit tests to use either resource_for_federation or resource_for_client depending on what is being tested.
2014-08-14 10:18:54 +01:00
Kegan Dougal
9f863d3466
Start phasing out HttpServer: we should be using Resources instead. Added resource_for_client/federation/web_client to the HomeServer and hooked the C-S servlets to operate on resource_for_client. Dynamically construct the Resource tree.
2014-08-14 09:55:16 +01:00
Paul "LeoNerd" Evans
d05aa651f8
An initial hack at storing presence state-change mtimes in database and presenting age durations to clients/federation events
2014-08-13 19:19:15 +01:00
Paul "LeoNerd" Evans
a6a9b71da0
Allow advancing the MockClock's time
2014-08-13 19:19:15 +01:00
Paul "LeoNerd" Evans
eef58a299e
Don't mock out presence_handler's internal start/stop methods in presencelike unit test; it's rude
2014-08-13 19:19:15 +01:00
Paul "LeoNerd" Evans
fc778e2bce
Move MockClock into tests.utils so we can reüse it
2014-08-13 19:19:15 +01:00
Paul "LeoNerd" Evans
3a1cfe18cf
Implement directory service federation by Federation Queries; avoid local_only hack; add unit tests
2014-08-13 18:03:41 +01:00
Paul "LeoNerd" Evans
7fb93f2a47
Add a HomeServer.parse_roomalias() to avoid having to RoomAlias.from_sring(..., hs=hs) - similar to parse_userid()
2014-08-13 18:03:41 +01:00
Paul "LeoNerd" Evans
505917cb97
Use new Federation Query API to implement HS->HS fetching of remote users' profile information instead of (ab)using the client-side REST API
2014-08-13 17:23:49 +01:00
Paul "LeoNerd" Evans
827de7cee9
Define the concept of a 'federation Query'; creating API for making and handling Queries on the Federation's increasingly-inaccurately-named ReplicationLayer
2014-08-13 17:23:49 +01:00
Paul "LeoNerd" Evans
820ed34abe
Namespace all the Federation HTTP URLs to /matrix/federation/v1/...
2014-08-13 15:07:55 +01:00
Paul "LeoNerd" Evans
55944ccf72
Use strings instead of opaque magic-number constants for presence states; rename AWAY to UNAVAILABLE
2014-08-13 14:31:48 +01:00
Matthew Hodgson
3e35a9f96e
add in copyrights to everything, not just the synapse subdir, and add a copyrighter.pl whilst we're at it
2014-08-13 03:32:18 +01:00