PageRenderTime 73ms CodeModel.GetById 26ms RepoModel.GetById 1ms app.codeStats 0ms

/app/omb/plugins/security.php

https://github.com/tjgillies/openmicroblogger
PHP | 2833 lines | 2048 code | 639 blank | 146 comment | 334 complexity | b52e2ec22cce41309c02e5bf3fc147c6 MD5 | raw file
Possible License(s): LGPL-2.1
  1. <?php
  2. /**
  3. * dbscript -- restful openid framework
  4. * @version 0.6.0 -- 22-October-2008
  5. * @author Brian Hendrickson <brian@dbscript.net>
  6. * @link http://dbscript.net/
  7. * @copyright Copyright 2009 Brian Hendrickson
  8. * @license http://www.opensource.org/licenses/mit-license.php MIT License
  9. * @package dbscript
  10. */
  11. /**
  12. * Model Security
  13. *
  14. * filter to check permissions in $model->access_list,
  15. * which can be set in the data model via:
  16. * $model->let_read/let_write/let_access( 'group:callback' )
  17. *
  18. * @author Brian Hendrickson <brian@dbscript.net>
  19. * @access public
  20. * @param Mapper $req
  21. * @param Database $db
  22. * @return boolean
  23. * @todo modify to handle a partial set of fields
  24. */
  25. function model_security( &$request, &$db ) {
  26. $action = $request->action;
  27. if ( isset( $request->resource ) )
  28. $model =& $db->get_table( $request->resource );
  29. else
  30. return true; // request is not for a resource
  31. if (public_resource())
  32. return true;
  33. if (virtual_resource())
  34. return true;
  35. if ( !( in_array( $action, $model->allowed_methods, true )))
  36. $action = 'get';
  37. $failed = false;
  38. authenticate_with_openid();
  39. // this switch is now repeated in $model->can($action)
  40. switch( $action ) {
  41. case 'get':
  42. if (!($model && $model->can_read_fields( $model->field_array )))
  43. $failed = true;
  44. break;
  45. case 'put':
  46. $submitted = $model->fields_from_request( $request );
  47. foreach ( $submitted as $table=>$fieldlist ) {
  48. $model =& $db->get_table($table);
  49. if (!($model && $model->can_write_fields( $fieldlist )))
  50. $failed = true;
  51. }
  52. break;
  53. case 'post':
  54. $submitted = $model->fields_from_request( $request );
  55. foreach ( $submitted as $table=>$fieldlist ) {
  56. $model =& $db->get_table($table);
  57. if (!($model && $model->can_create( $table )))
  58. $failed = true;
  59. }
  60. break;
  61. case 'delete':
  62. if (!($model && $model->can_delete( $request->resource )))
  63. $failed = true;
  64. break;
  65. default:
  66. $failed = true;
  67. }
  68. if (!$failed)
  69. return true;
  70. authenticate_with_openid();
  71. trigger_error( "Sorry, you do not have permission to $action ".$request->resource, E_USER_ERROR );
  72. }
  73. function authenticate_with_openid() {
  74. global $request;
  75. if ( !$request->openid_complete )
  76. begin_openid_authentication( $request );
  77. else
  78. complete_openid_authentication( $request );
  79. }
  80. function begin_openid_authentication( &$request ) {
  81. if ( !isset( $request->openid_url ) || empty( $request->openid_url )) {
  82. $_SESSION['requested_url'] = $request->uri;
  83. render( 'action', 'email' );
  84. return;
  85. }
  86. unset_cookie();
  87. $_SESSION['openid_url'] = $request->openid_url;
  88. if (class_exists('MySQL') && environment('openid_version') > 1 && !isset($_SESSION['openid_degrade']) )
  89. start_wp_openid();
  90. else
  91. start_simple_openid();
  92. }
  93. function start_wp_openid() {
  94. global $request;
  95. wp_plugin_include(array(
  96. 'wp-openid'
  97. ));
  98. $logic = new WordPressOpenID_Logic(null);
  99. $logic->activate_plugin();
  100. if( !WordPressOpenID_Logic::late_bind() )
  101. return;
  102. $redirect_to = '';
  103. if( !empty( $_SESSION['requested_url'] ) )
  104. $redirect_to = $_SESSION['requested_url'];
  105. $claimed_url = $request->openid_url;
  106. $consumer = WordPressOpenID_Logic::getConsumer();
  107. $auth_request = $consumer->begin( $claimed_url );
  108. if ( null === $auth_request )
  109. trigger_error('OpenID server not found at '. htmlentities( $claimed_url ), E_USER_ERROR);
  110. $return_to = $request->url_for( 'openid_continue' ).'/';
  111. $store =& WordPressOpenID_Logic::getStore();
  112. $sreg_request = Auth_OpenID_SRegRequest::build(array(),array(
  113. 'nickname',
  114. 'email',
  115. 'fullname'
  116. ));
  117. $auth_request->addExtension($sreg_request);
  118. $_SESSION['oid_return_to'] = $return_to;
  119. WordPressOpenID_Logic::doRedirect($auth_request, $request->protected_url, $return_to);
  120. exit(0);
  121. }
  122. function start_simple_openid() {
  123. global $request;
  124. include_once $GLOBALS['PATH']['library'] . 'openid.php';
  125. $openid = new SimpleOpenID;
  126. $openid->SetIdentity( $request->openid_url );
  127. $openid->SetApprovedURL( $request->url_for( 'openid_continue' ).'/'); // y'all come back now
  128. $openid->SetTrustRoot( $request->protected_url ); // protected site
  129. $openid->SetOptionalFields(array(
  130. 'nickname',
  131. 'email',
  132. 'fullname'
  133. ));
  134. $openid->SetRequiredFields(array());
  135. $server_url = $openid->GetOpenIDServer();
  136. $_SESSION['openid_server_url'] = $server_url;
  137. #echo $server_url; exit;
  138. $openid->SetOpenIDServer( $server_url );
  139. if ($openid->IsError())
  140. trigger_error( 'sorry there was an openid error: '.serialize($openid->GetError()), E_USER_ERROR);
  141. $url = trim($server_url);
  142. if (empty($url))
  143. trigger_error( 'sorry there was an openid error: the server url is not set '.serialize($_SESSION), E_USER_ERROR);
  144. redirect_to( $openid->GetRedirectURL() );
  145. }
  146. function complete_openid_authentication( &$request ) {
  147. if (!(check_cookie())) {
  148. // cookie not set, DO IT
  149. $openid_to_identity = array(
  150. 'email'=>'email_value',
  151. 'dob'=>'dob',
  152. 'postcode'=>'postal_code',
  153. 'country'=>'country_name',
  154. 'gender'=>'gender',
  155. 'language'=>'language',
  156. 'timezone'=>'tz'
  157. );
  158. if ( isset( $_SESSION['openid_url'] )) {
  159. global $db;
  160. $Identity =& $db->get_table( 'identities' );
  161. $Person =& $db->get_table( 'people' );
  162. $openid = $_SESSION['openid_url'];
  163. if (!strstr($openid,'http'))
  164. $openid = 'http://' . $openid;
  165. $i = $Identity->find_by( 'url', $openid );
  166. // OpenID auth complete, URL not exists
  167. // e-mail could be set though
  168. if (!$i && isset($_SESSION['openid_email']))
  169. $i = $Identity->find_by( 'email_value', $_SESSION['openid_email'] );
  170. //if (isset($_GET['openid_sreg_email']))
  171. // $i = $Identity->find_by( 'email_value', $_GET['openid_sreg_email'] );
  172. //if (!$i && isset($_GET['openid_sreg_nickname']))
  173. // $i = $Identity->find_by( 'nickname', $_GET['openid_sreg_nickname'] );
  174. if ($i) {
  175. $p = $Person->find( $i->person_id );
  176. } else {
  177. $p = $Person->base();
  178. $p->save();
  179. $i = $Identity->base();
  180. $i->set_value( 'person_id', $p->id );
  181. $i->set_value( 'label', 'profile 1' );
  182. if (isset($_SESSION['openid_email']))
  183. $i->set_value( 'email_value', $_SESSION['openid_email'] );
  184. }
  185. if (empty($i->url) || strstr( $i->url, "@" )) {
  186. $i->set_value( 'url', $openid );
  187. if (isset($_GET['openid_sreg_nickname']) && empty($i->nickname) ) {
  188. $nick = strtolower(urldecode($_GET['openid_sreg_nickname']));
  189. // set the nickname if it isn't alraedy taken and if it looks like a valid username
  190. if ($Identity->is_unique_value( $nick, 'nickname' ) && ereg("^([a-zA-Z0-9]+)$", $nick))
  191. $i->set_value( 'nickname', $nick );
  192. }
  193. // put SREG data in empty identity fields
  194. foreach($openid_to_identity as $k=>$v )
  195. if (!in_array($k,array('openid_sreg_nickname')) && isset($_GET['openid_sreg_'.$k]))
  196. if (empty($i->$v))
  197. $i->set_value( $v, urldecode($_GET['openid_sreg_'.$k]) );
  198. // split the SREG full name into first, last for VCARD, hCard, etc
  199. if (isset($_GET['openid_sreg_fullname']) && empty($i->given_name)) {
  200. $names = explode(' ',$_GET['openid_sreg_fullname']);
  201. if (strlen($names[0]) > 0 && empty($i->given_name))
  202. $i->set_value( 'given_name', $names[0] );
  203. if (isset($names[2]) && empty($i->family_name)) {
  204. $i->set_value( 'family_name', $names[2] );
  205. } elseif (isset($names[1]) && empty($i->family_name)) {
  206. $i->set_value( 'family_name', $names[1] );
  207. }
  208. $i->set_value( 'fullname', $_GET['openid_sreg_fullname']);
  209. }
  210. $i->set_value( 'avatar', base_path(true).'resource/favicon.png' );
  211. $i->save_changes();
  212. $i->set_etag( $p->id );
  213. }
  214. }
  215. if ( isset( $p->id ) && $p->id != 0) {
  216. // person id is valid
  217. // login complete
  218. set_cookie( $p->id );
  219. if (!(empty($_SESSION['requested_url'])))
  220. redirect_to( $_SESSION['requested_url'] );
  221. else
  222. redirect_to( $request->base );
  223. } else {
  224. // no person defined yet
  225. if ( isset($_SESSION['fb_person_id'])
  226. && $_SESSION['fb_person_id'] > 0 ) {
  227. } elseif ( isset($_SESSION['oauth_person_id'])
  228. && $_SESSION['oauth_person_id'] > 0 ) {
  229. // try to set the cookie
  230. // set_cookie( $_SESSION['oauth_person_id'] );
  231. } else {
  232. trigger_error( "unable to find the Person, sorry", E_USER_ERROR );
  233. }
  234. }
  235. } else {
  236. // cookie OK
  237. }
  238. }
  239. function ldap_login( &$vars ) {
  240. extract( $vars );
  241. $_SESSION['requested_url'] = $request->base;
  242. render( 'action', 'ldap' );
  243. }
  244. function _ldap( &$vars ) {
  245. extract( $vars );
  246. }
  247. function ldap_submit( &$vars ) {
  248. extract($vars);
  249. global $request;
  250. }
  251. function _email( &$vars ) {
  252. extract( $vars );
  253. $submit_url = $request->url_for( environment('authentication').'_submit' );
  254. $return_url = $request->url_for( 'openid_continue' ).'/';
  255. if (isset($_SESSION['requested_url']))
  256. $return_to = $_SESSION['requested_url'];
  257. else
  258. $return_to = $request->base;
  259. $protected_url = base_url(true);
  260. $Identity =& $db->model('Identity');
  261. if (isset($request->params['ident'])) {
  262. $ident = $Identity->find_by('token',$request->params['ident']);
  263. if ($ident) {
  264. $email = $ident->email_value;
  265. $_SESSION['openid_email'] = $email;
  266. $ident->set_value('token','');
  267. $ident->save_changes();
  268. } else {
  269. $email = false;
  270. }
  271. } else {
  272. $email = false;
  273. }
  274. return vars(
  275. array(
  276. &$email,
  277. &$protected_url,
  278. &$return_url,
  279. &$submit_url,
  280. &$return_to
  281. ),
  282. get_defined_vars()
  283. );
  284. }
  285. function _register( &$vars ) {
  286. extract( $vars );
  287. $submit_url = $request->url_for( environment('authentication').'_submit' );
  288. $return_url = $request->url_for( 'openid_continue' ).'/';
  289. if (isset($_SESSION['requested_url']))
  290. $return_to = $_SESSION['requested_url'];
  291. else
  292. $return_to = $request->base;
  293. $protected_url = base_url(true);
  294. if (isset($request->params['ident'])) {
  295. $ident = $Identity->find_by('token',$request->params['ident']);
  296. if ($ident) {
  297. $email = $ident->email_value;
  298. $_SESSION['openid_email'] = $email;
  299. $ident->set_value('token','');
  300. $ident->save_changes();
  301. } else {
  302. $email = false;
  303. }
  304. } else {
  305. $email = false;
  306. }
  307. return vars(
  308. array(
  309. &$email,
  310. &$protected_url,
  311. &$return_url,
  312. &$submit_url,
  313. &$return_to
  314. ),
  315. get_defined_vars()
  316. );
  317. }
  318. function _login( &$vars ) {
  319. extract( $vars );
  320. $submit_url = $request->url_for( 'openid_submit' );
  321. $return_url = $request->url_for( 'openid_continue' ).'/';
  322. if (isset($_SESSION['requested_url']))
  323. $return_to = $_SESSION['requested_url'];
  324. else
  325. $return_to = $request->base;
  326. $protected_url = base_url(true);
  327. if (isset($_SESSION['openid_url']))
  328. $openid_url = $_SESSION['openid_url'];
  329. else
  330. $openid_url = "";
  331. if (strstr($openid_url,'https://'))
  332. $openid_url = substr($openid_url,8);
  333. if (strstr($openid_url,'http://'))
  334. $openid_url = substr($openid_url,7);
  335. return vars(
  336. array(
  337. &$protected_url,
  338. &$return_url,
  339. &$submit_url,
  340. &$return_to,
  341. &$openid_url
  342. ),
  343. get_defined_vars()
  344. );
  345. }
  346. function normalize_url() {
  347. //
  348. }
  349. function password_register( &$vars ) {
  350. extract( $vars );
  351. $Identity =& $db->get_table( 'identities' );
  352. $Person =& $db->get_table( 'people' );
  353. if (!($request->password == $request->password2))
  354. trigger_error( "sorry the passwords do not match", E_USER_ERROR );
  355. //$i = $Identity->find_by(array(
  356. // 'nickname'=>$request->nickname
  357. //),1);
  358. //$p = $Person->find( $i->person_id );
  359. //if ( isset( $p->id ) && $p->id != 0) {
  360. $nick = $request->nickname;
  361. $sql = "SELECT id FROM ".$db->prefix."identities WHERE nickname LIKE '".$db->escape_string($nick)."' AND (post_notice = '' OR post_notice IS NULL)";
  362. $result = $db->get_result( $sql );
  363. if ( $db->num_rows($result) > 0) {
  364. trigger_error( "sorry that username is already taken", E_USER_ERROR );
  365. } else {
  366. // create new user and log them in
  367. $p = $Person->base();
  368. $p->save();
  369. $i = $Identity->base();
  370. $i->set_value( 'person_id', $p->id );
  371. $i->set_value( 'label', 'profile 1' );
  372. $i->set_value( 'nickname', $request->nickname );
  373. $i->set_value( 'url', $request->base."".$request->nickname );
  374. $i->set_value( 'password', md5($request->password) );
  375. $i->set_value( 'avatar', base_path(true).'resource/favicon.png' );
  376. $i->save_changes();
  377. $i->set_etag( $p->id );
  378. $_SESSION['openid_complete'] = true;
  379. set_cookie( $p->id );
  380. if (!(empty($_SESSION['requested_url'])))
  381. redirect_to( $_SESSION['requested_url'] );
  382. else
  383. redirect_to( $request->base );
  384. }
  385. }
  386. function password_submit( &$vars ) {
  387. extract($vars);
  388. global $request;
  389. $Identity =& $db->get_table( 'identities' );
  390. $Person =& $db->get_table( 'people' );
  391. $i = $Identity->find_by(array(
  392. 'nickname'=>$request->nickname,
  393. 'password'=>md5($request->password)
  394. ),1);
  395. if (!$i)
  396. trigger_error( "username or password incorrect, sorry", E_USER_ERROR );
  397. $p = $Person->find( $i->person_id );
  398. if ( isset( $p->id ) && $p->id != 0) {
  399. $_SESSION['openid_complete'] = true;
  400. set_cookie( $p->id );
  401. if (!(empty($_SESSION['requested_url'])))
  402. redirect_to( $_SESSION['requested_url'] );
  403. else
  404. redirect_to( $request->base );
  405. } else {
  406. trigger_error( "unable to find the Person, sorry", E_USER_ERROR );
  407. }
  408. }
  409. function openid_submit( &$vars ) {
  410. unset_cookie();
  411. unset($_SESSION['openid_complete']);
  412. unset($_SESSION['openid_url']);
  413. unset($_SESSION['openid_email']);
  414. authenticate_with_openid();
  415. }
  416. function email_submit( &$vars ) {
  417. extract($vars);
  418. global $request;
  419. unset_cookie();
  420. unset($_SESSION['openid_complete']);
  421. unset($_SESSION['openid_url']);
  422. unset($_SESSION['openid_email']);
  423. $Identity =& $db->get_table( 'identities' );
  424. $i = $Identity->find_by( 'email_value', $request->email );
  425. $_SESSION['openid_email'] = $request->email;
  426. if ( $i && !(strstr( $i->url, "@" )) && !empty($i->url)) {
  427. $request->openid_url = $i->url;
  428. authenticate_with_openid();
  429. } else {
  430. $url = environment('openid_server')."/?action=seek&email=".$request->email;
  431. $curl = curl_init($url);
  432. $method = "GET";
  433. $params = array();
  434. curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
  435. curl_setopt($curl, CURLOPT_HEADER, false);
  436. curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
  437. curl_setopt($curl, CURLOPT_HTTPGET, ($method == "GET"));
  438. curl_setopt($curl, CURLOPT_POST, ($method == "POST"));
  439. if ($method == "POST") curl_setopt($curl, CURLOPT_POSTFIELDS, $params);
  440. curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
  441. $response = curl_exec($curl);
  442. if ( curl_errno($curl) == 0 ) {
  443. if (strstr( $response, "http" )) {
  444. // found a url, need to put it in the openid form
  445. $request->set_param('openid_url',trim($response));
  446. authenticate_with_openid();
  447. } else {
  448. // meh
  449. }
  450. }
  451. $_SESSION['requested_url'] = $request->base;
  452. redirect_to(environment('openid_server')."/?action=register&return=".urlencode($request->base)."&email=".urlencode($request->email));
  453. }
  454. if (!(empty($_SESSION['requested_url'])))
  455. redirect_to( $_SESSION['requested_url'] );
  456. else
  457. redirect_to( $request->base );
  458. }
  459. function openid_logout( &$vars ) {
  460. if (isset($_GET['forward']) && !empty($_SERVER['HTTP_REFERER']))
  461. $_SESSION['logout_forward'] = $_SERVER['HTTP_REFERER'];
  462. unset_cookie();
  463. extract( $vars );
  464. $_SESSION['openid_complete'] = false;
  465. //unset($_SESSION['openid_email']);
  466. //unset($_SESSION['openid_url']);
  467. $_SESSION['oauth_person_id']=0;
  468. $_SESSION['fb_person_id']=0;
  469. unset($_SESSION['fb_session']);
  470. unset($_SESSION['oauth_access_token']);
  471. unset($_SESSION['oauth_access_token_secret']);
  472. unset($_SESSION['oauth_request_token']);
  473. unset($_SESSION['oauth_request_token_secret']);
  474. unset($_SESSION['oauth_state']);
  475. unset($_SESSION['oauth_twitter']);
  476. unset($_SESSION['fb_userid']);
  477. unset($_SESSION['fb_person_id']);
  478. unset($_SESSION['oauth_person_id']);
  479. unset($_SESSION['requested_url']);
  480. unset($_SESSION['openid_complete']);
  481. unset($_SESSION['oid_return_to']);
  482. if (isset($_SESSION['logout_forward']))
  483. redirect_to($_SESSION['logout_forward']);
  484. if (environment('authentication') == 'password')
  485. redirect_to( $request->base );
  486. else
  487. redirect_to( environment('openid_server')."/?action=logout&return=".urlencode($request->base) );
  488. }
  489. function email_login( &$vars ) {
  490. extract( $vars );
  491. $_SESSION['requested_url'] = $request->base;
  492. render( 'action', 'email' );
  493. }
  494. function email_register( &$vars ) {
  495. extract( $vars );
  496. $_SESSION['requested_url'] = $request->base;
  497. render( 'action', 'register' );
  498. }
  499. function oauth_login( &$vars ) {
  500. render( 'action', 'oauth' );
  501. }
  502. function _oauth( &$vars ) {
  503. // top stream, re-connect to subtwitter-db
  504. extract( $vars );
  505. global $prefix;
  506. $Blog =& $db->model('Blog');
  507. if (isset($_GET['forward'])){
  508. if (!empty($_SERVER['HTTP_REFERER']))
  509. $_SESSION['tw_forward'] = $_SERVER['HTTP_REFERER'];
  510. if (isset($_GET['callbackurl']))
  511. $_SESSION['tw_forward'] = $_GET['callbackurl'];
  512. }
  513. if (empty($db->prefix)) {
  514. if (isset($_REQUEST['oauth_token'])) {
  515. $tabresult = $db->get_result("SHOW tables");
  516. $tables = array();
  517. $tablist = array();
  518. for($i=0;$tables[$i]=mysql_fetch_assoc($tabresult);$i++)
  519. foreach($tables[$i] as $k=>$v) $tablist[] = $v;
  520. $Blog->find();
  521. while ($b = $Blog->MoveNext()) {
  522. if (!empty($b->prefix) && in_array($b->prefix."_db_sessions",$tablist)) {
  523. $sql = "SELECT data FROM ".$b->prefix."_db_sessions WHERE data LIKE '%".$db->escape_string($_REQUEST['oauth_token'])."%'";
  524. $result = $db->get_result( $sql );
  525. if ($db->num_rows($result) == 1) {
  526. // XXX subdomain upgrade
  527. $redir = blog_url($b->nickname,true);
  528. $redir .= 'oauth_login';
  529. $redir .= "&oauth_token=".$_REQUEST['oauth_token'];
  530. $content = '<script type="text/javascript">'."\n";
  531. $content .= ' // <![CDATA['."\n";
  532. $content .= " location.replace('".$redir."');"."\n";
  533. $content .= ' // ]]>'."\n";
  534. $content .= '</script>'."\n";
  535. return vars(
  536. array(&$content),
  537. get_defined_vars()
  538. );
  539. }
  540. }
  541. }
  542. }
  543. }
  544. // http://abrah.am
  545. lib_include('twitteroauth');
  546. /* Sessions are used to keep track of tokens while user authenticates with twitter */
  547. /* Consumer key from twitter */
  548. $consumer_key = environment( 'twitterKey' );
  549. /* Consumer Secret from twitter */
  550. $consumer_secret = environment( 'twitterSecret' );
  551. /* Set up placeholder */
  552. $content = NULL;
  553. /* Set state if previous session */
  554. $state = $_SESSION['oauth_state'];
  555. /* Checks if oauth_token is set from returning from twitter */
  556. $session_token = $_SESSION['oauth_request_token'];
  557. /* Checks if oauth_token is set from returning from twitter */
  558. $oauth_token = $_REQUEST['oauth_token'];
  559. /* Set section var */
  560. $section = $_REQUEST['section'];
  561. /* If oauth_token is missing get it */
  562. if ($_REQUEST['oauth_token'] != NULL && $_SESSION['oauth_state'] === 'start') {/*{{{*/
  563. $_SESSION['oauth_state'] = $state = 'returned';
  564. }/*}}}*/
  565. /*
  566. * 'default': Get a request token from twitter for new user
  567. * 'returned': The user has authorize the app on twitter
  568. */
  569. switch ($state) {/*{{{*/
  570. default:
  571. /* Create TwitterOAuth object with app key/secret */
  572. $to = new TwitterOAuth($consumer_key, $consumer_secret);
  573. /* Request tokens from twitter */
  574. $tok = $to->getRequestToken();
  575. /* Save tokens for later */
  576. $Blog =& $db->model('Blog');
  577. $Blog->find();
  578. if (!empty($db->prefix) && isset($_REQUEST['oauth_token'])) {
  579. $tabresult = $db->get_result("SHOW tables");
  580. $tables = array();
  581. $tablist = array();
  582. for($i=0;$tables[$i]=mysql_fetch_assoc($tabresult);$i++)
  583. foreach($tables[$i] as $k=>$v) $tablist[] = $v;
  584. while ($b = $Blog->MoveNext()) {
  585. if (!empty($b->prefix) && in_array($b->prefix."_db_sessions",$tablist)) {
  586. $sql = "SELECT id FROM ".$b->prefix."_db_sessions WHERE data LIKE '%".$db->escape_string($_REQUEST['oauth_token'])."%'";
  587. $result = $db->get_result( $sql );
  588. if ($db->num_rows($result) == 1) {
  589. $sess = $db->result_value( $result, 0, "id" );
  590. $del = $db->get_result( "DELETE FROM ".$b->prefix."_db_sessions WHERE id = '$sess'" );
  591. }
  592. }
  593. }
  594. }
  595. $_SESSION['oauth_request_token'] = $token = $tok['oauth_token'];
  596. $_SESSION['oauth_request_token_secret'] = $tok['oauth_token_secret'];
  597. $_SESSION['oauth_state'] = "start";
  598. if (isset($_GET['forward']) && !empty($_SERVER['HTTP_REFERER']))
  599. $_SESSION['oauth_twitter'] = $_SERVER['HTTP_REFERER'];
  600. else
  601. $_SESSION['oauth_twitter'] = $request->base;
  602. /* Build the authorization URL */
  603. $auth_url = $to->getAuthorizeURL($token);
  604. if (empty($auth_url)) {
  605. $content = 'Request token not found, <a href="'.$request->url_for('oauth_login').'">click here to try again...</a>';
  606. } else {
  607. $content = '<script type="text/javascript">'."\n";
  608. $content .= ' // <![CDATA['."\n";
  609. $content .= " location.replace('".$auth_url."');"."\n";
  610. $content .= ' // ]]>'."\n";
  611. $content .= '</script>'."\n";
  612. }
  613. break;
  614. case 'returned':
  615. if (isset($_SESSION['oauth_twitter']))
  616. $redirect_to = $_SESSION['oauth_twitter'];
  617. else
  618. $redirect_to = $request->base;
  619. /* If the access tokens are already set skip to the API call */
  620. if ($_SESSION['oauth_access_token'] === NULL && $_SESSION['oauth_access_token_secret'] === NULL) {
  621. /* Create TwitterOAuth object with app key/secret and token key/secret from default phase */
  622. $to = new TwitterOAuth($consumer_key, $consumer_secret, $_SESSION['oauth_request_token'], $_SESSION['oauth_request_token_secret']);
  623. /* Request access tokens from twitter */
  624. $tok = $to->getAccessToken();
  625. /* Save the access tokens. Normally these would be saved in a database for future use. */
  626. $_SESSION['oauth_access_token'] = $tok['oauth_token'];
  627. $_SESSION['oauth_access_token_secret'] = $tok['oauth_token_secret'];
  628. if (!($_SESSION['oauth_access_token'] === NULL && $_SESSION['oauth_access_token_secret'] === NULL)) {
  629. unset( $_SESSION['oauth_request_token'] );
  630. unset( $_SESSION['oauth_request_token_secret'] );
  631. }
  632. }
  633. $to = new TwitterOAuth(
  634. $consumer_key,
  635. $consumer_secret,
  636. $_SESSION['oauth_access_token'],
  637. $_SESSION['oauth_access_token_secret']
  638. );
  639. $session_oauth_token = $_SESSION['oauth_access_token'];
  640. $session_oauth_secret = $_SESSION['oauth_access_token_secret'];
  641. $content = $to->OAuthRequest('https://twitter.com/account/verify_credentials.json', array(), 'GET');
  642. if (!(class_exists('Services_JSON')))
  643. lib_include( 'json' );
  644. $json = new Services_JSON();
  645. $user = $json->decode($content);
  646. if (empty($user))
  647. trigger_error('The server said: '.$content, E_USER_ERROR );
  648. if (empty($prefix) && in_array('invites',$db->tables)) {
  649. $Invite =& $db->model( 'Invite' );
  650. $result = $Invite->find_by( 'nickname',$user->screen_name );
  651. if (!$result)
  652. trigger_error('Sorry, you have not been invited yet '.environment('email_from'), E_USER_ERROR);
  653. }
  654. $Identity =& $db->model('Identity');
  655. $Person =& $db->model('Person');
  656. $TwitterUser =& $db->model('TwitterUser');
  657. $twuser = $TwitterUser->find_by( 'twitter_id',$user->id );
  658. // a) twitter user exists, does not have a profile_id
  659. // b) twitter user exists, HAS a profile_id
  660. // c) twitter user does not exist
  661. if ($twuser) {
  662. if (!$twuser->profile_id) {
  663. // a
  664. $i = make_identity(array(
  665. $user->screen_name,
  666. $user->profile_image_url,
  667. $user->name,
  668. $user->description,
  669. $user->url,
  670. $user->location
  671. ));
  672. if (!$i)
  673. trigger_error('sorry I was unable to create an identity', E_USER_ERROR);
  674. $twuser->set_value('profile_id',$i->id);
  675. $twuser->set_value('oauth_key',$session_oauth_token);
  676. $twuser->set_value('oauth_secret',$session_oauth_secret);
  677. $twuser->save_changes();
  678. if (!$twuser)
  679. trigger_error('sorry I was unable to create a twitter user', E_USER_ERROR);
  680. } else {
  681. // b
  682. $i = $Identity->find($twuser->profile_id);
  683. if (!$i)
  684. trigger_error('sorry I was unable to find the identity', E_USER_ERROR);
  685. if ($session_oauth_token != $twuser->oauth_key) {
  686. $twuser->set_value('oauth_key',$session_oauth_token);
  687. $twuser->set_value('oauth_secret',$session_oauth_secret);
  688. $twuser->save_changes();
  689. }
  690. }
  691. } else {
  692. // c
  693. $i = make_identity(array(
  694. $user->screen_name,
  695. $user->profile_image_url,
  696. $user->name,
  697. $user->description,
  698. $user->url,
  699. $user->location
  700. ));
  701. if (!$i)
  702. trigger_error('sorry I was unable to create an identity', E_USER_ERROR);
  703. $twuser = make_twuser($user,$i->id,$session_oauth_token,$session_oauth_secret);
  704. if (!$twuser)
  705. trigger_error('sorry I was unable to create a twitter user', E_USER_ERROR);
  706. $Setting =& $db->model('Setting');
  707. $cfg = $Setting->base();
  708. $cfg->set_value('profile_id',$i->id);
  709. $cfg->set_value('person_id',$i->person_id);
  710. $cfg->set_value('name','config.env.importtwitter_'.$user->id);
  711. $cfg->set_value('value',1);
  712. $cfg->save_changes();
  713. $cfg->set_etag();
  714. }
  715. $_SESSION['oauth_person_id'] = $i->person_id;
  716. if (isset($_SESSION['tw_forward'])){
  717. $redirect_to = $_SESSION['tw_forward'];
  718. redirect_to($redirect_to);
  719. }
  720. if (empty($redirect_to)) {
  721. $content = "<p>there was an error in the oauth routine, sorry</p>";
  722. } else {
  723. $content = '<script type="text/javascript">'."\n";
  724. $content .= ' // <![CDATA['."\n";
  725. $content .= " location.replace('".$redirect_to."');"."\n";
  726. $content .= ' // ]]>'."\n";
  727. $content .= '</script>'."\n";
  728. }
  729. break;
  730. }/*}}}*/
  731. return vars(
  732. array(
  733. &$content,
  734. ),
  735. get_defined_vars()
  736. );
  737. }
  738. function make_identity( $user, $newperson=false ) {
  739. global $db,$prefix,$request;
  740. $Person =& $db->model('Person');
  741. if ($newperson) {
  742. $p = $Person->base();
  743. $p->save();
  744. } elseif (get_person_id()) {
  745. // make a new identity for the Person
  746. $p = $Person->find(get_person_id());
  747. } else {
  748. $p = $Person->base();
  749. $p->save();
  750. }
  751. if (!(get_class($p) == 'Record')){
  752. $p = $Person->base();
  753. $p->save();
  754. }
  755. $Identity =& $db->model('Identity');
  756. $i = $Identity->base();
  757. $nicker = $db->escape_string($user[0]);
  758. for ( $j=1; $j<50; $j++ ) {
  759. $sql = "SELECT nickname FROM ".$prefix."identities WHERE nickname LIKE '".$nicker."' AND (post_notice = '' OR post_notice IS NULL)";
  760. $result = $db->get_result( $sql );
  761. if ($db->num_rows($result) > 0) {
  762. $nicker = $db->escape_string($user[0]).$j;
  763. } else {
  764. break;
  765. }
  766. }
  767. $i->set_value( 'avatar', base_path(true).'resource/favicon.png' );
  768. $i->set_value( 'nickname', $nicker );
  769. if (!empty($user[1]))
  770. $i->set_value( 'avatar', $user[1] );
  771. $i->set_value( 'fullname', $user[2] );
  772. $i->set_value( 'bio', $user[3] );
  773. $i->set_value( 'homepage', $user[4] );
  774. $i->set_value( 'locality', $user[5] );
  775. $i->set_value( 'label', 'profile 1' );
  776. $i->set_value( 'person_id', $p->id );
  777. $i->save_changes();
  778. $i->set_etag($p->id);
  779. if (empty($prefix) && in_array('invites',$db->tables)) {
  780. $Membership =& $db->model( 'Membership' );
  781. $m = $Membership->base();
  782. $m->set_value( 'group_id', 4 ); // XXX
  783. $m->set_value( 'person_id', $p->id );
  784. $m->save_changes();
  785. }
  786. $i->set_value( 'profile', $request->url_for(array('resource'=>"_".$i->id)) );
  787. $i->set_value( 'profile_url', $request->url_for(array('resource'=>$nicker)) );
  788. $i->save_changes();
  789. //$i->set_value( 'update_profile', $updateProfile );
  790. //$i->set_value( 'post_notice', $postNotice );
  791. return $i;
  792. }
  793. function facebook_dologin(&$vars){
  794. extract($vars);
  795. foreach( array('helper','twitter','facebook') as $module )
  796. require_once $GLOBALS['PATH']['dbscript'] . $module . '.php';
  797. $xd = '/resource/xd_receiver.htm';
  798. $fbkey = environment('facebookKey');
  799. $fbsec = environment('facebookSecret');
  800. $appid = environment('facebookAppId');
  801. $agent = environment('facebookAppName');
  802. $fblogin = $request->url_for('facebook_login');
  803. $fbuid = 0;
  804. if (signed_in() && has_facebook_account()){
  805. $fbuid = $_SESSION['fb_userid'];
  806. }
  807. add_include_path(library_path().'facebook_stream');
  808. require_once "Services/Facebook.php";
  809. if (isset($_SESSION['fb_userid']) && !empty($_SESSION['fb_userid'])) {
  810. global $prefix,$db;
  811. $db->prefix = $prefix;
  812. $uid = $_SESSION['fb_userid'];
  813. $sql = "SELECT DISTINCT oauth_key FROM facebook_users WHERE facebook_id = ".$uid;
  814. $result = $db->get_result( $sql );
  815. if (!(mysql_num_rows($result) == 1))
  816. trigger_error('unable to find facebook user',E_USER_ERROR);
  817. $sess = $db->result_value($result,0,'oauth_key');
  818. } else {
  819. $sess = false;
  820. }
  821. $next = $fblogin;
  822. $f = new Facebook(
  823. $fbkey,
  824. $fbsec,
  825. $appid,
  826. $agent,
  827. $sess,
  828. $next
  829. );
  830. $f->permission_to('publish_stream',false,true);
  831. redirect_to($request->base);
  832. }
  833. function facebook_getloggedin(){
  834. extract($vars);
  835. foreach( array('helper','twitter','facebook') as $module )
  836. require_once $GLOBALS['PATH']['dbscript'] . $module . '.php';
  837. $xd = '/resource/xd_receiver.htm';
  838. $fbkey = environment('facebookKey');
  839. $fbsec = environment('facebookSecret');
  840. $appid = environment('facebookAppId');
  841. $agent = environment('facebookAppName');
  842. global $request;
  843. $fblogin = $request->url_for('facebook_login');
  844. $fbuid = 0;
  845. if (signed_in() && has_facebook_account()){
  846. $fbuid = $_SESSION['fb_userid'];
  847. if (isset($_SESSION['fb_forward']))
  848. redirect_to($_SESSION['fb_forward']);
  849. }
  850. add_include_path(library_path().'facebook_stream');
  851. require_once "Services/Facebook.php";
  852. if (isset($_SESSION['fb_userid']) && !empty($_SESSION['fb_userid'])) {
  853. global $prefix,$db;
  854. $db->prefix = $prefix;
  855. $uid = $_SESSION['fb_userid'];
  856. $sql = "SELECT DISTINCT oauth_key FROM facebook_users WHERE facebook_id = ".$uid;
  857. $result = $db->get_result( $sql );
  858. if (!(mysql_num_rows($result) == 1))
  859. trigger_error('unable to find facebook user',E_USER_ERROR);
  860. $sess = $db->result_value($result,0,'oauth_key');
  861. } else {
  862. $sess = false;
  863. }
  864. $next = $fblogin;
  865. if (isset($_GET['callbackurl']))
  866. $next = $_GET['callbackurl'];
  867. $f = new Facebook(
  868. $fbkey,
  869. $fbsec,
  870. $appid,
  871. $agent,
  872. $sess,
  873. $next
  874. );
  875. $tok = $f->request_token();
  876. redirect_to( $tok->authorize_url().'&fbconnect=true&return_session=true&req_perms=offline_access,publish_stream' );
  877. }
  878. function facebook_login( &$vars ) {
  879. extract($vars);
  880. $app_id = environment('facebookAppId');
  881. $consumer_key = environment('facebookKey');
  882. $consumer_secret = environment('facebookSecret');
  883. $agent = environment('facebookAppName')." (curl)";
  884. add_include_path(library_path());
  885. add_include_path(library_path().'facebook-platform/php');
  886. add_include_path(library_path().'facebook_stream');
  887. require_once "facebook.php";
  888. require_once "FacebookStream.php";
  889. require_once "Services/Facebook.php";
  890. if (isset($_GET['forward'])){
  891. if (!empty($_SERVER['HTTP_REFERER']))
  892. $_SESSION['fb_forward'] = $_SERVER['HTTP_REFERER'];
  893. if (isset($_GET['callbackurl']))
  894. $_SESSION['fb_forward'] = $_GET['callbackurl'];
  895. }
  896. // $sesskey = environment('facebookSession');
  897. $fb = new Facebook($consumer_key, $consumer_secret, true);
  898. // $facebook->api_client->session_key = $sesskey;
  899. $_SESSION['fb_session'] = (string)$fb->api_client->session_key;
  900. $_SESSION['fb_userid'] = (string)$fb->user;
  901. if (isset($_GET['session'])){
  902. if (!(class_exists('Services_JSON')))
  903. lib_include( 'json' );
  904. $data = $_GET['session'];
  905. // print_r(unserialize($data));
  906. $arr = (array)json_decode($data);
  907. if ($arr['uid'])
  908. $_SESSION['fb_userid'] = $arr['uid'];
  909. if ($arr['session_key'])
  910. $_SESSION['fb_session'] = $arr['session_key'];
  911. }
  912. if (!$_SESSION['fb_userid'])
  913. redirect_to($request->url_for('facebook_getloggedin'));
  914. $fs = new FacebookStream($consumer_key,$consumer_secret,$agent,$app_id);
  915. $token = $fs->getAccessToken();
  916. $_SESSION['fb_request_token'] = $token;
  917. $fieldlist = array(
  918. 'last_name',
  919. 'first_name',
  920. 'pic_small',
  921. 'profile_blurb',
  922. 'profile_url',
  923. 'locale',
  924. 'name',
  925. 'proxied_email'
  926. );
  927. $fields = implode(',',$fieldlist);
  928. $user = $fs->getInfo( $_SESSION['fb_userid'], $fields );
  929. $values = array();
  930. $values[] = str_replace(' ','',strtolower((string)$user->user->name));
  931. $values[] = (string)$user->user->pic_small;
  932. $values[] = (string)$user->user->name;
  933. $values[] = (string)$user->user->profile_blurb;
  934. $values[] = (string)$user->user->profile_url;
  935. $values[] = (string)$user->user->locale;
  936. $Identity =& $db->model('Identity');
  937. $Person =& $db->model('Person');
  938. $FacebookUser =& $db->model('FacebookUser');
  939. if (empty($prefix) && in_array('invites',$db->tables)) {
  940. $Invite =& $db->model( 'Invite' );
  941. $result = $Invite->find_by( 'nickname', (string)$user->user->name );
  942. if (!$result)
  943. trigger_error('Sorry, you have not been invited yet '.environment('email_from'), E_USER_ERROR);
  944. }
  945. $faceuser = $FacebookUser->find_by( 'facebook_id',$_SESSION['fb_userid'] );
  946. // a) facebook user exists, does not have a profile_id
  947. // b) facebook user exists, HAS a profile_id
  948. // c) facebook user does not exist
  949. if ($faceuser) {
  950. if (!$faceuser->profile_id) {
  951. $i = make_identity($values);
  952. if (!$i)
  953. trigger_error('sorry I was unable to create an identity', E_USER_ERROR);
  954. $faceuser->set_value('profile_id',$i->id);
  955. $faceuser->save_changes();
  956. if (!$faceuser)
  957. trigger_error('sorry I was unable to create a facebook user', E_USER_ERROR);
  958. } else {
  959. // b
  960. $i = $Identity->find($faceuser->profile_id);
  961. if (!$i)
  962. trigger_error('sorry I was unable to find the identity', E_USER_ERROR);
  963. }
  964. } else {
  965. // c
  966. $i = make_identity($values);
  967. if (!$i)
  968. trigger_error('sorry I was unable to create an identity', E_USER_ERROR);
  969. $faceuser = make_fb_user($user,$i->id);
  970. if (!$faceuser)
  971. trigger_error('sorry I was unable to create a facebook user', E_USER_ERROR);
  972. $Setting =& $db->model('Setting');
  973. $cfg = $Setting->base();
  974. $cfg->set_value('profile_id',$i->id);
  975. $cfg->set_value('person_id',$i->person_id);
  976. $cfg->set_value('name','config.env.importfacebook_'.(string)$user->user->uid);
  977. $cfg->set_value('value',1);
  978. $cfg->save_changes();
  979. $cfg->set_etag();
  980. }
  981. $_SESSION['fb_person_id'] = $i->person_id;
  982. if (isset($_SESSION['fb_forward']))
  983. redirect_to($_SESSION['fb_forward']);
  984. redirect_to($request->base);
  985. }
  986. function make_fb_user( $user, $profile_id ) {
  987. global $db;
  988. $Identity =& $db->model('Identity');
  989. $Person =& $db->model('Person');
  990. $nickname = str_replace(' ','',strtolower((string)$user->user->name));
  991. $FacebookUser =& $db->model('FacebookUser');
  992. $faceuser = $FacebookUser->find_by( 'facebook_id',(string)$user->user->uid );
  993. if ($faceuser)
  994. return $faceuser;
  995. $faceuser = $FacebookUser->base();
  996. $faceuser->set_value('description', (string)$user->user->profile_blurb);
  997. $faceuser->set_value('screen_name', $nickname);
  998. $faceuser->set_value('url', (string)$user->user->profile_url);
  999. $faceuser->set_value('name', (string)$user->user->name);
  1000. $faceuser->set_value('protected', 0);
  1001. $faceuser->set_value('followers_count', 0);
  1002. $faceuser->set_value('profile_image_url', (string)$user->user->pic_small);
  1003. $faceuser->set_value('location', (string)$user->user->locale);
  1004. $faceuser->set_value('facebook_id', (string)$user->user->uid);
  1005. $faceuser->set_value('profile_id', $profile_id);
  1006. $faceuser->set_value('oauth_key', $_SESSION['fb_session']);
  1007. $faceuser->save_changes();
  1008. return $faceuser;
  1009. }
  1010. function make_twuser( $user, $profile_id, $oauthkey, $oauthsecret ) {
  1011. global $db;
  1012. $Identity =& $db->model('Identity');
  1013. $Person =& $db->model('Person');
  1014. $nickname = $user->screen_name;
  1015. $TwitterUser =& $db->model('TwitterUser');
  1016. $twuser = $TwitterUser->find_by( 'twitter_id',$user->id );
  1017. if ($twuser)
  1018. return $twuser;
  1019. $twuser = $TwitterUser->base();
  1020. $twuser->set_value('description',$user->description);
  1021. $twuser->set_value('screen_name',$nickname);
  1022. $twuser->set_value('url',$user->url);
  1023. $twuser->set_value('name',$user->name);
  1024. $twuser->set_value('protected',$user->protected);
  1025. $twuser->set_value('followers_count',$user->followers_count);
  1026. $twuser->set_value('profile_image_url',$user->profile_image_url);
  1027. $twuser->set_value('location',$user->location);
  1028. $twuser->set_value('twitter_id',$user->id);
  1029. $twuser->set_value('profile_id',$profile_id);
  1030. $twuser->set_value('oauth_key',$oauthkey);
  1031. $twuser->set_value('oauth_secret',$oauthsecret);
  1032. $twuser->save_changes();
  1033. return $twuser;
  1034. }
  1035. function openid_login( &$vars ) {
  1036. extract( $vars );
  1037. global $request;
  1038. if (isset($request->params['openid'])) {
  1039. $openid = urldecode($request->params['openid']);
  1040. if (!strstr($openid,'http'))
  1041. $openid = 'http://' . $openid;
  1042. if ("/" == substr($openid,-1))
  1043. $openid = substr( $openid, 0, -1 );
  1044. $request->set_param('return_url',$request->url_for( 'openid_continue' ).'/');
  1045. $request->set_param('protected_url',$request->base);
  1046. $request->set_param('openid_url',trim($openid));
  1047. authenticate_with_openid();
  1048. if (!(empty($_SESSION['requested_url'])))
  1049. redirect_to( $_SESSION['requested_url'] );
  1050. else
  1051. redirect_to( $request->base );
  1052. }
  1053. render( 'action', 'login' );
  1054. }
  1055. function openid_continue( &$vars ) {
  1056. extract( $vars );
  1057. $valid = false;
  1058. if ( class_exists('MySQL') && environment('openid_version') > 1 && !isset($_SESSION['openid_degrade']) ) {
  1059. global $openid;
  1060. wp_plugin_include(array(
  1061. 'wp-openid'
  1062. ));
  1063. $logic = new WordPressOpenID_Logic(null);
  1064. $logic->activate_plugin();
  1065. $consumer = WordPressOpenID_Logic::getConsumer();
  1066. $openid->response = $consumer->complete($_SESSION['oid_return_to']);
  1067. switch( $openid->response->status ) {
  1068. case Auth_OpenID_CANCEL:
  1069. trigger_error('The OpenID assertion was cancelled.', E_USER_ERROR );
  1070. break;
  1071. case Auth_OpenID_FAILURE:
  1072. // if we fail OpenID v2 here, we retry once with OpenID v1
  1073. $_SESSION['openid_degrade'] = true;
  1074. $request->set_param('return_url',$request->url_for( 'openid_continue' ).'/');
  1075. $request->set_param('protected_url',$request->base);
  1076. $request->set_param('openid_url',$_SESSION['openid_url']);
  1077. authenticate_with_openid();
  1078. break;
  1079. case Auth_OpenID_SUCCESS:
  1080. $_SESSION['openid_complete'] = true;
  1081. $valid = true;
  1082. break;
  1083. }
  1084. }
  1085. if (!($valid)) {
  1086. include $GLOBALS['PATH']['library'] . 'openid.php';
  1087. $openid = new SimpleOpenID;
  1088. $openid->SetIdentity( $_SESSION['openid_url'] );
  1089. $openid->SetApprovedURL( $request->url_for( 'openid_continue' ).'/');
  1090. $openid->SetTrustRoot( $request->base );
  1091. $server_url = $_SESSION['openid_server_url'];
  1092. $openid->SetOpenIDServer( $server_url );
  1093. $valid = $openid->ValidateWithServer();
  1094. }
  1095. if ($valid)
  1096. $_SESSION['openid_complete'] = true;
  1097. else
  1098. trigger_error( "Sorry, the openid server $server_url did not validate your identity.", E_USER_ERROR );
  1099. complete_openid_authentication( $request );
  1100. if (!(empty($_SESSION['requested_url'])))
  1101. redirect_to( $_SESSION['requested_url'] );
  1102. else
  1103. redirect_to( $request->base );
  1104. }
  1105. function security_init() {
  1106. global $request;
  1107. // add Routes -- route name, pattern to match, and default request parameters
  1108. $request->connect( 'openid_continue/:fromserver', array('action'=>'openid_continue') );
  1109. $request->connect( 'openid_continue' );
  1110. $request->connect( 'openid_login_return' );
  1111. $request->connect( 'openid_submit' );
  1112. $request->connect( 'password_submit' );
  1113. $request->connect( 'facebook_dologin' );
  1114. $request->connect( 'facebook_getloggedin' );
  1115. $request->connect( 'rsslike/:forurl', array('action'=>'like','resource'=>'posts'));
  1116. $request->connect( 'password_register' );
  1117. $request->connect( 'openid_logout' );
  1118. $request->connect( 'openid_login' );
  1119. $request->connect( 'openid_login/:openid', array('action'=>'openid_login') );
  1120. $request->connect( 'email_login' );
  1121. $request->connect( 'register' );
  1122. $request->connect( 'email_submit' );
  1123. $request->connect( 'ldap_login' );
  1124. $request->connect( 'ldap_submit' );
  1125. $request->connect( 'oauth_login' );
  1126. $request->connect( 'facebook_login' );
  1127. $request->connect( 'authsub' );
  1128. foreach (array(
  1129. 'api/direct_messages/sent'=>'api_direct_messages_sent',
  1130. 'api/direct_messages'=>'api_direct_messages',
  1131. 'api/statuses/mentions'=>'api_statuses_mentions',
  1132. 'api/users/show'=>'api_users_show',
  1133. 'api/rss/textInput'=>'api_rss_textInput'
  1134. ) as $f1=>$f2) {
  1135. $patterns = explode( '/', $f1 );
  1136. $requirements = array();
  1137. foreach ( $patterns as $pos => $str ) {
  1138. if ( substr( $str, 0, 1 ) == ':' ) {
  1139. $requirements[] = '[A-Za-z0-9_.]+';
  1140. }
  1141. }
  1142. $routesetup = array(
  1143. 'action'=>$f2,
  1144. 'resource'=>'posts'
  1145. );
  1146. if (count($requirements) > 0)
  1147. $routesetup['requirements'] = $requirements;
  1148. $request->connect(
  1149. $f1,
  1150. $routesetup
  1151. );
  1152. global $prefix;
  1153. if (!$prefix) {
  1154. global $db;
  1155. $Blog =& $db->model('Blog');
  1156. $Blog->set_limit(200);
  1157. $coll = new Collection('blogs');
  1158. while ($b = $coll->MoveNext()) {
  1159. $sub = $b->nickname;
  1160. $routesetup['stream'] = $sub;
  1161. $routesetup['prefix'] = $b->prefix;
  1162. if (is_array($patterns))
  1163. $request->connect(
  1164. $sub.'/'.implode('/',$patterns),
  1165. $routesetup
  1166. );
  1167. }
  1168. }
  1169. }
  1170. $request->connect( 'permanent_facebook_key/:key', array('action'=>'permanent_facebook_key') );
  1171. $request->routematch();
  1172. if (isset($_SESSION['fb_person_id'])
  1173. && $_SESSION['fb_person_id'] >0) {
  1174. $request->openid_complete = true;
  1175. return $_SESSION['fb_person_id'];
  1176. } elseif (isset($_SESSION['oauth_person_id'])
  1177. && $_SESSION['oauth_person_id'] >0) {
  1178. $request->openid_complete = true;
  1179. return $_SESSION['oauth_person_id'];
  1180. } elseif ( isset( $_SESSION['openid_complete'] ) && check_cookie() ) {
  1181. if ( !isset($request->openid_url) && $_SESSION['openid_complete'] == true)
  1182. $request->openid_complete = true;
  1183. } elseif (check_cookie()) {
  1184. $_SESSION['openid_complete'] = true;
  1185. $request->openid_complete = true;
  1186. }
  1187. }
  1188. function security_install() {
  1189. //
  1190. }
  1191. function security_uninstall() {
  1192. //
  1193. }
  1194. function get_twitter_oauth(){
  1195. global $db,$prefix,$request;
  1196. $sql = "SELECT oauth_key,oauth_secret FROM ".$prefix."twitter_users WHERE profile_id = ".get_profile_id();
  1197. $result = $db->get_result( $sql );
  1198. if ($db->num_rows($result) == 1) {
  1199. // http://abrah.am
  1200. lib_include('twitteroauth');
  1201. $key = $db->result_value($result,0,'oauth_key');
  1202. $secret = $db->result_value($result,0,'oauth_secret');
  1203. $consumer_key = environment( 'twitterKey' );
  1204. $consumer_secret = environment( 'twitterSecret' );
  1205. $to = new TwitterOAuth(
  1206. $consumer_key,
  1207. $consumer_secret,
  1208. $key,
  1209. $secret
  1210. );
  1211. return $to;
  1212. }
  1213. return false;
  1214. }
  1215. function get_twitter_screen_name($person_id=false){
  1216. global $db;
  1217. if (!$person_id)
  1218. $person_id = get_person_id();
  1219. $TwitterUser =& $db->model('TwitterUser');
  1220. $TwitterUser->has_one('profile_id:identities');
  1221. $stat = $TwitterUser->find_by(array(
  1222. 'identities.person_id'=>$person_id
  1223. ));
  1224. if ($stat){
  1225. $tu = $TwitterUser->MoveFirst();
  1226. return $tu->screen_name;
  1227. }
  1228. return false;
  1229. }
  1230. function explode_returned($responseString){
  1231. $r = array();
  1232. foreach (explode('&', $responseString) as $param) {
  1233. $pair = explode('=', $param, 2);
  1234. if (count($pair) != 2) continue;
  1235. $r[urldecode($pair[0])] = urldecode($pair[1]);
  1236. }
  1237. return $r;
  1238. }
  1239. function setup_google_account(){
  1240. if (!isset($_SESSION['googleAccessKey']) && !isset($_SESSION['googleAccessSecret']))
  1241. trigger_error('sorry the oauth credentials were not found', E_USER_ERROR);
  1242. global $request,$db;
  1243. $Setting =& $db->model('Setting');
  1244. $stat = $Setting->find_by(array('name'=>'google_key','profile_id'=>get_profile_id()));
  1245. if (!$stat && !empty($_SESSION['googleAccessKey']) && get_profile_id()) {
  1246. $stat = $Setting->base();
  1247. $stat->set_value('profile_id',get_profile_id());
  1248. $stat->set_value('person_id',get_person_id());
  1249. $stat->set_value('name','google_key');
  1250. $stat->set_value('value',$_SESSION['googleAccessKey']);
  1251. $stat->save_changes();
  1252. $stat->set_etag();
  1253. $stat = $Setting->base();
  1254. $stat->set_value('profile_id',get_profile_id());
  1255. $stat->set_value('person_id',get_person_id());
  1256. $stat->set_value('name','google_secret');
  1257. $stat->set_value('value',$_SESSION['googleAccessSecret']);
  1258. $stat->save_changes();
  1259. $stat->set_etag();
  1260. $cfg = $Setting->base();
  1261. $cfg->set_value('profile_id',get_profile_id());
  1262. $cfg->set_value('person_id',get_person_id());
  1263. $cfg->set_value('name','config.env.importgoogle_'.$_SESSION['googleAccessKey']);
  1264. $cfg->set_value('value',1);
  1265. $cfg->save_changes();
  1266. $cfg->set_etag();
  1267. }
  1268. if (isset($_SESSION['bz_forward']))
  1269. redirect_to($_SESSION['bz_forward']);
  1270. redirect_to($request->base);
  1271. exit;
  1272. // this is how you make a gdata api request
  1273. $endpoint = $scope;
  1274. $parsed = parse_url($endpoint);
  1275. $params = array();
  1276. parse_str($parsed['query'], $params);
  1277. lib_include('twitteroauth');
  1278. $base_url = $request->base;
  1279. $key = environment( 'googleKey' );
  1280. $secret = environment( 'googleSecret' );
  1281. $consumer = new OAuthConsumer($key, $secret, NULL);
  1282. $hmac_method = new OAuthSignatureMethod_HMAC_SHA1();
  1283. $token = get_oauth_token($_SESSION['googleAccessKey'], $_SESSION['googleAccessSecret']);
  1284. $oauth_req = OAuthRequest::from_consumer_and_token($consumer, $token, "GET", $endpoint, $params);
  1285. $oauth_req->sign_request($hmac_method, $consumer, $token);
  1286. $responseString = send_signed_request($oauth_req->get_normalized_http_method(),
  1287. $endpoint, $oauth_req->to_header(), NULL, false);
  1288. echo $responseString;
  1289. exit;
  1290. $key = environment( 'googleKey' );
  1291. $secret = environment( 'googleSecret' );
  1292. $hmac_method = new OAuthSignatureMethod_HMAC_SHA1();
  1293. $consumer = new OAuthConsumer($key, $secret, NULL);
  1294. $token = $arr['oauth_token'];
  1295. $tokensecret = $arr['oauth_token_secret'];
  1296. $token = new OAuthToken($token, $tokensecret);
  1297. $endpoint = 'https://mail.google.com/mail/feed/atom/';
  1298. $oauth_req = OAuthRequest::from_consumer_and_token($consumer, $token, "GET", $endpoint, NULL);
  1299. $oauth_req->sign_request($hmac_method, $consumer, $token);
  1300. $responseString = readUrl($oauth_req->to_url());
  1301. print_r($responseString);
  1302. }
  1303. function authsub( &$vars ) {
  1304. // unset($_SESSION['googleAccessSecret']);
  1305. // unset($_SESSION['googleAccessKey']);
  1306. // exit;
  1307. if (isset($_SESSION['googleAccessKey']) && isset($_SESSION['googleAccessSecret']))
  1308. setup_google_account();
  1309. extract($vars);
  1310. // $scope = 'https://mail.google.com/mail/feed/atom/';
  1311. if (isset($_GET['forward'])){
  1312. if (!empty($_SERVER['HTTP_REFERER']))
  1313. $_SESSION['bz_forward'] = $_SERVER['HTTP_REFERER'];
  1314. if (isset($_GET['callbackurl']))
  1315. $_SESSION['bz_forward'] = $_GET['callbackurl'];
  1316. }
  1317. $scope = 'https://www.googleapis.com/auth/buzz';
  1318. $base_url = $request->base;
  1319. $endpoints = array(
  1320. // 'https://www.google.com/accounts/OAuthGetRequestToken?scope='.$scope,
  1321. 'https://www.google.com/accounts/OAuthGetRequestToken?scope='.$scope,
  1322. // 'https://www.google.com/accounts/OAuthAuthorizeToken',
  1323. 'https://www.google.com/buzz/api/auth/OAuthAuthorizeToken',
  1324. 'https://www.google.com/accounts/OAuthGetAccessToken'
  1325. );
  1326. if (!isset($_SESSION['googleAccessKey']) && !isset($_SESSION['googleAccessSecret'])){
  1327. if ($request->oauth_verifier)
  1328. $_SESSION['google_verifier'] = $request->oauth_verifier;
  1329. $domain_parts = explode('.', $request->domain);
  1330. if (count($domain_parts) == 3) {
  1331. $bzdomain = $domain_parts[1].'.'.$domain_parts[2];
  1332. } else {
  1333. $bzdomain = $request->domain;
  1334. }
  1335. if (!isset($request->oauth_token)){
  1336. $callback_url = $base_url."/authsub";
  1337. $req_req = get_oauth_request(NULL,$endpoints[0], array('oauth_callback'=>$callback_url,'domain'=>$bzdomain) );
  1338. $responseString = readUrl($req_req->to_url());
  1339. $r = explode_returned($responseString);
  1340. $token = $r['oauth_token'];
  1341. $secret = $r['oauth_token_secret'];
  1342. $_SESSION['google_secret'] = $secret;
  1343. $auth_url = $endpoints[1] . "?oauth_token=$token&oauth_callback=".urlencode($callback_url).'&scope='.$scope.'&domain='.$bzdomain;
  1344. redirect_to($auth_url);
  1345. } else {
  1346. $token = get_oauth_token($request->oauth_token,$_SESSION['google_secret']);
  1347. $acc_req = get_oauth_request($token,$endpoints[2],array('oauth_verifier'=>$_SESSION['google_verifier'],'domain'=>$bzdomain));
  1348. $responseString = readUrl($acc_req->to_url());
  1349. $r = explode_returned($responseString);
  1350. $_SESSION['googleAccessKey'] = $r['oauth_token'];
  1351. $_SESSION['googleAccessSecret'] = $r['oauth_token_secret'];
  1352. redirect_to($request->url_for('authsub'));
  1353. }
  1354. }
  1355. setup_google_account();
  1356. }
  1357. function get_oauth_request($token,$endpoint,$addparams) {
  1358. if (!class_exists('OAuthToken'))
  1359. lib_include('twitteroauth');
  1360. $base_url = $request->base;
  1361. $key = environment( 'googleKey' );
  1362. $secret = environment( 'googleSecret' );
  1363. $consumer = new OAuthConsumer($key, $secret, NULL);
  1364. $hmac_method = new OAuthSignatureMethod_HMAC_SHA1();
  1365. $parsed = parse_url($endpoint);
  1366. parse_str($parsed['query'], $params);
  1367. foreach($addparams as $k=>$v)
  1368. $params[$k] = $v;
  1369. $rq = OAuthRequest::from_consumer_and_token($consumer, $token, "GET", $endpoint, $params);
  1370. $rq->sign_request($hmac_method, $consumer, $token);
  1371. return $rq;
  1372. }
  1373. function get_oauth_token($token,$secret){
  1374. if (!class_exists('OAuthToken'))
  1375. lib_include('twitteroauth');
  1376. return new OAuthToken($token,$secret);
  1377. }
  1378. function send_signed_request($http_method, $url, $auth_header=null,
  1379. $postData=null, $returnResponseHeaders=true) {
  1380. $curl = curl_init($url);
  1381. curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
  1382. curl_setopt($curl, CURLOPT_FAILONERROR, false);
  1383. curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
  1384. if ($returnResponseHeaders) {
  1385. curl_setopt($curl, CURLOPT_HEADER, true);
  1386. }
  1387. switch($http_method) {
  1388. case 'GET':
  1389. if ($auth_header) {
  1390. curl_setopt($curl, CURLOPT_HTTPHEADER, array($auth_header));
  1391. }
  1392. break;
  1393. case 'POST':
  1394. $headers = array('Content-Type: application/atom+xml', $auth_header);
  1395. curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
  1396. curl_setopt($curl, CURLOPT_POST, 1);
  1397. curl_setopt($curl, CURLOPT_POSTFIELDS, $postData);
  1398. break;
  1399. case 'PUT':
  1400. $headers = array('Content-Type: application/atom+xml', $auth_header);
  1401. curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
  1402. curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $http_method);
  1403. curl_setopt($curl, CURLOPT_POSTFIELDS, $postData);
  1404. break;
  1405. case 'DELETE':
  1406. $headers = array($auth_header);
  1407. curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
  1408. curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $http_method);
  1409. break;
  1410. }
  1411. $response = curl_exec($curl);
  1412. if (!$response) {
  1413. $response = curl_error($curl);
  1414. }
  1415. curl_close($curl);
  1416. return $response;
  1417. }
  1418. function facebook_timeline(&$vars){
  1419. extract($vars);
  1420. global $db,$prefix;
  1421. $sql = "SELECT DISTINCT facebook_id,oauth_key FROM ".$prefix."facebook_users, ".$prefix."identities WHERE ".$prefix."identities.person_id = ".get_person_id();
  1422. $result = $db->get_result( $sql );
  1423. if ($db->num_rows($result) == 1) {
  1424. $app_id = environment('facebookAppId');
  1425. $consumer_key = environment('facebookKey');
  1426. $consumer_secret = environment('facebookSecret');
  1427. $agent = environment('facebookAppName')." (curl)";
  1428. add_include_path(library_path());
  1429. add_include_path(library_path().'facebook-platform/php');
  1430. add_include_path(library_path().'facebook_stream');
  1431. require_once "FacebookStream.php";
  1432. require_once "Services/Facebook.php";
  1433. $sesskey = 'a441dc31cd9e03b5b03b9912-1421801327';
  1434. $appid = $app_id;
  1435. $userid = $db->result_value($result,0,'facebook_id');
  1436. require_once "facebook.php";
  1437. $fb = new Facebook($consumer_key, $consumer_secret, true);
  1438. // $fs = new FacebookStream($consumer_key,$consumer_secret,$agent,$app_id);
  1439. $facebook->api_client->session_key = $sesskey;
  1440. $facebook->api_client->user = $userid;
  1441. $data = $fb->api_client->stream_get();
  1442. print_r($data);
  1443. exit;
  1444. // $access_token = $db->result_value($result,0,'oauth_key');
  1445. $fs = new FacebookStream($consumer_key,$consumer_secret,$agent,$app_id);
  1446. $fs->verifyPerms($userid,'offline_access');
  1447. $hash = md5("app_id=".$appid."session_key=".$sesskey."source_id=".$userid.$fs->getApiSecret());
  1448. $url = 'http://www.facebook.com/activitystreams/feed.php';
  1449. $url .= '?source_id=';
  1450. $url .= $userid;
  1451. $url .= '&app_id=';
  1452. $url .= $appid;
  1453. $url .= '&session_key=';
  1454. $url .= $sesskey;
  1455. $url .= '&sig=';
  1456. $url .= $hash;
  1457. $url .= '&v=0.7&read';
  1458. $ch = curl_init();
  1459. if (defined("CURL_CA_BUNDLE_PATH")) curl_setopt($ch, CURLOPT_CAINFO, CURL_CA_BUNDLE_PATH);
  1460. curl_setopt($ch, CURLOPT_URL, $url);
  1461. curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 60);
  1462. curl_setopt($ch, CURLOPT_HEADER, false);
  1463. curl_setopt($ch, CURLOPT_TIMEOUT, 60);
  1464. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  1465. curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
  1466. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
  1467. curl_setopt($ch, CURLOPT_USERAGENT, "Safari " . phpversion());
  1468. $response = curl_exec($ch);
  1469. echo "<BR><BR>";
  1470. echo $response;
  1471. echo "<BR><BR>";
  1472. echo curl_getinfo($ch, CURLINFO_HTTP_CODE);
  1473. exit;
  1474. // $auth_token
  1475. //echo $_SESSION['fb_request_token']; exit;
  1476. $facebook = new Facebook($consumer_key, $consumer_secret);
  1477. $infinite_key_array = $facebook->api_client->auth_getSession('CC1E30');
  1478. print_r($infinite_key_array);
  1479. echo "<BR>";
  1480. echo $_SESSION['fb_session'];
  1481. exit;
  1482. $sesskey = $_SESSION['fb_session'];
  1483. $user = $fs->getInfo($userid,$fields);
  1484. $hash = md5("app_id=".$appid."session_key=".$sesskey."source_id=".$userid.$fs->getApiSecret());
  1485. $url = 'http://www.facebook.com/activitystreams/feed.php';
  1486. $url .= '?source_id=';
  1487. $url .= $userid;
  1488. $url .= '&app_id=';
  1489. $url .= $appid;
  1490. $url .= '&session_key=';
  1491. $url .= $sesskey;
  1492. $url .= '&sig=';
  1493. $url .= $hash;
  1494. $url .= '&v=0.7&read';
  1495. $hash = md5("v=1.0method=stream.getformat=XMLviewer_id=".$userid."session_key=".$sesskey."api_key=".$fs->getApiKey().$fs->getApiSecret());
  1496. $url = "http://api.facebook.com/restserver.php?v=1.0&method=stream.get&format=XML&viewer_id=$userid&session_key=$sesskey&api_key=".$fs->getApiKey()."&sig=$hash";
  1497. echo htmlspecialchars($url);
  1498. $ch = curl_init();
  1499. if (defined("CURL_CA_BUNDLE_PATH")) curl_setopt($ch, CURLOPT_CAINFO, CURL_CA_BUNDLE_PATH);
  1500. curl_setopt($ch, CURLOPT_URL, $url);
  1501. curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 60);
  1502. curl_setopt($ch, CURLOPT_HEADER, false);
  1503. curl_setopt($ch, CURLOPT_TIMEOUT, 60);
  1504. curl_setopt($curl, CURLOPT_POST, 1);
  1505. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  1506. curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
  1507. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
  1508. curl_setopt($ch, CURLOPT_USERAGENT, "Safari " . phpversion());
  1509. $response = curl_exec($ch);
  1510. echo "<BR><BR>";
  1511. echo $response;
  1512. echo "<BR><BR>";
  1513. echo curl_getinfo($ch, CURLINFO_HTTP_CODE);
  1514. exit;
  1515. $fieldlist = array(
  1516. 'last_name',
  1517. 'first_name',
  1518. 'pic_small',
  1519. 'profile_blurb',
  1520. 'profile_url',
  1521. 'locale',
  1522. 'name',
  1523. 'proxied_email'
  1524. );
  1525. $fields = implode(',',$fieldlist);
  1526. $user = $fs->getInfo($userid,$fields);
  1527. print_r($user); exit;
  1528. $fs->streamRequest( $userid );
  1529. exit;
  1530. //$token = $fs->getAccessToken();
  1531. // $session = $fs->getSession($access_token);
  1532. //print_r($session);
  1533. //print_r($sessid); exit;
  1534. //echo $fs->api->auth->getSession();exit;
  1535. //echo "app_id=".$appid."session_key=".$sesskey."source_id=".$userid."[p]".$fs->getApiSecret();
  1536. $hash = md5("app_id=".$appid."session_key=".$sesskey."source_id=".$userid.$fs->getApiSecret());
  1537. $url = 'http://www.facebook.com/activitystreams/feed.php';
  1538. $url .= '?source_id=';
  1539. $url .= $userid;
  1540. $url .= '&app_id=';
  1541. $url .= $appid;
  1542. $url .= '&session_key=';
  1543. $url .= $sesskey;
  1544. $url .= '&sig=';
  1545. $url .= $hash;
  1546. $url .= '&v=0.7&read';
  1547. echo htmlspecialchars($url);exit;
  1548. $ch = curl_init();
  1549. if (defined("CURL_CA_BUNDLE_PATH")) curl_setopt($ch, CURLOPT_CAINFO, CURL_CA_BUNDLE_PATH);
  1550. curl_setopt($ch, CURLOPT_URL, $url);
  1551. curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 60);
  1552. curl_setopt($ch, CURLOPT_HEADER, false);
  1553. curl_setopt($ch, CURLOPT_TIMEOUT, 60);
  1554. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  1555. curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
  1556. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
  1557. curl_setopt($ch, CURLOPT_USERAGENT, "Safari " . phpversion());
  1558. $response = curl_exec($ch);
  1559. echo $response;
  1560. echo "<BR><BR>";
  1561. echo curl_getinfo($ch, CURLINFO_HTTP_CODE);
  1562. exit;
  1563. echo 1; exit;
  1564. //$sessid = $_SESSION['fb_request_token'];
  1565. $fs->streamRequest($userid );
  1566. exit;
  1567. $token = $fs->getAccessToken();
  1568. //$_SESSION['fb_request_token'] = $token;
  1569. $sessid = $fs->getSession($token);
  1570. print_r($sessid); exit;
  1571. $fs->streamRequest( $userid );
  1572. echo 'done';
  1573. exit;
  1574. }
  1575. exit;
  1576. }
  1577. function has_twitter_account(){
  1578. global $db;
  1579. $TwitterUser =& $db->model('TwitterUser');
  1580. $TwitterUser->has_one('profile_id:identities');
  1581. $stat = $TwitterUser->find_by(array(
  1582. 'identities.person_id'=>get_person_id()
  1583. ));
  1584. if ($stat)
  1585. return true;
  1586. return false;
  1587. }
  1588. function has_facebook_account(){
  1589. global $db,$prefix;
  1590. $FacebookUser =& $db->model('FacebookUser');
  1591. $FacebookUser->has_one('profile_id:identities');
  1592. $stat = $FacebookUser->find_by(array(
  1593. 'identities.person_id'=>get_person_id()
  1594. ));
  1595. if ($stat)
  1596. return true;
  1597. return false;
  1598. }
  1599. function has_google_account(){
  1600. global $db;
  1601. $Setting =& $db->model('Setting');
  1602. $stat = $Setting->find_by(array(
  1603. 'person_id'=>get_person_id(),
  1604. 'eq' => 'like',
  1605. 'name' => '%importgoogle%'
  1606. ));
  1607. if ($stat->exists)
  1608. return true;
  1609. return false;
  1610. }
  1611. function has_flickr_account(){
  1612. global $db;
  1613. $Setting =& $db->model('Setting');
  1614. $stat = $Setting->find_by(array('name'=>'flickr_frob','person_id'=>get_person_id()));
  1615. if ($stat){
  1616. $stat = $Setting->find_by(array('name'=>'flickr_status','person_id'=>get_person_id()));
  1617. if (!$stat) {
  1618. $stat = $Setting->base();
  1619. $stat->set_value('profile_id',get_profile_id());
  1620. $stat->set_value('person_id',get_person_id());
  1621. $stat->set_value('name','flickr_status');
  1622. $stat->set_value('value','enabled');
  1623. $stat->save_changes();
  1624. $stat->set_etag();
  1625. }
  1626. return true;
  1627. }
  1628. return false;
  1629. }
  1630. function setup_new_tweetiepic( &$rec ) {
  1631. global $request,$db;
  1632. $url = blog_url($rec->nickname,true);
  1633. require_once(ABSPATH.WPINC.'/class-snoopy.php');
  1634. $snoop = new Snoopy;
  1635. $snoop->agent = 'OpenMicroBlogger http://openmicroblogger.org';
  1636. $snoop->submit($url);
  1637. if (!strpos($snoop->response_code, '200'))
  1638. trigger_error('unable to connect to your new microblog stream',E_USER_ERROR);
  1639. $profile = get_profile();
  1640. $Identity =& $db->model('Identity');
  1641. $Person =& $db->model('Person');
  1642. $user_identity = get_profile();
  1643. $user_person = $Person->find($user_identity->person_id);
  1644. global $prefix;
  1645. $prefix = $rec->prefix."_";
  1646. $db->prefix = $prefix;
  1647. $Entry =& $db->model('Entry');
  1648. $Entry->save();
  1649. $Setting =& $db->model('Setting');
  1650. $Setting->save();
  1651. $Method =& $db->model('Method');
  1652. $Method->save();
  1653. $Identity =& $db->model('Identity');
  1654. $Identity->save();
  1655. $Person =& $db->model('Person');
  1656. $Person->save();
  1657. $p = $Person->base();
  1658. foreach ($user_person->attributes as $key=>$val)
  1659. $p->set_value($key, $val);
  1660. $p->save();
  1661. $i= $Identity->base();
  1662. $i->set_value( 'id', $user_identity->id );
  1663. $i->set_value( 'person_id', $p->id );
  1664. $i->set_value( 'label', 'profile 1' );
  1665. $i->set_value( 'nickname', $user_identity->nickname );
  1666. $i->set_value( 'url', blog_url($rec->nickname,true)."".$user_identity->nickname );
  1667. // $i->set_value( 'password', md5($passer) );
  1668. $i->set_value( 'bio', $passer );
  1669. $i->set_value( 'avatar', base_path(true).'resource/favicon.png' );
  1670. //echo $passer;
  1671. $i->save_changes();
  1672. $i->set_etag( $p->id );
  1673. $Membership =& $db->model('Membership');
  1674. $Membership->save();
  1675. $me = $Membership->base();
  1676. $me->set_value( 'person_id', $p->id);
  1677. $me->set_value( 'group_id', 2 );
  1678. $me->save_changes();
  1679. $me->set_etag($p->id);
  1680. $Setting =& $db->model('Setting');
  1681. $user = '';
  1682. $pass = '';
  1683. $data = base64_encode('a:14:{s:7:"service";s:5:"other";s:8:"location";s:0:"";s:11:"yourls_path";s:0:"";s:10:"yourls_url";s:0:"";s:12:"yourls_login";s:0:"";s:15:"yourls_password";s:0:"";s:5:"other";s:4:"rply";s:11:"bitly_login";s:0:"";s:14:"bitly_password";s:0:"";s:10:"trim_login";s:0:"";s:13:"trim_password";s:0:"";s:10:"rply_login";s:3:"'.$user.'";s:13:"rply_password";s:5:"'.$pass.'";s:19:"pingfm_user_app_key";s:0:"";}');
  1684. $s = $Setting->base();
  1685. $s->set_value('profile_id',$user_identity->id);
  1686. $s->set_value('person_id',$p->id);
  1687. $s->set_value('name','ozh_yourls');
  1688. $s->set_value('value',$data);
  1689. $s->save_changes();
  1690. $s->set_etag($p->id);
  1691. $s = $Setting->base();
  1692. $s->set_value('profile_id',$user_identity->id);
  1693. $s->set_value('person_id',$p->id);
  1694. $s->set_value('name','twitter_status');
  1695. $s->set_value('value','enabled');
  1696. $s->save_changes();
  1697. $s->set_etag($p->id);
  1698. $s = $Setting->base();
  1699. $s->set_value('profile_id',$user_identity->id);
  1700. $s->set_value('person_id',$p->id);
  1701. $s->set_value('name','facebook_status');
  1702. $s->set_value('value','disabled');
  1703. $s->save_changes();
  1704. $s->set_etag($p->id);
  1705. $m = $Method->base();
  1706. $m->set_value( 'code', '
  1707. do_shorten();
  1708. ');
  1709. $m->set_value( 'function', 'api_trim_url' );
  1710. $m->set_value( 'route', 'api/trim_url' );
  1711. $m->set_value( 'resource', 'posts' );
  1712. $m->set_value( 'permission', 'read' );
  1713. $m->set_value( 'enabled', true );
  1714. $m->set_value( 'omb', 0 );
  1715. $m->set_value( 'oauth', 1 );
  1716. $m->set_value( 'http', 1 );
  1717. $m->save_changes();
  1718. $m->set_etag($p->id);
  1719. $m = $Method->base();
  1720. $m->set_value( 'code', '
  1721. do_shorten();
  1722. ');
  1723. $m->set_value( 'function', 'api_trim_simple' );
  1724. $m->set_value( 'route', 'api/trim_simple' );
  1725. $m->set_value( 'resource', 'posts' );
  1726. $m->set_value( 'permission', 'read' );
  1727. $m->set_value( 'enabled', true );
  1728. $m->set_value( 'omb', 0 );
  1729. $m->set_value( 'oauth', 1 );
  1730. $m->set_value( 'http', 1 );
  1731. $m->save_changes();
  1732. $m->set_etag($p->id);
  1733. redirect_to($request->base);
  1734. }
  1735. function set_my_tweetiepic_pass() {
  1736. $stream = get_option('tweetiepic_stream',get_profile_id());
  1737. global $db,$request;
  1738. if ($stream){
  1739. $Blog =& $db->model('Blog');
  1740. $b = $Blog->find_by('prefix',$stream);
  1741. $blognick = $b->nickname;
  1742. $blogprefix = $b->prefix;
  1743. } else {
  1744. return;
  1745. }
  1746. $profile_id = get_profile_id();
  1747. global $prefix;
  1748. $prefix = $blogprefix."_";
  1749. $db->prefix = $prefix;
  1750. $Identity =& $db->model('Identity');
  1751. $i= $Identity->find($profile_id);
  1752. $i->set_value( 'password', md5($_POST['newpass']) );
  1753. $i->save_changes();
  1754. redirect_to($request->base);
  1755. }
  1756. function add_thumbs_if_blob($url){
  1757. global $db;
  1758. $Post =& $db->model('Post');
  1759. $p = $Post->find_by(array('url'=>$url));
  1760. if (!($p->id > 0))
  1761. return false;
  1762. $Entry =& $db->model('Entry');
  1763. $e = false;
  1764. $e = $Entry->find($p->entry_id);
  1765. if ($e)
  1766. return add_rss_if_blob($p,$url,$e);
  1767. return false;
  1768. }
  1769. function activity_object_content_type($url){
  1770. global $db;
  1771. $Post =& $db->model('Post');
  1772. $p = $Post->find_by(array('url'=>$url));
  1773. if (!$p)
  1774. return false;
  1775. $Entry =& $db->model('Entry');
  1776. $e = false;
  1777. $e = $Entry->find($p->entry_id);
  1778. if ($e)
  1779. return $e->content_type;
  1780. return false;
  1781. }
  1782. function activity_object_type($url){
  1783. global $db;
  1784. $content_type = false;
  1785. $result = $db->get_result("select entry_id,id from ".$db->prefix."posts where url like '$url'");
  1786. if ($db->num_rows($result) == 1) {
  1787. $entry_id = $db->result_value($result,0,"entry_id");
  1788. $id = $db->result_value($result,0,"id");
  1789. $result = $db->get_result("select content_type from ".$db->prefix."entries where id = $entry_id");
  1790. if ($db->num_rows($result) == 1) {
  1791. $content_type = $db->result_value($result,0,"content_type");
  1792. }
  1793. }
  1794. if ($content_type == 'image/jpeg')
  1795. return 'photo';
  1796. $Annotation =& $db->model('Annotation');
  1797. if (!$db->table_exists('annotations'))
  1798. $Annotation->save();
  1799. $Annotation->find_by(array('target_id'=>$id));
  1800. $a = $Annotation->MoveFirst();
  1801. if ($a->json){
  1802. if (!function_exists('json_encode'))
  1803. lib_include('json');
  1804. $j = new Services_JSON();
  1805. $ann = $j->decode($a->json);
  1806. if (count($ann) > 0)
  1807. return $ann;
  1808. }
  1809. return 'note';
  1810. }
  1811. function api_direct_messages() {
  1812. echo "";
  1813. exit;
  1814. }
  1815. function api_statuses_mentions() {
  1816. echo "";
  1817. exit;
  1818. }
  1819. function api_users_show() {
  1820. echo "";
  1821. exit;
  1822. }
  1823. function api_direct_messages_sent() {
  1824. echo "";
  1825. exit;
  1826. }
  1827. function api_rss_textInput() {
  1828. global $db;
  1829. global $request;
  1830. $Post =& $db->model('Post');
  1831. $ch = curl_init();
  1832. curl_setopt($ch, CURLOPT_URL,$request->feed);
  1833. curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
  1834. curl_setopt($ch, CURLOPT_TIMEOUT, 30);
  1835. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  1836. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
  1837. $buf = curl_exec($ch);
  1838. $res2 = simplexml_load_string($buf);
  1839. $senditem = '';
  1840. foreach($res2 as $b){
  1841. if (isset($b->item)){
  1842. $senditem = $b->item->asXML();
  1843. }
  1844. }
  1845. $xml = (array)simplexml_load_string($senditem);
  1846. $i = false;
  1847. $profile_url = false;
  1848. $avatar_url = false;
  1849. $username = '';
  1850. foreach($xml['subject'] as $k=>$v){
  1851. if ($k == 'link'){
  1852. $parts = (array)$v;
  1853. if ($parts['@attributes']['rel'] == 'alternate'){
  1854. $profile_url = $parts['@attributes']['href'];
  1855. }
  1856. if ($parts['@attributes']['rel'] == 'avatar'){
  1857. $avatar_url = $parts['@attributes']['href'];
  1858. }
  1859. }
  1860. if ($k == 'preferredUsername'){
  1861. $username = (string)$v;
  1862. }
  1863. }
  1864. if (!$profile_url || !$avatar_url || empty($username))
  1865. trigger_error(E_USER_ERROR,'could not generate identity');
  1866. $Identity =& $db->model('Identity');
  1867. $i = $Identity->find_by(array('post_notice'=>$profile_url));
  1868. if (!($i->id > 0))
  1869. $i = false;
  1870. if (!$i){
  1871. $arr = array(
  1872. $username,
  1873. $avatar_url,
  1874. $username,
  1875. '',
  1876. $profile_url,
  1877. ''
  1878. );
  1879. $i = make_identity($arr);
  1880. $i->set_value( 'update_profile', $profile_url );
  1881. $i->set_value( 'post_notice', $profile_url );
  1882. $i->save_changes();
  1883. }
  1884. if (!$i)
  1885. trigger_error('sorry I was unable to create an identity', E_USER_ERROR);
  1886. foreach($xml as $k=>$v){
  1887. if ($k == 'in-reply-to'){
  1888. $rply = (array)$v;
  1889. if (isset($rply['@attributes']['href'])){
  1890. $parent = $Post->find_by(array('url'=>$rply['@attributes']['href']));
  1891. if (!($parent->id > 0))
  1892. trigger_error('bad reply ID',E_USER_ERROR);
  1893. $p = $Post->base();
  1894. $p->set_value( 'profile_id', $i->id );
  1895. $p->set_value( 'parent_id', $parent->id );
  1896. $p->set_value( 'title', (string)$xml['title'] );
  1897. $p->save_changes();
  1898. $p->set_etag($i->person_id);
  1899. trigger_after( 'insert_from_post', $Post, $p );
  1900. $p->save_changes();
  1901. // notify the author of the original object
  1902. // notify any tagged people in the object
  1903. $Annotation =& $db->model('Annotation');
  1904. if (!$db->table_exists('annotations'))
  1905. $Annotation->save();
  1906. $Annotation->set_param('find_by',array('target_id'=>$parent->entry_id));
  1907. $Annotation->find();
  1908. $a = $Annotation->MoveFirst();
  1909. if ($a->json){
  1910. if (!class_exists('Services_JSON'))
  1911. lib_include('json');
  1912. $j = new Services_JSON();
  1913. $activity = $j->decode($a->json);
  1914. }
  1915. $discov = $activity[0]->annotations->activity->object;
  1916. $feeds = discover_feeds( $discov );
  1917. foreach($feeds as $f){
  1918. $input = discover_textInput($f);
  1919. if (is_array($input)) {
  1920. if (isset($input['link'])){
  1921. $reply_to = $input['link'];
  1922. $parts = split('mailto:',$reply_to);
  1923. $recipient = $parts[1];
  1924. global $request;
  1925. $subject = 'New comment on a photo of you at '.$request->base;
  1926. $email = "New comment on a photo of you:\n\n".$p->url."\n\n";
  1927. $html = false;
  1928. send_email( $recipient, $subject, $email, environment('email_from'), environment('email_name'), $html );
  1929. }
  1930. }
  1931. }
  1932. $subject = 'New comment on your post at '.$request->base;
  1933. $email = "New comment on your post:\n\n".$p->url."\n\n";
  1934. $html = false;
  1935. $pro = owner_of($parent);
  1936. if (!empty($pro->email_value));
  1937. send_email( $pro->email_value, $subject, $email, environment('email_from'), environment('email_name'), $html );
  1938. }
  1939. }
  1940. }
  1941. exit;
  1942. if (isset($handler->data['items'][0]['thr:in-reply-to']['href'])){
  1943. $parent = $Post->find_by(array('url'=>$handler->data['items'][0]['thr:in-reply-to']['href']));
  1944. if (!($parent->id > 0))
  1945. trigger_error(E_USER_ERROR,'bad reply ID');
  1946. $p = $Post->base();
  1947. /*
  1948. <activity:subject>
  1949. <activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
  1950. <atom:id>http://localhost/~brian/brianjesse-clone/index.php/user/1</atom:id>
  1951. <atom:title>brianjesse</atom:title>
  1952. <atom:link rel="alternate" type="text/html" href="http://localhost/~brian/brianjesse-clone/index.php/brianjesse"></atom:link>
  1953. <atom:link rel="avatar" type="image/png" media:width="96" media:height="96" href="http://localhost/~brian/brianjesse-clone/theme/default/default-avatar-profile.png"></atom:link>
  1954. <atom:link rel="avatar" type="image/png" media:width="48" media:height="48" href="http://localhost/~brian/brianjesse-clone/theme/default/default-avatar-stream.png"></atom:link>
  1955. <atom:link rel="avatar" type="image/png" media:width="24" media:height="24" href="http://localhost/~brian/brianjesse-clone/theme/default/default-avatar-mini.png"></atom:link>
  1956. <poco:preferredUsername>brianjesse</poco:preferredUsername>
  1957. <poco:displayName>brianjesse</poco:displayName>
  1958. </activity:subject>
  1959. */
  1960. $profile_url = $handler->data['items'][0];
  1961. /* $p->set_value( 'profile_id', $sender->id );
  1962. $p->set_value( 'parent_id', $parent->id );
  1963. $p->set_value( 'uri', $notice_uri );
  1964. $p->set_value( 'url', $notice_url );
  1965. $p->set_value( 'title', $content );
  1966. $p->save_changes();
  1967. $p->set_etag($sender->person_id);
  1968. trigger_after( 'insert_from_post', $Post, $p );
  1969. */
  1970. }
  1971. exit;
  1972. }
  1973. function render_rss_feed($pro,$tweets,$like = false,$likedata = false, $return = false){
  1974. global $request;
  1975. add_include_path(library_path());
  1976. include 'Zend/Feed.php';
  1977. $feed = array();
  1978. $feed['title'] = environment('site_title').' / '.$pro->nickname;
  1979. $feed['link'] = $request->url_for(array('resource'=>'api/statuses/user_timeline/')).$pro->id.'.rss';
  1980. $feed['charset'] = 'utf-8';
  1981. $feed['language'] = 'en-us';
  1982. $feed['published'] = strtotime( $tweets->updated );
  1983. $feed['entries'] = array();
  1984. $input = get_option('textinput_link',get_profile_id());
  1985. // if (empty($input))
  1986. $input = $request->url_for(array('resource'=>'api/rss/textInput'));
  1987. $feed['textInput'] = array(
  1988. 'title' => '@reply '.$pro->nickname,
  1989. 'description'=>'send a reply to '.$pro->nickname,
  1990. 'name'=>'guid',
  1991. 'link'=>$input
  1992. );
  1993. while ($p = $tweets->MoveNext()) {
  1994. $entry = array();
  1995. $entry['title'] = iconv('UTF-8', 'ASCII//TRANSLIT', $p->title);
  1996. $entry['link'] = $request->url_for(array('resource'=>'posts','id'=>$p->id));
  1997. $entry['description'] = iconv('UTF-8', 'ASCII//TRANSLIT', $p->body);
  1998. $entry['atom:content'] = $entry['description'];
  1999. $entry['lastUpdate'] = strtotime( $p->created );
  2000. $feed['entries'][] = $entry;
  2001. }
  2002. if (!function_exists('set_default_omb_cloud_options'))
  2003. include(app_path().'rsscloud/rsscloud.php');
  2004. if ( '' == get_option( 'cloud_domain' ) )
  2005. set_default_omb_cloud_options();
  2006. $feedObj = Zend_Feed::importArray($feed, 'rss');
  2007. $data = (string) $feedObj->saveXml();
  2008. echo $data;
  2009. if ($return)
  2010. return true;
  2011. exit;
  2012. $tweets->rewind();
  2013. add_action('rss2_head','load_my_cloud_element');
  2014. lib_include( 'rsscloud_element' );
  2015. if (empty($pro->profile_url))
  2016. $pro->profile_url = $request->url_for(array('resource'=>$pro->nickname));
  2017. echo '<?xml version="1.0"?>
  2018. <!-- RSS generated by OpenMicroBlogger v0.5.0 on '.date( "n/j/Y; g:i:s A e" ).' -->
  2019. <rss version="2.0" xmlns:scripting="http://flickrfan.org/scriptingNamespace.html" xmlns:media="http://search.yahoo.com/mrss/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:activity="http://activitystrea.ms/spec/1.0/" xmlns:georss="http://www.georss.org/georss" xmlns:poco="http://portablecontacts.net/spec/1.0">
  2020. <channel>
  2021. <title>'.environment('site_title').' / '.$pro->nickname.'</title>
  2022. <link>'.$pro->profile_url.'</link>';
  2023. echo '
  2024. <atom:link type="application/rss+xml" href="'.$request->url_for(array('resource'=>'api/statuses/user_timeline/')).$pro->id.'.rss'.'" rel="self"></atom:link>
  2025. <image>
  2026. <link>'.$pro->profile_url.'</link>
  2027. <title>'.$pro->nickname.'</title>
  2028. <url>'.$pro->avatar.'</url>
  2029. </image>'; echo '
  2030. <description>'.environment('site_title').' updates from '.$pro->fullname.' / @'.$pro->nickname.'</description>
  2031. <language>en-us</language>
  2032. <copyright></copyright>
  2033. <pubDate>'.date( "D, j M Y H:i:s T" ).'</pubDate>
  2034. <lastBuildDate>'.date( "D, j M Y H:i:s T", strtotime( $tweets->updated )).'</lastBuildDate>
  2035. <generator>OpenMicroBlogger</generator>
  2036. ';
  2037. do_action('rss2_head');
  2038. echo '
  2039. ';
  2040. while ($p = $tweets->MoveNext()) {
  2041. global $db;
  2042. $islike = false;
  2043. if ($p->parent_id > 0) {
  2044. $Like =& $db->model('Like');
  2045. $Like->find_by(array('post_id'=>$p->parent_id));
  2046. if ($Like->rowcount() == 1)
  2047. $islike = true;
  2048. }
  2049. $like = false;
  2050. if ($islike)
  2051. $like = true;
  2052. $posturl = $request->url_for(array('resource'=>'posts','id'=>$p->id));
  2053. $comurl = $posturl;
  2054. $tit = iconv('UTF-8', 'ASCII//TRANSLIT', $p->title);
  2055. $bod = iconv('UTF-8', 'ASCII//TRANSLIT', $p->body);
  2056. if ($like){
  2057. $favdpost = $db->get_record( 'posts',$p->parent_id );
  2058. $owner = get_profile($favdpost->profile_id);
  2059. if (!is_object($favdpost)) continue;
  2060. $favorited_url = $favdpost->url;
  2061. $favorited_title = iconv('UTF-8', 'ASCII//TRANSLIT', $favdpost->title);
  2062. $favorited_time = $favdpost->created;
  2063. $favorited_channel = ''.environment('site_title').' / '.$owner->nickname.'';
  2064. $favorited_channel_feed = $request->url_for(array('resource'=>'api/statuses/user_timeline/')).$owner->id.'.rss';
  2065. $favorited_channel_html = $owner->homepage;
  2066. $favorited_user_numeric_profile = $owner->profile;
  2067. $favorited_user_fullname = $owner->fullname;
  2068. $favorited_user_profile_url = $owner->profile_url;
  2069. $favorited_user_avatar_url = $owner->avatar;
  2070. $favorited_user_nickname = $owner->nickname;
  2071. $favorited_user_bio = $owner->bio;
  2072. $favorited_user_location = $owner->locality;
  2073. $favorited_user_homepage = $owner->homepage;
  2074. }
  2075. $private = false;
  2076. $permission = ' <osw:acl-action permission="http://onesocialweb.org/spec/1.0/acl/permission/grant">
  2077. http://onesocialweb.org/spec/1.0/acl/action/view
  2078. </osw:acl-action>
  2079. <osw:acl-subject type="http://onesocialweb.org/spec/1.0/acl/subject/everyone"/>
  2080. </osw:acl-rule>
  2081. ';
  2082. echo ' <item>
  2083. <title>'.$tit.'</title>';
  2084. if ($like) echo '
  2085. <activity:verb>http://activitystrea.ms/schema/1.0/like</activity:verb>
  2086. <activity:object>
  2087. <atom:id>'.$favorited_url.'</atom:id>
  2088. <atom:title>'.$favorited_title.'</atom:title>
  2089. <atom:published>'.date( "D, j M Y H:i:s T", strtotime( $favorited_time )).'</atom:published>
  2090. <atom:link rel="alternate" type="text/html" href="'.$favorited_url.'" />
  2091. <atom:source>
  2092. <atom:title>'.$favorited_channel.'</atom:title>
  2093. <atom:link rel="self" type="application/rss+xml" href="'.$favorited_channel_feed.'" />
  2094. <atom:link rel="alternate" type="text/html" href="'.$favorited_channel_html.'" />
  2095. </atom:source>
  2096. </activity:object>
  2097. <activity:actor>
  2098. <activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
  2099. <atom:id>'.$favorited_user_numeric_profile.'</atom:id>
  2100. <atom:title>'.$favorited_user_fullname.'</atom:title>
  2101. <atom:link rel="alternate" type="text/html" href="'.$favorited_user_profile_url.'"/>
  2102. <atom:link rel="avatar" type="image/jpeg" media:width="96" media:height="96" href="'.$favorited_user_avatar_url.'"/>
  2103. <poco:preferredUsername>'.$favorited_user_nickname.'</poco:preferredUsername>
  2104. <poco:displayName>'.$favorited_user_fullname.'</poco:displayName>
  2105. <poco:note>'.$favorited_user_bio.'</poco:note>
  2106. <poco:address>
  2107. <poco:formatted>'.$favorited_user_location.'</poco:formatted>
  2108. </poco:address>
  2109. <poco:urls>
  2110. <poco:type>homepage</poco:type>
  2111. <poco:value>'.$favorited_user_homepage.'</poco:value>
  2112. <poco:primary>true</poco:primary>
  2113. </poco:urls>
  2114. </activity:actor>
  2115. '; else echo '
  2116. '; echo ' <link>'.$posturl.add_extension_if_blob($p).'</link>
  2117. <scripting:byline>'.$pro->fullname.'</scripting:byline>
  2118. <guid>'.$posturl.'</guid>
  2119. <comments>'.$comurl.'</comments>
  2120. <description>'.$bod.'</description>
  2121. <pubDate>'.date( "D, j M Y H:i:s T", strtotime( $p->created )).'</pubDate>'.add_rss_if_blob($p,$posturl); if ($private) echo $permission; echo '
  2122. </item>
  2123. ';
  2124. }
  2125. echo ' </channel>
  2126. </rss>
  2127. ';
  2128. }
  2129. function add_extension_if_blob($p){
  2130. global $db;
  2131. $Entry =& $db->model('Entry');
  2132. $e = $Entry->find($p->entry_id);
  2133. if (in_array(extension_for($e->content_type), array('jpg','png','gif')))
  2134. return "/entry.".extension_for($e->content_type);
  2135. return "";
  2136. }
  2137. function add_rss_if_blob($p,$posturl,$e=false){
  2138. global $db,$request;
  2139. $Upload =& $db->model('Upload');
  2140. $Entry =& $db->model('Entry');
  2141. if ($e)
  2142. $u = $p;
  2143. if (!$e){
  2144. $u = $Upload->find_by(array(
  2145. 'eq' => 'like',
  2146. 'title'=>substr($p->title,0,-10)
  2147. ));
  2148. if (!$u) return;
  2149. }
  2150. if (!$e)
  2151. $e = $Entry->find($u->entry_id);
  2152. if (in_array(extension_for($e->content_type), array('jpg','png','gif'))){
  2153. $origurl = $request->url_for(array('resource'=>$u->table,'action'=>'entry.'.extension_for($e->content_type),'id'=>$u->id));
  2154. $thumburl = false;
  2155. $folder = 'uploads/';
  2156. $Thumbnail =& $db->model('Thumbnail');
  2157. $t = $Thumbnail->find_by(array('target_id'=>$e->id));
  2158. if (!$t){
  2159. } else {
  2160. $thumburl = $request->url_for(array('resource'=>$u->table,'action'=>'preview.'.extension_for($e->content_type),'id'=>$u->id));
  2161. }
  2162. return array($origurl,$e->content_type,0,0,0,$thumburl,0,0);
  2163. //return array($origurl,$e->content_type,filesize($download),imagesy($pic),imagesx($pic),,imagesy($th),imagesx($th));
  2164. return
  2165. '
  2166. <enclosure url="'.$origurl.'" type="'.$e->content_type.'" length="'.filesize($download).'" />
  2167. <media:content url="'.$origurl.'" type="'.$e->content_type.'" height="'.imagesy($pic).'" width="'.imagesx($pic).'"/>
  2168. <media:title>'.$p->title.'</media:title>
  2169. <media:description type="html">'.$p->body.'</media:description>
  2170. <media:thumbnail url="'.$thumburl.'" height="'.imagesy($th).'" width="'.imagesx($th).'"/>';
  2171. }
  2172. return "";
  2173. }
  2174. function permanent_facebook_key(&$vars){
  2175. extract($vars);
  2176. $app_id = environment('facebookAppId');
  2177. $consumer_key = environment('facebookKey');
  2178. $consumer_secret = environment('facebookSecret');
  2179. $agent = environment('facebookAppName')." (curl)";
  2180. add_include_path(library_path());
  2181. add_include_path(library_path().'facebook-platform/php');
  2182. add_include_path(library_path().'facebook_stream');
  2183. require_once "facebook.php";
  2184. require_once "FacebookStream.php";
  2185. require_once "Services/Facebook.php";
  2186. $facebook = new Facebook($consumer_key, $consumer_secret);
  2187. $infinite_key_array = $facebook->api_client->auth_getSession($request->params['key']);
  2188. if ($infinite_key_array['session_key'])
  2189. echo "your permanent session key is ". $infinite_key_array['session_key'];
  2190. else
  2191. echo "sorry there was an error getting your permanent session key";
  2192. exit;
  2193. }