Commit Graph

254 Commits

Author SHA1 Message Date
Mikael Nordfeldth
fac9f4e545 Merge branch 'nightly' of gitorious.org:social/mainline into nightly 2015-01-21 23:45:49 +01:00
Mikael Nordfeldth
9c5aa67a63 Enable AntiBrute by default. 2015-01-21 23:43:04 +01:00
Mikael Nordfeldth
5981b5c8d9 CC license fixes (no remote image, https for href) 2015-01-08 18:13:33 +01:00
Mikael Nordfeldth
769febf22e DirectMessage added to default plugins
I think the migration from core to plugin is done now for DMs.

This is required since we support the Twitter-based API by default,
which is implemented in many of the mobile clients etc. But you can
disable the DirectMessage for your instance of you wish, of course.
2014-11-07 16:37:00 +01:00
Mikael Nordfeldth
db7cc7fa75 Favorite functionality put into plugin (not done yet)
Now we have to fix any code in the core which directly uses the Fave class
or any other favorite stuff, since it is pluginised and thus might not be
available on some installations.
2014-06-24 15:58:53 +02:00
Mikael Nordfeldth
d7c40e77b2 Show more links work with AJAX-retrieved HTML
Attachment_ajaxAction has been removed since AttachmentAction handles
AJAX calls splendidly.
2014-05-19 00:56:21 +02:00
Mikael Nordfeldth
202eaa53e0 Don't report all linked URLs to remote sites
noembed.com acts as a proxy for oEmbed requests, but that also means they
get all the links we post on our instances, given that they're used as a
default endpoint.
2014-05-18 23:25:40 +02:00
Mikael Nordfeldth
c93a5252c1 Don't show or preview text/html attachments
htmLawed cleans stuff out properly, but there's no very good way right
now to show text/html attachments, since everything gets jumbled up with
our own CSS etc. Best would be an iframe or just a new tab or so.
2014-05-18 23:11:49 +02:00
Mikael Nordfeldth
80fbec173b Improved imageboard-style notice feeds on web UI 2014-05-18 14:05:29 +02:00
Mikael Nordfeldth
52738b0267 Directory to default plugins (disabled for singleuser) 2014-05-09 10:49:00 +02:00
Mikael Nordfeldth
c15216f00b OStatus enabled by default, only disabled for private siteprofile 2014-05-09 10:31:55 +02:00
Mikael Nordfeldth
34114e87be OpportunisticQM moved from core to default plugins.
This makes it easier to disable, but remember that you must then
either enable and maintain queue daemons or disable queueing (and
handle whatever remaining queue items are stored in the database)!
2014-05-06 23:32:32 +02:00
Mikael Nordfeldth
1776c90cb9 Moved oEmbed stuff out to a plugin (Oembed). 2014-05-06 23:32:13 +02:00
Mikael Nordfeldth
030639d02d EmailAuthentication enabled by default
The login field said "Username or email address" already, so...
2014-04-28 12:39:57 +02:00
Mikael Nordfeldth
d59eb5e184 Dynamically generate thumbnails (see full text)
The File object now stores width and height of files that can
supply this kind of information. Formats which we can not read
natively in PHP do not currently benefit from this. However an
event hook will be introduced later.

The CreateFileImageThumbnail event is renamed to:
CreateFileImageThumbnailSource to clarify that the hooks should not
generate their own thumbnails but only the source image. Also it now
accepts File objects, not MediaFile objects.

The thumbnail generation is documented in the source code. For
developers, call 'getThumbnail' on a File object and hope for the best.

Default thumbnail sizes have increased to be more appealing.
2014-04-21 20:46:11 +02:00
Mikael Nordfeldth
54f3b4be47 Thumbnails are now by default squares of 150px 2014-04-18 11:07:59 +02:00
Mikael Nordfeldth
71bda34e72 Thumbnail default set to 150px square 2014-04-17 15:15:12 +02:00
Mikael Nordfeldth
6faed0e451 MediaFile loses dependency on PEAR::MIME
At the same time we remove the "filecommand" setting, since we will
likely not have use of it thanks to PECL fileinfo.

