'%grp/asso.php' => $this->make_hook('index', AUTH_PUBLIC),
'%grp/logo' => $this->make_hook('logo', AUTH_PUBLIC),
'%grp/site' => $this->make_hook('site', AUTH_PUBLIC),
- '%grp/edit' => $this->make_hook('edit', AUTH_MDP, 'groupadmin'),
- '%grp/mail' => $this->make_hook('mail', AUTH_MDP, 'groupadmin'),
- '%grp/forum' => $this->make_hook('forum', AUTH_MDP, 'groupmember'),
- '%grp/annuaire' => $this->make_hook('annuaire', AUTH_MDP, 'groupannu'),
- '%grp/annuaire/vcard' => $this->make_hook('vcard', AUTH_MDP, 'groupmember:groupannu'),
- '%grp/annuaire/csv' => $this->make_hook('csv', AUTH_MDP, 'groupmember:groupannu'),
- '%grp/trombi' => $this->make_hook('trombi', AUTH_MDP, 'groupannu'),
- '%grp/geoloc' => $this->make_hook('geoloc', AUTH_MDP, 'groupannu'),
+ '%grp/edit' => $this->make_hook('edit', AUTH_MDP, 'groupadmin'),
+ '%grp/mail' => $this->make_hook('mail', AUTH_MDP, 'groupadmin'),
+ '%grp/forum' => $this->make_hook('forum', AUTH_MDP, 'groupmember'),
+ '%grp/annuaire' => $this->make_hook('annuaire', AUTH_MDP, 'groupannu'),
+ '%grp/annuaire/vcard' => $this->make_hook('vcard', AUTH_MDP, 'groupmember:groupannu'),
+ '%grp/annuaire/csv' => $this->make_hook('csv', AUTH_MDP, 'groupmember:groupannu'),
+ '%grp/trombi' => $this->make_hook('trombi', AUTH_MDP, 'groupannu'),
+ '%grp/geoloc' => $this->make_hook('geoloc', AUTH_MDP, 'groupannu'),
'%grp/subscribe' => $this->make_hook('subscribe', AUTH_MDP),
- '%grp/subscribe/valid' => $this->make_hook('subscribe_valid', AUTH_MDP, 'groupadmin'),
- '%grp/unsubscribe' => $this->make_hook('unsubscribe', AUTH_MDP, 'groupmember'),
+ '%grp/subscribe/valid' => $this->make_hook('subscribe_valid', AUTH_MDP, 'groupadmin'),
+ '%grp/unsubscribe' => $this->make_hook('unsubscribe', AUTH_MDP, 'groupmember'),
'%grp/change_rights' => $this->make_hook('change_rights', AUTH_MDP),
- '%grp/admin/annuaire' => $this->make_hook('admin_annuaire', AUTH_MDP, 'groupadmin'),
- '%grp/member' => $this->make_hook('admin_member', AUTH_MDP, 'groupadmin'),
- '%grp/member/new' => $this->make_hook('admin_member_new', AUTH_MDP, 'groupadmin'),
- '%grp/member/new/ajax' => $this->make_hook('admin_member_new_ajax', AUTH_MDP, 'user', NO_AUTH),
- '%grp/member/del' => $this->make_hook('admin_member_del', AUTH_MDP, 'groupadmin'),
+ '%grp/admin/annuaire' => $this->make_hook('admin_annuaire', AUTH_MDP, 'groupadmin'),
+ '%grp/member' => $this->make_hook('admin_member', AUTH_MDP, 'groupadmin'),
+ '%grp/member/new' => $this->make_hook('admin_member_new', AUTH_MDP, 'groupadmin'),
+ '%grp/member/new/ajax' => $this->make_hook('admin_member_new_ajax', AUTH_MDP, 'user', NO_AUTH),
+ '%grp/member/del' => $this->make_hook('admin_member_del', AUTH_MDP, 'groupadmin'),
+ '%grp/member/suggest' => $this->make_hook('admin_member_suggest', AUTH_MDP, 'groupadmin'),
'%grp/rss' => $this->make_token_hook('rss', AUTH_PUBLIC),
- '%grp/announce/new' => $this->make_hook('edit_announce', AUTH_MDP, 'groupadmin'),
- '%grp/announce/edit' => $this->make_hook('edit_announce', AUTH_MDP, 'groupadmin'),
+ '%grp/announce/new' => $this->make_hook('edit_announce', AUTH_MDP, 'groupadmin'),
+ '%grp/announce/edit' => $this->make_hook('edit_announce', AUTH_MDP, 'groupadmin'),
'%grp/announce/photo' => $this->make_hook('photo_announce', AUTH_PUBLIC),
- '%grp/admin/announces' => $this->make_hook('admin_announce', AUTH_MDP, 'groupadmin'),
+ '%grp/admin/announces' => $this->make_hook('admin_announce', AUTH_MDP, 'groupadmin'),
);
}
- function handler_index(&$page, $arg = null)
+ function handler_index($page, $arg = null)
{
global $globals, $platal;
if (!is_null($arg)) {
$page->assign('articles', $arts);
}
- function handler_logo(&$page)
+ function handler_logo($page)
{
global $globals;
$globals->asso()->getLogo()->send();
}
- function handler_site(&$page)
+ function handler_site($page)
{
global $globals;
$site = $globals->asso('site');
exit;
}
- function handler_edit(&$page)
+ function handler_edit($page)
{
global $globals;
$page->changeTpl('xnetgrp/edit.tpl');
Post::v('unsub_url'), $flags, Post::t('welcome_msg'),
$globals->asso('id'));
if (Post::v('mail_domain')) {
- XDB::execute('INSERT IGNORE INTO virtual_domains (domain) VALUES({?})',
- Post::v('mail_domain'));
+ XDB::execute('INSERT IGNORE INTO email_virtual_domains (name)
+ VALUES ({?})',
+ Post::t('mail_domain'));
+ XDB::execute('UPDATE email_virtual_domains
+ SET aliasing = id
+ WHERE name = {?}',
+ Post::t('mail_domain'));
}
} else {
XDB::execute(
$globals->asso('id'));
}
+ Phone::deletePhones(0, Phone::LINK_GROUP, $globals->asso('id'));
+ $phone = new Phone(array('link_type' => 'group', 'link_id' => $globals->asso('id'), 'id' => 0,
+ 'type' => 'fixed', 'display' => Post::v('phone'), 'pub' => 'public'));
+ $fax = new Phone(array('link_type' => 'group', 'link_id' => $globals->asso('id'), 'id' => 1,
+ 'type' => 'fax', 'display' => Post::v('fax'), 'pub' => 'public'));
+ $phone->save();
+ $fax->save();
+ Address::deleteAddresses(null, Address::LINK_GROUP, null, $globals->asso('id'));
+ $address = new Address(array('groupid' => $globals->asso('id'), 'type' => Address::LINK_GROUP, 'text' => Post::v('address')));
+ $address->save();
if ($_FILES['logo']['name']) {
$upload = PlUpload::get($_FILES['logo'], $globals->asso('id'), 'asso.logo', true);
}
}
- function handler_mail(&$page)
+ function handler_mail($page)
{
global $globals;
}
}
- function handler_forum(&$page, $group = null, $artid = null)
+ function handler_forum($page, $group = null, $artid = null)
{
global $globals;
$page->changeTpl('xnetgrp/forum.tpl');
run_banana($page, 'ForumsBanana', $get);
}
- function handler_annuaire(&$page, $action = null, $subaction = null)
+ function handler_annuaire($page, $action = null, $subaction = null)
{
global $globals;
$page->assign('only_admin', Env::b('admin'));
}
- function handler_trombi(&$page)
+ function handler_trombi($page)
{
pl_redirect('annuaire/trombi');
}
- function handler_geoloc(&$page)
+ function handler_geoloc($page)
{
pl_redirect('annuaire/geoloc');
}
- function handler_vcard(&$page, $photos = null)
+ function handler_vcard($page, $photos = null)
{
global $globals;
$vcard = new VCard($photos == 'photos', 'Membre du groupe ' . $globals->asso('nom'));
- $vcard->addProfiles($globals->asso()->getMembersFilter()->getProfiles());
+ $vcard->addProfiles($globals->asso()->getMembersFilter()->getProfiles(null, Profile::FETCH_ALL));
$vcard->show();
}
- function handler_csv(&$page, $filename = null)
+ function handler_csv($page, $filename = null)
{
global $globals;
if (is_null($filename)) {
$filename = $globals->asso('diminutif') . '.csv';
}
$users = $globals->asso()->getMembersFilter(null, new UFO_Name('directory_name'))->getUsers();
- pl_content_headers("text/x-csv");
+ pl_cached_content_headers('text/x-csv', 1);
$page->changeTpl('xnetgrp/annuaire-csv.tpl', NO_SKIN);
$page->assign('users', $users);
}
$globals->asso('id'), $uid);
}
- private function validSubscription(User &$user)
+ private function validSubscription(User $user)
{
global $globals;
$this->removeSubscriptionRequest($user->id());
}
}
- function handler_subscribe(&$page, $u = null)
+ function handler_subscribe($page, $u = null)
{
global $globals;
$page->changeTpl('xnetgrp/inscrire.tpl');
$uf = New UserFilter(New UFC_Group($globals->asso('id'), true));
$admins = $uf->iterUsers();
$admin = $admins->next();
- $to = $admin->bestalias;
+ $to = $admin->bestEmail();
while ($admin = $admins->next()) {
- $to .= ', ' . $admin->bestalias;
+ $to .= ', ' . $admin->bestEmail();
}
$append = "\n"
}
}
- function handler_subscribe_valid(&$page)
+ function handler_subscribe_valid($page)
{
global $globals;
$page->assign('valid', $it);
}
- function handler_change_rights(&$page)
+ function handler_change_rights($page)
{
if (Env::has('right') && (may_update() || S::suid())) {
switch (Env::v('right')) {
http_redirect($_SERVER['HTTP_REFERER']);
}
- function handler_admin_annuaire(&$page)
+ function handler_admin_annuaire($page)
{
global $globals;
$page->assign('lists', $lists);
}
- function handler_admin_member_new(&$page, $email = null)
+ function handler_admin_member_new($page, $email = null)
{
global $globals;
}
S::assert_xsrf_token();
+ $suggest_account_activation = false;
+
+ // FS#703 : $_GET is urldecoded twice, hence
+ // + (the data) => %2B (in the url) => + (first decoding) => ' ' (second decoding)
+ // Since there can be no spaces in emails, we can fix this with :
+ $email = str_replace(' ', '+', $email);
// Finds or creates account: first cases are for users with an account.
if (!User::isForeignEmailAddress($email)) {
}
}
} else {
- // User is of type xnet.
+ // User is of type xnet. There are 3 possible cases:
+ // * the email is not known yet: we create a new account and
+ // propose to send an email to the user so he can activate
+ // his account,
+ // * the email is known but the user was not contacted in order to
+ // activate yet: we propose to send an email to the user so he
+ // can activate his account,
+ // * the email is known and the user was already contacted or has
+ // an active account: nothing to be done.
list($mbox, $domain) = explode('@', strtolower($email));
$hruid = User::makeHrid($mbox, $domain, 'ext');
// User might already have an account (in another group for example).
$hruid, $display_name, $full_name, $directory_name, $email);
$user = User::get($hruid);
}
+
+ $suggest_account_activation = $this->suggest($user);
}
if ($user) {
VALUES ({?}, {?})',
$user->id(), $globals->asso('id'));
$this->removeSubscriptionRequest($user->id());
- pl_redirect('member/' . $user->login());
+ if ($suggest_account_activation) {
+ pl_redirect('member/suggest/' . $user->login() . '/' . $email . '/' . $globals->asso('nom'));
+ } else {
+ pl_redirect('member/' . $user->login());
+ }
+ }
+ }
+
+ // Check if the user has a pending or active account, and thus if we should her account's activation.
+ private function suggest(PlUser $user)
+ {
+ $active = XDB::fetchOneCell('SELECT state = \'active\'
+ FROM accounts
+ WHERE uid = {?}',
+ $user->id());
+ $pending = XDB::fetchOneCell('SELECT uid
+ FROM register_pending_xnet
+ WHERE uid = {?}',
+ $user->id());
+ $requested = AccountReq::isPending($user->id());
+
+ if ($active || $pending || $requested) {
+ return false;
}
+ return true;
}
- function handler_admin_member_new_ajax(&$page)
+ function handler_admin_member_suggest($page, $hruid, $email)
+ {
+ $page->changeTpl('xnetgrp/membres-suggest.tpl');
+
+ // FS#703 : $_GET is urldecoded twice, hence
+ // + (the data) => %2B (in the url) => + (first decoding) => ' ' (second decoding)
+ // Since there can be no spaces in emails, we can fix this with :
+ $email = str_replace(' ', '+', $email);
+
+ if (Post::has('suggest')) {
+ if (Post::t('suggest') == 'yes') {
+ $user = S::user();
+ $group = Platal::globals()->asso('nom');
+ $request = new AccountReq($user, $hruid, $email, $group);
+ $request->submit();
+ $page->trigSuccessRedirect('Un email va bien être envoyé à ' . $email . ' pour l\'activation de son compte.',
+ $group . '/member/' . $hruid);
+ } else {
+ pl_redirect('member/' . $hruid);
+ }
+ }
+ $page->assign('email', $email);
+ $page->assign('hruid', $hruid);
+ }
+
+ function handler_admin_member_new_ajax($page)
{
pl_content_headers("text/html");
$page->changeTpl('xnetgrp/membres-new-search.tpl', NO_SKIN);
$page->assign('users', $users);
}
- function unsubscribe(PlUser &$user)
+ function unsubscribe(PlUser $user)
{
global $globals;
XDB::execute("DELETE FROM group_members
}
}
- XDB::execute("DELETE FROM virtual_redirect
- USING virtual_redirect
- INNER JOIN virtual USING(vid)
- WHERE redirect={?} AND alias LIKE {?}",
- $user->forlifeEmail(), '%@'.$domain);
+ XDB::execute('DELETE v
+ FROM email_virtual AS v
+ INNER JOIN email_virtual_domains AS d ON (v.domain = d.id)
+ WHERE v.redirect = {?} AND d.name = {?}',
+ $user->forlifeEmail(), $domain);
return !$warning;
}
- function handler_unsubscribe(&$page)
+ function handler_unsubscribe($page)
{
$page->changeTpl('xnetgrp/membres-del.tpl');
$user = S::user();
- $uid = S::user()->id();
- if (empty($uid)) {
+ if (empty($user)) {
return PL_NOT_FOUND;
}
$page->assign('self', true);
- $page->assign('user', $uid);
+ $page->assign('user', $user);
if (!Post::has('confirm')) {
return;
S::assert_xsrf_token();
}
+ $hasSingleGroup = ($user->groupCount() == 1);
+
if ($this->unsubscribe($user)) {
- $page->trigSuccess('Vous avez été désinscrit du groupe avec succès.');
+ $page->trigSuccess('Tu as été désinscrit du groupe avec succès.');
} else {
- $page->trigWarning('Vous avez été désinscrit du groupe, mais des erreurs se sont produites lors des désinscriptions des alias et des listes de diffusion.');
+ $page->trigWarning('Tu as été désinscrit du groupe, mais des erreurs se sont produites lors des désinscriptions des alias et des listes de diffusion.');
+ }
+
+ // If user is of type xnet account and this was her last group, disable the account.
+ if ($user->type == 'xnet' && $hasSingleGroup) {
+ $user->clear(true);
}
$page->assign('is_member', is_member(true));
}
- function handler_admin_member_del(&$page, $user = null)
+ function handler_admin_member_del($page, $user = null)
{
$page->changeTpl('xnetgrp/membres-del.tpl');
$user = User::getSilent($user);
if (empty($user)) {
return PL_NOT_FOUND;
}
+
+ global $globals;
+
+ if (!$user->inGroup($globals->asso('id'))) {
+ pl_redirect('annuaire');
+ }
+
+ $page->assign('self', false);
$page->assign('user', $user);
if (!Post::has('confirm')) {
S::assert_xsrf_token();
}
+ $hasSingleGroup = ($user->groupCount() == 1);
+
if ($this->unsubscribe($user)) {
$page->trigSuccess("{$user->fullName()} a été désinscrit du groupe !");
} else {
$page->trigWarning("{$user->fullName()} a été désinscrit du groupe, mais des erreurs subsistent !");
}
+
+ // If user is of type xnet account and this was her last group, disable the account.
+ if ($user->type == 'xnet' && $hasSingleGroup) {
+ $user->clear(true);
+ }
}
- private function changeLogin(PlPage &$page, PlUser &$user, MMList &$mmlist, $login)
+ private function changeLogin(PlPage $page, PlUser $user, $login)
{
// Search the user's uid.
$xuser = User::getSilent($login);
return $user->login();
}
- function handler_admin_member(&$page, $user)
+ function handler_admin_member($page, $user)
{
global $globals;
- $page->changeTpl('xnetgrp/membres-edit.tpl');
-
$user = User::getSilent($user);
if (empty($user)) {
return PL_NOT_FOUND;
}
+ if (!$user->inGroup($globals->asso('id'))) {
+ pl_redirect('annuaire');
+ }
+
+ $page->changeTpl('xnetgrp/membres-edit.tpl');
+
$mmlist = new MMList(S::user(), $globals->asso('mail_domain'));
if (Post::has('change')) {
+ require_once 'emails.inc.php';
S::assert_xsrf_token();
// Convert user status to X
if (!Post::blank('login_X')) {
- $forlife = $this->changeLogin($page, $user, $mmlist, Post::t('login_X'));
+ $forlife = $this->changeLogin($page, $user, Post::t('login_X'));
if ($forlife) {
pl_redirect('member/' . $forlife);
}
// Update user info
$email_changed = (!$user->profile() && strtolower($user->forlifeEmail()) != strtolower(Post::v('email')));
$from_email = $user->forlifeEmail();
- if (!$user->profile()) {
+ if ($user->type == 'virtual' || ($user->type == 'xnet' && !$user->perms)) {
XDB::query('UPDATE accounts
SET full_name = {?}, directory_name = {?}, display_name = {?},
sex = {?}, email = {?}, type = {?}
WHERE uid = {?}',
Post::t('email'), $user->id());
}
+ if (require_email_update($user, Post::t('email'))) {
+ $listClient = new MMList(S::user());
+ $listClient->change_user_email($user->forlifeEmail(), Post::t('email'));
+ update_alias_user($user->forlifeEmail(), Post::t('email'));
+ }
if (XDB::affectedRows()) {
- $page->trigSuccess('Données de l\'utilisateur mise à jour.');
+ $page->trigSuccess('Données de l\'utilisateur mises à jour.');
+ }
+
+ if (($user->type == 'xnet' && !$user->perms) && Post::b('suggest')) {
+ $request = new AccountReq(S::user(), $user->hruid, Post::t('email'), $globals->asso('nom'));
+ $request->submit();
+ $page->trigSuccess('Le compte va bientôt être activé.');
}
// Update group params for user
// Change subscriptioin to aliases
foreach (Env::v('ml3', array()) as $ml => $state) {
+ require_once 'emails.inc.php';
$ask = !empty($_REQUEST['ml4'][$ml]);
+ list($local_part, ) = explode('@', $ml);
if($state == $ask) {
if ($state && $email_changed) {
- XDB::query("UPDATE virtual_redirect AS vr, virtual AS v
- SET vr.redirect = {?}
- WHERE vr.vid = v.vid AND v.alias = {?} AND vr.redirect = {?}",
- $user->forlifeEmail(), $ml, $from_email);
+ update_list_alias($user->id(), $from_email, $local_part, $globals->asso('mail_domain'));
$page->trigSuccess("L'abonnement de {$user->fullName()} à $ml a été mis à jour.");
}
} else if($ask) {
- XDB::query("INSERT INTO virtual_redirect (vid,redirect)
- SELECT vid,{?} FROM virtual WHERE alias={?}",
- $user->forlifeEmail(), $ml);
+ add_to_list_alias($user->id(), $local_part, $globals->asso('mail_domain'));
$page->trigSuccess("{$user->fullName()} a été abonné à $ml.");
} else {
- XDB::query("DELETE FROM virtual_redirect
- USING virtual_redirect
- INNER JOIN virtual USING(vid)
- WHERE redirect={?} AND alias={?}",
- $from_email, $ml);
+ delete_from_list_alias($user->id(), $local_part, $globals->asso('mail_domain'));
$page->trigSuccess("{$user->fullName()} a été désabonné de $ml.");
}
}
$positions = str_replace(array('enum(', ')', '\''), '', $res[0]['Type']);
$page->assign('user', $user);
+ $page->assign('suggest', $this->suggest($user));
$page->assign('listes', $mmlist->get_lists($user->forlifeEmail()));
- $page->assign('alias', $user->emailAliases($globals->asso('mail_domain'), 'user', true));
+ $page->assign('alias', $user->emailGroupAliases($globals->asso('mail_domain')));
$page->assign('positions', explode(',', $positions));
}
- function handler_rss(PlPage& $page, PlUser& $user)
+ function handler_rss(PlPage $page, PlUser $user)
{
global $globals;
$page->assign('asso', $globals->asso());
return $feed->run($page, $user, false);
}
- private function upload_image(PlPage &$page, PlUpload &$upload)
+ private function upload_image(PlPage $page, PlUpload $upload)
{
if (@!$_FILES['image']['tmp_name'] && !Env::v('image_url')) {
return true;
return true;
}
- function handler_photo_announce(&$page, $eid = null) {
+ function handler_photo_announce($page, $eid = null) {
if ($eid) {
$res = XDB::query('SELECT *
FROM group_announces_photo
exit;
}
- function handler_edit_announce(&$page, $aid = null)
+ function handler_edit_announce($page, $aid = null)
{
global $globals, $platal;
$page->changeTpl('xnetgrp/announce-edit.tpl');
$page->assign_by_ref('upload', $upload);
}
- function handler_admin_announce(&$page)
+ function handler_admin_announce($page)
{
global $globals;
$page->changeTpl('xnetgrp/announce-admin.tpl');