Browse Source

- Important update : remove all link to Jaxl XMPP library

- Load Moxl XMPP library
- Start cleaning all the code relative to Jaxl
- Update login widget to manage On The Fly connexion 
- Update Roster and Chat to make them working with Moxl
- Update Datajar to the dev branch (JOIN + new query)
- Update Session and Cache to fil with Datajar
- Update Main Controller to fit with the new Session system
- Clean User code to fit with the new session system
pull/5/head
Jaussoin Timothée 14 years ago
parent
commit
368823f177
  1. 10
      loader.php
  2. 40
      system/Cache.php
  3. 8
      system/Controller/ControllerMain.php
  4. 18
      system/Datas/Message.php
  5. 16
      system/Datas/Presence.php
  6. 3
      system/Jabber.php
  7. 5
      system/RPC.php
  8. 80
      system/Session.php
  9. 28
      system/User.php
  10. 4
      system/Widget/WidgetBase.php
  11. 123
      system/Widget/WidgetCommon.php
  12. 155
      system/Widget/widgets/Chat/Chat.php
  13. 16
      system/Widget/widgets/Chat/chat.js
  14. 14
      system/Widget/widgets/Feed/Feed.php
  15. 191
      system/Widget/widgets/Login/Login.php
  16. 74
      system/Widget/widgets/Login/login.css
  17. 3
      system/Widget/widgets/Login/login.js
  18. 11
      system/Widget/widgets/Profile/Profile.php
  19. 63
      system/Widget/widgets/Roster/Roster.php
  20. 18
      system/Widget/widgets/Roster/roster.css
  21. 7
      system/Widget/widgets/Roster/roster.js
  22. 6
      system/Widget/widgets/Vcard/Vcard.php
  23. 3
      system/Widget/widgets/Vcard/vcard.js
  24. 4
      themes/movim/main.tpl
  25. 4
      themes/movim/profile.tpl

10
loader.php

@ -14,7 +14,8 @@ define('USERS_PATH', BASE_PATH . 'user/');
// Loads up all system libraries.
require_once(LIB_PATH . "Lang/i18n.php");
require_once(LIB_PATH . "Datajar/loader.php");
require_once(LIB_PATH . "Datajar2/Datajar/loader.php");
load_datajar(array('sqlite'));
require_once(LIB_PATH . "Datas/Caps.php");
@ -30,12 +31,14 @@ require_once(LIB_PATH . "Utils.php");
require_once(LIB_PATH . "Cache.php");
require_once(LIB_PATH . "Conf.php");
require_once(LIB_PATH . "Event.php");
require_once(LIB_PATH . "Jabber.php");
//require_once(LIB_PATH . "Jabber.php");
require_once(LIB_PATH . "Logger.php");
require_once(LIB_PATH . "MovimException.php");
require_once(LIB_PATH . "RPC.php");
require_once(LIB_PATH . "User.php");
require_once(LIB_PATH . "Moxl/loader.php");
require_once(LIB_PATH . "Controller/ControllerBase.php");
require_once(LIB_PATH . "Controller/ControllerMain.php");
require_once(LIB_PATH . "Controller/ControllerAjax.php");
@ -110,5 +113,6 @@ $sdb = new DatajarEngineWrapper(Conf::getServerConfElement('storageConnection'))
DatajarBase::bind($sdb);
// Starting session.
Session::start(APP_NAME);
$sess = Session::start(APP_NAME);
$session = $sess->get('session');
?>

40
system/Cache.php

@ -36,10 +36,10 @@ class Cache
$user = new User();
$this->login = $user->getLogin();
$this->db = new DatajarEngineWrapper(Conf::getServerConfElement('storageConnection'));
//$this->db = new DatajarEngineWrapper(Conf::getServerConfElement('storageConnection'));
$var = new CacheVar();
$this->db->create($var);
//$var = new CacheVar();
//$this->db->create($var);
}
function __destruct()
@ -113,15 +113,35 @@ class Cache
$md5 = md5($data);
$time = time();
//$var = new CacheVar();
//$this->db->load($var, array('key' => $cache_key));
$var = new CacheVar();
$this->db->load($var, array('key' => $cache_key));
/*$success = $var->load(array(
'session' => self::$sid,
'container' => $this->container,
'name' => $varname));*/
$query = CacheVar::query()->select()
->where(array(
'key' => $cache_key))
->limit(0, 1);
$result = Cache::run_query($query);
if($result) {
$var = $result[0];
}
$var->key = $cache_key;
$var->data = $data;
$var->checksum = $md5;
$var->timestamp = $time;
$this->db->save($var);
$var->run_query($var->query()->save($var));
//$this->db->save($var);
}
/**
@ -132,13 +152,21 @@ class Cache
$cache_key = $this->login.':'.$key;
$var = new CacheVar();
if($var->load(array('key' => $cache_key))) {
return unserialize(gzuncompress(base64_decode(str_replace("\\'", "'", $var->data))));
} else {
return false;
}
/*$var = new CacheVar();
$success = $this->db->load($var, array('key' => $cache_key));
if($success) {
return unserialize(gzuncompress(base64_decode(str_replace("\\'", "'", $var->data))));
} else {
return false;
}
}*/
}
}

8
system/Controller/ControllerMain.php

@ -41,13 +41,14 @@ class ControllerMain extends ControllerBase
$this->page->menuAddLink(t('Home'), '?q=mainPage', true);
$this->page->menuAddLink(t('Profile'), '?q=profile');
$this->page->menuAddLink(t('Configuration'), '?q=config');
$this->page->menuAddLink(t('Help'), '?q=help');
$this->page->menuAddLink(t('Help'), '?q=help');
$this->page->menuAddLink(t('Logout'), '?q=disconnect');
$content = new TplPageBuilder($user);
$this->page->setContent($content->build('main.tpl'));
echo $this->page->build('page.tpl');
}
}
}
function friend()
@ -114,7 +115,8 @@ class ControllerMain extends ControllerBase
$this->page->menuAddLink(t('Home'), '?q=mainPage');
$this->page->menuAddLink(t('Profile'), '?q=profile', true);
$this->page->menuAddLink(t('Configuration'), '?q=config');
$this->page->menuAddLink(t('Help'), '?q=help');
$this->page->menuAddLink(t('Help'), '?q=help');
$this->page->menuAddLink(t('Logout'), '?q=disconnect');
$content = new TplPageBuilder($user);

