Browse Source

- New widget, LoginAnonymous

- New page, room, to login anonymously on XMPP chatrooms
- Add a new column in Sessionx model (mechanism)
pull/16/head
Jaussoin Timothée 11 years ago
parent
commit
4c60ddceaf
  1. 10
      app/controllers/RoomController.php
  2. 5
      app/models/sessionx/Sessionx.php
  3. 15
      app/models/sessionx/SessionxDAO.php
  4. 1
      app/views/login.tpl
  5. 11
      app/views/room.tpl
  6. 13
      app/widgets/Chat/Chat.php
  7. 48
      app/widgets/Chat/_chat_header_room.tpl
  8. 1
      app/widgets/Chat/chat.js
  9. 7
      app/widgets/Chat/chat.tpl
  10. 5
      app/widgets/Header/_header_room.tpl
  11. 23
      app/widgets/Login/Login.php
  12. 58
      app/widgets/LoginAnonymous/LoginAnonymous.php
  13. 1
      app/widgets/LoginAnonymous/loginanonymous.tpl
  14. 5
      app/widgets/Presence/Presence.php
  15. 39
      app/widgets/Rooms/Rooms.php
  16. 90
      app/widgets/Rooms/_rooms.tpl
  17. 2
      app/widgets/Rooms/_rooms_list.tpl
  18. 8
      app/widgets/Rooms/locales.ini
  19. 35
      app/widgets/Rooms/rooms.js
  20. 2
      linker.php
  21. 1
      locales/locales.ini
  22. 1
      system/Route.php
  23. 6
      system/Sessionx.php
  24. 4
      system/User.php
  25. 8
      system/widget/WidgetBase.php

10
app/controllers/RoomController.php

@ -0,0 +1,10 @@
<?php
class RoomController extends BaseController {
function load() {
}
function dispatch() {
$this->page->setTitle(__('page.room'));
}
}

5
app/models/sessionx/Sessionx.php

@ -19,6 +19,7 @@ class Sessionx extends Model {
public $active;
public $start;
public $timestamp;
public $mechanism;
public function __construct() {
$this->_struct = '
@ -54,7 +55,9 @@ class Sessionx extends Model {
"start" :
{"type":"date" },
"timestamp" :
{"type":"date" }
{"type":"date" },
"mechanism" :
{"type":"string", "size":64 }
}';
parent::__construct();

15
app/models/sessionx/SessionxDAO.php

@ -20,7 +20,8 @@ class SessionxDAO extends SQL {
config = :config,
active = :active,
start = :start,
timestamp = :timestamp
timestamp = :timestamp,
mechanism = :mechanism
where session = :session';
$this->prepare(
@ -41,7 +42,8 @@ class SessionxDAO extends SQL {
'config' => $s->config,
'active' => $s->active,
'start' => $s->start,
'timestamp' => $s->timestamp
'timestamp' => $s->timestamp,
'mechanism' => $s->mechanism
)
);
@ -65,7 +67,8 @@ class SessionxDAO extends SQL {
config,
active,
start,
timestamp)
timestamp,
mechanism)
values
(:session,
:username,
@ -82,7 +85,8 @@ class SessionxDAO extends SQL {
:config,
:active,
:start,
:timestamp)';
:timestamp,
:mechanism)';
$this->prepare(
'Sessionx',
@ -102,7 +106,8 @@ class SessionxDAO extends SQL {
'config' => $s->config,
'active' => $s->active,
'start' => $s->start,
'timestamp' => $s->timestamp
'timestamp' => $s->timestamp,
'mechanism' => $s->mechanism
)
);

1
app/views/login.tpl

@ -4,6 +4,7 @@
<section>
<div>
<?php $this->widget('Login'); ?>
<?php $this->widget('LoginAnonymous'); ?>
</div>
</section>
</main>

11
app/views/room.tpl

@ -0,0 +1,11 @@
<?php $this->widget('Presence'); ?>
<?php $this->widget('LoginAnonymous'); ?>
<main>
<?php $this->widget('Header');?>
<section>
<div>
<?php $this->widget('Rooms'); ?>
</div>
<?php $this->widget('Chat'); ?>
</section>
</main>

13
app/widgets/Chat/Chat.php

@ -237,7 +237,14 @@ class Chat extends WidgetCommon
if($muc) {
$m->type = 'groupchat';
$m->resource = $session->user;
$s = Session::start();
$m->resource = $s->get('username');
if($m->resource == null) {
$m->resource = $session->user;
}
$m->jidfrom = $to;
}
@ -511,5 +518,9 @@ class Chat extends WidgetCommon
if($validate_jid->validate($this->get('f'))) {
$this->view->assign('jid', $this->get('f'));
}
/*if($validate_jid->validate($this->get('r'))) {
$this->view->assign('room', $this->get('r'));
}*/
}
}