Also the "supported" list for attachment mime types has changed
format, so we can keep track of at least some known file extensions.
2014-03-08 03:34:50 +01:00
Mikael Nordfeldth
074339ea13 WebM should be allowed to upload!
Evan had left _two_ "video/mpeg", just so you know.
2014-03-08 00:29:47 +01:00
Mikael Nordfeldth
00db57949f Always queue inbox distribution 2014-03-06 01:50:54 +01:00
Jean Baptiste Favre
7f4e6aaafa Introduce new config option common_config('queue','daemon').Allows to dynamically enable scripts/queuedaemon.php into scripts/getvaliddaemons.php 2014-03-01 12:16:38 +01:00
Mikael Nordfeldth
c0c8250ff7 minify removed from core (use plugin if desired)
My reasoning: Minifying makes third party review harder. A visitor on
a GNU social site should have no problem reading, understanding and
modifying javascripts for their own liking. A minified script is much
more difficult to use, reuse, modify and share.

Free software is not minified.
2014-02-24 01:05:13 +01:00
Mikael Nordfeldth
5487c596fc Remove callback sneakery by StatusNet 2014-02-23 14:57:12 +01:00
Mikael Nordfeldth
09e06bbc19 Queues should be enabled by default (thanks postblue) 2013-12-02 13:51:55 +01:00
Mikael Nordfeldth
9400795a5f Cron split into Cronish and OpportunisticQM
/main/cron changed to /main/runqueue

The key-required functionality is not throughly tested yet.
2013-11-20 21:20:42 +01:00
Mikael Nordfeldth
0cd93c2761 Cron plugin added and now default queue handler
Generally the Cron plugin will run if there's still execution time for
1 second since starting the Action processing. If you want to change
this (such as disabling, 0 seconds, or maybe running bigger chunks,
for like 4 seconds) you can do this, where 'n' is time in seconds.

   addPlugin('Cron', array('secs_per_action', n));

Add 'rel_to_pageload'=>false to the array if you want to run the queue
for a certain amount of seconds _despite_ maybe already having run that
long in the previous parts of Action processing.

Perhaps you want to run the cron script remotely, using a machine capable
of background processing (or locally, to avoid running daemon processes),
simply do an HTTP GET request to the route /main/cron of your GNU social.
Setting secs_per_action to 0 in the plugin config will imply that you run
all your queue handling by calling /main/cron (which runs as long as it can).

