2010-02-09 15:37:45 +09:00
< ? php
/*
* StatusNet - the distributed open - source microblogging tool
* Copyright ( C ) 2010 , StatusNet , 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 />.
*/
/**
* @ package OStatusPlugin
* @ maintainer James Walker < james @ status . net >
*/
if ( ! defined ( 'STATUSNET' ) && ! defined ( 'LACONICA' )) { exit ( 1 ); }
class OStatusInitAction extends Action
{
var $nickname ;
2010-03-04 07:06:05 +09:00
var $group ;
2010-02-23 03:03:34 +09:00
var $profile ;
2010-02-09 15:37:45 +09:00
var $err ;
function prepare ( $args )
{
parent :: prepare ( $args );
if ( common_logged_in ()) {
2010-02-21 05:46:48 +09:00
$this -> clientError ( _m ( 'You can use the local subscription!' ));
2010-02-09 15:37:45 +09:00
return false ;
}
2010-03-04 07:06:05 +09:00
// Local user or group the remote wants to subscribe to
2010-02-23 03:03:34 +09:00
$this -> nickname = $this -> trimmed ( 'nickname' );
2010-03-04 07:06:05 +09:00
$this -> group = $this -> trimmed ( 'group' );
2010-02-23 03:03:34 +09:00
// Webfinger or profile URL of the remote user
$this -> profile = $this -> trimmed ( 'profile' );
2010-02-09 15:37:45 +09:00
return true ;
}
function handle ( $args )
{
parent :: handle ( $args );
if ( $_SERVER [ 'REQUEST_METHOD' ] == 'POST' ) {
/* Use a session token for CSRF protection. */
$token = $this -> trimmed ( 'token' );
if ( ! $token || $token != common_session_token ()) {
2010-02-21 05:46:48 +09:00
$this -> showForm ( _m ( 'There was a problem with your session token. ' .
2010-02-09 15:37:45 +09:00
'Try again, please.' ));
return ;
}
$this -> ostatusConnect ();
} else {
$this -> showForm ();
}
}
function showForm ( $err = null )
{
2010-02-14 02:49:14 +09:00
$this -> err = $err ;
if ( $this -> boolean ( 'ajax' )) {
header ( 'Content-Type: text/xml;charset=utf-8' );
$this -> xw -> startDocument ( '1.0' , 'UTF-8' );
$this -> elementStart ( 'html' );
$this -> elementStart ( 'head' );
2010-02-21 05:46:48 +09:00
$this -> element ( 'title' , null , _m ( 'Subscribe to user' ));
2010-02-14 02:49:14 +09:00
$this -> elementEnd ( 'head' );
$this -> elementStart ( 'body' );
$this -> showContent ();
$this -> elementEnd ( 'body' );
$this -> elementEnd ( 'html' );
} else {
$this -> showPage ();
}
2010-02-09 15:37:45 +09:00
}
function showContent ()
{
2010-11-30 05:55:58 +09:00
2010-03-04 07:06:05 +09:00
if ( $this -> group ) {
$header = sprintf ( _m ( 'Join group %s' ), $this -> group );
$submit = _m ( 'Join' );
} else {
$header = sprintf ( _m ( 'Subscribe to %s' ), $this -> nickname );
$submit = _m ( 'Subscribe' );
}
2010-02-09 15:37:45 +09:00
$this -> elementStart ( 'form' , array ( 'id' => 'form_ostatus_connect' ,
'method' => 'post' ,
'class' => 'form_settings' ,
'action' => common_local_url ( 'ostatusinit' )));
$this -> elementStart ( 'fieldset' );
2010-03-04 07:06:05 +09:00
$this -> element ( 'legend' , null , $header );
2010-02-09 15:37:45 +09:00
$this -> hidden ( 'token' , common_session_token ());
$this -> elementStart ( 'ul' , 'form_data' );
2010-02-14 02:44:41 +09:00
$this -> elementStart ( 'li' , array ( 'id' => 'ostatus_nickname' ));
2010-02-21 05:46:48 +09:00
$this -> input ( 'nickname' , _m ( 'User nickname' ), $this -> nickname ,
_m ( 'Nickname of the user you want to follow' ));
2010-03-04 07:06:05 +09:00
$this -> hidden ( 'group' , $this -> group ); // pass-through for magic links
2010-02-09 15:37:45 +09:00
$this -> elementEnd ( 'li' );
2010-02-14 02:44:41 +09:00
$this -> elementStart ( 'li' , array ( 'id' => 'ostatus_profile' ));
2010-02-23 03:03:34 +09:00
$this -> input ( 'profile' , _m ( 'Profile Account' ), $this -> profile ,
2010-11-30 06:00:54 +09:00
_m ( " Your account id (i.e. user@identi.ca)<br />With GNU social, users do not use one server to communicate in the way that Facebook and Twitter users do. Instead, users are spread out over a network of servers and different sites. You can run your own server, or you can sign up for one of the public servers — it doesn't even need to be a GNU social server — any server that speaks the OStatus protocol is suitable. A good place to get an account for yourself is www.status.net " ));
2010-02-09 15:37:45 +09:00
$this -> elementEnd ( 'li' );
$this -> elementEnd ( 'ul' );
2010-03-04 07:06:05 +09:00
$this -> submit ( 'submit' , $submit );
2010-02-09 15:37:45 +09:00
$this -> elementEnd ( 'fieldset' );
$this -> elementEnd ( 'form' );
2010-02-14 02:44:41 +09:00
}
2010-02-09 15:37:45 +09:00
function ostatusConnect ()
{
2010-02-21 05:46:48 +09:00
$opts = array ( 'allowed_schemes' => array ( 'http' , 'https' , 'acct' ));
2010-02-23 03:03:34 +09:00
if ( Validate :: uri ( $this -> profile , $opts )) {
$bits = parse_url ( $this -> profile );
2010-02-21 05:46:48 +09:00
if ( $bits [ 'scheme' ] == 'acct' ) {
$this -> connectWebfinger ( $bits [ 'path' ]);
} else {
2010-02-23 03:03:34 +09:00
$this -> connectProfile ( $this -> profile );
2010-02-21 05:46:48 +09:00
}
2010-02-23 03:03:34 +09:00
} elseif ( strpos ( $this -> profile , '@' ) !== false ) {
$this -> connectWebfinger ( $this -> profile );
} else {
$this -> clientError ( _m ( " Must provide a remote profile. " ));
2010-02-21 05:46:48 +09:00
}
}
function connectWebfinger ( $acct )
{
2010-03-04 07:06:05 +09:00
$target_profile = $this -> targetProfile ();
2010-02-21 05:46:48 +09:00
2010-03-04 07:06:05 +09:00
$disco = new Discovery ;
2010-02-26 07:34:56 +09:00
$result = $disco -> lookup ( $acct );
2010-02-21 05:46:48 +09:00
if ( ! $result ) {
$this -> clientError ( _m ( " Couldn't look up OStatus account profile. " ));
}
2010-03-04 07:06:05 +09:00
2010-02-21 05:46:48 +09:00
foreach ( $result -> links as $link ) {
if ( $link [ 'rel' ] == 'http://ostatus.org/schema/1.0/subscribe' ) {
// We found a URL - let's redirect!
2010-02-26 17:25:51 +09:00
$url = Discovery :: applyTemplate ( $link [ 'template' ], $target_profile );
2010-02-23 03:03:34 +09:00
common_log ( LOG_INFO , " Sending remote subscriber $acct to $url " );
2010-02-21 05:46:48 +09:00
common_redirect ( $url , 303 );
}
}
2010-02-23 03:03:34 +09:00
$this -> clientError ( _m ( " Couldn't confirm remote profile address. " ));
2010-02-21 05:46:48 +09:00
}
2010-02-09 15:37:45 +09:00
2010-02-21 05:46:48 +09:00
function connectProfile ( $subscriber_profile )
{
2010-03-04 07:06:05 +09:00
$target_profile = $this -> targetProfile ();
2010-02-09 15:37:45 +09:00
2010-02-21 05:46:48 +09:00
// @fixme hack hack! We should look up the remote sub URL from XRDS
$suburl = preg_replace ( '!^(.*)/(.*?)$!' , '$1/main/ostatussub' , $subscriber_profile );
$suburl .= '?profile=' . urlencode ( $target_profile );
2010-02-09 15:37:45 +09:00
2010-02-23 03:03:34 +09:00
common_log ( LOG_INFO , " Sending remote subscriber $subscriber_profile to $suburl " );
2010-02-21 05:46:48 +09:00
common_redirect ( $suburl , 303 );
2010-02-09 15:37:45 +09:00
}
2010-02-21 05:46:48 +09:00
2010-03-04 07:06:05 +09:00
/**
* Build the canonical profile URI + URL of the requested user or group
*/
function targetProfile ()
{
if ( $this -> nickname ) {
$user = User :: staticGet ( 'nickname' , $this -> nickname );
if ( $user ) {
return common_local_url ( 'userbyid' , array ( 'id' => $user -> id ));
} else {
$this -> clientError ( " No such user. " );
}
} else if ( $this -> group ) {
2010-03-05 02:24:47 +09:00
$group = Local_group :: staticGet ( 'nickname' , $this -> group );
2010-03-04 07:06:05 +09:00
if ( $group ) {
return common_local_url ( 'groupbyid' , array ( 'id' => $group -> group_id ));
} else {
$this -> clientError ( " No such group. " );
}
} else {
$this -> clientError ( " No local user or group nickname provided. " );
}
}
2010-02-09 15:37:45 +09:00
function title ()
{
2010-02-21 05:46:48 +09:00
return _m ( 'OStatus Connect' );
2010-02-09 15:37:45 +09:00
}
2010-11-30 05:55:58 +09:00
2010-02-09 15:37:45 +09:00
2010-02-14 02:44:41 +09:00
}