48
app/widgets/Chat/_chat_header_room.tpl

@ -1,17 +1,24 @@
{$anon = $c->supported('anonymous')}
<div>
<ul class="active">
<li onclick="Rooms_ajaxAdd()">
<span class="icon">
<i class="md md-group-add"></i>
</span>
</li>
</ul>
{if="!$anon"}
<ul class="active">
<li onclick="Rooms_ajaxAdd()">
<span class="icon">
<i class="md md-group-add"></i>
</span>
</li>
</ul>
{/if}
<span class="on_desktop icon"><i class="md md-forum"></i></span>
<h2>{$c->__('page.chats')}</h2>
{if="!$anon"}
<h2>{$c->__('page.chats')}</h2>
{else}
<h2>{$c->__('page.room')}</h2>
{/if}
</div>
<div>
<ul class="active">
<li onclick="Rooms_ajaxExit('{$room}'); MovimTpl.hidePanel();">
<li onclick="Rooms_ajaxExit('{$room}'); MovimTpl.hidePanel(); {if="$anon"}Presence_ajaxLogout(){/if}">
<span class="icon">
<i class="md md-close"></i>
</span>
@ -22,8 +29,17 @@
</span>
</li>
</ul>
<div class="return active r2 {if="$subject != null"}condensed{/if}" onclick="MovimTpl.hidePanel(); Chat_ajaxGet();">
<span id="back" class="icon" ><i class="md md-arrow-back"></i></span>
<div
class="return {if="!$anon"}active{/if} r2 {if="$subject != null"}condensed{/if}"
{if="!$anon"}onclick="MovimTpl.hidePanel(); Chat_ajaxGet();"{/if}>
<span id="back" class="icon" >
{if="!$anon"}
<i class="md md-arrow-back"></i>
{else}
<i class="md md-chat"></i>
{/if}
</span>
{if="$conference != null && $conference->name"}
<h2 title="{$room}">{$conference->name}</h2>
{else}
@ -37,10 +53,12 @@
<li onclick="Rooms_ajaxList('{$room}')">
<span>{$c->__('chatroom.members')}</span>
</li>
<li onclick="Rooms_ajaxRemoveConfirm('{$room}')">
<span>{$c->__('button.delete')}</span>
</li>
{if="$presence != null && $presence->mucrole == 'moderator'"}
{if="!$anon"}
<li onclick="Rooms_ajaxRemoveConfirm('{$room}')">
<span>{$c->__('button.delete')}</span>
</li>
{/if}
{if="$presence != null && $presence->mucrole == 'moderator' && !$anon"}
<li onclick="Chat_ajaxGetRoomConfig('{$room}')">
<span>{$c->__('chatroom.config')}</span>
</li>

1
app/widgets/Chat/chat.js

@ -46,6 +46,7 @@ var Chat = {
}
},
appendMessage : function(message) {
console.log(message);
if(message.body == '') return;
var bubble = null;

7
app/widgets/Chat/chat.tpl

@ -7,4 +7,11 @@
});
</script>
{/if}
{if="$room"}
<script type="text/javascript">
MovimWebsocket.attach(function() {
Chat_ajaxGetRoom('{$room}');
});
</script>
{/if}
</div>

5
app/widgets/Header/_header_room.tpl

@ -0,0 +1,5 @@
<div>
<span id="menu" class="on_mobile icon active" onclick="MovimTpl.toggleMenu()"><i class="md md-menu"></i></span>
<span class="on_desktop icon"><i class="md md-forum"></i></span>
<h2 class="r1">{$c->__('page.room')}</h2>
</div>

23
app/widgets/Login/Login.php

