]> git.mxchange.org Git - quix0rs-gnu-social.git/blobdiff - lib/implugin.php
Remove CSRF protection from username/password login and from OpenID login.
[quix0rs-gnu-social.git] / lib / implugin.php
index 5d4d8949cde0d1853a6a7479ca0d69eeb76c61f8..2811e7d644770b0a3589465e652e083059029a2b 100644 (file)
@@ -59,7 +59,6 @@ abstract class ImPlugin extends Plugin
      */
     abstract function normalize($screenname);
 
-
     /**
      * validate (ensure the validity of) a screenname
      *
@@ -79,47 +78,52 @@ abstract class ImPlugin extends Plugin
     /**
      * send a single notice to a given screenname
      * The implementation should put raw data, ready to send, into the outgoing
-     *   queue using enqueue_outgoing_raw()
+     *   queue using enqueueOutgoingRaw()
      *
      * @param string $screenname screenname to send to
      * @param Notice $notice notice to send
      *
      * @return boolean success value
      */
-    function send_notice($screenname, $notice)
+    function sendNotice($screenname, $notice)
     {
-        return $this->send_message($screenname, $this->format_notice($notice));
+        return $this->sendMessage($screenname, $this->formatNotice($notice));
     }
 
     /**
      * send a message (text) to a given screenname
      * The implementation should put raw data, ready to send, into the outgoing
-     *   queue using enqueue_outgoing_raw()
+     *   queue using enqueueOutgoingRaw()
      *
      * @param string $screenname screenname to send to
      * @param Notice $body text to send
      *
      * @return boolean success value
      */
-    abstract function send_message($screenname, $body);
+    abstract function sendMessage($screenname, $body);
 
     /**
      * receive a raw message
      * Raw IM data is taken from the incoming queue, and passed to this function.
-     * It should parse the raw message and call handle_incoming()
+     * It should parse the raw message and call handleIncoming()
+     *
+     * Returning false may CAUSE REPROCESSING OF THE QUEUE ITEM, and should
+     * be used for temporary failures only. For permanent failures such as
+     * unrecognized addresses, return true to indicate your processing has
+     * completed.
      *
      * @param object $data raw IM data
      *
-     * @return boolean success value
+     * @return boolean true if processing completed, false for temporary failures
      */
-    abstract function receive_raw_message($data);
+    abstract function receiveRawMessage($data);
 
     /**
      * get the screenname of the daemon that sends and receives message for this service
      *
      * @return string screenname of this plugin
      */
-    abstract function daemon_screenname();
+    abstract function daemonScreenname();
 
     /**
      * get the microid uri of a given screenname
@@ -130,7 +134,7 @@ abstract class ImPlugin extends Plugin
      */
     function microiduri($screenname)
     {
-        return $this->transport . ':' . $screenname;    
+        return $this->transport . ':' . $screenname;
     }
     //========================UTILITY FUNCTIONS USEFUL TO IMPLEMENTATIONS - MISC ========================\
 
@@ -139,7 +143,7 @@ abstract class ImPlugin extends Plugin
      *
      * @param object $data
      */
