Adding users to a group using a script [message #30191] |
Fri, 10 February 2006 11:44 |
djechelon
Messages: 46 Registered: July 2005
Karma: 0
|
Member |
|
|
Hi,
I need to let users add themselves to a group using an external script made by me. The user inserts username/password and a secret code.
This group lets the user access to some forums that are normally visibile but not readable
If everything is OK I run the following SQL Query:
$gid = 64;
$group_opts = 312975;
$sql = "INSERT INTO Forum_group_members (user_id , group_id , group_members_opt) VALUES ('".$uid."', '".$gid."', '".$group_opts."');";
$uid is taken from database and is obviously the user's ID.
When I go to Groups Administration I see the user listed with all permissions correctly set, but he can't still access the restricted forums!!!
Do I have to run other queries?
Thank you in advance.
|
|
|
Re: Adding users to a group using a script [message #30201 is a reply to message #30191] |
Sat, 11 February 2006 20:03 |
Ilia
Messages: 13241 Registered: January 2002
Karma: 0
|
Senior Member Administrator Core Developer |
|
|
You need to rebuild the group cache for that user by using the grp_rebuild_cache() function inside groups.inc passing the user id as the parameter to the function.
FUDforum Core Developer
|
|
|
Re: Adding users to a group using a script [message #30308 is a reply to message #30191] |
Thu, 16 February 2006 16:45 |
djechelon
Messages: 46 Registered: July 2005
Karma: 0
|
Member |
|
|
Sorry for answering so late but I've been a bit busy.
I have copied and rewritten the function you mentioned, making it rebuild the whole forum's group cache.
This is the result:
<?php function grp_rebuild_cache($user_id=null) {
global $conn;
$list = array();
$lmt = '';
/* generate an array of permissions, in the end we end up with 1ist of permissions */
$r = mysql_query("SELECT gm.user_id AS uid, gm.group_members_opt AS gco, gr.resource_id AS rid FROM Forum_group_members gm INNER JOIN Forum_group_resources gr ON gr.group_id=gm.group_id WHERE gm.group_members_opt>=65536 AND (gm.group_members_opt & 65536) > 0" . ($lmt ? ' AND '.$lmt : ''),$conn) or die(mysql_error().__LINE__);
while ($o = mysql_fetch_object($r)) {
foreach ($o as $k => $v) {
$o->$k = (int) $v;
}
if (isset($list[$o->rid][$o->uid])) {
if ($o->gco & 131072) {
$list[$o->rid][$o->uid] |= $o->gco;
} else {
$list[$o->rid][$o->uid] &= $o->gco;
}
} else {
$list[$o->rid][$o->uid] = $o->gco;
}
}
unset($r);
$tmp = array();
foreach ($list as $k => $v) {
foreach ($v as $u => $p) {
$tmp[] = $k.",".$p.",".$u;
}
}
if (!$tmp) {
mysql_query("DELETE FROM Forum_group_cache" . ($lmt ? ' WHERE '.$lmt : ''),$conn) or die(mysql_error().__LINE__);
return;
}
$sql = "REPLACE INTO Forum_group_cache (resource_id, group_cache_opt, user_id) VALUES (".implode('), (', $tmp).")";
mysql_query($sql,$conn) or die(mysql_error().$sql);
mysql_query("DELETE FROM Forum_group_cache WHERE ".($lmt ? $lmt . ' AND ' : '')." id < LAST_INSERT_ID()",$conn) or die(mysql_error().__LINE__);
mysql_query("DELETE FROM Forum_group_cache" . ($lmt ? ' WHERE '.$lmt : ''), $conn) or die(mysql_error().__LINE__);
foreach ($tmp as $ttmp) {
mysql_query("INSERT INTO Forum_group_cache (resource_id, group_cache_opt, user_id) VALUES (".$ttmp.")",$conn) or die(mysql_error().__LINE__);
}
} ?>
I made it run without errors, but still users can't access the private Forums I mentioned before, even if they are listed in Groups Administration.
Running Consistency check is useless...
What should I do then?
|
|
|
|
|
|
Re: Adding users to a group using a script [message #30371 is a reply to message #30191] |
Mon, 20 February 2006 20:45 |
djechelon
Messages: 46 Registered: July 2005
Karma: 0
|
Member |
|
|
Here's what I tried to do now.
A user tried to access the restricted zone as described.
He was displayed in Groups Management Panel, but couldn't access restricted zone.
I went into the database and searched for his user ID.
Nothing related to that ID was found inside the group cache table.
I ran consistency checker and re-checked for user ID in the database.
I emptied the group cache table using TRUNCATE TABLE Forum_group_cache from phpMyAdmin
I ran consistency checker but still no entry in the group cache.
I went into Groups Admin, deleted that user and re-added it manually by username.
His ID was found in the group cache as finally expected, and he can now enter the forums.
I think there is nothing wrong with the query
"INSERT INTO Forum_group_members (user_id , group_id , group_members_opt) VALUES ('".$uid."', '".$gid."', '".$group_opts."');
Because I copied it from FUDforum source.
I found a way to avoid cache rebuilding by sending direct queries to the group cache table. I haven't tested it yet but it could be a good solution for MY CASE only.
But I found that even if I set permissions 312975 (that SHOULD be all permissions except edit, del, sticky, attach, break, close, move) the option field in group cache table is set to 378511. Is it normal?
But still: when I run consistency check it does actually not rebuild group cache correctly. I mean that if I empty the group cache table and run the consistency check the table is filled with old values. I think there is a problem with the checker.
|
|
|
Re: Adding users to a group using a script [message #30382 is a reply to message #30371] |
Tue, 21 February 2006 15:20 |
Ilia
Messages: 13241 Registered: January 2002
Karma: 0
|
Senior Member Administrator Core Developer |
|
|
I think I see the cause for your problem, when adding a user you need to make sure you set the 65536 bit. This bit indicates that this is an approved group member. Without it, the record is ignored by group cache rebuild.
FUDforum Core Developer
|
|
|