/main/cron will output "0" if it has finished processing, "1" if it should
be called again to complete processing (because it ran out of time due to
PHP's max_execution_time INI setting).

The Cron plugin also runs events as close to hourly, daily and weekly
as you get, based on the opportunistic method of running whenever a user
visits the site. This means of course that the cron events should be as
fast as possible, not only to avoid delaying page load for users but
also to minimize the risk of running into PHP's max_execution_time. One
suggestion is to only use the events to add new queue items for later processing.

These events are called CronHourly, CronDaily, CronWeekly - however there
is no guarantee that all events will execute, so some kind of failsafe,
transaction-ish method must be implemented in the future.
2013-11-19 14:13:33 +01:00
Mikael Nordfeldth
450ae3043b Plugins should be initialized with an empty array, not null 2013-11-19 13:52:41 +01:00
Mikael Nordfeldth
c942bdcb43 Comment and typing improvements
To make the StatusNet::addPlugin() accept only arrays,
the lib/default.php had to be changed because all plugins
had 'null' as default value instead of an array.
2013-11-19 13:29:26 +01:00
Mikael Nordfeldth
e45edd6ae2 Use addPlugin! (esp. XMPP folks should do this)
If you're using XMPP by setting $config['xmpp'][*] then you should do:

    addPlugin('Xmpp', $config['xmpp']);

because setting it directly in $config[''] won't do anything.

Also, default resource for XMPP is now 'gnusocial'. If you want something
more random, set it in your addPlugin config array.
2013-10-30 12:28:39 +01:00
Mikael Nordfeldth
fcba540a14 Removed legacy OMB. Use OStatus for remote profiles. 2013-10-28 16:22:09 +01:00
Mikael Nordfeldth
2a5ba1f74b Core and Default plugins separated, now loads on install
_flow_ reported on IRC that install.php had stopped working. This was
because default plugins had been put into two separate lists, and the
list with AuthCrypt was never loaded when performing an installation.

Core plugins cannot be disabled.

I also removed the Memcache autodetection thing since it should be
solved in a more elegant manner.
2013-10-19 14:38:15 +02:00
Mikael Nordfeldth
87370f0cb1 URL shortening can now be disabled for the 'maxurllength'
Also, URL shortening now consistently uses 'maxurllength'...
2013-10-06 22:35:49 +02:00
Mikael Nordfeldth
753019baf2 60 chars was too little, 100 chars seems better. For me. 2013-10-06 20:28:07 +02:00
Mikael Nordfeldth
b0dfc70a54 Properly unlink all old avatars when deleting/uploading a new
We're also now using $config['image']['jpegquality'] to determine the
quality setting for resized images.

To set Avatar max size, adjust $config['avatar']['maxsize']

The getAvatar call now throws exceptions too. Related changes applied.
Now let's move Profile->avatarUrl to the Avatar class!
2013-10-01 17:00:10 +02:00
Mikael Nordfeldth
c3001ff82b url shortening fixes for api config and not ur1.ca
Will have to change the 'maxnoticelength' code to stop shortening ALL
links if the setting for infinitely long notices is configured.
2013-09-19 01:11:47 +02:00
Mikael Nordfeldth
5e24600304 Minified javascripts are evil! Human readable source, please! 2013-09-14 13:41:49 +02:00
Mikael Nordfeldth
794163c31f Default to NOT ask for current location for new users
It may be a bad experience for new users to immediately when trying
out the service be asked for their geographical position. Instead,
let them opt-in for this behaviour.
2013-08-12 14:40:55 +02:00
Evan Prodromou
d942072a6c Optionally hide spam from timelines
For sites with a lot of spam, this will hide that spam from timelines for everyone but moderators.
2012-03-21 10:26:00 -04:00
Evan Prodromou
a818d5c61a use null for db/database config, check for it 2011-12-03 11:45:56 -05:00
Zach Copley
c137d69aee Switch from oohembed to noembed for default oembed provider 2011-09-30 19:51:23 +00:00
Evan Prodromou
ea1a11a087 site-wide option to enable old-school settings 2011-09-24 09:46:13 -04:00
Evan Prodromou
223b806a81 make performance optimization off by default 2011-09-19 22:01:13 -04:00
Evan Prodromou
04dccad3bb Activity notices on by default 2011-08-26 11:38:05 -04:00
Evan Prodromou
7ce2b3c756 change 140-char limit to unlimited by default 2011-08-03 12:50:12 -04:00
Zach Copley
969a558339 Change a few things around for CORS header output 2011-07-07 17:19:59 -07:00
Zach Copley
cb183359e2 Merge commit 'refs/merge-requests/157' of git://gitorious.org/statusnet/mainline into merge-requests/157 2011-07-07 15:58:28 -07:00
Evan Prodromou
7e9c17bd15 make the default scope depend on site/private 2011-07-01 21:50:04 -04:00
flyingmana
3c47d158f4 make cors header deactivatable 2011-06-29 22:39:33 +02:00
Zach Copley
36d619480a Rip out user, group and site design customization code
Squashed commit of the following:

commit 0bcfb6535115ec0a11669420f8689aeedc417bc8
Author: Zach Copley <zach@status.net>
Date:   Thu Jun 9 15:51:47 2011 -0400

    Remove design-related stuff from the API

commit 88da010256fbcaee1ff01d9507ea47d3225f2825
Author: Zach Copley <zach@status.net>
Date:   Thu Jun 9 15:40:16 2011 -0400

    Mop up misc design related code

commit 11958b064745b797b4c9f9f4b7e8f65e4c82ce83
Author: Zach Copley <zach@status.net>
Date:   Thu Jun 9 15:21:00 2011 -0400

    Remove Design DB_DataObject class and references to it in schema

commit f8540594728ce6ba4697eb21657ccb897a9fc127
Author: Zach Copley <zach@status.net>
Date:   Thu Jun 9 13:15:54 2011 -0400

    Remove design-related actions and widgets

commit ddf7b4d425b88b58956b8be06047d2a3e0560bd2
Author: Zach Copley <zach@status.net>
Date:   Thu Jun 9 13:10:57 2011 -0400

    Remove navigation / routing to design settings actions

commit e3f280f8780d99168edf37ef766956f281e9c5da
Author: Zach Copley <zach@status.net>
Date:   Thu Jun 9 13:03:09 2011 -0400

    CurrentUserDesignAction -> Action

commit 6780b1a07e1375a7fa0fd48c8bf3109d9a12e33e
Author: Zach Copley <zach@status.net>
Date:   Thu Jun 9 12:54:22 2011 -0400

    * GroupDesignAction -> GroupAction (new base class for group actions)

commit 2136377e895db274709a1d486f377f13946ccfd6
Author: Zach Copley <zach@status.net>
Date:   Thu Jun 9 12:36:40 2011 -0400

    OwnerDesignAction -> Action
2011-06-09 16:20:19 -04:00
Evan Prodromou
c97048d01b merge 0.9.x into 1.0.x 2011-05-04 14:59:39 -07:00
Siebrand Mazeland
98cc1da7b5 Update indentation. 2011-04-21 20:19:51 +02:00
Evan Prodromou
4fa7f147b0 Make tag-per-group optional, default false 2011-04-20 16:19:07 -04:00
Evan Prodromou
a2d1eb399f disable sms, email by post by default 2011-04-14 16:24:56 -04:00
Evan Prodromou
be467fef91 like search is the default for 1.0.x 2011-04-11 19:00:25 -04:00
Evan Prodromou
9204719522 inviteonly by default 2011-04-11 17:06:20 -04:00
Siebrand Mazeland
f0d762f196 Update/add translator documentation.
L10n/i18n updates.
Superfluous whitespace removed.
Add FIXME for a few i18n issues I couldn't solve this quickly.

Takes care of documentation for all core code added in merge of "people tags" feature (Commit:e75c9988ebe33822e493ac225859bc593ff9b855).
2011-04-10 19:59:55 +02:00
Shashi Gowda
f47027abbe Merge remote-tracking branch 'mainline/1.0.x' into people_tags_rebase
Conflicts:
	lib/profileblock.php
	theme/default/css/display.css
2011-04-09 21:57:45 +05:30
Evan Prodromou
dc25564251 enable user directory and extended profile by default 2011-04-08 17:46:49 -04:00
Shashi Gowda
ad86eb78d3 Merge remote-tracking branch 'mainline/1.0.x' into people_tags_rebase
Conflicts:
	js/util.min.js
	lib/default.php
2011-04-07 23:13:45 +05:30
Evan Prodromou
4b5f76d688 more flexible oEmbed handling 2011-04-06 17:57:33 -04:00
Evan Prodromou
4b9c3335d4 default to private sites 2011-04-05 13:30:05 -04:00
Shashi Gowda
5a2bab07b2 Merge remote-tracking branch 'mainline/1.0.x' into people_tags_rebase
Conflicts:
	actions/tagother.php
	classes/Profile.php
	classes/Profile_tag.php
	js/util.min.js
2011-03-30 15:47:42 +05:30
Evan Prodromou
c7f866b032 Caller can set scope for Notice::saveNew() 2011-03-26 15:49:46 -04:00
Shashi Gowda
31c1177970 Merge branch '1.0.x' into people_tags_rebase
Conflicts:
	EVENTS.txt
	actions/peopletag.php
	actions/tagother.php
	classes/Notice.php
	js/util.js
	js/util.min.js
	lib/accountprofileblock.php
	lib/action.php
	lib/activityobject.php
	lib/command.php
	lib/personalgroupnav.php
	plugins/OStatus/OStatusPlugin.php
2011-03-22 07:56:25 +05:30
Evan Prodromou
a430540155 configuration option to bust frames or not 2011-03-17 11:32:14 -04:00
Evan Prodromou
4c0a746831 neo is the default 2011-03-07 15:00:43 -05:00
Evan Prodromou
0b95d68910 cleaner is the new default theme (for now) 2011-03-07 14:32:21 -05:00
Shashi Gowda
4b8ee81ca9 Utility functions for people tags 2011-03-06 23:33:39 +05:30
Brion Vibber
77a3017e9e Can now set $config['site']['minify'] = false; to use util.js and friends non-minified; aids in browser-side debugging. 2011-03-03 16:53:16 -08:00
Zach Copley
b7d0746694 Merge branch '0.9.x' into 1.0.x
Conflicts:
	actions/confirmaddress.php
	actions/emailsettings.php
	actions/hostmeta.php
	actions/imsettings.php
	actions/login.php
	actions/profilesettings.php
	actions/showgroup.php
	actions/smssettings.php
	actions/urlsettings.php
	actions/userauthorization.php
	actions/userdesignsettings.php
	classes/Memcached_DataObject.php
	index.php
	lib/accountsettingsaction.php
	lib/action.php
	lib/common.php
	lib/connectsettingsaction.php
	lib/designsettings.php
	lib/personalgroupnav.php
	lib/profileaction.php
	lib/userprofile.php
	plugins/ClientSideShorten/ClientSideShortenPlugin.php
	plugins/Facebook/FBConnectSettings.php
	plugins/Facebook/FacebookPlugin.php
	plugins/NewMenu/NewMenuPlugin.php
	plugins/NewMenu/newmenu.css
2011-02-28 15:39:43 -08:00
Evan Prodromou
f6e614b894 add plugins/sslpath setting, default to site path/plugins 2011-02-11 15:58:47 -05:00
Evan Prodromou
f06e661a9b new methods for paths to plugin static files 2011-02-03 10:36:25 -05:00
Brion Vibber
de7726dd00 Performance counters: records number of total and unique cache get/set/incr/deletes and queries, and logs to syslog.
$config['site']['logperf'] = true; // to record & dump total hits of each type and the runtime to syslog
$config['site']['logperf_detail'] = true; // very verbose -- dump the individual cache keys and queries as they get used (may contain private info in some queries)

Seeing 180 cache gets on a timeline page seems not unusual currently; since these run in serial, even relatively small roundtrip times can add up heavily.
We should consider ways to reduce the number of round trips, such as more frequently storing compound objects or the output of processing in memcached.
Doing parallel multi-key lookups could also help by collapsing round-trip times, but might not be easy to fit into SN's object model. (For things like streams this should actually work pretty well -- grab the list, then when it's returned go grab all the individual items in parallel and return the list)
2011-01-31 13:12:56 -08:00
Brion Vibber
47f31bce47 Merge branch 'master' into testing
Conflicts:
	classes/Profile.php