-    function enqueue_outgoing_raw($data)
+    function enqueueOutgoingRaw($data)
     {
         $qm = QueueManager::get();
         $qm->enqueue($data, $this->transport . '-out');
@@ -150,7 +154,7 @@ abstract class ImPlugin extends Plugin
      *
      * @param object $data
      */
-    function enqueue_incoming_raw($data)
+    function enqueueIncomingRaw($data)
     {
         $qm = QueueManager::get();
         $qm->enqueue($data, $this->transport . '-in');
@@ -163,9 +167,9 @@ abstract class ImPlugin extends Plugin
      *
      * @return User user
      */
-    function get_user($screenname)
+    function getUser($screenname)
     {
-        $user_im_prefs = $this->get_user_im_prefs_from_screenname($screenname);
+        $user_im_prefs = $this->getUserImPrefsFromScreenname($screenname);
         if($user_im_prefs){
             $user = User::staticGet('id', $user_im_prefs->user_id);
             $user_im_prefs->free();
@@ -175,7 +179,6 @@ abstract class ImPlugin extends Plugin
         }
     }
 
-
     /**
      * given a screenname, get the User_im_prefs object for this transport
      *
@@ -183,16 +186,18 @@ abstract class ImPlugin extends Plugin
      *
      * @return User_im_prefs user_im_prefs
      */
-    function get_user_im_prefs_from_screenname($screenname)
+    function getUserImPrefsFromScreenname($screenname)
     {
-        if($user_im_prefs = User_im_prefs::pkeyGet( array('transport' => $this->transport, 'screenname' => $screenname) )){
+        $user_im_prefs = User_im_prefs::pkeyGet(
+            array('transport' => $this->transport,
+                  'screenname' => $this->normalize($screenname)));
+        if ($user_im_prefs) {
             return $user_im_prefs;
-        }else{
+        } else {
             return false;
         }
     }
 
-
     /**
      * given a User, get their screenname
      *
@@ -200,17 +205,16 @@ abstract class ImPlugin extends Plugin
      *
      * @return string screenname of that user
      */
-    function get_screenname($user)
+    function getScreenname($user)
     {
-        $user_im_prefs = $this->get_user_im_prefs_from_user($user);
-        if($user_im_prefs){
+        $user_im_prefs = $this->getUserImPrefsFromUser($user);
+        if ($user_im_prefs) {
             return $user_im_prefs->screenname;
-        }else{
+        } else {
             return false;
         }
     }
 
-
     /**
      * given a User, get their User_im_prefs
      *
@@ -218,11 +222,14 @@ abstract class ImPlugin extends Plugin
      *
      * @return User_im_prefs user_im_prefs of that user
      */
-    function get_user_im_prefs_from_user($user)
+    function getUserImPrefsFromUser($user)
     {
-        if($user_im_prefs = User_im_prefs::pkeyGet( array('transport' => $this->transport, 'user_id' => $user->id) )){
+        $user_im_prefs = User_im_prefs::pkeyGet(
+            array('transport' => $this->transport,
+                  'user_id' => $user->id));
+        if ($user_im_prefs){
             return $user_im_prefs;
-        }else{
+        } else {
             return false;
         }
     }
@@ -235,10 +242,10 @@ abstract class ImPlugin extends Plugin
      *
      * @param boolean success
      */
-    protected function send_from_site($screenname, $msg)
+    protected function sendFromSite($screenname, $msg)
     {
         $text = '['.common_config('site', 'name') . '] ' . $msg;
-        $this->send_message($screenname, $text);
+        $this->sendMessage($screenname, $text);
     }
 
     /**
@@ -250,7 +257,7 @@ abstract class ImPlugin extends Plugin
      *
      * @return boolean success value
      */
-    function send_confirmation_code($screenname, $code, $user)
+    function sendConfirmationCode($screenname, $code, $user)
     {
         $body = sprintf(_('User "%s" on %s has said that your %s screenname belongs to them. ' .
           'If that\'s true, you can confirm by clicking on this URL: ' .
@@ -260,7 +267,7 @@ abstract class ImPlugin extends Plugin
           'or if you didn\'t request this confirmation, just ignore this message.'),
           $user->nickname, common_config('site', 'name'), $this->getDisplayName(), common_local_url('confirmaddress', array('code' => $code)));
 
-        return $this->send_message($screenname, $body);
+        return $this->sendMessage($screenname, $body);
     }
 
     /**
@@ -274,7 +281,7 @@ abstract class ImPlugin extends Plugin
      * @return boolean success flag
      */
 
-    function public_notice($notice)
+    function publicNotice($notice)
     {
         // Now, users who want everything
 
@@ -287,7 +294,7 @@ abstract class ImPlugin extends Plugin
                        'Sending notice ' . $notice->id .
                        ' to public listener ' . $screenname,
                        __FILE__);
-            $this->send_notice($screenname, $notice);
+            $this->sendNotice($screenname, $notice);
         }
 
         return true;
@@ -307,7 +314,7 @@ abstract class ImPlugin extends Plugin
      * @return boolean success flag
      */
 
-    function broadcast_notice($notice)
+    function broadcastNotice($notice)
     {
 
         $ni = $notice->whoGets();
@@ -318,7 +325,7 @@ abstract class ImPlugin extends Plugin
                 // either not a local user, or just not found
                 continue;
             }
-            $user_im_prefs = $this->get_user_im_prefs_from_user($user);
+            $user_im_prefs = $this->getUserImPrefsFromUser($user);
             if(!$user_im_prefs || !$user_im_prefs->notify){
                 continue;
             }
@@ -345,7 +352,7 @@ abstract class ImPlugin extends Plugin
             common_log(LOG_INFO,
                        'Sending notice ' . $notice->id . ' to ' . $user_im_prefs->screenname,
                        __FILE__);
-            $this->send_notice($user_im_prefs->screenname, $notice);
+            $this->sendNotice($user_im_prefs->screenname, $notice);
             $user_im_prefs->free();
         }
 
@@ -360,7 +367,7 @@ abstract class ImPlugin extends Plugin
      * @return string plain-text version of the notice, with user nickname prefixed
      */
 
-    function format_notice($notice)
+    function formatNotice($notice)
     {
         $profile = $notice->getProfile();
         return $profile->nickname . ': ' . $notice->content . ' [' . $notice->id . ']';
@@ -373,7 +380,7 @@ abstract class ImPlugin extends Plugin
      * @param string $body message text
      * @return boolean true if the message was a command and was executed, false if it was not a command
      */
-    protected function handle_command($user, $body)
+    protected function handleCommand($user, $body)
     {
         $inter = new CommandInterpreter();
         $cmd = $inter->handle_command($user, $body);
@@ -391,7 +398,7 @@ abstract class ImPlugin extends Plugin
      * @param string $txt message text
      * @return boolean true if autoreply
      */
-    protected function is_autoreply($txt)
+    protected function isAutoreply($txt)
     {
         if (preg_match('/[\[\(]?[Aa]uto[-\s]?[Rr]e(ply|sponse)[\]\)]/', $txt)) {
             return true;
@@ -407,7 +414,7 @@ abstract class ImPlugin extends Plugin
      * @param string $txt message text
      * @return boolean true if OTR
      */
-    protected function is_otr($txt)
+    protected function isOtr($txt)
     {
         if (preg_match('/^\?OTR/', $txt)) {
             return true;
@@ -425,34 +432,34 @@ abstract class ImPlugin extends Plugin
      *
      * @param boolean success
      */
-    protected function handle_incoming($from, $notice_text)
+    protected function handleIncoming($from, $notice_text)
     {
-        $user = $this->get_user($from);
+        $user = $this->getUser($from);
         // For common_current_user to work
         global $_cur;
         $_cur = $user;
 
         if (!$user) {
-            $this->send_from_site($from, 'Unknown user; go to ' .
+            $this->sendFromSite($from, 'Unknown user; go to ' .
                              common_local_url('imsettings') .
                              ' to add your address to your account');
             common_log(LOG_WARNING, 'Message from unknown user ' . $from);
             return;
         }
-        if ($this->handle_command($user, $notice_text)) {
+        if ($this->handleCommand($user, $notice_text)) {
             common_log(LOG_INFO, "Command message by $from handled.");
             return;
-        } else if ($this->is_autoreply($notice_text)) {
+        } else if ($this->isAutoreply($notice_text)) {
             common_log(LOG_INFO, 'Ignoring auto reply from ' . $from);
             return;
-        } else if ($this->is_otr($notice_text)) {
+        } else if ($this->isOtr($notice_text)) {
             common_log(LOG_INFO, 'Ignoring OTR from ' . $from);
             return;
         } else {
 
             common_log(LOG_INFO, 'Posting a notice from ' . $user->nickname);
 
-            $this->add_notice($from, $user, $notice_text);
+            $this->addNotice($from, $user, $notice_text);
         }
 
         $user->free();
@@ -470,12 +477,12 @@ abstract class ImPlugin extends Plugin
      *
      * @param boolean success
      */
-    protected function add_notice($screenname, $user, $body)
+    protected function addNotice($screenname, $user, $body)
     {
         $body = trim(strip_tags($body));
         $content_shortened = common_shorten_links($body);
         if (Notice::contentTooLong($content_shortened)) {
-          $this->send_from_site($screenname, sprintf(_('Message too long - maximum is %1$d characters, you sent %2$d.'),
+          $this->sendFromSite($screenname, sprintf(_('Message too long - maximum is %1$d characters, you sent %2$d.'),
                                           Notice::maxContent(),
                                           mb_strlen($content_shortened)));
           return;
@@ -485,11 +492,10 @@ abstract class ImPlugin extends Plugin
             $notice = Notice::saveNew($user->id, $content_shortened, $this->transport);
         } catch (Exception $e) {
             common_log(LOG_ERR, $e->getMessage());
-            $this->send_from_site($from, $e->getMessage());
+            $this->sendFromSite($from, $e->getMessage());
             return;
         }
 
-        common_broadcast_notice($notice);
         common_log(LOG_INFO,
                    'Added notice ' . $notice->id . ' from user ' . $user->nickname);
         $notice->free();
@@ -497,7 +503,7 @@ abstract class ImPlugin extends Plugin
     }
 
     //========================EVENT HANDLERS========================\
-    
+
     /**
      * Register notice queue handler
      *
@@ -507,8 +513,9 @@ abstract class ImPlugin extends Plugin
      */
     function onEndInitializeQueueManager($manager)
     {
-        $manager->connect($this->transport . '-in', new ImReceiverQueueHandler($this));
+        $manager->connect($this->transport . '-in', new ImReceiverQueueHandler($this), 'im');
         $manager->connect($this->transport, new ImQueueHandler($this));
+        $manager->connect($this->transport . '-out', new ImSenderQueueHandler($this), 'im');
         return true;
     }
 
@@ -585,14 +592,16 @@ abstract class ImPlugin extends Plugin
 
     function onGetImTransports(&$transports)
     {
-        $transports[$this->transport] = array('display' => $this->getDisplayName());
+        $transports[$this->transport] = array(
+            'display' => $this->getDisplayName(),
+            'daemonScreenname' => $this->daemonScreenname());
     }
 
     function onSendImConfirmationCode($transport, $screenname, $code, $user)
     {
         if($transport == $this->transport)
         {
-            $this->send_confirmation_code($screenname, $code, $user);
+            $this->sendConfirmationCode($screenname, $code, $user);
             return false;
         }
     }
@@ -605,8 +614,13 @@ abstract class ImPlugin extends Plugin
 
     function initialize()
     {
+        if( ! common_config('queue', 'enabled'))
+        {
+            throw new ServerException("Queueing must be enabled to use IM plugins");
+        }
+
         if(is_null($this->transport)){
-            throw new Exception('transport cannot be null');
+            throw new ServerException('transport cannot be null');
         }
     }
 }