Keegan McAllister
cb7e726d77
Create and use @internal_notify_view
...
Resolves #288 .
(imported from commit 982bf5651a34fa66cd81c882ed0351829eaadf86)
2012-11-28 15:28:14 -05:00
Zev Benjamin
81fe519b24
github hooks: Display different actions for pull requests sanely
...
(imported from commit c6d43ccff2d72f61a1cc4d8d320db56edd074832)
2012-11-28 14:49:21 -05:00
Zev Benjamin
fb0b4b23c3
Preliminary GitHub integration for pull requests and pushes
...
(imported from commit 5f91cfd39552294e2c1f1412044d5c8e738d68e3)
2012-11-27 13:55:57 -05:00
Zev Benjamin
a117bd4cdc
Use @has_request_variables a little more
...
(imported from commit ea6422ea3cdbce134bb40181b7889bf5c6442eb7)
2012-11-27 13:55:57 -05:00
Luke Faraone
d270ff348f
Save newly created users in the log so they aren't forgotten by populatedb.
...
(imported from commit a43aaf73576dcacf85c4ad662cbcf04b3fe2bbd7)
2012-11-27 11:16:38 -05:00
Tim Abbott
688525668e
Correctly display the user count in registration process.
...
(imported from commit 24c8479c0730d1756c4e1bd0b818772914c20bd5)
2012-11-27 10:55:00 -05:00
Jessica McKellar
cca39ca5e8
Add default subscriptions upon non-MIT user creation.
...
We'll probably eventually get fancier with this, suggesting various
default sets depending on the company or making it easy for one person
to create default subs for several people at once.
Until we know what we want, keep it simple.
(imported from commit 14319dd50c67fe33ac6f15288dba4916ce0a89ac)
2012-11-26 21:02:29 -05:00
Jeff Arnold
a6ec875268
[schema] Add enable_desktop_notifications to user profile
...
(imported from commit f5b543e8446263ce8855561441a6d4c1a8d41f4d)
2012-11-26 14:43:55 -05:00
Tim Abbott
fac24df233
Show a user-visible error message when mirroring is not working.
...
The main problem with this code is that the error message doesn't go
away until you reload. To fix this, we need to add a noblock option
on get_updates.
(imported from commit dc45af397bcf06a218bda5dd224ebd5fdf3462db)
2012-11-26 11:49:29 -05:00
Tim Abbott
eefa5b2d7b
API: Add support for nonblocking get_updates requests.
...
(imported from commit bf2ab19a83765c177fbb93abc1a61dccf5b4b2b7)
2012-11-26 11:49:29 -05:00
Luke Faraone
724dce78e4
Always allow registration if attempting to register for a non-MIT realm.
...
(imported from commit 00489ab74c376a4ffb23ad661699ef31c6c06818)
2012-11-21 16:42:15 -05:00
Keegan McAllister
161af7838f
Prevent session expiry as long as the user has reloaded in the past two weeks
...
Fixes (?) #416 .
(imported from commit 9d56fe4125f742e2cdccc41ebd385daacccf461f)
2012-11-20 21:49:11 -05:00
Luke Faraone
ed691f0b6e
Linewrap long line in views.py
...
(imported from commit 923ce6d87755e4827995d10f62b574d416246147)
2012-11-20 17:40:40 -05:00
Luke Faraone
48806b5548
Fix incorrect Recipient access, use create_stream_if_needed.
...
This solves 500s that were occurring when subbing to "signups" and related
actions.
(imported from commit 91a59cc23d144133565b2465896e0c5ba868a9bb)
2012-11-20 17:38:00 -05:00
Waseem Daher
12f1a29e07
Specify the stream in a way that includes the realm.
...
(imported from commit 4de319fe3600f7d434be5198fef214f059f4b668)
2012-11-20 17:18:32 -05:00
Luke Faraone
b1ba5bf1b2
[manual] Send a message when a new user creates an account.
...
(imported from commit 2c69be9bfbbe947db41188cbdfc05cf887dc858f)
2012-11-20 16:41:55 -05:00
Jeff Arnold
9ce4c103c0
Implement full history search by creating a narrow for a search term
...
(imported from commit 3f2df6a6e590458ff774bbd658bbd1d95076a4db)
2012-11-19 17:12:59 -05:00
Tim Abbott
6026c80de6
API: Add unsubscribe function.
...
(imported from commit 6dc55e9030770500770ce3921a4e77499d64f2d6)
2012-11-16 17:06:01 -05:00
Tim Abbott
d1239278c7
Rewrite remove_subscriptions to work like add_subscriptions.
...
In particular:
* Taking a list of streams as arguments.
* Using the _backend model so that we can have an API version.
* Considering "not subscribed" to be a non-fatal error.
And of course the corresponding changes to subs.js.
(imported from commit fdb300c6aa6921c2c6b09c22bd1e64405c368809)
2012-11-16 17:06:01 -05:00
Tim Abbott
ff2b5c19de
add_subscriptons_backend: Some minor code cleanup.
...
(imported from commit 14a8352b65859b5a8688a6823404f4a7982403ae)
2012-11-16 17:06:01 -05:00
Tim Abbott
f1ccf44c99
add_subscriptions_backend: Check that the argument is a list.
...
(imported from commit c514dab9fb28dcdaa12b38e7ef028e177f4377fb)
2012-11-16 17:06:01 -05:00
Tim Abbott
f5ccde78e3
[manual] Use "subscriptions" for {add,list}_subscriptions consistently.
...
This change requires a zephyr_mirror deployment when it is pushed to prod.
(imported from commit a31d6efd2db4d4617c7c6b00326be3f07c7263da)
2012-11-16 17:06:01 -05:00
Tim Abbott
afc62a8e16
[manual] Uniformize the subscriptions API method names.
...
This requires a zephyr_mirror deployment when it is pushed to prod.
(imported from commit 6543441fb264b518f8705d7989d068a1d50ce5d6)
2012-11-16 17:06:01 -05:00
Waseem Daher
162c708bde
Add the ability to get more messages by stream name.
...
(imported from commit 38a2847a9820585a458c651436e3a7ec9256c590)
2012-11-16 15:58:21 -05:00
Tim Abbott
50995dc6b7
Fix showing the subscribe-and-send dialogue when you're subscribed.
...
This doesn't fully fix the problems related to not syncing
subscriptions to browser clients, but it does fix the instance that
everyone experiences.
(imported from commit be2bc31a7c4443c1678321f1a938496e2632c0d3)
2012-11-15 17:15:59 -05:00
Jeff Arnold
a68efd9ce2
Handle loading of older messages in narrowed view
...
(imported from commit 2fe1377736322a44e8682c69dd5e4312d5f46ca4)
2012-11-15 16:32:00 -05:00
Tim Abbott
2ed1917a10
api_get_old_messages: Use @has_request_variables.
...
(imported from commit 98862197e7b2f57e64ac4d906251cb81f582f5d1)
2012-11-15 15:39:14 -05:00
Tim Abbott
00cd30ff97
Use @has_request_variables in json_remove_subscription.
...
(imported from commit b08b7672959f8773db1ff7e40b53648926b47a09)
2012-11-15 15:39:14 -05:00
Tim Abbott
1c0832583c
send_message_backend: Use POST() for the forged variable.
...
(imported from commit f2ca2a1adf1c71aa2e92e13a5f9396dfb091a8ef)
2012-11-15 15:39:14 -05:00
Tim Abbott
5467678a2e
send_message_backend: Return error on messages with no recipients.
...
(imported from commit 4cf9bac8eb6e35dde0510afe4efb8ba70c86b566)
2012-11-15 15:39:14 -05:00
Tim Abbott
17f55441b5
Filter out empty string recipients in extract_recipients.
...
(imported from commit 0a4168e36ea2fe40bde281d2690adcf40bb15abe)
2012-11-15 15:39:08 -05:00
Tim Abbott
1ea1cdcdfd
Call extract_recipients using a POST() decorator.
...
(imported from commit 135c465251a7af688b4354d0bd57763fd8ce282e)
2012-11-15 15:38:18 -05:00
Tim Abbott
03e52767ff
Don't lower-case recipient email addresses in extract_recipients.
...
(imported from commit 7dd150dae659cc68aa6c8f1bad39f7be32384a95)
2012-11-15 15:36:23 -05:00
Tim Abbott
5230382e4d
mirror: Check whether the user is a recipient by id.
...
(imported from commit e50f0b00d8e3cb00fdc7af3872b5adc38c432dcc)
2012-11-15 15:36:23 -05:00
Tim Abbott
4fe089e1ce
Refactor arguments to create_mirrored_message_users.
...
(imported from commit 1a0954018585514c391dd0a6d5d2d382cb8e37ab)
2012-11-15 15:31:48 -05:00
Tim Abbott
eddc516d5f
send_message: Allow list-form "to" for sending to streams.
...
(imported from commit f1d8c694b5d89d09222d4f303f68841aede64385)
2012-11-15 15:31:48 -05:00
Tim Abbott
5faf18754e
Decrease code duplication in create_mirrored_message_users.
...
(imported from commit d299124aa1eaa9afac62278c6b98208a14d2cdb1)
2012-11-15 15:30:09 -05:00
Tim Abbott
411a7f6b4f
[manual] send_message: Rename recipient/stream fields to 'to'.
...
This commit changes APIs and requires and update of all zephyr
mirroring bots to deploy properly.
(imported from commit 2672d2d07269379f7a865644aaeb6796d54183e1)
2012-11-15 15:30:06 -05:00
Tim Abbott
6f10d27f3b
send_message_backend: Eliminate unnecessary sender argument.
...
(imported from commit 64c1b9e2973e47a1d6af355cef0617c9abbff946)
2012-11-15 15:20:52 -05:00
Tim Abbott
b219be06d3
Use @has_request_variables for client_name extraction.
...
(imported from commit b2ba8edaa680c69c82258bfc3f93a9e8028f2cfa)
2012-11-15 15:20:52 -05:00
Tim Abbott
2ab8af0b91
Clean up now-unnecessary extract_sender.
...
(imported from commit c504838bec7ec14be8fb660015445c9bc20a2a88)
2012-11-14 15:03:49 -05:00
Tim Abbott
7227cb32f8
zephyr_mirror: Compute zephyr mirror fullnames server-side.
...
(imported from commit 9e6f6f9fe49d60ed30753582480e592613feb3c8)
2012-11-14 15:03:46 -05:00
Tim Abbott
979560d2fe
mirror: Make check for duplicate messages more exact.
...
This should fix the problem where only one of pairs of identical
messages sent to two different zephyr classes by bots will make it
over.
(imported from commit 37005417e2e1f737501c9524b95b044eefbfe235)
2012-11-14 14:33:31 -05:00
Zev Benjamin
150a800b95
Don't reject mirrored stream messages because they don't have a recipient field
...
(imported from commit 1677ad91dc2e470c02a01a553d9d07789199a8d9)
2012-11-13 20:22:37 -05:00
Keegan McAllister
42a5ea9d2e
Specify requests.post data as a dict
...
These were lists of pairs because we were going to repeat keys, but that didn't
work anyway.
(imported from commit 687b3f7b8a2821d057719c725f1f39db3992ae5c)
2012-11-13 17:33:41 -05:00
Keegan McAllister
f82e8fc4d1
Move Markdown rendering out of the Tornado server
...
(imported from commit fc726939aa1061c40b292899dbbc9ade3b29ea01)
2012-11-13 17:33:41 -05:00
Zev Benjamin
9c99e00228
Normalize the sender email while we're at it
...
(imported from commit 1c245156809da77b4bef7a4396e8c0bee5724490)
2012-11-13 17:25:13 -05:00
Zev Benjamin
57bc0e0b8d
Normalize recipient list on the server-side send path
...
This was causing Zephyr mirroring to break because
create_mirrored_message_users was returning False due to the
same_realm_email check failing.
(imported from commit e6a63160f34ec056461038650b5f8027718e6c63)
2012-11-13 17:25:13 -05:00
Zev Benjamin
f851d9437d
Turn 2-person huddles between the sender and other user into a personal on the backend
...
(imported from commit 959e7ea8101dc1d469d62ea2c7c7a65854679833)
2012-11-13 15:40:53 -05:00
Zev Benjamin
195bdb07c9
Unify huddles and personals into private messages on the send path
...
Personals are now just private messages between two people (which
sometimes manifests as a private message with one recipient). The
new message type on the send path is 'private'. Note that the receive
path still has 'personal' and 'huddle' message types.
(imported from commit 97a438ef5c0b3db4eb3e6db674ea38a081265dd3)
2012-11-13 15:40:53 -05:00
Zev Benjamin
33c23c0113
Use a JSON array for recipients in send_message
...
(imported from commit e2184f92b708cc2e8ef3e9ae79ee4241c0aa12a1)
2012-11-13 15:40:53 -05:00
Zev Benjamin
b948473a45
Simplify get_old_messages API
...
It now takes an anchor message id, a number of messages before, and a
number of messages after. The result always contains the anchor
message.
(imported from commit 84d070dc8091161c86d4bbeafbdc299493890a2a)
2012-11-13 15:40:53 -05:00
Zev Benjamin
69598e2b0b
Don't return server_generation in get_old_messages
...
(imported from commit de2b22fa51c645b7f1b92229bc15b1d0c4b4a8e4)
2012-11-13 15:40:53 -05:00
Keegan McAllister
31496e9189
Generalize Tornado-related settings
...
(imported from commit 76a1338a87e1a6663aa7602a499e2d769814bf08)
2012-11-13 10:59:02 -05:00
Tim Abbott
30b43ebee2
Uniformize /json/ and /api/ URLs to end with no trailing slash.
...
(imported from commit c35b30bcc43982db3a2f774ea69269e5424a6159)
2012-11-09 14:30:10 -05:00
Zev Benjamin
50b3cdd637
Make failures parameter in get_updates_backend optional
...
This was causing our tests to fail and would have also
affected API users not using our Python bindings
(imported from commit 2d81496892e9042e328279edea94be8ee4d21c1b)
2012-11-09 14:21:06 -05:00
Tim Abbott
85423bc010
Add a /activity page displaying data on user activity on the site.
...
(imported from commit 3877be49e4e0b89cadfead88b5c51f955759a996)
2012-11-09 12:28:38 -05:00
Zev Benjamin
472480a4b6
Move @has_request_variables decorator from return_messages_immediately to get_updates_backend
...
return_messages_immediately's return value is not returned, so the
argument validation in @has_request_variables didn't work correctly.
@has_request_variables would return a json_error, but
send_with_safety_check expects a dict.
(imported from commit 86b6bccb7861dbf523c06b606b87374e339059a4)
2012-11-09 12:27:40 -05:00
Zev Benjamin
fd51cf343b
Make client_id parameter in api_get_messages optional
...
(imported from commit a3221fe73f63c2cfa8f87b6059283a9aa0e8b8e4)
2012-11-09 12:27:40 -05:00
Tim Abbott
5ab0cccf41
Pass the user's user_profile to authenticated view functions.
...
This change substantially increases the number of view functions where
the API and JSON versions are actually identical code.
(imported from commit 2eee55a8943cf9a684bec2ba1f6d7afcb2b91948)
2012-11-08 17:59:31 -05:00
Zev Benjamin
95cd3f8ee6
Use the new @has_request_variables decorator
...
(imported from commit 2aa99140bf19e7e236f872960abd1b84b6a713be)
2012-11-08 16:40:07 -05:00
Zev Benjamin
27cf7e09d3
Add magic request variable extractor decorator
...
Functions with the @has_request_variables decorator can have some of
their arguments extracted from the HTTP request. For each such
argument, its default value should be an instance of the POST class.
The arguments to the POST constructor control the request variable
name that the function parameter should be populated from (it
defaults to the same as the parameter name), whether the value should
be converted before being passed, and whether a default value should
be supplied if the parameter is missing from the request.
(imported from commit ba1c25d73ba3980e44abec1458e6496807fcdaa4)
2012-11-08 16:36:14 -05:00
Zev Benjamin
dc8c54e6db
Move view decorators into decorator.py
...
(imported from commit 737cff552b395493f44864ac06e901b0ba17fa29)
2012-11-08 16:35:31 -05:00
Zev Benjamin
b278db110f
Move json response functions into their own file
...
(imported from commit 91a786849bfa30dcacecef6b8339d8f1a9365156)
2012-11-08 16:30:57 -05:00
Zev Benjamin
7bbde14d78
Use functools.wraps on the functions returned by our decorators
...
This lets Django report the correct view name in errors
(imported from commit b21347e7af39cda439125355f99f4fc63fc3bd2f)
2012-11-08 16:30:57 -05:00
Zev Benjamin
0ca46d5abe
Correctly construct tuple
...
(imported from commit f85ae7b0e4c335548cbe7254e5d820ced17a50a9)
2012-11-08 16:30:57 -05:00
Keegan McAllister
c5035dade0
Remove unnecessary intermediate list
...
(imported from commit 037000d1c7c84d976866b9a8cef6eb3a69baecb9)
2012-11-08 15:13:20 -05:00
Keegan McAllister
b0d395b0c1
Use generator expressions with sorted()
...
No need for an intermediate list.
(imported from commit c8ccdf2399155876b6cbf1f768ad3ec303730757)
2012-11-08 15:13:20 -05:00
Keegan McAllister
ac1edd05fa
parse_named_users: Rephrase odd for loop
...
(imported from commit daf77ceccb7eabf27946836841a34d5fa703b3ac)
2012-11-08 15:13:19 -05:00
Keegan McAllister
0fbb33c33f
already_sent_mirrored_message: Clean up query
...
No need for an 'if' if we're just returning a boolean. And using
QuerySet.exists() should be a little more efficient.
(imported from commit 69ec3cc9f2fe904ec40ea3b8a8687a06cd03f3f3)
2012-11-08 15:13:19 -05:00
Keegan McAllister
e94c6fdf86
return_messages_immediately: Remove dead assignment
...
(imported from commit ef5583c292db3c3087af4949a0b0b255cf098cd1)
2012-11-08 15:13:19 -05:00
Keegan McAllister
f2ac76aeac
get_stream: Use try/except
...
For consistency with the rest of our code.
(imported from commit a2df17facad1a4e3b9e5e1dc4d33b64010cee939)
2012-11-08 15:13:19 -05:00
Keegan McAllister
8df247708c
Rename login_required_*_view -> authenticated_*_view
...
login_required_api_view is misleadingly named. It accepts neither a Django
login session nor login credentials (username / password). The intent here is
authentication, whether stateful (login) or stateless (API key).
(imported from commit 7e9be552168396b399116737655bd7267fd5c1a3)
2012-11-08 15:13:19 -05:00
Tim Abbott
1ef33bc5ea
Remove starnine@mit.edu from API super users.
...
(imported from commit 67019a1e2a298a56b0efe598d4492f4b0f8dee87)
2012-11-08 13:34:32 -05:00
Tim Abbott
f74bf4da92
is_super_user_api_key: Make tabbott/extra@mit.edu a super user.
...
(imported from commit a8bb8356c3d3ca37eb8de9ab705f400942389429)
2012-11-08 13:04:47 -05:00
Keegan McAllister
3b8dbbc7d7
Use django.utils.timezone.now consistently
...
(imported from commit f223d9c1f6c77012db342b8be7aaed964b9f18c6)
2012-11-07 18:51:33 -05:00
Tim Abbott
e7abe13cd6
The empty string shouldn't be a valid stream name.
...
(imported from commit 1fa878d7d51d3c3444ac75edf08b32f886683964)
2012-11-07 15:42:32 -05:00
Keegan McAllister
a815a253f7
get_profile: Return max_message_id
...
(imported from commit 5b5c853e667e47ff46ff14558f1e27f619f77cd7)
2012-11-07 15:34:44 -05:00
Keegan McAllister
d461453250
Remove max_message_id from updates response
...
(imported from commit 1d8ce12a4d32dfb761617b4c2aa8e9fbe3ad2994)
2012-11-07 15:34:44 -05:00
Jessica McKellar
9077d51d54
For now, allow all characters in stream names.
...
We've had multiple requests from MIT zephyr users to allow
non-alphanumeric stream names, and we haven't decided what we want to
allow, so for now allow everything.
Note that the web client and mirror script limit stream names to 30
characters, which is our database limit.
(imported from commit 2acb5ee04e5ee7c40031ac831e12d09d04bbb2e6)
2012-11-07 15:12:03 -05:00
Zev Benjamin
b5cd40723f
Start long-polling immediately in get_updates if the user has no messages
...
(imported from commit 02f883c58513f3bb705b248320cd9cfb7abd6417)
2012-11-06 16:40:52 -05:00
Zev Benjamin
8464e45507
Set the response status to 400 in send_with_safety_check if there was an error
...
(imported from commit 11fd082bb88be271b268d60cc797318386c9d778)
2012-11-06 16:40:52 -05:00
Jessica McKellar
15ca35e961
views: remove unused imports.
...
(imported from commit 1c44a1b23bb020b82bae99a75a12218c3e708e26)
2012-11-05 10:32:42 -05:00
Tim Abbott
1993ee403d
Remove @asynchronous on notify_foo views.
...
(imported from commit 79e3f99450deb3efa0c4154465a692ef01306ce4)
2012-11-02 20:55:31 -04:00
Tim Abbott
517c8e298a
Remove now-unnecessary check for 'time' in json_send_message.
...
(imported from commit aa177e13c16a43a5914227142a4e2589e2bd92bb)
2012-11-02 20:55:31 -04:00
Keegan McAllister
2b1ecd1ad8
Fix name of login_required_api_view in comment
...
(imported from commit e278256da19c3abd4ee05bd6c4318a482a25cee0)
2012-11-02 14:57:38 -04:00
Zev Benjamin
6178cd830a
Return the error if return_messages_immediately returns an error response
...
We previously started long-polling.
(imported from commit 5860e484c63088ed34226f39f5aeb74e3ed43f91)
2012-11-01 16:02:28 -04:00
Tim Abbott
7c3a189c03
Combine api_subscribe and json_add_subscriptions.
...
(imported from commit 1a5df7c88beb2c27a048b1880136b9c7cb4451b2)
2012-11-01 13:05:52 -04:00
Tim Abbott
7e0cbd1c8b
Change json_add_subscription to use the same interface as api_subscribe.
...
(imported from commit 9b9eb0284ad262ce9701ef81162d954544435d52)
2012-11-01 13:05:52 -04:00
Tim Abbott
01bf0868a9
Rename new_subscription argument to streams.
...
(imported from commit 8024f47564fe580734d5e452f5092520870003a7)
2012-11-01 13:05:52 -04:00
Tim Abbott
22bb5a5830
Fix longpolling on messages to nobody.
...
This is what caused our server to hang when receiving certain messages
over the last couple days. It was introduced by me making in the
assumption that doing the same thing we did after validate_notify
failed was a correct way to immediately return from
notify_new_message, which it was not. The code of validate_notify
actually finished the handler in the event that validation failed,
which isn't "correct", but did not manifest in a visible problem.
The correct way to trigger an immediate response from a tornado view
is to just return the value, not call handler.finish() and then return
None.
Similarly, the correct way to trigger longpolling from a tornado view
is to either return None (or equivalently, / drop off the end of the
function) or return a generator.
(imported from commit 5b931248b4650fc88d5d68f5936a95f19e097af9)
2012-10-31 16:35:30 -04:00
Tim Abbott
b33c0c4eee
Send the stripped stream name to add_subscriptions_backend.
...
(imported from commit c3bbb9bd200629020fe7e60d42644beaab30bff5)
2012-10-31 14:06:35 -04:00
Tim Abbott
e48bdfe847
Use json_success for api_fetch_api_key.
...
(imported from commit 395d992fa634f5304f8a44f38f0251109c1a0810)
2012-10-30 16:59:18 -04:00
Tim Abbott
c00e37c106
Use json_error rather than HttpResponseBadRequest and friends.
...
(imported from commit a9f6df2e561218db46f4ade86bac1ecd87b6ca78)
2012-10-30 16:59:18 -04:00
Tim Abbott
9fa2f0d4f8
Use @require_post for login_required_json_view.
...
(imported from commit e7efea5f016b1b44a0a3deba024e3df828006cfa)
2012-10-30 16:59:18 -04:00
Tim Abbott
4e9df28c12
send_message: Don't create streams automatically on send.
...
(imported from commit 7be1b72c5fdf9a21167d2be3948cf1febf8da8ed)
2012-10-30 15:02:45 -04:00
Luke Faraone
1d6a5741e0
Previously conditionals used the wrong case to reference request.POST.
...
(imported from commit 2624def3745c3b26114ee1a1a9a20288e078b243)
2012-10-30 13:29:40 -04:00
Luke Faraone
9f61e27218
Fix broken conditionals in get_old_messages_backend.
...
(imported from commit 13b934cdd2805d45efff18f7ce485b3e17e11c1a)
2012-10-30 13:24:02 -04:00
Tim Abbott
0fcf1db00a
Fix tracebacks sending messages nobody will receive.
...
(imported from commit afe3d7465f105015f7fa8247ab3cba7476b89fc2)
2012-10-29 19:17:26 -04:00
Tim Abbott
af09279483
Check for empty stream/subject names.
...
(imported from commit 208be288f903e8a040ed9e1de243315df0d9adae)
2012-10-29 17:36:01 -04:00