Permalink
Browse files

Merge branch '0.8.x' of git@gitorious.org:+laconica-developers/laconi…

…ca/dev into upload

Conflicts:

	js/util.js
	lib/attachmentlist.php
  • Loading branch information...
2 parents 3e0c291 + 36fe5a8 commit ebeb5f744cbfd5bfea0da1b350a3757865ec4b3b Robin Millette committed May 31, 2009
View
@@ -694,6 +694,13 @@ to users on a remote site. (Or not... it's not well tested.) The
Upgrading
=========
+IMPORTANT NOTE: Laconica 0.7.4 introduced a fix for some
+incorrectly-stored international characters ("UTF-8"). For new
+installations, it will now store non-ASCII characters correctly.
+However, older installations will have the incorrect storage, and will
+consequently show up "wrong" in browsers. See below for how to deal
+with this situation.
+
If you've been using Laconica 0.6, 0.5 or lower, or if you've been
tracking the "git" version of the software, you will probably want
to upgrade and keep your existing data. There is no automated upgrade
@@ -783,6 +790,29 @@ problem.
3. When fixup_inboxes is finished, you can set the enabled flag to
'true'.
+UTF-8 Database
+--------------
+
+Laconica 0.7.4 introduced a fix for some incorrectly-stored
+international characters ("UTF-8"). This fix is not
+backwards-compatible; installations from before 0.7.4 will show
+non-ASCII characters of old notices incorrectly. This section explains
+what to do.
+
+0. You can disable the new behaviour by setting the 'db''utf8' config
+ option to "false". You should only do this until you're ready to
+ convert your DB to the new format.
+1. When you're ready to convert, you can run the fixup_utf8.php script
+ in the scripts/ subdirectory. If you've had the "new behaviour"
+ enabled (probably a good idea), you can give the ID of the first
+ "new" notice as a parameter, and only notices before that one will
+ be converted. Notices are converted in reverse chronological order,
+ so the most recent (and visible) ones will be converted first. The
+ script should work whether or not you have the 'db''utf8' config
+ option enabled.
+2. When you're ready, set $config['db']['utf8'] to true, so that
+ new notices will be stored correctly.
+
Configuration options
=====================
@@ -910,6 +940,10 @@ mirror: you can set this to an array of DSNs, like the above
and adding the slaves to this array. Note that if you want some
requests to go to the 'database' (master) server, you'll need
to include it in this array, too.
+utf8: whether to talk to the database in UTF-8 mode. This is the default
+ with new installations, but older sites may want to turn it off
+ until they get their databases fixed up. See "UTF-8 database"
+ above for details.
syslog
------
@@ -1162,6 +1196,21 @@ reporturl: URL to post statistics to. Defaults to Laconica developers'
set 'run' to 'never' than to set this value to something
nonsensical.
+
+attachments
+-----------
+
+The software lets users upload files with their notices. You can configure
+the types of accepted files by mime types and a trio of quota options:
+per file, per user (total), per user per month.
+
+supported: an array of mime types you accept to store and distribute,
+ like 'image/gif', 'video/mpeg', 'audio/mpeg', etc.
+file_quota: maximum size for a single file upload in bytes.
+user_quota: total size in bytes a user can store.
+monthly_quota: total size permitted in the current month.
+
+
Troubleshooting
===============
View
@@ -67,6 +67,7 @@ function handle($args)
$this->process_command();
} else {
# basic authentication failed
+ common_log(LOG_WARNING, "Failed API auth attempt, nickname: $nickname.");
$this->show_basic_auth_error();
}
}
@@ -179,14 +179,14 @@ function show()
$this->out->elementStart('div', array('id' =>'notices_primary'));
$this->out->element('h2', null, _('Notices'));
- $this->out->elementStart('ul', array('class' => 'notices'));
+ $this->out->elementStart('ol', array('class' => 'notices xoxo'));
if (array_key_exists('root', $this->tree)) {
$rootid = $this->tree['root'][0];
$this->showNoticePlus($rootid);
}
- $this->out->elementEnd('ul');
+ $this->out->elementEnd('ol');
$this->out->elementEnd('div');
return $cnt;
@@ -215,13 +215,13 @@ function showNoticePlus($id)
if (array_key_exists($id, $this->tree)) {
$children = $this->tree[$id];
- $this->out->elementStart('ul', array('class' => 'notices'));
+ $this->out->elementStart('ol', array('class' => 'notices'));
foreach ($children as $child) {
$this->showNoticePlus($child);
}
- $this->out->elementEnd('ul');
+ $this->out->elementEnd('ol');
}
$this->out->elementEnd('li');
@@ -295,4 +295,4 @@ function showContext()
{
return;
}
-}
+}
@@ -70,7 +70,7 @@ function getInstructions()
function showContent()
{
$user = common_current_user();
- $this->elementStart('form', array('method' => 'POST',
+ $this->elementStart('form', array('method' => 'post',
'id' => 'form_settings_design',
'class' => 'form_settings',
'action' =>
@@ -82,7 +82,7 @@ function showContent()
$this->element('legend', null, _('Change background image'));
$this->elementStart('ul', 'form_data');
$this->elementStart('li');
- $this->element('label', array('for' => 'design_ background-image_file'),
+ $this->element('label', array('for' => 'design_background-image_file'),
_('Upload file'));
$this->element('input', array('name' => 'design_background-image_file',
'type' => 'file',
@@ -208,10 +208,10 @@ function showLocalNavBlock()
function showContent()
{
- $this->elementStart('ul', array('class' => 'notices'));
+ $this->elementStart('ol', array('class' => 'notices xoxo'));
$nli = new NoticeListItem($this->notice, $this);
$nli->show();
- $this->elementEnd('ul');
+ $this->elementEnd('ol');
}
/**
@@ -11,7 +11,7 @@ class Foreign_link extends Memcached_DataObject
public $__table = 'foreign_link'; // table name
public $user_id; // int(4) primary_key not_null
- public $foreign_id; // int(4) primary_key not_null
+ public $foreign_id; // bigint(8) primary_key not_null unsigned
public $service; // int(4) primary_key not_null
public $credentials; // varchar(255)
public $noticesync; // tinyint(1) not_null default_1
@@ -227,4 +227,22 @@ static function cachedQuery($cls, $qry, $expiry=3600)
$c->set($ckey, $cached, MEMCACHE_COMPRESSED, $expiry);
return new ArrayWrapper($cached);
}
+
+ // We overload so that 'SET NAMES "utf8"' is called for
+ // each connection
+
+ function _connect()
+ {
+ global $_DB_DATAOBJECT;
+ $exists = !empty($this->_database_dsn_md5) &&
+ isset($_DB_DATAOBJECT['CONNECTIONS'][$this->_database_dsn_md5]);
+ $result = parent::_connect();
+ if (!$exists) {
+ $DB = &$_DB_DATAOBJECT['CONNECTIONS'][$this->_database_dsn_md5];
+ if (common_config('db', 'utf8')) {
+ $DB->query('SET NAMES "utf8"');
+ }
+ }
+ return $result;
+ }
}
View
@@ -285,7 +285,7 @@ create table foreign_user (
create table foreign_link (
user_id int comment 'link to user on this system, if exists' references user (id),
- foreign_id int comment 'link ' references foreign_user(id),
+ foreign_id bigint unsigned comment 'link to user on foreign service, if exists' references foreign_user(id),
service int not null comment 'foreign key to service' references foreign_service(id),
credentials varchar(255) comment 'authc credentials, typically a password',
noticesync tinyint not null default 1 comment 'notice synchronization, bit 1 = sync outgoing, bit 2 = sync incoming, bit 3 = filter local replies',
@@ -2,6 +2,7 @@ INSERT INTO notice_source
(code, name, url, created)
VALUES
('adium', 'Adium', 'http://www.adiumx.com/', now()),
+ ('AgentSolo.com','AgentSolo.com','http://www.agentsolo.com/', now()),
('betwittered','BeTwittered','http://www.32hours.com/betwitteredinfo/', now()),
('bti','bti','http://gregkh.github.com/bti/', now()),
('cliqset', 'Cliqset', 'http://www.cliqset.com/', now()),
@@ -29,6 +30,7 @@ VALUES
('pingvine','PingVine','http://pingvine.com/', now()),
('pocketwit','PockeTwit','http://code.google.com/p/pocketwit/', now()),
('posty','Posty','http://spreadingfunkyness.com/posty/', now()),
+ ('qtwitter','qTwitter','http://qtwitter.ayoy.net/', now()),
('royalewithcheese','Royale With Cheese','http://p.hellyeah.org/', now()),
('rssdent','rssdent','http://github.com/zcopley/rssdent/tree/master', now()),
('rygh.no','rygh.no','http://rygh.no/', now()),
View
@@ -250,6 +250,7 @@ $(document).ready(function(){
$("#form_notice").each(addAjaxHidden);
NoticeHover();
NoticeReply();
+ NoticeAttachments();
});
@@ -288,3 +289,53 @@ function NoticeReplySet(nick,id) {
}
return true;
}
+
+function NoticeAttachments() {
+ $.fn.jOverlay.options = {
+ method : 'GET',
+ data : '',
+ url : '',
+ color : '#000',
+ opacity : '0.6',
+ zIndex : 99,
+ center : true,
+ imgLoading : $('address .url')[0].href+'theme/base/images/illustrations/illu_progress_loading-01.gif',
+ bgClickToClose : true,
+ success : function() {
+ $('#jOverlayContent').append('<button>&#215;</button>');
+ $('#jOverlayContent button').click($.closeOverlay);
+ },
+ timeout : 0
+ };
+
+ $('a.attachment').click(function() {
+ $().jOverlay({url: $('address .url')[0].href+'/attachment/' + ($(this).attr('id').substring('attachment'.length + 1)) + '/ajax'});
+ return false;
+ });
+
+ var t;
+ $("body:not(#shownotice) a.thumbnail").hover(
+ function() {
+ var anchor = $(this);
+ $("a.thumbnail").children('img').hide();
+ anchor.closest(".entry-title").addClass('ov');
+
+ if (anchor.children('img').length == 0) {
+ t = setTimeout(function() {
+ $.get($('address .url')[0].href+'/attachment/' + (anchor.attr('id').substring('attachment'.length + 1)) + '/thumbnail', null, function(data) {
+ anchor.append(data);
+ });
+ }, 500);
+ }
+ else {
+ anchor.children('img').show();
+ }
+ },
+ function() {
+ clearTimeout(t);
+ $("a.thumbnail").children('img').hide();
+ $(this).closest(".entry-title").removeClass('ov');
+ }
+ );
+}
+
@@ -83,19 +83,18 @@ function show()
$atts = new File;
$att = $atts->getAttachments($this->notice->id);
if (empty($att)) return 0;
-
- $this->out->elementStart('dl', array('id' =>'attachment'));
+ $this->out->elementStart('dl', array('id' =>'attachments'));
$this->out->element('dt', null, _('Attachments'));
$this->out->elementStart('dd');
- $this->out->elementStart('ul', array('class' => 'attachments'));
+ $this->out->elementStart('ol', array('class' => 'attachments'));
foreach ($att as $n=>$attachment) {
$item = $this->newListItem($attachment);
$item->show();
}
$this->out->elementEnd('dd');
- $this->out->elementEnd('ul');
+ $this->out->elementEnd('ol');
$this->out->elementEnd('dl');
return count($att);
View
@@ -208,6 +208,7 @@
'require_prefix' => 'classes/',
'class_prefix' => '',
'mirror' => null,
+ 'utf8' => true,
'db_driver' => 'DB', # XXX: JanRain libs only work with DB
'quote_identifiers' => false,
'type' => 'mysql' );
View
@@ -86,7 +86,7 @@ function show()
{
$this->out->elementStart('div', array('id' =>'notices_primary'));
$this->out->element('h2', null, _('Notices'));
- $this->out->elementStart('ul', array('class' => 'notices'));
+ $this->out->elementStart('ol', array('class' => 'notices xoxo'));
$cnt = 0;
@@ -101,7 +101,7 @@ function show()
$item->show();
}
- $this->out->elementEnd('ul');
+ $this->out->elementEnd('ol');
$this->out->elementEnd('div');
return $cnt;
@@ -52,12 +52,12 @@ function showContent()
{
$notices = $this->getNotices();
$cnt = 0;
- $this->out->elementStart('ul', 'notices');
+ $this->out->elementStart('ol', 'notices xoxo');
while ($notices->fetch() && ++$cnt <= NOTICES_PER_SECTION) {
$this->showNotice($notices);
}
- $this->out->elementEnd('ul');
+ $this->out->elementEnd('ol');
return ($cnt > NOTICES_PER_SECTION);
}
Oops, something went wrong. Retry.

0 comments on commit ebeb5f7

Please sign in to comment.