2011-01-31 11:50:06 -08:00
Brion Vibber
433ec21119 Add $config['sessions']['gc_limit'] to limit how much work we do in each session GC; defaulting to killing 1000 sessions at a time. 2011-01-27 12:08:24 -08:00
Evan Prodromou
570c7b63a2 Add internal URL shortener 2011-01-23 16:49:12 -05:00
Evan Prodromou
f9b2feb7f5 Merge branch '0.9.x' into 1.0.x
Conflicts:
	README
2011-01-12 18:05:56 -05:00
Evan Prodromou
98a0d7f538 Configuration options for using an HTTP proxy
We can make a lot of HTTP requests from the server side. This change
adds some configuration options for using an HTTP proxy, which can
cache hits from multiple sites (good for status.net-like services, for example).
2011-01-03 10:38:32 -08:00
Brion Vibber
26baad63f2 Merge branch '0.9.x' into 1.0.x 2010-12-22 15:25:38 -08:00
Evan Prodromou
5fe8301129 disable account deletion by default 2010-12-22 11:25:47 -08:00
Evan Prodromou
7c7b91e61a define configuration settings for account maintenance security 2010-12-13 16:28:02 -05:00
Brion Vibber
9df856e667 Merge branch '0.9.x' into merge
Conflicts:
	README
	actions/hostmeta.php
	classes/File_redirection.php
	lib/common.php
	lib/designsettings.php
	lib/router.php
	lib/util.php
	lib/xmppmanager.php
	plugins/OStatus/OStatusPlugin.php