18
system/Datas/Message.php

@ -1,18 +1,18 @@
<?php
class Message extends DatajarBase {
protected $key;
protected $to;
protected $from;
public $key;
public $to;
public $from;
protected $type;
public $type;
protected $subject;
protected $thread;
protected $body;
public $subject;
public $thread;
public $body;
protected $published;
protected $delivered;
public $published;
public $delivered;
protected function type_init() {
$this->key = DatajarType::varchar(128);

16
system/Datas/Presence.php

@ -1,16 +1,16 @@
<?php
class Presence extends DatajarBase {
protected $key;
protected $jid;
public $key;
public $jid;
protected $ressource;
protected $presence;
protected $priority;
protected $status;
public $ressource;
public $presence;
public $priority;
public $status;
protected $node;
protected $ver;
public $node;
public $ver;
protected function type_init() {
$this->key = DatajarType::varchar(128);

3
system/Jabber.php

@ -16,7 +16,7 @@
* See COPYING for licensing information.
*/
include(LIB_PATH . 'Jaxl/core/jaxl.class.php');
//include(LIB_PATH . 'Jaxl/core/jaxl.class.php');
class Jabber
{
@ -144,7 +144,6 @@ class Jabber
$this->jaxl->startCore('bosh');
}
movim_log($presence = Cache::c('presence'));
self::setStatus($presence['status'], $presence['show'], false, true);
}

5
system/RPC.php

@ -90,9 +90,10 @@ class RPC
public function handle()
{
if(isset($_GET['do']) && $_GET['do'] == 'poll') {
$user = new User();
/*$user = new User();
$xmppSession = Jabber::getInstance($user->getLogin());
$xmppSession->pingServer();
$xmppSession->pingServer();*/
moxl\ping();
} else {
$xml = file_get_contents('php://input');
$request = simplexml_load_string($xml);

80
system/Session.php

@ -53,15 +53,18 @@ class Session
*/
protected function __construct($name)
{
if(defined('TEST_DB_CONN')) {
/*if(defined('TEST_DB_CONN')) {
$this->db = new DatajarEngineWrapper(TEST_DB_CONN);
} else {
$this->db = new DatajarEngineWrapper(Conf::getServerConfElement('storageConnection'));
}
var_dump($this->db);*/
// Does the database exist?
$var = new SessionVar();
$this->db->create($var);
//$query = $var->query()->create($var);
//$var->run_query($query);
if(self::$sid == null) {
if(isset($_COOKIE['PHPFASTSESSID'])) {
@ -107,12 +110,25 @@ class Session
*/
public function get($varname)
{
$data = new SessionVar();
if($this->db->load($data, array(
/*$data = new SessionVar();
$query = $data->query()->select($data)->where(array(
'session' => self::$sid,
'container' => $this->container,
'name' => $varname))) {
return unserialize(base64_decode($data->value));
'name' => $varname));
//$query = $var->query()->save($var);
$data->run_query($query);*/
$query = SessionVar::query()->select()
->where(array(
'session' => self::$sid,
'container' => $this->container,
'name' => $varname));
$data = SessionVar::run_query($query);
if($data) {
return unserialize(base64_decode($data[0]->value));
} else {
return false;
}
@ -125,22 +141,39 @@ class Session
{
// Does the variable exist?
$var = new SessionVar();
$success = $this->db->load($var, array(
'session' => self::$sid,
'container' => $this->container,
'name' => $varname));
/*$success = $var->load(array(
'session' => self::$sid,
'container' => $this->container,
'name' => $varname));*/
$query = SessionVar::query()->select()
->where(array(
'session' => self::$sid,
'container' => $this->container,
'name' => $varname))
->limit(0, 1);
$data = SessionVar::run_query($query);
//var_dump($data);
Logger::log(1, "Session: Setting variable $varname");
if(!$success) {
if($data) {
$var = $data[0];
}
//if(!$success) {
$var->session = self::$sid;
$var->container = $this->container;
$var->name = $varname;
}
//}
$var->value = base64_encode(serialize($value));
$var->timestamp = time();
$this->db->save($var);
$var->run_query($var->query()->save($var));
return $var->value;
}
@ -151,21 +184,30 @@ class Session
public function remove($varname)
{
$var = new SessionVar();
$this->db->load($var, array(
$var->load(array(
'session' => self::$sid,
'container' => $this->container,
'name' => $varname));
$this->db->delete($var);
$query = $var->query()->delete($var);
$var->run_query($query);
}
public function delete_container()
{
$vars = $this->db->select('SessionVar', array('container' => $this->container,
'session' => self::$sid));
/*$vars = $this->db->select('SessionVar', array('container' => $this->container,
'session' => self::$sid));*/
$query = SessionVar::query()->select()
->where(array(
'session' => self::$sid,
'container' => $this->container));
$vars = SessionVar::run_query($query);
foreach($vars as $var)
{
$this->db->delete($var);
$query = SessionVar::query()->delete($var);
SessionVar::run_query($query);
}
}

28
system/User.php

@ -19,18 +19,20 @@ class User {
function __construct()
{
if($this->isLogged()) {
$sess = Session::start(APP_NAME);
$this->username = $sess->get('login');
$this->password = $sess->get('pass');
global $session;
//$sess = Session::start(APP_NAME);
$this->username = $session['user'].'@'.$session['host'];
//$this->password = $sess->get('pass');
$this->xmppSession = Jabber::getInstance($this->username);
/*$this->xmppSession = Jabber::getInstance($this->username);*/
}
else if(isset($_POST['login'])
/*else if(isset($_POST['login'])
&& isset($_POST['pass'])
&& $_POST['login'] != ''
&& $_POST['pass'] != '') {
$this->authenticate($_POST['login'], $_POST['pass']);
}
}*/
}
/**
@ -39,11 +41,13 @@ class User {
function isLogged()
{
// User is not logged in if both the session vars and the members are unset.
$sess = Session::start(APP_NAME);
return (($this->username != '' && $this->password != '') || $sess->get('login'));
//$sess = Session::start(APP_NAME);
//return (($this->username != '' && $this->password != '') || $sess->get('login'));
global $session;
return $session['on'];
}
function authenticate($login,$pass)
/*function authenticate($login,$pass)
{
try{
@ -91,14 +95,14 @@ class User {
}
return $e->getMessage();
}
}
}*/
function desauth()
{
PresenceHandler::clearPresence();
$sess = Session::start('jaxl');
Session::dispose('jaxl');
// $sess = Session::start('jaxl');
// Session::dispose('jaxl');
$sess = Session::start(APP_NAME);
Session::dispose(APP_NAME);

4
system/Widget/WidgetBase.php

@ -37,8 +37,8 @@ class WidgetBase
{
// Put default widget init here.
$this->external = $external;
if(Jabber::getInstance())
$this->xmpp = Jabber::getInstance();
//if(Jabber::getInstance())
// $this->xmpp = Jabber::getInstance();
$this->ajax = ControllerAjax::getInstance();
$this->user = new User();

123
system/Widget/WidgetCommon.php

@ -17,49 +17,49 @@
class WidgetCommon extends WidgetBase {
protected function preparePost($message) {
global $sdb;
/*global $sdb;
$user = new User();
$contact = $sdb->select('Contact', array('key' => $user->getLogin(), 'jid' => $message->getData('jid')));
$contact = $sdb->select('Contact', array('key' => $user->getLogin(), 'jid' => $message->getData('jid')));*/
$tmp = '';
if(isset($contact[0])) {
if(isset($message[1])) {
$tmp = '<div class="post ';
if($user->getLogin() == $message->getData('jid'))
if($this->user->getLogin() == $message[0]->getData('jid'))
$tmp .= 'me';
$tmp .= '" id="'.$message->getData('nodeid').'" >
<img class="avatar" src="'.$contact[0]->getPhoto('s').'">
$tmp .= '" id="'.$message[0]->getData('nodeid').'" >
<img class="avatar" src="'.$message[1]->getPhoto('s').'">
<span><a href="?q=friend&f='.$message->getData('jid').'">'.$contact[0]->getTrueName().'</a></span>
<span class="date">'.prepareDate(strtotime($message->getData('updated'))).'</span>
<span><a href="?q=friend&f='.$message[0]->getData('jid').'">'.$message[1]->getTrueName().'</a></span>
<span class="date">'.prepareDate(strtotime($message[0]->getData('updated'))).'</span>
<div class="content">
'.prepareString($message->getData('content')). '</div>';
'.prepareString($message[0]->getData('content')). '</div>';
$attachments = AttachmentHandler::getAttachment($user->getLogin(), $message->getData('nodeid'));
if($attachments) {
//$attachments = AttachmentHandler::getAttachment($this->user->getLogin(), $message[0]->getData('nodeid'));
/*if($attachments) {
$tmp .= '<div class="attachment">';
foreach($attachments as $attachment)
$tmp .= '<a target="_blank" href="'.$attachment->getData('link').'"><img alt="'.$attachment->getData('title').'" title="'.$attachment->getData('title').'" src="'.$attachment->getData('thumb').'"></a>';
$tmp .= '</div>';
}
}*/
if($message->getPlace() != false)
if($message[0]->getPlace() != false)
$tmp .= '<span class="place">
<a
target="_blank"
href="http://www.openstreetmap.org/?lat='.$message->getData('lat').'&lon='.$message->getData('lon').'&zoom=10"
>'.$message->getPlace().'</a>
href="http://www.openstreetmap.org/?lat='.$message[0]->getData('lat').'&lon='.$message[0]->getData('lon').'&zoom=10"
>'.$message[0]->getPlace().'</a>
</span>';
if($message->getData('jid') != $message->getData('uri'))
$tmp .= '<span class="recycle"><a href="?q=friend&f='.$message->getData('uri').'">'.$message->getData('name').'</a></span>';
if($message[0]->getData('jid') != $message[0]->getData('uri'))
$tmp .= '<span class="recycle"><a href="?q=friend&f='.$message[0]->getData('uri').'">'.$message[0]->getData('name').'</a></span>';
movim_log($message->getData('commentson').' '.$message->getData('nodeid'));
if($message->getData('commentson') == 1) {
$tmp .= '<div class="comments" id="'.$message->getData('nodeid').'comments">';
movim_log($message[0]->getData('commentson').' '.$message[0]->getData('nodeid'));
if($message[0]->getData('commentson') == 1) {
$tmp .= '<div class="comments" id="'.$message[0]->getData('nodeid').'comments">';
$comments = WidgetCommon::prepareComments($message->getData('nodeid'));
$comments = WidgetCommon::prepareComments($message[0]->getData('nodeid'));
if($comments != false)
$tmp .= $comments;
@ -69,7 +69,7 @@ class WidgetCommon extends WidgetBase {
<a
class="getcomments icon bubble"
style="margin-left: 0px;"
onclick="'.$this->genCallAjax('ajaxGetComments', "'".$message->getData('commentplace')."'", "'".$message->getData('nodeid')."'").'; this.innerHTML = \''.t('Loading comments ...').'\'">'.
onclick="'.$this->genCallAjax('ajaxGetComments', "'".$message[0]->getData('commentplace')."'", "'".$message[0]->getData('nodeid')."'").'; this.innerHTML = \''.t('Loading comments ...').'\'">'.
t('Get the comments').'
</a>
</div></div>';
@ -82,7 +82,7 @@ class WidgetCommon extends WidgetBase {
<table id="commentsubmit">
<tr>
<td>
<textarea id="'.$message->getData('nodeid').'commentcontent" onkeyup="movim_textarea_autoheight(this);"></textarea>
<textarea id="'.$message[0]->getData('nodeid').'commentcontent" onkeyup="movim_textarea_autoheight(this);"></textarea>
</td>
</tr>
<tr class="commentsubmitrow">
@ -90,13 +90,13 @@ class WidgetCommon extends WidgetBase {
<td>
<a
onclick="
if(document.getElementById(\''.$message->getData('nodeid').'commentcontent\').value != \'\') {
if(document.getElementById(\''.$message[0]->getData('nodeid').'commentcontent\').value != \'\') {
'.$this->genCallAjax(
'ajaxPublishComment',
"'".$message->getData('commentplace')."'",
"'".$message->getData('nodeid')."'",
"encodeURIComponent(document.getElementById('".$message->getData('nodeid')."commentcontent').value)").
'document.getElementById(\''.$message->getData('nodeid').'commentcontent\').value = \'\';
"'".$message[0]->getData('commentplace')."'",
"'".$message[0]->getData('nodeid')."'",
"encodeURIComponent(document.getElementById('".$message[0]->getData('nodeid')."commentcontent').value)").
'document.getElementById(\''.$message[0]->getData('nodeid').'commentcontent\').value = \'\';
}"
class="button tiny icon submit"
style="padding-left: 28px;"
@ -116,18 +116,25 @@ class WidgetCommon extends WidgetBase {
}
protected function prepareComments($parentid) {
$user = new User();
//$user = new User();
$query = Post::query()
->join('Contact', array('Post.jid' => 'Contact.jid'))
->where(array('Post`.`key' => $this->user->getLogin(), 'Post`.`parentid' => $parentid))
->orderby('Post.updated', false);
$comments = Post::run_query($query);
/*$query = Post::query()
->where(array('key' => $user->getLogin(), 'parentid' => $parentid))
->orderby('published', false);
$comments = Post::run_query($query);
$comments = Post::run_query($query);*/
$tmp = false;
$size = sizeof($comments);
$comcounter = 0;
/*$comcounter = 0;
var_dump($size);
if($size > 3) {
$tmp = '<div
@ -139,36 +146,40 @@ class WidgetCommon extends WidgetBase {
<a class="getcomments icon bubbleold">'.t('Show the older comments').'</a>
</div>';
$comcounter = $size - 3;
}
}*/
if($comments) {
foreach($comments as $comment) {
$query = Contact::query()
$i = 0;
foreach($comments as $comment) {
/*$query = Contact::query()
->where(array('key' => $user->getLogin(), 'jid' => $comment->getData('jid')));
$contact = Post::run_query($query);
$contact = Post::run_query($query);*/
if(isset($comments[$i+1]) && $comments[$i][0]->getData('nodeid') != $comments[$i+1][0]->getData('nodeid')) {
if(isset($contact[0])) {
$photo = $contact[0]->getPhoto('s');
$name = $contact[0]->getTrueName();
}
else {
$photo = "image.php?c=default";
$name = $comment->getData('jid');
}
$tmp .= '
<div class="comment" ';
if($comcounter > 0) {
$tmp .= 'style="display:none;"';
$comcounter--;
}
if(isset($comment[1])) {
$photo = $comment[1]->getPhoto('s');
$name = $comment[1]->getTrueName();
}
else {
$photo = "image.php?c=default";
$name = $comment[0]->getData('jid');
}
$tmp .='>
<img class="avatar tiny" src="'.$photo.'">
<span><a href="?q=friend&f='.$comment->getData('jid').'">'.$name.'</a></span>
<span class="date">'.prepareDate(strtotime($comment->getData('published'))).'</span><br />
<div class="content tiny">'.prepareString($comment->getData('content')).'</div>
</div>';
$tmp .= '
<div class="comment" ';
/*if($comcounter > 0) {
$tmp .= 'style="display:none;"';
$comcounter--;
}*/
$tmp .='>
<img class="avatar tiny" src="'.$photo.'">
<span><a href="?q=friend&f='.$comment[0]->getData('jid').'">'.$name.'</a></span>
<span class="date">'.prepareDate(strtotime($comment[0]->getData('published'))).'</span><br />
<div class="content tiny">'.prepareString($comment[0]->getData('content')).'</div>
</div>';
}
$i++;
}
}

155
system/Widget/widgets/Chat/Chat.php

@ -26,6 +26,7 @@ class Chat extends WidgetBase
$this->addjs('chat.js');
$this->registerEvent('message', 'onMessage');
$this->registerEvent('composing', 'onComposing');
$this->registerEvent('paused', 'onPaused');
$this->registerEvent('presence', 'onPresence');
$this->cached = false;
@ -34,7 +35,6 @@ class Chat extends WidgetBase
function onPresence($presence)
{
$arr = $presence->getPresence();
$tab = PresenceHandler::getPresence($arr['jid'], true);
$txt = array(
1 => t('Online'),
@ -48,27 +48,34 @@ class Chat extends WidgetBase
$html = '
<div class="message presence">
<span class="date">'.date('G:i', time()).'</span>'.
prepareString(htmlentities($txt[$tab['presence']], ENT_COMPAT, "UTF-8")).'
prepareString(htmlentities($txt[$arr['presence']], ENT_COMPAT, "UTF-8")).'
</div>';
RPC::call('movim_append',
'messages'.$tab['jid'],
'messages'.$arr['jid'],
RPC::cdata($html));
RPC::call('scrollTalk',
'messages'.$tab['jid']);
'messages'.$arr['jid']);
}
function onMessage($message)
{
if($message->getData('key') == $message->getData('from'))
if($message->getData('key') == $message->getData('from')) {
$key = $message->getData('from');
$jid = $message->getData('to');
else
} else {
$key = $message->getData('to');
$jid = $message->getData('from');
global $sdb;
$contact = new Contact();
$sdb->load($contact, array('key' => $this->user->getLogin(), 'jid' => $jid));
}
$query = Contact::query()->select()
->where(array(
'key' => $key,
'jid' => $jid));
$contact = Contact::run_query($query);
$contact = $contact[0];
if($contact->getData('chaton') == 0) {
RPC::call('movim_prepend',
@ -76,8 +83,9 @@ class Chat extends WidgetBase
RPC::cdata($this->prepareChat($contact)));
RPC::call('scrollAllTalks');
$contact->chaton = 1;
$sdb->save($contact);
}else if($message->getData('body') != '') {
$contact->run_query($contact->query()->save($contact));
} else if($message->getData('body') != '') {
$html = $this->prepareMessage($message);
@ -92,6 +100,9 @@ class Chat extends WidgetBase
RPC::call('hideComposing',
$contact->getData('jid'));
RPC::call('hidePaused',
$contact->getData('jid'));
RPC::call('scrollTalk',
'messages'.$contact->getData('jid'));
@ -105,11 +116,15 @@ class Chat extends WidgetBase
}
function onComposing($payload)
function onComposing($jid)
{
global $sdb;
$contact = new Contact();
$sdb->load($contact, array('key' => $this->user->getLogin(), 'jid' => reset(explode("/", $payload['from']))));
$query = Contact::query()->select()
->where(array(
'key' => $this->user->getLogin(),
'jid' => $jid));
$contact = Contact::run_query($query);
$contact = $contact[0];
if($contact->getData('chaton') == 1) {
RPC::call('showComposing',
$contact->getData('jid'));
@ -118,6 +133,25 @@ class Chat extends WidgetBase
'messages'.$contact->getData('jid'));
}
}
function onPaused($jid)
{
$query = Contact::query()->select()
->where(array(
'key' => $this->user->getLogin(),
'jid' => $jid));
$contact = Contact::run_query($query);
$contact = $contact[0];
if($contact->getData('chaton') == 1) {
RPC::call('showPaused',
$contact->getData('jid'));
RPC::call('scrollTalk',
'messages'.$contact->getData('jid'));
}
}
/**
* Open a new talk
@ -127,22 +161,24 @@ class Chat extends WidgetBase
*/
function ajaxOpenTalk($jid)
{
global $sdb;
$query = Contact::query()->select()
->where(array(
'key' => $this->user->getLogin(),
'jid' => $jid));
$contact = Contact::run_query($query);
$contact = $contact[0];
$presence = PresenceHandler::getPresence($jid, true);
if(isset($presence) && $presence["presence_txt"] != 'offline') {
$contact = new Contact();
$sdb->load($contact, array('key' => $this->user->getLogin(), 'jid' => $jid));
if($contact->getData('chaton') != 1) {
RPC::call('movim_prepend',
'chats',
RPC::cdata($this->prepareChat($contact)));
RPC::call('scrollAllTalks');
$contact->chaton = 1;
$sdb->save($contact);
RPC::commit();
}
}
if($contact->getData('chaton') != 1) {
RPC::call('movim_prepend',
'chats',
RPC::cdata($this->prepareChat($contact)));
RPC::call('scrollAllTalks');
$contact->chaton = 1;
$contact->run_query($contact->query()->save($contact));
RPC::commit();
}
}
/**
@ -154,21 +190,25 @@ class Chat extends WidgetBase
*/
function ajaxSendMessage($to, $message)
{
$item = array('@attributes' => array(
'to' => $to,
'from' => $this->user->getLogin()),
'body' => rawurldecode($message));
$m = new \Message();
global $sdb;
$m = new Message();
$m->setMessageChat($item);
$sdb->save($m);
$m->key->setval($this->user->getLogin());
$m->to->setval($to);
$m->from->setval($this->user->getLogin());
$m->type->setval("chat");
$m->body->setval(rawurldecode($message));
$m->published->setval(date('Y-m-d H:i:s'));
$m->delivered->setval(date('Y-m-d H:i:s'));
$m->run_query($m->query()->save($m));
$this->onMessage($m);
// We decode URL codes to send the correct message to the XMPP server
$this->xmpp->sendMessage($to, rawurldecode($message));
moxl\message($to, rawurldecode($message));
}
/**
@ -178,29 +218,37 @@ class Chat extends WidgetBase
* @return void
*/
function ajaxCloseTalk($jid)
{
global $sdb;
$contact = new Contact();
$sdb->load($contact, array('key' => $this->user->getLogin(), 'jid' => $jid));
{
$query = Contact::query()->select()
->where(array(
'key' => $this->user->getLogin(),
'jid' => $jid));
$contact = Contact::run_query($query);
$contact = $contact[0];
if($contact->getData('chaton') == 1 || $contact->getData('chaton') == 2) {
$contact->chaton = 0;
$sdb->save($contact);
$contact->run_query($contact->query()->save($contact));
}
}
function ajaxHideTalk($jid)
{
global $sdb;
$contact = new Contact();
$sdb->load($contact, array('key' => $this->user->getLogin(), 'jid' => $jid));
$query = Contact::query()->select()
->where(array(
'key' => $this->user->getLogin(),
'jid' => $jid));
$contact = Contact::run_query($query);
$contact = $contact[0];
if($contact->getData('chaton') == 1) {
$contact->chaton = 2;
$sdb->save($contact);
}
else {
$contact->chaton = 1;
$sdb->save($contact);
}
$contact->run_query($contact->query()->save($contact));
RPC::call('scrollTalk',
'messages'.$contact->getData('jid'));
@ -257,7 +305,10 @@ class Chat extends WidgetBase
$html = '
<div class="chat" onclick="this.querySelector(\'textarea\').focus()">'.
'<div class="messages" '.$style.' id="messages'.$contact->getData('jid').'">'.$messageshtml.'<div style="display: none;" class="message" id="composing'.$contact->getData('jid').'">'.t('Composing...').'</div></div>'.
'<div class="messages" '.$style.' id="messages'.$contact->getData('jid').'">'.$messageshtml.'
<div style="display: none;" class="message" id="composing'.$contact->getData('jid').'">'.t('Composing...').'</div>
<div style="display: none;" class="message" id="paused'.$contact->getData('jid').'">'.t('Paused...').'</div>
</div>'.
'<textarea onkeyup="movim_textarea_autoheight(this);" '.$style.'
onkeypress="if(event.keyCode == 13) {'.$this->genCallAjax('ajaxSendMessage', "'".$contact->getData('jid')."'", "sendMessage(this, '".$contact->getData('jid')."')").' return false;}"
></textarea>'.

16
system/Widget/widgets/Chat/chat.js

@ -43,11 +43,22 @@ function showComposing(jid) {
var box = document.getElementById('messages' + jid);
var composing = document.getElementById('composing' + jid);
hidePaused(jid);
box.appendChild(composing);
composing.style.display = 'block';
}
function showPaused(jid) {
var box = document.getElementById('messages' + jid);
var paused = document.getElementById('paused' + jid);
hideComposing(jid);
box.appendChild(paused);
paused.style.display = 'block';
}
function newMessage() {
if(document_focus == false) {
movim_title_inc();
@ -59,6 +70,11 @@ function hideComposing(jid) {
composing.style.display = 'none';
}
function hidePaused(jid) {
var paused = document.getElementById('paused' + jid);
paused.style.display = 'none';
}
function sendMessage(n, jid)
{
var text = n.value;

14
system/Widget/widgets/Feed/Feed.php

@ -12,7 +12,7 @@ class Feed extends WidgetCommon {
$this->registerEvent('stream', 'onStream');
$this->registerEvent('vcard', 'onVcard');
$this->cached = true;
$this->cached = false;
}
function onPost($id) {
@ -30,8 +30,9 @@ class Feed extends WidgetCommon {
function prepareFeed($start) {
$query = Post::query()
->where(array('key' => $this->user->getLogin(), 'parentid' => ''))
->orderby('updated', true)
->join('Contact', array('Post.jid' => 'Contact.jid'))
->where(array('Post`.`key' => $this->user->getLogin(), 'Post`.`parentid' => ''))
->orderby('Post.updated', true)
->limit($start, '20');
$messages = Post::run_query($query);
@ -44,8 +45,13 @@ class Feed extends WidgetCommon {
} else {
$html = '';
$i = 0;
foreach($messages as $message) {
$html .= $this->preparePost($message);
if(
isset($messages[$i+1]) &&
$messages[$i][0]->getData('nodeid') != $messages[$i+1][0]->getData('nodeid'))
$html .= $this->preparePost($message);
$i++;
}
$next = $start + 20;

191
system/Widget/widgets/Login/Login.php

@ -23,12 +23,186 @@ class Login extends WidgetBase {
function WidgetLoad()
{
$this->addcss('login.css');
$this->addjs('login.js');
}
private function displayWarning($warning)
{
if($warning != false) {
switch ($warning) {
case 'noaccount':
$warning = '
<div class="warning">
'.t('Wrong username').'
</div> ';
break;
case 'invalidjid':
$warning = '
<div class="warning">
'.t('Invalid JID').'
</div> ';
break;
case 'errormechanism':
$warning = '
<div class="error">
'.t('Authentification mechanism not supported by Movim').'
</div> ';
break;
case 'dnsdomain':
$warning = '
<div class="error">
'.t('XMPP Domain error, your account is not a correct Jabber ID').'
</div> ';
break;
case 'datamissing':
$warning = '
<div class="error">
'.t('Some data are missing !').'
</div> ';
break;
case 'wrongpass':
$warning = '
<div class="warning">
'.t('Wrong password').'
</div> ';
break;
case 'failauth':
$warning = '
<div class="warning">
'.t('The XMPP authentification failed').'
</div> ';
break;
case 'bosherror':
$warning = '
<div class="warning">
'.t('The current BOSH URL in invalid').'
</div> ';
break;
case 'internal':
$warning = '
<div class="error">
'.t('Internal server error').'
</div> ';
break;
case 'session':
$warning = '
<div class="error">
'.t('Session error').'
</div> ';
break;
case 'acccreated':
$warning = '
<div class="error valid">
'.t('Account successfully created').'
</div> ';
break;
case 'wrongaccount':
$warning = '
<div class="error">
'.t('Movim failed to authenticate. You entered wrong data').'
</div> ';
break;
}
RPC::call('movim_fill', 'warning',
RPC::cdata($warning));
RPC::commit();
exit;
}
}
function ajaxLogin($element)
{
$warning = false;
// Empty input test
foreach($element as $value) {
if($value == NULL || $value == '') {
$warning = 'datamissing';
}
}
$this->displayWarning($warning);
// Correct email test
if(!filter_var($element['login'], FILTER_VALIDATE_EMAIL))
$warning = 'invalidjid';
$this->displayWarning($warning);
// Correct XMPP account test
$login_arr = explode('@', $element['login']);
$user = $login_arr[0];
$host = $login_arr[1];
$dns = dns_get_record('_xmpp-client._tcp.'.$login_arr[1]);
if(isset($dns[0]['target']) && $dns[0]['target'] != null)
$domain = $dns[0]['target'];
else {
$warning = 'dnsdomain';
}
$this->displayWarning($warning);
global $session;
if($s != false) {
$session = $sess->get('session');
}
else {
$session = array(
'rid' => 1,
'sid' => 0,
'id' => 0,
'url' => 'localhost:5280/http-bind',
'port'=> 5222,
'host'=> $host,
'domain' => $domain,
'ressource' => 'moxl',
'user' => $user,
'password' => $element['pass']);
}
$sess = Session::start(APP_NAME);
$sess->set('session', $session);
// BOSH + XMPP connexion test
$warning = moxl\login();
if($warning != 'OK')
$this->displayWarning($warning);
RPC::call('enterMovim', BASE_URI.'?q=mainPage');
RPC::commit();
}
function build()
{
switch ($_GET['err']) {
$submit = $this->genCallAjax('ajaxLogin', "movim_parse_form('login')");
?>
<div id="loginpage">
<?php
if(file_exists(BASE_PATH.'install/part1.php')) { ?>
<div class="warning">
<?php echo t('Please remove the %s folder in order to complete the installation', 'install/'); ?>
</div>
<?php
}?>
<div id="warning"></div>
<form name="login" id="connectform">
<input type="email" name="login" id="login" />
<input type="password" name="pass" id="pass" />
<input
onclick="<?php echo $submit; ?>"
type="button"
name="submit" value="Come In!"/>
</form>
</div>
<?php
/* switch ($_GET['err']) {
case 'noaccount':
$warning = '
<div class="warning">
@ -112,8 +286,10 @@ class Login extends WidgetBase {
<span>
<?php
$query = ConfVar::query();
$contacts = ConfVar::run_query($query);
//$query = ConfVar::query();
//$contacts = ConfVar::run_query($query);
$contacts = ConfVar::run_query(ConfVar::query()->select());
$conf = Conf::getServerConf();
echo t('This server hosts %s accounts', count($contacts));
@ -130,13 +306,6 @@ class Login extends WidgetBase {
</span>
</div>
</form>
</div>
<?php
if(file_exists(BASE_PATH.'install/part1.php')) { ?>
<div class="warning" style="margin-top: 40px;">
<?php echo t('Please remove the %s folder in order to complete the installation', 'install/'); ?>
</div>
<?php
}
</div>*/
}
}

74
system/Widget/widgets/Login/login.css

@ -33,7 +33,7 @@ body {
border-radius: 4px;
}
#loginpage input[type=submit] {
#loginpage input[name=submit] {
background: -moz-linear-gradient(top, #6E9EA8 0%, #274950 100%);
background: -webkit-linear-gradient(top, #6E9EA8 0%, #274950 100%);
color: white;
@ -66,75 +66,5 @@ body {
width: 500px;
margin: 0em auto;
margin-bottom: 1em;
text-align: center;
}
/*#loginpage {
min-height: 400px;
background-image: url(img/wall.jpg);
background-repeat: no-repeat;
background-position: 10px -20px;
}
#loginpage #quote {
float: left;
margin-top: 42px;
height: 150px;
color: #aaa;
background-image: url(img/quotestart.png);
background-repeat: no-repeat;
width: 60%;
margin-left: 5%;
}
#loginpage #quote blockquote {
font-style:italic;
font-size: 19px;
font-family: Georgia,"Times New Roman",Times,serif;
margin: 20px;
}
#loginpage #quote cite {
float: right;
}
#connectform {
font-size: 16px;
padding: 0px 10px;
float: right;
min-height: 200px;
margin-top: 60px;
border-left: 1px solid #ccc;
}
#connectform hr {
margin: 0px;
height: 0px;
display: block;
clear: both;
}
#connectform .warning, #connectform .error {
font-size: 13px;
margin: 5px;
}
#connectform label {
margin: 5px;
width: 80px;
}
#connectform input {
margin: 5px;
}
#connectform a.showoptions {
padding: 0px;
font-size: 12px;
display: block;
margin: 5px;
}
#connectform fieldset {
margin: 0px;
border: none;
}
*/

3
system/Widget/widgets/Login/login.js

@ -0,0 +1,3 @@
function enterMovim(url) {
window.location.href = url;
}

11
system/Widget/widgets/Profile/Profile.php

@ -52,13 +52,16 @@ class Profile extends WidgetBase
function prepareVcard($vcard = false)
{
global $sdb;
$me = $sdb->select('Contact', array('key' => $this->user->getLogin(), 'jid' => $this->user->getLogin()));
$query = Contact::query()->select()
->where(array(
'key' => $this->user->getLogin(),
'jid' => $this->user->getLogin()));
$contact = Contact::run_query($query);
$presence = Cache::c('presence');
if(isset($me[0])) {
$me = $me[0];
if(isset($contact[0])) {
$me = $contact[0];
$html ='<h1>'.$me->getTrueName().'</h1><img src="'.$me->getPhoto().'"/>';
$html .= '

63
system/Widget/widgets/Roster/Roster.php

@ -32,15 +32,14 @@ class Roster extends WidgetBase
$this->registerEvent('presence', 'onPresence');
$this->registerEvent('vcard', 'onVcard');
$this->cached = true;
$this->cached = false;
}
function onPresence($presence)
{
$arr = $presence->getPresence();
$tab = PresenceHandler::getPresence($arr['jid'], true);
RPC::call('incomingPresence',
RPC::cdata($tab['jid']), RPC::cdata($tab['presence_txt']));
RPC::cdata($arr['jid']), RPC::cdata($arr['presence_txt']));
}
function onVcard($contact)
@ -58,12 +57,12 @@ class Roster extends WidgetBase
function ajaxRefreshRoster()
{
$this->xmpp->getRosterList();
//$this->xmpp->getRosterList();
}
function prepareRosterElement($contact, $inner = false)
{
$presence = PresenceHandler::getPresence($contact->getData('jid'), true);
$presence = $contact[1]->getPresence();
$start =
'<li
class="';
@ -72,24 +71,26 @@ class Roster extends WidgetBase
else
$start .= 'offline ';
if($contact->getData('jid') == $_GET['f'])
if($contact[0]->getData('jid') == $_GET['f'])
$start .= 'active ';
$start .= '"
id="roster'.$contact->getData('jid').'"
id="roster'.$contact[0]->getData('jid').'"
>';
$middle = '<div class="chat on" onclick="'.$this->genCallWidget("Chat","ajaxOpenTalk", "'".$contact->getData('jid')."'").'"></div>
$middle = '<div class="chat on" onclick="'.$this->genCallWidget("Chat","ajaxOpenTalk", "'".$contact[0]->getData('jid')."'").'"></div>
<a
title="'.$contact->getData('jid');
title="'.$contact[0]->getData('jid');
if($presence['status'] != '')
$middle .= ' - '.$presence['status'];
$middle .= '"';
$middle .= ' href="?q=friend&f='.$contact->getData('jid').'"
$middle .= ' href="?q=friend&f='.$contact[0]->getData('jid').'"
>
<img class="avatar" src="'.$contact->getPhoto('xs').'" />'.
'<span>'.$contact->getTrueName();
if($contact->getData('rosterask') == 'subscribe')
<img class="avatar" src="'.$contact[0]->getPhoto('xs').'" />'.
'<span>'.$contact[0]->getTrueName();
if($contact[0]->getData('rosterask') == 'subscribe')
$middle .= " #";
if($presence['ressource'] != '')
$middle .= ' ('.$presence['ressource'].')';
$middle .= '</span>
</a>';
$end = '</li>';
@ -106,18 +107,12 @@ class Roster extends WidgetBase
function prepareRoster()
{
$query = Contact::query()
->where(
array(
'key' => $this->user->getLogin(),
'jid!' => '',
array(
'rostersubscription!' => 'none',
'|rosterask' => 'subscribe'
)
)
)
->orderby('group', true);
$query = Contact::query()->join('Presence',
array('Contact.jid' =>
'Presence.jid'))
->where(array('Contact`.`key' => $this->user->getLogin()))
->orderby('Contact.group', true);
$contacts = Contact::run_query($query);
$html = '';
@ -125,17 +120,16 @@ class Roster extends WidgetBase
if($contacts != false) {
if($contacts[0]->getData('group') == '')
if($contacts[0][0]->getData('group') == '')
$html .= '<div><h1>'.t('Ungrouped').'</h1>';
else {
$group = $contacts[0]->getData('group');
$group = $contacts[0][0]->getData('group');
$html .= '<div><h1>'.$group.'</h1>';
}
foreach($contacts as $c) {
if($group != $c->getData('group')) {
$group = $c->getData('group');
if($group != $c[0]->getData('group')) {
$group = $c[0]->getData('group');
$html .= '</div>';
if($group == '')
$html .= '<div><h1>'.t('Ungrouped').'</h1>';
@ -146,10 +140,8 @@ class Roster extends WidgetBase
$html .= $this->prepareRosterElement($c);
}
$html .= '</div>';
$html .= '<li class="more" onclick="showRoster(this);"><a href="#"><span>'.t('Show All').'</span></a></li>';
} else {
$html .= '<script type="text/javascript">setTimeout(\''.$this->genCallAjax('ajaxRefreshRoster').'\', 1500);</script>';
//$html .= '<script type="text/javascript">setTimeout(\''.$this->genCallAjax('ajaxRefreshRoster').'\', 1500);</script>';
}
return $html;
@ -162,6 +154,11 @@ class Roster extends WidgetBase
<ul id="rosterlist">
<?php echo $this->prepareRoster(); ?>
</ul>
<div id="rostermenu">
<ul>
<li onclick="showRoster(this);"><a href="#"><?php echo t('Show/Hide'); ?></a></li>
</ul>
</div>
<div class="config_button" onclick="<?php $this->callAjax('ajaxRefreshRoster');?>"></div>
<script type="text/javascript">sortRoster();</script>
</div>

18
system/Widget/widgets/Roster/roster.css

@ -1,6 +1,7 @@
#roster {
margin-bottom: 60px;
width: 200px;
overflow: hidden;
}
#roster ul {
@ -103,3 +104,20 @@
font-weight: bold;
text-align: center;
}
#roster #rostermenu {
position: fixed;
bottom: 0;
right: 0;
background-color: #444;
color: white;
height: 21px;
width: 200px;
box-shadow: 0px 0px 10px rgba(0,0,0,0.3);
}
#roster #rostermenu a:link, #roster #rostermenu a:visited {
color: white;
line-height: 17px;
font-size: 11px;
}

7
system/Widget/widgets/Roster/roster.js

@ -45,10 +45,11 @@ function showRoster(n) {
roster = document.querySelector('#rosterlist');
offline = roster.querySelectorAll('.offline');
for(i = 0; i < offline.length; i++) {
offline.item(i).style.display = 'block';
if(offline.item(i).style.display == 'none')
offline.item(i).style.display = 'block';
else
offline.item(i).style.display = 'none';
}
n.style.display = 'none';
}
function incomingPresence(val) {

6
system/Widget/widgets/Vcard/Vcard.php

@ -25,8 +25,6 @@ class Vcard extends WidgetBase
$this->registerEvent('myvcard', 'onMyVcardReceived');
$this->addcss('vcard.css');
$this->addjs('vcard.js');
//$this->cached = true;
}
function onMyVcardReceived()
@ -162,7 +160,7 @@ class Vcard extends WidgetBase
</div>';
$html .= '</fieldset>';
/* $html .= '<br />
$html .= '<br />
<fieldset>
<legend>'.t('Geographic Position').'</legend>';
$html .= '<div class="warning"><a class="button tiny" style="float: right;" onclick="getPos(this);">Récupérer ma position</a></div>';
@ -172,7 +170,7 @@ class Vcard extends WidgetBase
</div>';
$html .= '<div class="element"><span>'.t('Longitude').'</span>
<input type="text" name="vCardLong" class="content" value="Longitude" readonly>
</div>';*/
</div>';
$html .= '<hr />';

3
system/Widget/widgets/Vcard/vcard.js

@ -1,7 +1,8 @@
function getPos(n)
{
n.style.display = "none";
//n.style.display = "none";
if(navigator.geolocation){
console.log(navigator.geolocation.getCurrentPosition);
navigator.geolocation.getCurrentPosition(function(position){
var latitude = position.coords.latitude;
var longitude = position.coords.longitude;

4
themes/movim/main.tpl

@ -1,14 +1,14 @@
<?php /* -*- mode: html -*- */
?>
<?php $this->widget('Poller');?>
<?php $this->widget('Logout');?>
<?php /*$this->widget('Logout');*/?>
<?php $this->widget('Chat');?>
<div id="left">
<?php $this->widget('Profile');?>
</div>
<div id="right">
<?php $this->widget('Notifs');?>
<?php /*$this->widget('Notifs');*/?>
<?php $this->widget('Roster');?>
</div>
<div id="center" class="protect orange">

4
themes/movim/profile.tpl

@ -2,7 +2,7 @@
?>
<?php $this->widget('Poller');?>
<?php $this->widget('Logout');?>
<?php /*$this->widget('Logout');*/?>
<?php $this->widget('Chat');?>
<?php /*$this->widget('Log');*/?>
@ -11,7 +11,7 @@
</div>
<div id="right">
<?php $this->widget('Notifs');?>
<?php /*$this->widget('Notifs');*/?>
<?php $this->widget('Roster');?>
</div>
<div id="center">

Loading…
Cancel
Save