@ -39,17 +39,22 @@ class Login extends WidgetBase
$pd = new \Modl\PresenceDAO();
$pd->clearPresence($this->user->getLogin());
// http://xmpp.org/extensions/xep-0280.html
\Moxl\Stanza\Carbons::enable();
$session = \Sessionx::start();
$session->load();
// We refresh the roster
$r = new GetList;
$r->request();
if($session->mechanism != 'ANONYMOUS') {
// http://xmpp.org/extensions/xep-0280.html
\Moxl\Stanza\Carbons::enable();
// We get the configuration
$s = new Get;
$s->setXmlns('movim:prefs')
->request();
// We refresh the roster
$r = new GetList;
$r->request();
// We get the configuration
$s = new Get;
$s->setXmlns('movim:prefs')
->request();
}
}
function onConfig($packet)

58
app/widgets/LoginAnonymous/LoginAnonymous.php

@ -0,0 +1,58 @@
<?php
use Respect\Validation\Validator;
class LoginAnonymous extends WidgetBase
{
function load()
{
$this->registerEvent('session_start_handle', 'onStart');
}
function onStart($packet)
{
$session = \Sessionx::start();
$session->load();
if($session->mechanism == 'ANONYMOUS') {
RPC::call('Rooms.anonymousJoin');
}
}
function display()
{
}
function ajaxLogin($username)
{
$validate_user = Validator::string()->length(4, 40);
if(!$validate_user->validate($username)) {
Notification::append(null, 'bad username');
return;
}
// We get the Server Configuration
$cd = new \Modl\ConfigDAO;
$config = $cd->get();
$host = 'anonymous.jappix.com';
$password = 'AmISnowden?';
// We try to get the domain
$domain = \Moxl\Utils::getDomain($host);
// We launch the XMPP socket
RPC::call('register', $host);
// We set the username in the session
$s = Session::start();
$s->set('username', $username);
// We create a new session or clear the old one
$s = Sessionx::start();
$s->init($username, $password, $host, $domain);
\Moxl\Stanza\Stream::init($host);
}
}

1
app/widgets/LoginAnonymous/loginanonymous.tpl

@ -0,0 +1 @@

5
app/widgets/Presence/Presence.php