2010-12-07 10:50:05 -08:00
Evan Prodromou
49757c79ee Config flag to disable router caching if needed 2010-12-06 17:21:01 -05:00
Evan Prodromou
004d58fdb8 Make code-dependent cache entries more volatile
If a cache entry is dependent on the code that's running, upgrading
(or enabling/disabling plugins) can generate hard-to-track
inconsistencies.

This change adds a close-to-unique fingerprint of the running code to
some cache keys, so that if the fingerprint changes, the old values
are ignored and new values are used.

If the automated uniqueness fails, an administrator can add an extra
config value, $config['site']['build'], that's thrown into the key also.
2010-12-06 17:20:26 -05:00
Evan Prodromou
bb63fd4b75 Config flag to disable router caching if needed 2010-12-06 17:19:41 -05:00
Evan Prodromou
b3d47ed6cc Make code-dependent cache entries more volatile
If a cache entry is dependent on the code that's running, upgrading
(or enabling/disabling plugins) can generate hard-to-track
inconsistencies.

This change adds a close-to-unique fingerprint of the running code to
some cache keys, so that if the fingerprint changes, the old values
are ignored and new values are used.

If the automated uniqueness fails, an administrator can add an extra
config value, $config['site']['build'], that's thrown into the key also.
2010-12-06 17:05:32 -05:00
Brion Vibber
197b56778a Add $config['attachments']['process_links'] to allow disabling processing of mentioned URL links for attachment info (oEmbed lookups) and dereferencing of redirects that we didn't have shortened ourselves.
This option may be useful for intranet sites that don't have direct access to the internet, as they may be unable to successfully fetch those resources.
2010-11-17 13:03:59 -08:00
Brion Vibber
cb124fe831 Add a quick config setting to disable/enable display of thumbnails in regular notice lists (attachments/show_thumbs) - disabling gives the same display as before this feature was added (but changes to oembed handling are still there, and the lightbox popup is gone) 2010-11-12 12:24:55 -08:00
Brion Vibber
694448e0aa Add attachments 'thumb_width' and 'thumb_height' settings for inline thumbs, defaulting to 100x75.
This is used as the max thumb width/height for oEmbed requests (replacing the old default of 500x400 which was more suitable for the lightbox).
2010-11-08 17:36:02 -08:00
Brion Vibber
e7c7fd39fc Merge branch '1.0.x' into schema-x
Conflicts:
	plugins/CacheLog/locale/nb/LC_MESSAGES/CacheLog.po
