diff options
Diffstat (limited to 'classes')
-rw-r--r-- | classes/Consumer.php | 21 | ||||
-rw-r--r-- | classes/Inbox.php | 51 | ||||
-rw-r--r-- | classes/Notice.php | 87 | ||||
-rw-r--r-- | classes/Oauth_application.php | 140 | ||||
-rw-r--r-- | classes/Oauth_application_user.php | 44 | ||||
-rw-r--r-- | classes/Profile.php | 25 | ||||
-rw-r--r-- | classes/Token.php | 6 | ||||
-rw-r--r-- | classes/statusnet.ini | 34 |
8 files changed, 385 insertions, 23 deletions
diff --git a/classes/Consumer.php b/classes/Consumer.php index d5b7b7e33..ad64a8491 100644 --- a/classes/Consumer.php +++ b/classes/Consumer.php @@ -4,16 +4,17 @@ */ require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; -class Consumer extends Memcached_DataObject +class Consumer extends Memcached_DataObject { ###START_AUTOCODE /* the code below is auto generated do not remove the above tag */ public $__table = 'consumer'; // table name public $consumer_key; // varchar(255) primary_key not_null + public $consumer_secret; // varchar(255) not_null public $seed; // char(32) not_null - public $created; // datetime() not_null - public $modified; // timestamp() not_null default_CURRENT_TIMESTAMP + public $created; // datetime not_null + public $modified; // timestamp not_null default_CURRENT_TIMESTAMP /* Static get */ function staticGet($k,$v=null) @@ -21,4 +22,18 @@ class Consumer extends Memcached_DataObject /* the code above is auto generated do not remove the tag below */ ###END_AUTOCODE + + static function generateNew() + { + $cons = new Consumer(); + $rand = common_good_rand(16); + + $cons->seed = $rand; + $cons->consumer_key = md5(time() + $rand); + $cons->consumer_secret = md5(md5(time() + time() + $rand)); + $cons->created = common_sql_now(); + + return $cons; + } + } diff --git a/classes/Inbox.php b/classes/Inbox.php index e14d4f4e7..086dba1c9 100644 --- a/classes/Inbox.php +++ b/classes/Inbox.php @@ -57,6 +57,22 @@ class Inbox extends Memcached_DataObject static function initialize($user_id) { + $inbox = Inbox::fromNoticeInbox($user_id); + + unset($inbox->fake); + + $result = $inbox->insert(); + + if (!$result) { + common_log_db_error($inbox, 'INSERT', __FILE__); + return null; + } + + return $inbox; + } + + static function fromNoticeInbox($user_id) + { $ids = array(); $ni = new Notice_inbox(); @@ -80,20 +96,14 @@ class Inbox extends Memcached_DataObject $inbox->user_id = $user_id; $inbox->notice_ids = call_user_func_array('pack', array_merge(array('N*'), $ids)); - - $result = $inbox->insert(); - - if (!$result) { - common_log_db_error($inbox, 'INSERT', __FILE__); - return null; - } + $inbox->fake = true; return $inbox; } static function insertNotice($user_id, $notice_id) { - $inbox = Inbox::staticGet('user_id', $user_id); + $inbox = DB_DataObject::staticGet('inbox', 'user_id', $user_id); if (empty($inbox)) { $inbox = Inbox::initialize($user_id); @@ -133,16 +143,35 @@ class Inbox extends Memcached_DataObject $inbox = Inbox::staticGet('user_id', $user_id); if (empty($inbox)) { - $inbox = Inbox::initialize($user_id); + $inbox = Inbox::fromNoticeInbox($user_id); if (empty($inbox)) { return array(); + } else { + $inbox->encache(); } } $ids = unpack('N*', $inbox->notice_ids); - // XXX: handle since_id - // XXX: handle max_id + if (!empty($since_id)) { + $newids = array(); + foreach ($ids as $id) { + if ($id > $since_id) { + $newids[] = $id; + } + } + $ids = $newids; + } + + if (!empty($max_id)) { + $newids = array(); + foreach ($ids as $id) { + if ($id <= $max_id) { + $newids[] = $id; + } + } + $ids = $newids; + } $ids = array_slice($ids, $offset, $limit); diff --git a/classes/Notice.php b/classes/Notice.php index 02cd20391..38b10db04 100644 --- a/classes/Notice.php +++ b/classes/Notice.php @@ -335,7 +335,11 @@ class Notice extends Memcached_DataObject $notice->saveTags(); - $notice->addToInboxes(); + $groups = $notice->saveGroups(); + + $recipients = $notice->saveReplies(); + + $notice->addToInboxes($groups, $recipients); $notice->saveUrls(); @@ -822,7 +826,11 @@ class Notice extends Memcached_DataObject return $ids; } - function whoGets() + /** + * @param $groups array of Group *objects* + * @param $recipients array of profile *ids* + */ + function whoGets($groups=null, $recipients=null) { $c = self::memcache(); @@ -833,6 +841,14 @@ class Notice extends Memcached_DataObject } } + if (is_null($groups)) { + $groups = $this->getGroups(); + } + + if (is_null($recipients)) { + $recipients = $this->getReplies(); + } + $users = $this->getSubscribedUsers(); // FIXME: kind of ignoring 'transitional'... @@ -845,7 +861,6 @@ class Notice extends Memcached_DataObject $ni[$id] = NOTICE_INBOX_SOURCE_SUB; } - $groups = $this->saveGroups(); $profile = $this->getProfile(); foreach ($groups as $group) { @@ -860,8 +875,6 @@ class Notice extends Memcached_DataObject } } - $recipients = $this->saveReplies(); - foreach ($recipients as $recipient) { if (!array_key_exists($recipient, $ni)) { @@ -880,9 +893,9 @@ class Notice extends Memcached_DataObject return $ni; } - function addToInboxes() + function addToInboxes($groups, $recipients) { - $ni = $this->whoGets(); + $ni = $this->whoGets($groups, $recipients); Inbox::bulkInsert($this->id, array_keys($ni)); @@ -916,6 +929,9 @@ class Notice extends Memcached_DataObject return $ids; } + /** + * @return array of Group objects + */ function saveGroups() { // Don't save groups for repeats @@ -1086,6 +1102,63 @@ class Notice extends Memcached_DataObject return $recipientIds; } + function getReplies() + { + // XXX: cache me + + $ids = array(); + + $reply = new Reply(); + $reply->selectAdd(); + $reply->selectAdd('profile_id'); + $reply->notice_id = $this->id; + + if ($reply->find()) { + while($reply->fetch()) { + $ids[] = $reply->profile_id; + } + } + + $reply->free(); + + return $ids; + } + + /** + * Same calculation as saveGroups but without the saving + * @fixme merge the functions + * @return array of Group objects + */ + function getGroups() + { + // Don't save groups for repeats + + if (!empty($this->repeat_of)) { + return array(); + } + + // XXX: cache me + + $groups = array(); + + $gi = new Group_inbox(); + + $gi->selectAdd(); + $gi->selectAdd('group_id'); + + $gi->notice_id = $this->id; + + if ($gi->find()) { + while ($gi->fetch()) { + $groups[] = clone($gi); + } + } + + $gi->free(); + + return $groups; + } + function asAtomEntry($namespace=false, $source=false) { $profile = $this->getProfile(); diff --git a/classes/Oauth_application.php b/classes/Oauth_application.php new file mode 100644 index 000000000..a6b539087 --- /dev/null +++ b/classes/Oauth_application.php @@ -0,0 +1,140 @@ +<?php +/** + * Table Definition for oauth_application + */ +require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; + +class Oauth_application extends Memcached_DataObject +{ + ###START_AUTOCODE + /* the code below is auto generated do not remove the above tag */ + + public $__table = 'oauth_application'; // table name + public $id; // int(4) primary_key not_null + public $owner; // int(4) not_null + public $consumer_key; // varchar(255) not_null + public $name; // varchar(255) not_null + public $description; // varchar(255) + public $icon; // varchar(255) not_null + public $source_url; // varchar(255) + public $organization; // varchar(255) + public $homepage; // varchar(255) + public $callback_url; // varchar(255) not_null + public $type; // tinyint(1) + public $access_type; // tinyint(1) + public $created; // datetime not_null + public $modified; // timestamp not_null default_CURRENT_TIMESTAMP + + /* Static get */ + function staticGet($k,$v=NULL) { + return Memcached_DataObject::staticGet('Oauth_application',$k,$v); + } + /* the code above is auto generated do not remove the tag below */ + ###END_AUTOCODE + + // Bit flags + public static $readAccess = 1; + public static $writeAccess = 2; + + public static $browser = 1; + public static $desktop = 2; + + function getConsumer() + { + return Consumer::staticGet('consumer_key', $this->consumer_key); + } + + static function maxDesc() + { + $desclimit = common_config('application', 'desclimit'); + // null => use global limit (distinct from 0!) + if (is_null($desclimit)) { + $desclimit = common_config('site', 'textlimit'); + } + return $desclimit; + } + + static function descriptionTooLong($desc) + { + $desclimit = self::maxDesc(); + return ($desclimit > 0 && !empty($desc) && (mb_strlen($desc) > $desclimit)); + } + + function setAccessFlags($read, $write) + { + if ($read) { + $this->access_type |= self::$readAccess; + } else { + $this->access_type &= ~self::$readAccess; + } + + if ($write) { + $this->access_type |= self::$writeAccess; + } else { + $this->access_type &= ~self::$writeAccess; + } + } + + function setOriginal($filename) + { + $imagefile = new ImageFile($this->id, Avatar::path($filename)); + + // XXX: Do we want to have a bunch of different size icons? homepage, stream, mini? + // or just one and control size via CSS? --Zach + + $orig = clone($this); + $this->icon = Avatar::url($filename); + common_debug(common_log_objstring($this)); + return $this->update($orig); + } + + static function getByConsumerKey($key) + { + if (empty($key)) { + return null; + } + + $app = new Oauth_application(); + $app->consumer_key = $key; + $app->limit(1); + $result = $app->find(true); + + return empty($result) ? null : $app; + } + + /** + * Handle an image upload + * + * Does all the magic for handling an image upload, and crops the + * image by default. + * + * @return void + */ + + function uploadLogo() + { + if ($_FILES['app_icon']['error'] == + UPLOAD_ERR_OK) { + + try { + $imagefile = ImageFile::fromUpload('app_icon'); + } catch (Exception $e) { + common_debug("damn that sucks"); + $this->showForm($e->getMessage()); + return; + } + + $filename = Avatar::filename($this->id, + image_type_to_extension($imagefile->type), + null, + 'oauth-app-icon-'.common_timestamp()); + + $filepath = Avatar::path($filename); + + move_uploaded_file($imagefile->filepath, $filepath); + + $this->setOriginal($filename); + } + } + +} diff --git a/classes/Oauth_application_user.php b/classes/Oauth_application_user.php new file mode 100644 index 000000000..57986281f --- /dev/null +++ b/classes/Oauth_application_user.php @@ -0,0 +1,44 @@ +<?php +/** + * Table Definition for oauth_application_user + */ +require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; + +class Oauth_application_user extends Memcached_DataObject +{ + ###START_AUTOCODE + /* the code below is auto generated do not remove the above tag */ + + public $__table = 'oauth_application_user'; // table name + public $profile_id; // int(4) primary_key not_null + public $application_id; // int(4) primary_key not_null + public $access_type; // tinyint(1) + public $token; // varchar(255) + public $created; // datetime not_null + public $modified; // timestamp not_null default_CURRENT_TIMESTAMP + + /* Static get */ + function staticGet($k,$v=NULL) { + return Memcached_DataObject::staticGet('Oauth_application_user',$k,$v); + } + /* the code above is auto generated do not remove the tag below */ + ###END_AUTOCODE + + static function getByKeys($user, $app) + { + if (empty($user) || empty($app)) { + return null; + } + + $oau = new Oauth_application_user(); + + $oau->profile_id = $user->id; + $oau->application_id = $app->id; + $oau->limit(1); + + $result = $oau->find(true); + + return empty($result) ? null : $oau; + } + +} diff --git a/classes/Profile.php b/classes/Profile.php index 25d908dbf..1076fb2cb 100644 --- a/classes/Profile.php +++ b/classes/Profile.php @@ -352,6 +352,31 @@ class Profile extends Memcached_DataObject return $profile; } + function getApplications($offset = 0, $limit = null) + { + $qry = + 'SELECT a.* ' . + 'FROM oauth_application_user u, oauth_application a ' . + 'WHERE u.profile_id = %d ' . + 'AND a.id = u.application_id ' . + 'AND u.access_type > 0 ' . + 'ORDER BY u.created DESC '; + + if ($offset > 0) { + if (common_config('db','type') == 'pgsql') { + $qry .= ' LIMIT ' . $limit . ' OFFSET ' . $offset; + } else { + $qry .= ' LIMIT ' . $offset . ', ' . $limit; + } + } + + $application = new Oauth_application(); + + $cnt = $application->query(sprintf($qry, $this->id)); + + return $application; + } + function subscriptionCount() { $c = common_memcache(); diff --git a/classes/Token.php b/classes/Token.php index 1fabd72f1..a129d1fd1 100644 --- a/classes/Token.php +++ b/classes/Token.php @@ -4,7 +4,7 @@ */ require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; -class Token extends Memcached_DataObject +class Token extends Memcached_DataObject { ###START_AUTOCODE /* the code below is auto generated do not remove the above tag */ @@ -14,7 +14,9 @@ class Token extends Memcached_DataObject public $tok; // char(32) primary_key not_null public $secret; // char(32) not_null public $type; // tinyint(1) not_null - public $state; // tinyint(1) + public $state; // tinyint(1) + public $verifier; // varchar(255) + public $verified_callback; // varchar(255) public $created; // datetime() not_null public $modified; // timestamp() not_null default_CURRENT_TIMESTAMP diff --git a/classes/statusnet.ini b/classes/statusnet.ini index 73727a6d6..44088cf6b 100644 --- a/classes/statusnet.ini +++ b/classes/statusnet.ini @@ -39,6 +39,7 @@ code = K [consumer] consumer_key = 130 +consumer_secret = 130 seed = 130 created = 142 modified = 384 @@ -348,6 +349,37 @@ created = 142 tag = K notice_id = K +[oauth_application] +id = 129 +owner = 129 +consumer_key = 130 +name = 130 +description = 2 +icon = 130 +source_url = 2 +organization = 2 +homepage = 2 +callback_url = 130 +type = 17 +access_type = 17 +created = 142 +modified = 384 + +[oauth_application__keys] +id = N + +[oauth_application_user] +profile_id = 129 +application_id = 129 +access_type = 17 +token = 2 +created = 142 +modified = 384 + +[oauth_application_user__keys] +profile_id = K +application_id = K + [profile] id = 129 nickname = 130 @@ -484,6 +516,8 @@ tok = 130 secret = 130 type = 145 state = 17 +verifier = 2 +verified_callback = 2 created = 142 modified = 384 |