@ -103,6 +103,11 @@ class Presence extends WidgetBase
function ajaxLogout()
{
$pd = new \Modl\PresenceDAO();
$session = \Sessionx::start();
$pd->clearPresence($session->username.'@'.$session->host);
$session = \Sessionx::start();
$p = new Unavailable;
$p->setType('terminate')

39
app/widgets/Rooms/Rooms.php

@ -108,7 +108,17 @@ class Rooms extends WidgetCommon
$p = new Muc;
$p->setTo($room);
if($nickname != false) $p->setNickname($nickname);
if($nickname == false) {
$s = Session::start();
$nickname = $s->get('username');
}
if($nickname == false || $nickname == null) {
$session = \Sessionx::start();
$nickname = $session->username;
}
$p->setNickname($nickname);
$p->request();
}
@ -122,11 +132,17 @@ class Rooms extends WidgetCommon
{
if(!$this->validateRoom($room)) return;
$session = \Sessionx::start();
$s = Session::start();
$resource = $s->get('username');
if($resource == null) {
$session = \Sessionx::start();
$resource = $session->username;
}
$pu = new Unavailable;
$pu->setTo($room)
->setResource($session->username)
->setResource($resource)
->request();
}
@ -193,6 +209,10 @@ class Rooms extends WidgetCommon
function checkConnected($room, $resource = false)
{
if(!$this->validateRoom($room)) return;
if($resource && !$this->validateResource($resource)) {
Notification::append(null, $this->__('chatrooms.bad_id'));
return;
}
$pd = new \modl\PresenceDAO();
@ -215,6 +235,7 @@ class Rooms extends WidgetCommon
$view = $this->tpl();
$cod = new \modl\ConferenceDAO();
$view->assign('conferences', $cod->getAll());
$view->assign('room', $this->get('r'));
return $view->draw('_rooms', true);
}
@ -231,6 +252,18 @@ class Rooms extends WidgetCommon
else return true;
}
/**
* @brief Validate the resource
*
* @param string $resource
*/
private function validateResource($resource)
{
$validate_resource = Validator::string()->length(6, 40);
if(!$validate_resource->validate($resource)) return false;
else return true;
}
function display()
{
$this->view->assign('list', $this->prepareRooms());

90
app/widgets/Rooms/_rooms.tpl

@ -1,29 +1,67 @@
<ul class="middle divided spaced active">
<li class="subheader">
{$c->__('chatrooms.title')}
<span class="info">{$conferences|count}</span>
</li>
{loop="$conferences"}
{$connected = $c->checkConnected($value->conference, $value->nick)}
<li data-jid="{$value->conference}"
{if="$value->nick != null"} data-nick="{$value->nick}" {/if}
class="condensed room {if="$connected"}online{/if}">
{if="$connected"}
<span class="icon bubble color {$value->name|stringToColor}"><i class="md md-people"></i></span>
{else}
<span class="icon bubble color {$value->name|stringToColor}"><i class="md md-people-outline"></i></span>
{/if}
<span>{$value->name}</span>
<p>{$value->conference}</p>
{if="!$c->supported('anonymous') && $c->getView() != 'room'"}
<ul class="middle divided spaced active">
<li class="subheader">
{$c->__('chatrooms.title')}
<span class="info">{$conferences|count}</span>
</li>
{/loop}
{loop="$conferences"}
{$connected = $c->checkConnected($value->conference, $value->nick)}
<li data-jid="{$value->conference}"
{if="$value->nick != null"} data-nick="{$value->nick}" {/if}
class="condensed room {if="$connected"}online{/if}">
{if="$connected"}
<span class="icon bubble color {$value->name|stringToColor}"><i class="md md-people"></i></span>
{else}
<span class="icon bubble color {$value->name|stringToColor}"><i class="md md-people-outline"></i></span>
{/if}
<span>{$value->name}</span>
<p>{$value->conference}</p>
</li>
{/loop}
{if="$conferences == null"}
<li class="condensed">
<span class="icon green">
<i class="md md-people-outline"></i>
</span>
<p>{$c->__('rooms.empty_text1')} {$c->__('rooms.empty_text2')}</p>
</li>
{if="$conferences == null"}
<li class="condensed">
<span class="icon green">
<i class="md md-people-outline"></i>
</span>
<p>{$c->__('rooms.empty_text1')} {$c->__('rooms.empty_text2')}</p>
</li>
{/if}
</ul>
{else}
{if="$c->getView() == 'room'"}
<div class="placeholder icon">
<h1>{$c->__('room.anonymous_title')}</h1>
<h4>{$c->__('room.anonymous_login', $room)}</h4>
</div>
<ul class="simple divided thick">
<li>
<form
name="loginanonymous">
<div>
<input type="text" name="nick" id="nick" required
placeholder="{$c->__('room.nick')}"/>
<label for="nick">{$c->__('room.nick')}</label>
</div>
<div>
<input
type="submit"
value="{$c->__('button.come_in')}"
class="button flat oppose"/>
</div>
</form>
</li>
</ul>
<script type="text/javascript">
Rooms.anonymous_room = '{$room}';
</script>
{else}
<div class="placeholder icon">
<h1>{$c->__('room.anonymous_title')}</h1>
<h4>{$c->__('room.anonymous_text1')}</h4>
<h4>{$c->__('room.anonymous_text2')}</h4>
</div>
{/if}
</ul>
{/if}

2
app/widgets/Rooms/_rooms_list.tpl

@ -24,7 +24,7 @@
<i class="md md-beenhere"></i>
</div>
{/if}
{if="$value->mucjid && strpos($value->mucjid, '/') == false"}
{if="$value->mucjid && strpos($value->mucjid, '/') == false && !$c->supported('anonymous')"}
<a href="{$c->route('contact', $value->mucjid)}">
<span>{$value->resource}</span>
</a>

8
app/widgets/Rooms/locales.ini

@ -15,6 +15,14 @@ chatrooms.remove_text = 'You are going to remove the following chatroom. Pleas
chatrooms.connected = 'Connected to the chatroom'
chatrooms.disconnected = 'Disconnected from the chatroom'
chatrooms.users = 'Users in the room'
chatrooms.bad_nickname = 'Please enter a correct nickname (6 to 40 characters)'
[bookmarks]
bookmarks.updated = 'Bookmarks updated'
[anonymous]
room.anonymous_title = 'Public chatroom'
room.anonymous_text1 = 'You are currently logued as an anonymous user.'
room.anonymous_text2 = 'You can join using your own account or create one on the login page by login out using the cross in the top-right corner.'
room.anonymous_login = 'Login on %s'
room.nick = 'Your nickname'

35
app/widgets/Rooms/rooms.js

@ -1,4 +1,6 @@
var Rooms = {
anonymous_room: false,
refresh: function() {
var items = document.querySelectorAll('#rooms_widget ul li:not(.subheader)');
var i = 0;
@ -33,9 +35,42 @@ var Rooms = {
for(i = 0; i < list.length; i++) {
movim_remove_class(list[i], 'active');
}
},
/**
* @brief Connect to an anonymous server
* @param The jid to remember
*/
anonymousInit : function() {
Presence_ajaxLogout();
// We register the socket
MovimWebsocket.connection.register('anonymous.jappix.com');
MovimWebsocket.register(function()
{
form = document.querySelector('form[name="loginanonymous"]');
form.onsubmit = function(e) {
e.preventDefault();
// We login
LoginAnonymous_ajaxLogin(this.querySelector('input#nick').value);
}
});
},
/**
* @brief Join an anonymous room
* @param The jid to remember
*/
anonymousJoin : function() {
// We display the room
Chat_ajaxGetRoom(Rooms.anonymous_room);
// And finally we join
Rooms_ajaxExit(Rooms.anonymous_room);
Rooms_ajaxJoin(Rooms.anonymous_room);
}
}
MovimWebsocket.attach(function() {
Rooms.refresh();
Rooms.anonymousInit();
});

2
linker.php

@ -77,7 +77,7 @@ $stdin_behaviour = function ($data) use (/*&*/&$conn, $loop, &$buffer, &$connect
$xml = \Moxl\API::commit();
\Moxl\API::clear();
if(!empty($xml)) {
if(!empty($xml) && $conn) {
//$conn->write(trim($xml));
$conn->send(trim($xml));
#fwrite(STDERR, colorize(trim($xml), 'yellow')." : ".colorize('sent to XMPP', 'green')."\n");

1
locales/locales.ini

@ -30,6 +30,7 @@ page.preview = 'Preview'
page.visio = 'Visio-conference'
page.pods = 'Pods'
page.share = 'Share'
page.room = 'Room'
[errors]
error.error = 'Error: %s'

1
system/Route.php

@ -24,6 +24,7 @@ class Route extends \BaseController {
'news' => array('n'),
'pods' => false,
'profile' => false,
'room' => array('r'),
'share' => array('url'),
'visio' => false
);

6
system/Sessionx.php

@ -39,6 +39,7 @@ class Sessionx {
private $_start;
private $_active = false;
private $_config;
private $_mechanism;
/*
* Session generation and handling part
*/
@ -93,6 +94,7 @@ class Sessionx {
$s->active = $this->_active;
$s->start = $this->_start;
$s->timestamp = $this->_timestamp;
$s->mechanism = $this->_mechanism;
return $s;
}
@ -137,6 +139,7 @@ class Sessionx {
$this->_active = $session->active;
$this->_start = $session->start;
$this->_timestamp = $session->timestamp;
$this->_mechanism = $session->mechanism;
}
self::$_instance = $this;
@ -160,7 +163,8 @@ class Sessionx {
'user',
'password',
'hash',
'start')
'start',
'mechanism')
)
) {
$key = '_'.$key;

4
system/User.php

@ -161,6 +161,7 @@ class User {
function isSupported($key)
{
$this->reload();
if($this->caps != null) {
switch($key) {
case 'pubsub':
@ -170,6 +171,9 @@ class User {
return false;
break;
}
} elseif($key == 'anonymous') {
$session = \Sessionx::start();
return ($session->mechanism == 'ANONYMOUS');
} else {
return false;
}

8
system/widget/WidgetBase.php

@ -126,6 +126,14 @@ class WidgetBase
return $this->draw();
}
/**
* Get the current view name
*/
function getView()
{
return $this->_view;
}
/*
* @desc Preload some sourcecode for the draw method
*/

Loading…
Cancel
Save