diff options
author | Evan Prodromou <evan@controlyourself.ca> | 2009-07-11 07:30:26 -0700 |
---|---|---|
committer | Evan Prodromou <evan@controlyourself.ca> | 2009-07-11 07:30:26 -0700 |
commit | 55415652382d1f3ae77123d197e01d95da83041e (patch) | |
tree | 449ee7e9aebe184583f099e49a7194eb5bbf8543 /scripts | |
parent | bfae5489cb629331f2936b2bf1066adb3976bce1 (diff) | |
parent | 7621e0e38467349a89f71e814941932fbacecfa1 (diff) |
Merge branch 'testing'
Diffstat (limited to 'scripts')
-rwxr-xr-x | scripts/maildaemon.php | 154 | ||||
-rwxr-xr-x | scripts/update_translations.php | 145 | ||||
-rwxr-xr-x | scripts/xmppdaemon.php | 21 |
3 files changed, 254 insertions, 66 deletions
diff --git a/scripts/maildaemon.php b/scripts/maildaemon.php index cfb11a36f..11ddf06b7 100755 --- a/scripts/maildaemon.php +++ b/scripts/maildaemon.php @@ -42,11 +42,11 @@ class MailerDaemon function handle_message($fname='php://stdin') { - list($from, $to, $msg) = $this->parse_message($fname); + list($from, $to, $msg, $attachments) = $this->parse_message($fname); if (!$from || !$to || !$msg) { $this->error(null, _('Could not parse message.')); } - common_log(LOG_INFO, "Mail from $from to $to: " .substr($msg, 0, 20)); + common_log(LOG_INFO, "Mail from $from to $to with ".count($attachments) .' attachment(s): ' .substr($msg, 0, 20)); $user = $this->user_from($from); if (!$user) { $this->error($from, _('Not a registered user.')); @@ -65,7 +65,47 @@ class MailerDaemon return true; } $msg = $this->cleanup_msg($msg); - $err = $this->add_notice($user, $msg); + $msg = common_shorten_links($msg); + if (mb_strlen($msg) > 140) { + $this->error($from,_('That\'s too long. '. + 'Max notice size is 140 chars.')); + } + $fileRecords = array(); + foreach($attachments as $attachment){ + $mimetype = $this->getUploadedFileType($attachment); + $stream = stream_get_meta_data($attachment); + if (!$this->isRespectsQuota($user,filesize($stream['uri']))) { + die('error() should trigger an exception before reaching here.'); + } + $filename = $this->saveFile($user, $attachment,$mimetype); + + fclose($attachment); + + if (empty($filename)) { + $this->error($from,_('Couldn\'t save file.')); + } + + $fileRecord = $this->storeFile($filename, $mimetype); + $fileRecords[] = $fileRecord; + $fileurl = common_local_url('attachment', + array('attachment' => $fileRecord->id)); + + // not sure this is necessary -- Zach + $this->maybeAddRedir($fileRecord->id, $fileurl); + + $short_fileurl = common_shorten_url($fileurl); + $msg .= ' ' . $short_fileurl; + + if (mb_strlen($msg) > 140) { + $this->deleteFile($filename); + $this->error($from,_('Max notice size is 140 chars, including attachment URL.')); + } + + // Also, not sure this is necessary -- Zach + $this->maybeAddRedir($fileRecord->id, $short_fileurl); + } + + $err = $this->add_notice($user, $msg, $fileRecords); if (is_string($err)) { $this->error($from, $err); return false; @@ -74,6 +114,89 @@ class MailerDaemon } } + function saveFile($user, $attachment, $mimetype) { + + $filename = File::filename($user->getProfile(), "email", $mimetype); + + $filepath = File::path($filename); + + $stream = stream_get_meta_data($attachment); + if (copy($stream['uri'], $filepath) && chmod($filepath,0664)) { + return $filename; + } else { + $this->error(null,_('File could not be moved to destination directory.' . $stream['uri'] . ' ' . $filepath)); + } + } + + function storeFile($filename, $mimetype) { + + $file = new File; + $file->filename = $filename; + + $file->url = File::url($filename); + + $filepath = File::path($filename); + + $file->size = filesize($filepath); + $file->date = time(); + $file->mimetype = $mimetype; + + $file_id = $file->insert(); + + if (!$file_id) { + common_log_db_error($file, "INSERT", __FILE__); + $this->error(null,_('There was a database error while saving your file. Please try again.')); + } + + return $file; + } + + function maybeAddRedir($file_id, $url) + { + $file_redir = File_redirection::staticGet('url', $url); + + if (empty($file_redir)) { + $file_redir = new File_redirection; + $file_redir->url = $url; + $file_redir->file_id = $file_id; + + $result = $file_redir->insert(); + + if (!$result) { + common_log_db_error($file_redir, "INSERT", __FILE__); + $this->error(null,_('There was a database error while saving your file. Please try again.')); + } + } + } + + function getUploadedFileType($fileHandle) { + require_once 'MIME/Type.php'; + + $cmd = &PEAR::getStaticProperty('MIME_Type', 'fileCmd'); + $cmd = common_config('attachments', 'filecommand'); + + $stream = stream_get_meta_data($fileHandle); + $filetype = MIME_Type::autoDetect($stream['uri']); + if (in_array($filetype, common_config('attachments', 'supported'))) { + return $filetype; + } + $media = MIME_Type::getMedia($filetype); + if ('application' !== $media) { + $hint = sprintf(_(' Try using another %s format.'), $media); + } else { + $hint = ''; + } + $this->error(null,sprintf( + _('%s is not a supported filetype on this server.'), $filetype) . $hint); + } + + function isRespectsQuota($user,$fileSize) { + $file = new File; + $ret = $file->isRespectsQuota($user,$fileSize); + if (true === $ret) return true; + $this->error(null,$ret); + } + function error($from, $msg) { file_put_contents("php://stderr", $msg . "\n"); @@ -133,19 +256,30 @@ class MailerDaemon common_log($level, 'MailDaemon: '.$msg); } - function add_notice($user, $msg) + function add_notice($user, $msg, $fileRecords) { $notice = Notice::saveNew($user->id, $msg, 'mail'); if (is_string($notice)) { $this->log(LOG_ERR, $notice); return $notice; } + foreach($fileRecords as $fileRecord){ + $this->attachFile($notice, $fileRecord); + } common_broadcast_notice($notice); $this->log(LOG_INFO, 'Added notice ' . $notice->id . ' from user ' . $user->nickname); return true; } + function attachFile($notice, $filerec) + { + File_to_post::processNew($filerec->id, $notice->id); + + $this->maybeAddRedir($filerec->id, + common_local_url('file', array('notice' => $notice->id))); + } + function parse_message($fname) { $contents = file_get_contents($fname); @@ -163,12 +297,19 @@ class MailerDaemon $type = $parsed->ctype_primary . '/' . $parsed->ctype_secondary; + $attachments = array(); + if ($parsed->ctype_primary == 'multipart') { foreach ($parsed->parts as $part) { if ($part->ctype_primary == 'text' && $part->ctype_secondary == 'plain') { $msg = $part->body; - break; + }else{ + if ($part->body) { + $attachment = tmpfile(); + fwrite($attachment, $part->body); + $attachments[] = $attachment; + } } } } else if ($type == 'text/plain') { @@ -176,8 +317,7 @@ class MailerDaemon } else { $this->unsupported_type($type); } - - return array($from, $to, $msg); + return array($from, $to, $msg, $attachments); } function unsupported_type($type) diff --git a/scripts/update_translations.php b/scripts/update_translations.php index 4d7adafea..2f4ca8720 100755 --- a/scripts/update_translations.php +++ b/scripts/update_translations.php @@ -1,66 +1,97 @@ +#!/usr/bin/env php <?php +/* + * Laconica - a distributed open-source microblogging tool + * Copyright (C) 2008, 2009, Control Yourself, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +// Abort if called from a web server +if (isset($_SERVER) && array_key_exists('REQUEST_METHOD', $_SERVER)) { + print "This script must be run from the command line\n"; + exit(); +} + +define('INSTALLDIR', realpath(dirname(__FILE__) . '/..')); +define('LACONICA', true); + +require_once(INSTALLDIR . '/lib/common.php'); + +// Master Laconica .pot file location (created by update_pot.sh) +$laconica_pot = INSTALLDIR . '/locale/laconica.po'; set_time_limit(60); -chdir(dirname(__FILE__) . '/..'); /* Languages to pull */ -$languages = array( - 'da_DK' => 'http://laconi.ca/translate/download.php?file_id=93', - 'nl_NL' => 'http://laconi.ca/translate/download.php?file_id=97', - 'en_NZ' => 'http://laconi.ca/translate/download.php?file_id=87', - 'eo' => 'http://laconi.ca/translate/download.php?file_id=88', - 'fr_FR' => 'http://laconi.ca/translate/download.php?file_id=99', - 'de_DE' => 'http://laconi.ca/translate/download.php?file_id=100', - 'it_IT' => 'http://laconi.ca/translate/download.php?file_id=101', - 'ko' => 'http://laconi.ca/translate/download.php?file_id=102', - 'no_NB' => 'http://laconi.ca/translate/download.php?file_id=104', - 'pt' => 'http://laconi.ca/translate/download.php?file_id=106', - 'pt_BR' => 'http://laconi.ca/translate/download.php?file_id=107', - 'ru_RU' => 'http://laconi.ca/translate/download.php?file_id=109', - 'es' => 'http://laconi.ca/translate/download.php?file_id=110', - 'tr_TR' => 'http://laconi.ca/translate/download.php?file_id=114', - 'uk_UA' => 'http://laconi.ca/translate/download.php?file_id=115', - 'he_IL' => 'http://laconi.ca/translate/download.php?file_id=116', - 'mk_MK' => 'http://laconi.ca/translate/download.php?file_id=103', - 'ja_JP' => 'http://laconi.ca/translate/download.php?file_id=117', - 'cs_CZ' => 'http://laconi.ca/translate/download.php?file_id=96', - 'ca_ES' => 'http://laconi.ca/translate/download.php?file_id=95', - 'pl_PL' => 'http://laconi.ca/translate/download.php?file_id=105', - 'sv_SE' => 'http://laconi.ca/translate/download.php?file_id=128' -); +$languages = get_all_languages(); /* Update the languages */ -foreach ($languages as $code => $file) { - - $lcdir='locale/'.$code; - $msgdir=$lcdir.'/LC_MESSAGES'; - $pofile=$msgdir.'/laconica.po'; - $mofile=$msgdir.'/laconica.mo'; - - /* Check for an existing */ - if (!is_dir($msgdir)) { - mkdir($lcdir); - mkdir($msgdir); - $existingSHA1 = ''; - } else { - $existingSHA1 = file_exists($pofile) ? sha1_file($pofile) : ''; - } - - /* Get the remote one */ - $newFile = file_get_contents($file); - - // Update if the local .po file is different to the one downloaded, or - // if the .mo file is not present. - if(sha1($newFile)!=$existingSHA1 || !file_exists($mofile)) { - echo "Updating ".$code."\n"; - file_put_contents($pofile, $newFile); - $prevdir = getcwd(); - chdir($msgdir); - system('msgmerge -U laconica.po ../../laconica.pot'); - system('msgfmt -f -o laconica.mo laconica.po'); - chdir($prevdir); - } else { - echo "Unchanged - ".$code."\n"; - } + +foreach ($languages as $language) { + + $code = $language['lang']; + $file_url = 'http://laconi.ca/pootle/' . $code . + '/laconica/LC_MESSAGES/laconica.po'; + $lcdir = INSTALLDIR . '/locale/' . $code; + $msgdir = "$lcdir/LC_MESSAGES"; + $pofile = "$msgdir/laconica.po"; + $mofile = "$msgdir/laconica.mo"; + + /* Check for an existing */ + if (!is_dir($msgdir)) { + mkdir($lcdir); + mkdir($msgdir); + $existingSHA1 = ''; + } else { + $existingSHA1 = file_exists($pofile) ? sha1_file($pofile) : ''; + } + + /* Get the remote one */ + $new_file = curl_get_file($file_url); + + if ($new_file === FALSE) { + echo "Couldn't retrieve .po file for $code: $file_url\n"; + continue; + } + + // Update if the local .po file is different to the one downloaded, or + // if the .mo file is not present. + if (sha1($new_file) != $existingSHA1 || !file_exists($mofile)) { + echo "Updating ".$code."\n"; + file_put_contents($pofile, $new_file); + system(sprintf('msgmerge -U %s %s', $pofile, $laconica_pot)); + system(sprintf('msgfmt -f -o %s %s', $mofile, $pofile)); + } else { + echo "Unchanged - ".$code."\n"; + } } + echo "Finished\n"; + + +function curl_get_file($url) +{ + $c = curl_init(); + curl_setopt($c, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($c, CURLOPT_URL, $url); + $contents = curl_exec($c); + curl_close($c); + + if (!empty($contents)) { + return $contents; + } + + return FALSE; +} diff --git a/scripts/xmppdaemon.php b/scripts/xmppdaemon.php index bd1918ca9..488b4b514 100755 --- a/scripts/xmppdaemon.php +++ b/scripts/xmppdaemon.php @@ -60,7 +60,9 @@ class XMPPDaemon extends Daemon $this->resource = common_config('xmpp', 'resource') . 'daemon'; } - $this->log(LOG_INFO, "INITIALIZE XMPPDaemon {$this->user}@{$this->server}/{$this->resource}"); + $this->jid = $this->user.'@'.$this->server.'/'.$this->resource; + + $this->log(LOG_INFO, "INITIALIZE XMPPDaemon {$this->jid}"); } function connect() @@ -106,10 +108,25 @@ class XMPPDaemon extends Daemon $this->log(LOG_DEBUG, "Beginning processing loop."); - $this->conn->process(); + while ($this->conn->processTime(60)) { + $this->sendPing(); + } } } + function sendPing() + { + if (!isset($this->pingid)) { + $this->pingid = 0; + } else { + $this->pingid++; + } + + $this->log(LOG_DEBUG, "Sending ping #{$this->pingid}"); + + $this->conn->send("<iq from='{$this->jid}' to='{$this->server}' id='ping_{$this->pingid}' type='get'><ping xmlns='urn:xmpp:ping'/></iq>"); + } + function handle_reconnect(&$pl) { $this->log(LOG_DEBUG, "Got reconnection callback."); |