2010-10-28 16:27:53 -07:00
Craig Andrews
1851933c34 Enable Strict Transport Security plugin by default 2010-10-27 10:12:35 -04:00
Brion Vibber
e07254d15b $config['db']['mysql_foreign_keys'] option to experimentally enable foreign keys on MySQL. (Would only work on InnoDB tables, may explode, etc) 2010-10-19 12:11:49 -07:00
Brion Vibber
7765ddae81 Merge branch '0.9.x' into 1.0.x
Conflicts:
	README
	lib/default.php
2010-10-18 12:17:11 -07:00
Evan Prodromou
47ac8458ca default for nofollow external is sometimes 2010-10-18 11:41:18 -04:00
Evan Prodromou
7c05b0dafc options to nofollow external links in notices 2010-10-18 11:29:52 -04:00
Craig Andrews
0721d8d3e2 Merge remote branch 'statusnet/0.9.x' into 1.0.x 2010-10-14 15:27:17 -04:00
Evan Prodromou
1a4dc03bfe document and default for site|ssllogo 2010-10-14 14:56:38 -04:00
Evan Prodromou
b31c49c5d4 Make HTTPS urls in File::url() if necessary 2010-10-14 14:22:17 -04:00
Brion Vibber
59119482ca Merge branch '0.9.x' of gitorious.org:statusnet/mainline into 1.0.x
Conflicts:
	actions/hostmeta.php
	actions/imsettings.php
	classes/User.php
	lib/adminpanelaction.php
	lib/channel.php
	lib/default.php
	lib/router.php
	lib/util.php
2010-10-04 12:54:36 -07:00
Brion Vibber
54c88cba57 Add a $config['plugins']['locale_path'] which can be set to override the individual plugins' locale subdirectories.
This will apply to *ALL* plugins in *ALL* languages, so should probably only be used when doing site customization...

You'd probably do:

  $config['site']['locale_path'] = '/srv/awesome/data/locale';
  $config['plugins']['locale_path'] = '/srv/awesome/data/locale';

with a structure like:
srv/
  awesome/
    data/
      locale/
        en/
          LC_MESSAGES/
            statusnet.po
            OpenID.po
            AnonymousFave.po

etc, all alongside each other. You could separate plugins from the core if you like.

Where locale files have not already been generated, you can build one for a plugin like so:

  php scripts/update_po_templates.php --plugin=MyPlugin

and pull out the template file:

  plugins/MyPlugin/locale/MyPlugin.pot

Edit that (make sure you at least set the CHARSET, probably to UTF-8) and save your customized .po
files into the structure as above, and use msgfmt to generate .mo files for final output.
2010-09-30 19:18:46 -07:00