*************** *** 642,931 **** return $tables; } - - /* * Create a list of group names and IDs. */ - function views_handler_filter_group() { - $list = array(); - $list = variable_get('og_node_types', array('og')); - $groupTypes = implode(",", $list); $vids = array(); - $result = db_query("SELECT n.nid, n.title FROM {node} n WHERE n.type IN ('". $groupTypes ."') ORDER BY n.title"); while ($obj = db_fetch_object($result)) { $vids[$obj->nid] = $obj->title; } return $vids; } - /* - * Implementation of hook_init. - * - * Got the idea of re-directing if this is a add group node request - * from here: http://drupal.org/project/globalredirect * */ - - function og_user_roles_init () - { - global $user; - - // Looking for this format: http://www.scbbs.com/node/add/link?gids[]=29 - - // We only need to process this if the user is logged in - if ($user->uid > 0) { - - // Bootstrap if arg() doesn't exist - if (!function_exists('arg') && $user->uid > 0){ - drupal_bootstrap(DRUPAL_BOOTSTRAP_PATH); // added as per this issue: http://drupal.org/node/149469 - } - - // If this is a group node/add, re-direct to ognodeadd - if (arg(0) == 'node' && arg(1) == 'add' && isset($_REQUEST['gids'])) { - $gids = $_GET['gids']; - $gid = intval(current($_REQUEST['gids'])); - - $type = arg(2); - - $path = 'node/ognodeadd'; - if ($type == 'og_user_roles_subgroup') $type = variable_get("og_user_roles_create_subgroup_value", ''); // change OG Subgroups type to 'group' - - $query = 'type=' . $type . '&gids[]=' . $gid; - drupal_goto($path, $query); - } - } - } - /* - * Implementation of hook_user. - * Put new users in default role if applicable. - * - * Got this code from here: http://drupal.org/node/28379#comment-132430 * */ - - function og_user_roles_user ($op, &$edit, &$user, $category=null) - { - // If the user opted to create a default role - - if (variable_get("og_user_roles_assign_default", 0) == 1) { - - $rid = variable_get("og_user_roles_default_value", 0); - - // special case for new users - if ($op == "insert") - { - /* - * Modification as per: http://drupal.org/node/149483 - */ - // Check to see if this user doesn't already have this role; - // If not, then assign it. - - $sql = "SELECT COUNT(*) FROM {users_roles} WHERE uid = %d AND rid = %d"; - $result = db_query($sql, $user->uid, $rid); - $output = (db_result($result)); - if ($output == 0) db_query('INSERT INTO {users_roles} (uid, rid) VALUES (%d, %d)', $user->uid, $rid); - } - - } // end if - - // Add the group roles to $user->roles if this is a group - // This should only be effective until the next global $user call - - if ($op == "load") { - $roles = og_user_roles_all_roles($user); // This returns normal $user->roles and includes OG roles if any - $user->roles = $roles; - } // end $op load - - // Remove user info from og_users_roles table - - if ($op == "delete") { - db_query("DELETE FROM {og_users_roles} WHERE uid = %d", $user->uid); // delete all records for this user - } // end $op delete - - } - - /** - * implementation of hook_og(); - * - * @param $op string, 'user insert', 'user update', 'user delete' - * @param $nid node ID of the group - * @param $uid the user ID - * @param $args associative array containing details about the subscription - */ - function og_user_roles_og($op, $nid, $uid, $args = array()) { - switch ($op) { - case 'user insert': - - // --- Modification - 2007-06-18 - as per: http://drupal.org/node/152442 - // Adding every user to a basic group restricted role, that all users in the group should have. - // I don't know a better way, so I'll do it like this. This is based on the creating of a founder role, - // just that every user in the group should automagically get this role. - // -Bibo - if (variable_get("og_user_roles_assign_basicgrouprole", 0) == 1) { - $rid = variable_get("og_user_roles_basicgrouprole_value", 0); - og_user_roles_role_join($uid, $rid, $nid); // assign user to group role in that group - } - //--- end of modification - - global $base_url; - $user = user_load(array('uid' => $uid)); - $username = $user->name; - $node = node_load($nid); - - // Send notification of new og subscription to administrators of group; - - if (variable_get("og_user_roles_notify_default", 0) == 1) { - $group = $node->title; - $sender = variable_get('site_mail', ''); - $subject = 'User ' . $username . ' added to group: ' . $group; - $message = "User " . $username . " added to group: " . $group . ""; - - // Get the group admin(s) - - // $result = db_query("SELECT uid FROM og_uid WHERE is_admin = 1 AND nid = " . $nid); - $result = db_query("SELECT uid FROM {og_uid} WHERE is_admin = 1 AND nid = %d", $nid); // FIXED TABLE PREFIX - while ($obj = db_fetch_object($result)) { - $recipient_uid = $obj->uid; - $recipient_user = user_load(array('uid' => $recipient_uid)); - $recipient = $recipient_user->mail; - mimemail($sender, $recipient, $subject, $message); - } // end while - } // end if - - break; - - case 'user delete': - - // Remove all roles for this user in this group if he is being unsubscribed; - - og_user_roles_role_leave($uid, $nid); - - break; - - } // end switch - } - - /** - * Implementation of hook_node_info(). - */ - function og_user_roles_node_info() { - - // If og_subgroups is installed AND og_user_roles_create_subgroup checkbox is checked; - - if (module_exists('og_subgroups') && variable_get("og_user_roles_create_subgroup", 0) == 1) { - return array( - 'og_user_roles_subgroup' => array( - 'name' => t('Subgroup'), - 'module' => 'og_user_roles', - 'description' => t('Create a basic subgroup.'), - 'help' => t('Create a basic subgroup.'), - 'body_label' => t('Description'), - ), - ); - } // end if - } - - /** - * Implementation of hook_load(). - * - * Doesn't seem to work. - */ - //function og_user_roles_load($node) { - // watchdog test - // watchdog("hook_load", "og_user_roles : type = " . $node->type); - - // return $node; - //} - /** - * Implementation of hook_nodeapi(). * */ function og_user_roles_nodeapi(&$node, $op, $teaser = NULL, $page = NULL) { switch ($op) { - - case 'access': - // - // This access check is used for TAC and OG permissions integration; - // - if (variable_get("og_user_roles_tac_og_value", 0) == 1) { - - $access = FALSE; - $og_access = og_user_roles_og_access_check($teaser, $node); - $tac_access = og_user_roles_taxonomy_access_check($teaser, $node); - - if ($og_access === TRUE && $tac_access == FALSE) $access = FALSE; - if ($og_access === FALSE) $access = FALSE; - if ($og_access === TRUE && $tac_access == TRUE) $access = TRUE; - - return $access; - } - - break; - case 'submit': - // - // Put appropriate nodes into all groups upon node submission; - // - // Get list of nodes to put into all groups; - - $nodelist = variable_get('og_user_roles_all_groups_nodes', ''); - if (!empty($nodelist)) { - $nodelistArray = explode(",", $nodelist); - foreach ($nodelistArray as $nodelistItem) { - if ($node->nid == $nodelistItem) { - if ($grps = og_user_roles_get_groups($node)) { - $node->og_groups = array_keys($grps); - $node->og_groups_names = array_values($grps); - - $public = db_result(db_query_range("SELECT is_public FROM {og_ancestry} WHERE nid = %d", $node->nid, 0, 1)); - $node->og_public = $public ? TRUE : FALSE; - } // end $grps if - } // end $node->nid if - } // end foreach - } // end $nodelist if - - break; - case 'insert': - - // If this is a group node, put the group creator into a group role upon creation; - - if (variable_get("og_user_roles_assign_founder", 0) == 1) { - - $rid = variable_get("og_user_roles_founder_value", 0); - - // If this is a group node - if (og_is_group_type($node->type)) { - // Get the requisite data - $uid = $node->uid; // user ID - $gid = $node->nid; // group ID - og_user_roles_role_join($uid, $rid, $gid); // assign user to group role in that group - } - } - - // Create a subgroup record for this group - - // 'ognodeadd' is my node add callback, so I know if this node is a group and - // here, then we need to process it node as a subgroup - - if ($node->type == variable_get('og_user_roles_create_subgroup_value', '') && arg(1) == 'ognodeadd') { - - $gids = $_GET['gids']; - $gid = $gids[0]; - $subgroup = $node->nid; - $sql = 'INSERT INTO {og_ancestry} (nid,group_nid,is_public) VALUES (%d,%d,0)'; - db_query($sql, $subgroup, $gid); - } - break; - } // end switch } // end og_user_roles_nodeapi function - // returns all groups so long as this is not a group itself function og_user_roles_get_groups($node) { $groups = array(); --- 556,797 ---- return $tables; } + /* * Create a list of group names and IDs. */ + function views_handler_filter_group() { + $list = array(); + $list = variable_get('og_node_types', array('og')); + + $group_types = implode(',', $list); $vids = array(); + $result = db_query("SELECT n.nid, n.title FROM {node} n WHERE n.type IN (%s) ORDER BY n.title", $group_types); while ($obj = db_fetch_object($result)) { $vids[$obj->nid] = $obj->title; } + return $vids; } + + /* + * Implementation of hook_init. * + * Got the idea of re-directing if this is a add group node request + * from here: http://drupal.org/project/globalredirect */ + function og_user_roles_init() { + global $user; + // Looking for this format: http://www.scbbs.com/node/add/link?gids[]=29 + // We only need to process this if the user is logged in + + if ($user->uid > 0) { + // Bootstrap if arg() doesn't exist + if (!function_exists('arg') && $user->uid > 0) { + drupal_bootstrap(DRUPAL_BOOTSTRAP_PATH); // added as per this issue: http://drupal.org/node/149469 + } + // If this is a group node/add, re-direct to ognodeadd + if (arg(0) == 'node' && arg(1) == 'add' && isset($_REQUEST['gids'])) { + $gids = $_GET['gids']; + $gid = intval(current($_REQUEST['gids'])); + $type = arg(2); + $path = 'node/ognodeadd'; + + if ($type == 'og_user_roles_subgroup') { + $type = variable_get('og_user_roles_create_subgroup_value', ''); // change OG Subgroups type to 'group' + } + $query = 'type=' . $type . '&gids[]=' . $gid; + + drupal_goto($path, $query); + } + } + } + /* + * Implementation of hook_user. + * Put new users in default role if applicable. * + * Got this code from here: http://drupal.org/node/28379#comment-132430 */ + function og_user_roles_user($op, &$edit, &$user, $category = NULL) { + + // If the user opted to create a default role + if ($op == 'insert' && variable_get('og_user_roles_assign_default', 0) == 1) { + // Check to see if this user doesn't already have this role; + // If not, then assign it. + $rid = variable_get('og_user_roles_default_value', 0); + $sql = "SELECT COUNT(*) FROM {users_roles} WHERE uid = %d AND rid = %d"; + $result = db_query($sql, $user->uid, $rid); + $output = (db_result($result)); + + if ($output == 0) { + db_query('INSERT INTO {users_roles} (uid, rid) VALUES (%d, %d)', $user->uid, $rid); + } + } + + // Add the group roles to $user->roles if this is a group + // This should only be effective until the next global $user call + if ($op == 'load') { + $roles = og_user_roles_all_roles($user); // This returns normal $user->roles and includes OG roles if any + $user->roles = $roles; + } // end $op load + + // Remove user info from og_users_roles table + if ($op == 'delete') { + db_query("DELETE FROM {og_users_roles} WHERE uid = %d", $user->uid); // delete all records for this user + } // end $op delete + } + /** + * implementation of hook_og(); * + * @param $op string, 'user insert', 'user update', 'user delete' + * @param $nid node ID of the group + * @param $uid the user ID + * @param $args associative array containing details about the subscription + */ + function og_user_roles_og($op, $nid, $uid, $args = array()) { + + switch ($op) { + case 'user insert': + global $base_url; + + if (variable_get('og_user_roles_assign_basicgrouprole', 0) == 1) { + $rid = variable_get('og_user_roles_basicgrouprole_value', 0); + og_user_roles_role_join($uid, $rid, $nid); // assign user to group role in that group + } + + $user = user_load(array('uid' => $uid)); + $node = node_load($nid); + + // Send notification of new og subscription to administrators of group; + if (variable_get('og_user_roles_notify_default', 0) == 1) { + $group = check_plain($node->title); + $sender = variable_get('site_mail', ''); + $subject = t('User @user added to group: @group', array('@user' => $user->name, '@group' => $group)); + $message = t('User @user added to group: @group.', array('@user' => theme('username', $user), '@group' => l($group, "node/$nid"))); + $result = db_query("SELECT uid FROM {og_uid} WHERE is_admin = 1 AND nid = %d", $nid); // FIXED TABLE PREFIX + + while ($obj = db_fetch_object($result)) { + $recipient_uid = $obj->uid; + $recipient_user = user_load(array('uid' => $recipient_uid)); + $recipient = $recipient_user->mail; + mimemail($sender, $recipient, $subject, $message); + } // end while + } // end if + break; + + case 'user delete': + // Remove all roles for this user in this group if he is being unsubscribed; + og_user_roles_role_leave($uid, $nid); + break; + } // end switch + } + + /** + * Implementation of hook_node_info(). + */ + function og_user_roles_node_info() { + // If og_subgroups is installed AND og_user_roles_create_subgroup checkbox is checked; + if (module_exists('og_subgroups') && variable_get("og_user_roles_create_subgroup", 0) == 1) { + + return array( + 'og_user_roles_subgroup' => array( + 'name' => t('Subgroup'), + 'module' => 'og_user_roles', + 'description' => t('Create a basic subgroup.'), + 'help' => t('Create a basic subgroup.'), + 'body_label' => t('Description'), + ), + ); + } // end if + } + + /** + * Implementation of hook_nodeapi(). */ function og_user_roles_nodeapi(&$node, $op, $teaser = NULL, $page = NULL) { switch ($op) { + case 'access': + // This access check is used for TAC and OG permissions integration; + if (variable_get("og_user_roles_tac_og_value", 0) == 1) { + $access = FALSE; + + $og_access = og_user_roles_og_access_check($teaser, $node); + $tac_access = og_user_roles_taxonomy_access_check($teaser, $node); + + if ($og_access === TRUE && $tac_access == FALSE) { + $access = FALSE; + } + if ($og_access === FALSE) { + $access = FALSE; + } + + if ($og_access === TRUE && $tac_access == TRUE) { + $access = TRUE; + } + + return $access; + } + break; + case 'submit': + // Put appropriate nodes into all groups upon node submission; + + // Get list of nodes to put into all groups; + $nodelist = variable_get('og_user_roles_all_groups_nodes', ''); + + if (!empty($nodelist)) { + $nodelist_array = explode(",", $nodelist); + + foreach ($nodelist_array as $nodelist_item) { + if ($node->nid == $nodelist_item) { + if ($grps = og_user_roles_get_groups($node)) { + $node->og_groups = array_keys($grps); + $node->og_groups_names = array_values($grps); + $public = db_result(db_query_range("SELECT is_public FROM {og_ancestry} WHERE nid = %d", $node->nid, 0, 1)); + $node->og_public = $public ? TRUE : FALSE; + } // end $grps if + } // end $node->nid if + } // end foreach + + } // end $nodelist if + break; + case 'insert': + + // If this is a group node, put the group creator into a group role upon creation; + if (variable_get("og_user_roles_assign_founder", 0) == 1) { + // If this is a group node + + if (og_is_group_type($node->type)) { + // Get the requisite data + $uid = $node->uid; // user ID + $rid = variable_get("og_user_roles_founder_value", 0); + $gid = $node->nid; // group ID + og_user_roles_role_join($uid, $rid, $gid); // assign user to group role in that group + } + + } + // Create a subgroup record for this group + // 'ognodeadd' is my node add callback, so I know if this node is a group and + + // here, then we need to process it node as a subgroup + if ($node->type == variable_get('og_user_roles_create_subgroup_value', '') && arg(1) == 'ognodeadd') { + $gids = $_GET['gids']; + $gid = $gids[0]; + $subgroup = $node->nid; + $sql = 'INSERT INTO {og_ancestry} (nid,group_nid,is_public) VALUES (%d,%d,0)'; + db_query($sql, $subgroup, $gid); + } + break; } // end switch } // end og_user_roles_nodeapi function + + // returns all groups so long as this is not a group itself function og_user_roles_get_groups($node) { $groups = array(); *************** *** 965,1419 **** // just the query for the get_node_groups function. function og_user_roles_get_groups_result() { $sql = "SELECT oga.group_nid, n.title FROM {og_ancestry} oga INNER JOIN {node} n ON oga.group_nid = n.nid"; - // we use rewrite_sql() in order to avoid disclosing completely private groups (once we support those properly) - // return db_query(db_rewrite_sql($sql, 'oga', 'group_nid'), $nid); - return db_query(db_rewrite_sql($sql, 'oga', 'group_nid'), ''); - } - - // - // My OG Roles Modifications - // - // - // Modification - Added this function - // - // This function returns an array of role keys and names, like $user->roles - // However, it returns site roles as well as group roles - // - function og_user_roles_all_roles_array($user) { - - $roles = og_user_roles_all_roles($user); - - return $roles; - } - - // This function takes the global $user (or $account) value and returns a list - // of group and non-group roles for this user - - function og_user_roles_all_roles($user) { - - // This will be the process to get BOTH the group and non-group roles for a user - - $uid = $user->uid; - $gid = 0; - $gids = array(); - $nodeID = 0; - $location = 0; - - $uri_request_id = $_SERVER['REQUEST_URI']; - $arg = explode("/", $uri_request_id); - - $ogroles = array(); - $x1 = 0; - // - // This will by default add the anonymous user role (no need since we merge user->roles) - // - // We get the groupID - // - $group_node = og_get_group_context(); - $gid02 = $group_node->nid; - $gid = $gid02; - if ($gid02 === null) $gid = 0; - // - // If the above doesn't get the groupID, then we start trying stuff - // - if ($gid == 0) { - - // http://doadance.scbbs.com/drupal03/node/79 - - if (arg(0) == 'node' && is_numeric(arg(1)) && is_null(arg(2))) { - $location = 1; - $nodeID = (int)arg(1); - $gid = getgid($nodeID, $uid); - } - - // http://doadance.scbbs.com/node/79/edit - // http://doadance.scbbs.com/node/79/outline - // http://doadance.scbbs.com/node/79/track - - if (arg(0) == 'node' && is_numeric(arg(1)) && (arg(2) == 'edit' || arg(2) == 'outline' || arg(2) == 'track' ) ) { - $location = 2; - $nodeID = (int)arg(1); - $gid = getgid($nodeID, $uid); - } - // 0 1 2 - // http://www.mysite.com/comment/edit/14 - // - if (arg(0) == 'comment' && is_numeric(arg(2)) && arg(1) == 'edit' ) { - $location = 3; - $comment = _comment_load(arg(2)); - $nodeID = $comment->nid; - $gid = getgid($nodeID, $uid); - } - // 0 1 2 - // http://www.mysite.com/comment/reply/128#comment_form - // - if (arg(0) == 'comment' && arg(1) == 'reply' ) { - $location = 4; - $subsections = explode("#", arg(2)); - $nodeID = (int)$subsections[0]; - $gid = getgid($nodeID, $uid); - } - - // og_term access - // 0 1 2 3 - // http://www.mysite.com/node/add/forum/121 - // - if (arg(0) == 'node' && is_numeric(arg(3)) && arg(1) == 'add' ) { - $location = 5; - $nodeID = (int)arg(3); - $gid = getgid($nodeID, $uid); - } - - // Here we get the gid directly - // - // http://doadance.scbbs.com/node/79/view/tree - // http://doadance.scbbs.com/node/79/view/members - // http://doadance.scbbs.com/node/79/view - - if (arg(0) == 'node' && is_numeric(arg(1)) && arg(2) == 'view' ) { - $location = 2; - $gid = (int)arg(1); - } - - // Here we get the gid directly - // - // http://doadance.scbbs.com/og/users/72 - // http://doadance.scbbs.com/og/manage/72 - - if (arg(0) == 'og' && is_numeric(arg(2)) && is_null(arg(3))) { - $location = 6; - $gid = (int)arg(2); - } - - // og_user_roles - // - // http://doadance.scbbs.com/og/users/72/roles - // http://doadance.scbbs.com/og/users/72/add - - if (arg(0) == 'og' && arg(1) == 'users' && is_numeric(arg(2)) && is_null(arg(4))) { - $location = 6; - $gid = (int)arg(2); - } - - // og unsubscribe - // og_user_roles - // - // This is sort of a catch all for "og" and gid in this order - // og// - // - // http://doadance.scbbs.com/og/unsubscribe/72 - // http://doadance.scbbs.com/og/users/72/add - - if (arg(0) == 'og' && is_numeric(arg(2))) { - $location = 6; - $gid = (int)arg(2); - } - - // og_forum - // - // http://doadance.scbbs.com/og_forum/manage/72 - - if (arg(0) == 'og_forum' && arg(1) == 'manage' && is_numeric(arg(2)) && is_null(arg(3))) { - $location = 6; - $gid = (int)arg(2); - } - - // http://doadance.scbbs.com/og_forum/manage/edit/72 - // http://doadance.scbbs.com/og_forum/manage/add/72 - - if (arg(0) == 'og_forum' && arg(1) == 'manage' && is_numeric(arg(3))) { - $location = 6; - $gid = (int)arg(3); - } - - // og_calendar - // - // http://doadance.scbbs.com/og_calendar/72 - - if (arg(0) == 'og_calendar' && is_numeric(arg(1)) && is_null(arg(2))) { - $location = 7; - $gid = (int)arg(1); - } - - // og_forum - // 0 1 2 3 - // http://www.mysite.com/og_forum/39/72?edit[og_groups][]=72 - // http://www.mysite.com/og_forum/37/71?sort=asc&order=Replies&edit[og_groups][0]=71 - - if ($arg[1] == 'og_forum' && strpos($arg[3], 'og_groups') !== false && (!is_null($arg[3])) ) { - $location = 8; - $subsections = explode("=", $arg[3]); - foreach ($subsections as $subsection) { - if (is_numeric($subsection)) { - $gid = (int)$subsection; - } - } - } - - // og create nodes (version 5.1) - // 0 1 2 3 - // http://sbn.scbbs.com/node/add/forum?gids[]=72 - // http://sbn.scbbs.com/node/add/simplenews?gids[]=72 - // http://sbn.scbbs.com/node/add/webform?gids[]=72 - // http://sbn.scbbs.com/node/add/video?gids[]=72 - // http://sbn.scbbs.com/node/add/page?gids[]=72 - // http://sbn.scbbs.com/node/add/blog?gids[]=72 - // http://sbn.scbbs.com/node/add/event?gids[]=72 - // http://sbn.scbbs.com/node/add/poll?gids[]=72 - // http://sbn.scbbs.com/node/add/flexinode-3?gids[]=72 - - if ($arg[1] == 'node' && strpos($arg[3], 'gids') !== false && (!is_null($arg[3])) ) { - $location = 10 . "(" . arg(0) . "|" . arg(1) . "|" . arg(2) . ")"; - $subsections = explode("=", $arg[3]); - $gid = (int)$subsections[1]; - } - - // og create nodes (custom node/20 aliased to node/ognodeadd) - // 0 1 2 3 - // http://clients.brixrealtyinc.com/node/ognodeadd?type=document&gids[]=12 - // - if ($arg[1] == 'node') { - if (strpos($arg[2], 'ognodeadd') !== false ) { - if (strpos($arg[2], 'gids') !== false ) { - $location = 13; - $subsections = explode("=", $arg[2]); - $gid = (int)$subsections[2]; - } - } - } - - } // end $gid if - // - // Now, using $uid and $gid we find out what roles this user has in this group; - // - if (empty($gid)) $gid = 0; // This prevents us from getting error on non-group node/add - // $query = 'SELECT role.rid, role.name FROM role INNER JOIN og_users_roles ON role.rid = og_users_roles.rid WHERE og_users_roles.uid = ' . $uid . ' AND og_users_roles.gid = ' . $gid; - // $results = db_query($query); - $query = 'SELECT {role}.rid, {role}.name FROM {role} INNER JOIN {og_users_roles} ON {role}.rid = {og_users_roles}.rid WHERE {og_users_roles}.uid = %d AND {og_users_roles}.gid = %d'; // FIXED TABLE PREFIX - $results = db_query($query, $uid, $gid); - // - // Create an array of these roles; - // - while ( $row = db_fetch_array($results) ) { - $x1 = $row["rid"]; - $ogroles[$x1] = $row["name"]; - } - // - // First, we need to create an array of $user->roles - // - $c = $user->roles; - // - // Next, we add the $user->roles array to the $ogroles array, if there is an ogroles array; - // - if ($x1 > 0) { - $d = array(); - $d = $c + $ogroles; - $d = array_unique($d); - } else { - $d = $c; - } - - // Write the test data - - og_user_roles_write_test($user, $location, $gid02, $gid, $uri_request_id, $d, $query); - // - // $d is either the merged results, or just $user->roles; - // - return $d; - - } // end og_user_roles_all_roles() - - function getgid($nodeID, $uid) { - - // This will return a $gid based upon the $nodeID and $uid supplied - - $gid = 0; - - // $result = db_query("select node_access.gid from node_access INNER JOIN og_uid ON node_access.gid = og_uid.nid WHERE node_access.realm = 'og_subscriber' AND og_uid.uid = $uid AND (node_access.nid = $nodeID OR node_access.gid = $nodeID)"); // modified to check for either the node or group ID in node_access - $result = db_query("select {node_access}.gid from {node_access} INNER JOIN {og_uid} ON {node_access}.gid = {og_uid}.nid WHERE {node_access}.realm = 'og_subscriber' AND {og_uid}.uid = %d AND ({node_access}.nid = %d OR {node_access}.gid = %d)", $uid, $nodeID, $nodeID); // FIXED TABLE PREFIX - modified to check for either the node or group ID in node_access - while($t = db_fetch_object($result)) { - $gid = $t->gid; - } - - // If $gid still equals 0 then try searching og_term table (if it exists) - // og forums will typically be listed here - - if ($gid == 0) { - if (user_table_exists('{og_term}')) { - // $result = db_query("select og_term.nid from og_term INNER JOIN og_uid ON og_term.nid = og_uid.nid WHERE og_term.tid = $nodeID AND og_uid.uid = $uid"); - $result = db_query("select {og_term}.nid from {og_term} INNER JOIN {og_uid} ON {og_term}.nid = {og_uid}.nid WHERE {og_term}.tid = %d AND {og_uid}.uid = %d", $nodeID, $uid); // FIXED TABLE PREFIX - while($t = db_fetch_object($result)) { - $gid = $t->nid; - } - } - } - - return $gid; - - } // end getgid() - // - // Modification - Added this function - // - function user_table_exists($table) { - return db_num_rows(db_query("SHOW TABLES LIKE '{" . db_escape_table($table) . "}'")); - } - - function og_user_roles_write_test($user, $location, $gid02, $gid, $uri_request_id, $d, $query) { - // - // See what is found in user_all_roles - // - $testStatus = ""; - $testDate = format_date(time(), 'custom', 'Y-m-d h:i:s a'); - $testUser = $user->uid; - $testFunction = "og_user_roles_all_roles"; - $testSubFunction = $location; - $testString = "group context: " . $gid02; - $testUserName = $user->name; - $testGroup = $gid; - $testURI = $uri_request_id; - $testAArg0 = arg(0); - $testAArg1 = arg(1); - $testAArg2 = arg(2); - $testAArg3 = arg(3); - $testPerm = "Roles Returned: (" . implode(",", $d) . ")
dbQuery = " . $query; - if (user_table_exists('{user_test}')) { - $testQuery = "insert into user_test (testStatus, testDate, testUser, testUserName, testGroup, testFunction, testSubFunction, testString, testURI, testAArg0, testAArg1, testAArg2, testAArg3, testPerm) values ('" . $testStatus . "','" . $testDate . "','" . $testUser . "','" . $testUserName . "','" . $testGroup . "','" . $testFunction . "','" . $testSubFunction . "','" . $testString . "','" . $testURI . "','" . $testAArg0 . "','" . $testAArg1 . "','" . $testAArg2 . "','" . $testAArg3 . "','" . $testPerm . "')"; - db_query($testQuery); - } - } - /** * Called by og_user_roles_nodeapi('access') * To check og access permissions * - */ function og_user_roles_og_access_check($op, $node = NULL) { global $user; - $uid = $user->uid; - - if ($op != 'create' && $node->nid && $node->status) { - - if (isset($user) && is_array($user->og_groups)) { - $gids = array_keys($user->og_groups); - } - else { - $gids[] = 0; - } - - - if (isset($user) && is_array($user->roles)) { - $rids = array_keys($user->roles); - } - else { - $rids[] = 1; - } - - // - // if this node has groups or is a group, then use group sql, else use non-group sql - // - - $groups = $node->og_groups; - - if ($groups || $node->type == 'group') { - - $sql = " - SELECT COUNT(*) FROM {node_access} na - LEFT OUTER JOIN {og_uid} ogu on ogu.nid = na.nid - LEFT OUTER JOIN {og} ogm on ogm.nid = na.nid - WHERE (na.nid = 0 OR na.nid = %d) - AND ((na.realm = 'og_public' and na.gid = 0) - OR (na.realm = 'og_subscriber' AND na.gid in ('".implode("','",$gids)."')) - OR (ogm.nid > 0 and (na.nid in ('".implode("','",$gids)."')) or ogm.directory = 1 ) - OR (na.realm = 'term_access' AND na.nid in ('".implode("','",$gids)."')) ) - AND (na.grant_$op >= 1 OR (ogu.is_admin = 1 AND ogu.uid = ".$uid.") ) - "; - } else { - $sql = " - SELECT COUNT(*) FROM {node_access} na - WHERE (na.nid = 0 OR na.nid = %d) - AND (na.realm = 'term_access' AND na.gid in ('".implode("','",$rids)."')) - AND na.grant_$op >= 1 - "; - } - - $result = db_query($sql, $node->nid); - $output = (db_result($result)); - if ($output == 0) return FALSE; - if ($output > 0) return TRUE; - } - } - /** - * Called by og_user_roles_nodeapi('access') * To check taxonomy_access access permissions * - */ - function og_user_roles_taxonomy_access_check($op, $node = NULL) { - global $user; - $uid = $user->uid; - - if ($op != 'create' && $node->nid && $node->status) { - // Discovered that I needed to continue using user->roles to get non-group roles. - // will get group roles using og_users_roles and og_ancestry - // if (isset($user) && is_array($user->roles)) { $rids = array_keys($user->roles); - } else { $rids[] = 1; } - - $sql = "SELECT COUNT(*) FROM {node_access} na"; - $sql .= " LEFT OUTER JOIN {og_users_roles} ogr ON ogr.rid = na.gid"; - $sql .= " LEFT OUTER JOIN {og_ancestry} oga ON oga.nid = na.nid"; - $sql .= " LEFT OUTER JOIN {og_uid} ogu on ogu.nid = na.nid"; - $sql .= " WHERE (na.nid = 0 OR na.nid = %d) AND ((na.realm = 'term_access' AND na.gid in ('".implode("','",$rids)."')) OR (ogr.uid = " . $uid . " AND na.realm = 'term_access' AND oga.group_nid = ogr.gid) )"; - $sql .= " AND (na.grant_$op >= 1 OR (ogu.is_admin = 1 AND ogu.uid = ".$uid.") )"; - $result = db_query($sql, $node->nid); - $output = (db_result($result)); - if ($output == 0) return FALSE; - if ($output > 0) return TRUE; - } - } - /** - * Create content * - * Format: http://www.scbbs.com/node/ognodeadd?type=link&gids[]=29 * - */ - function og_user_roles_ognodeadd() { - global $user; - $roles = og_user_roles_all_roles($user); // This returns normal $user->roles and includes OG roles if any - $user->roles = $roles; - - $gids = $_GET['gids']; - - $typeFound = 'no'; - - if ($gids) { - $group_node = node_load($gids[0]); - og_set_group_context($group_node); - } - - $type = $_GET['type']; - - if ($type) { - // - // Got this from node.module (node_access) - // No matter the type, this should return us the create permission. - // - $module = node_get_types('module', $type); - if ($module == 'node') { - $module = 'node_content'; // Avoid function name collisions. - } - $access = module_invoke($module, 'access', 'create', $type); - if ($access === TRUE) { - $output = node_add($type); - } else { - $output = "Access denied."; - watchdog("access denied", "node/ognodeadd?type=" . $type . "&gids[]=" . $gids[0], WATCHDOG_WARNING); - } - } - return $output; }--- 832,1288 ---- // just the query for the get_node_groups function. function og_user_roles_get_groups_result() { $sql = "SELECT oga.group_nid, n.title FROM {og_ancestry} oga INNER JOIN {node} n ON oga.group_nid = n.nid"; + $result = db_query(db_rewrite_sql($sql, 'oga', 'group_nid'), ''); + + return $result; + } + + + // + // My OG Roles Modifications + // + // + // Modification - Added this function + // + // This function returns an array of role keys and names, like $user->roles + // However, it returns site roles as well as group roles + // + function og_user_roles_all_roles_array($user) { + $roles = og_user_roles_all_roles($user); + return $roles; + } + + // This function takes the global $user (or $account) value and returns a list + // of group and non-group roles for this user + function og_user_roles_all_roles($user) { + // This will be the process to get BOTH the group and non-group roles for a user + $uid = $user->uid; + $gid = 0; + $gids = array(); + $nid = 0; + $location = 0; + $uri_request_id = $_SERVER['REQUEST_URI']; + $arg = explode("/", $uri_request_id); + $ogroles = array(); + $x1 = 0; + + // + // This will by default add the anonymous user role (no need since we merge user->roles) + // + // We get the groupID + // + + $group_node = og_get_group_context(); + $gid02 = $group_node->nid; + $gid = $gid02; + if ($gid02 === NULL) { + $gid = 0; + } + + // + // If the above doesn't get the groupID, then we start trying stuff + // + if ($gid == 0) { + // http://doadance.scbbs.com/drupal03/node/79 + if (arg(0) == 'node' && is_numeric(arg(1)) && is_null(arg(2))) { + $location = 1; + $nid = (int)arg(1); + $gid = getgid($nid, $uid); + } + + // http://doadance.scbbs.com/node/79/edit + // http://doadance.scbbs.com/node/79/outline + // http://doadance.scbbs.com/node/79/track + if (arg(0) == 'node' && is_numeric(arg(1)) && (arg(2) == 'edit' || arg(2) == 'outline' || arg(2) == 'track')) { + $location = 2; + $nid = (int)arg(1); + $gid = getgid($nid, $uid); + } + + // 0 1 2 + // http://www.mysite.com/comment/edit/14 + // + if (arg(0) == 'comment' && is_numeric(arg(2)) && arg(1) == 'edit') { + $location = 3; + $comment = _comment_load(arg(2)); + $nid = $comment->nid; + $gid = getgid($nid, $uid); + } + + // 0 1 2 + // http://www.mysite.com/comment/reply/128#comment_form + // + if (arg(0) == 'comment' && arg(1) == 'reply') { + $location = 4; + $subsections = explode("#", arg(2)); + $nid = (int)$subsections[0]; + $gid = getgid($nid, $uid); + } + + // og_term access + // 0 1 2 3 + // http://www.mysite.com/node/add/forum/121 + // + if (arg(0) == 'node' && is_numeric(arg(3)) && arg(1) == 'add') { + $location = 5; + $nid = (int)arg(3); + $gid = getgid($nid, $uid); + } + + // Here we get the gid directly + // + // http://doadance.scbbs.com/node/79/view/tree + // http://doadance.scbbs.com/node/79/view/members + // http://doadance.scbbs.com/node/79/view + if (arg(0) == 'node' && is_numeric(arg(1)) && arg(2) == 'view') { + $location = 2; + $gid = (int)arg(1); + } + + // Here we get the gid directly + // + // http://doadance.scbbs.com/og/users/72 + // http://doadance.scbbs.com/og/manage/72 + if (arg(0) == 'og' && is_numeric(arg(2)) && is_null(arg(3))) { + $location = 6; + $gid = (int)arg(2); + } + + // og_user_roles + // + // http://doadance.scbbs.com/og/users/72/roles + // http://doadance.scbbs.com/og/users/72/add + if (arg(0) == 'og' && arg(1) == 'users' && is_numeric(arg(2)) && is_null(arg(4))) { + $location = 6; + $gid = (int)arg(2); + } + + // og unsubscribe + // og_user_roles + // + // This is sort of a catch all for "og" and gid in this order + // og// + // + // http://doadance.scbbs.com/og/unsubscribe/72 + // http://doadance.scbbs.com/og/users/72/add + if (arg(0) == 'og' && is_numeric(arg(2))) { + $location = 6; + $gid = (int)arg(2); + } + + // og_forum + // + // http://doadance.scbbs.com/og_forum/manage/72 + if (arg(0) == 'og_forum' && arg(1) == 'manage' && is_numeric(arg(2)) && is_null(arg(3))) { + $location = 6; + $gid = (int)arg(2); + } + + // http://doadance.scbbs.com/og_forum/manage/edit/72 + // http://doadance.scbbs.com/og_forum/manage/add/72 + if (arg(0) == 'og_forum' && arg(1) == 'manage' && is_numeric(arg(3))) { + $location = 6; + $gid = (int)arg(3); + } + + // og_calendar + // + // http://doadance.scbbs.com/og_calendar/72 + if (arg(0) == 'og_calendar' && is_numeric(arg(1)) && is_null(arg(2))) { + $location = 7; + $gid = (int)arg(1); + } + + // og_forum + // 0 1 2 3 + // http://www.mysite.com/og_forum/39/72?edit[og_groups][]=72 + // http://www.mysite.com/og_forum/37/71?sort=asc&order=Replies&edit[og_groups][0]=71 + if ($arg[1] == 'og_forum' && strpos($arg[3], 'og_groups') !== FALSE && (!is_null($arg[3]))) { + $location = 8; + $subsections = explode("=", $arg[3]); + foreach ($subsections as $subsection) { + if (is_numeric($subsection)) { + $gid = (int)$subsection; + } + } + } + + // og create nodes (version 5.1) + // 0 1 2 3 + // http://sbn.scbbs.com/node/add/forum?gids[]=72 + // http://sbn.scbbs.com/node/add/simplenews?gids[]=72 + // http://sbn.scbbs.com/node/add/webform?gids[]=72 + // http://sbn.scbbs.com/node/add/video?gids[]=72 + // http://sbn.scbbs.com/node/add/page?gids[]=72 + // http://sbn.scbbs.com/node/add/blog?gids[]=72 + // http://sbn.scbbs.com/node/add/event?gids[]=72 + // http://sbn.scbbs.com/node/add/poll?gids[]=72 + // http://sbn.scbbs.com/node/add/flexinode-3?gids[]=72 + if ($arg[1] == 'node' && strpos($arg[3], 'gids') !== FALSE && (!is_null($arg[3]))) { + $location = 10 .'('. arg(0) .'|'. arg(1) .'|'. arg(2) .')'; + $subsections = explode('=', $arg[3]); + $gid = (int)$subsections[1]; + } + + // og create nodes (custom node/20 aliased to node/ognodeadd) + // 0 1 2 3 + // http://clients.brixrealtyinc.com/node/ognodeadd?type=document&gids[]=12 + // + if ($arg[1] == 'node') { + if (strpos($arg[2], 'ognodeadd') !== FALSE) { + if (strpos($arg[2], 'gids') !== FALSE) { + $location = 13; + $subsections = explode('=', $arg[2]); + $gid = (int)$subsections[2]; + } + } + } + } // end $gid if + + // + // Now, using $uid and $gid we find out what roles this user has in this group; + // + if (empty($gid)) { + $gid = 0; // This prevents us from getting error on non-group node/add + } + + $query = 'SELECT {role}.rid, {role}.name FROM {role} INNER JOIN {og_users_roles} ON {role}.rid = {og_users_roles}.rid WHERE {og_users_roles}.uid = %d AND {og_users_roles}.gid = %d'; // FIXED TABLE PREFIX + $results = db_query($query, $uid, $gid); + + // + // Create an array of these roles; + // + + while ($row = db_fetch_array($results)) { + $x1 = $row["rid"]; + $ogroles[$x1] = $row["name"]; + } + + // + // First, we need to create an array of $user->roles + // + $c = $user->roles; + + // + // Next, we add the $user->roles array to the $ogroles array, if there is an ogroles array; + // + if ($x1 > 0) { + $d = array(); + $d = $c + $ogroles; + $d = array_unique($d); + } + else { + $d = $c; + } + + // Write the test data + og_user_roles_write_test($user, $location, $gid02, $gid, $uri_request_id, $d, $query); + + // + // $d is either the merged results, or just $user->roles; + // + + return $d; + } // end og_user_roles_all_roles() + + function getgid($nid, $uid) { + // This will return a $gid based upon the $nid and $uid supplied + $gid = 0; + $result = db_query("select {node_access}.gid from {node_access} INNER JOIN {og_uid} ON {node_access}.gid = {og_uid}.nid WHERE {node_access}.realm = 'og_subscriber' AND {og_uid}.uid = %d AND ({node_access}.nid = %d OR {node_access}.gid = %d)", $uid, $nid, $nid); // FIXED TABLE PREFIX - modified to check for either the node or group ID in node_access + while ($t = db_fetch_object($result)) { + $gid = $t->gid; + } + + // If $gid still equals 0 then try searching og_term table (if it exists) + // og forums will typically be listed here + if ($gid == 0) { + if (user_table_exists('{og_term}')) { + $result = db_query("select {og_term}.nid from {og_term} INNER JOIN {og_uid} ON {og_term}.nid = {og_uid}.nid WHERE {og_term}.tid = %d AND {og_uid}.uid = %d", $nid, $uid); // FIXED TABLE PREFIX + while ($t = db_fetch_object($result)) { + $gid = $t->nid; + } + } + } + + return $gid; + } // end getgid() + + // + // Modification - Added this function + // + function user_table_exists($table) { + return db_num_rows(db_query("SHOW TABLES LIKE '{" . db_escape_table($table) . "}'")); + } + + function og_user_roles_write_test($user, $location, $gid02, $gid, $uri_request_id, $d, $query) { + // + // See what is found in user_all_roles + // + $test_status = ''; + $test_date = format_date(time(), 'custom', 'Y-m-d h:i:s a'); + $test_user = $user->uid; + $test_function = 'og_user_roles_all_roles'; + $test_subfunction = $location; + $test_string = 'group context: '. $gid02; + $test_username = $user->name; + $test_group = $gid; + $test_uri = $uri_request_id; + $test_aarg0 = arg(0); + $test_aarg1 = arg(1); + $test_aarg2 = arg(2); + $test_aarg3 = arg(3); + $test_perm = 'Roles Returned: ('. implode(",", $d) .')
dbQuery = '. $query; + + if (user_table_exists('{user_test}')) { + $test_query = "INSERT INTO user_test (testStatus, testDate, testUser, testUserName, testGroup, testFunction, testSubFunction, testString, testURI, testAArg0, testAArg1, testAArg2, testAArg3, testPerm) values ('" . $test_status . "','" . $test_date . "','" . $test_user . "','" . $test_username . "','" . $test_group . "','" . $test_function . "','" . $test_subfunction . "','" . $test_string . "','" . $test_uri . "','" . $test_aarg0 . "','" . $test_aarg1 . "','" . $test_aarg2 . "','" . $test_aarg3 . "','" . $test_perm . "')"; + db_query($test_query); + } + } + /** * Called by og_user_roles_nodeapi('access') * To check og access permissions * + */ function og_user_roles_og_access_check($op, $node = NULL) { global $user; + $uid = $user->uid; + if ($op != 'create' && $node->nid && $node->status) { + if (isset($user) && is_array($user->og_groups)) { + $gids = array_keys($user->og_groups); + } + else { + $gids[] = 0; + } + + if (isset($user) && is_array($user->roles)) { + $rids = array_keys($user->roles); + } + else { + $rids[] = 1; + } + + // + // if this node has groups or is a group, then use group sql, else use non-group sql + // + $groups = $node->og_groups; + if ($groups || $node->type == 'group') { + $sql = " + SELECT COUNT(*) FROM {node_access} na + LEFT OUTER JOIN {og_uid} ogu on ogu.nid = na.nid + LEFT OUTER JOIN {og} ogm on ogm.nid = na.nid + WHERE (na.nid = 0 OR na.nid = %d) + AND ((na.realm = 'og_public' and na.gid = 0) + OR (na.realm = 'og_subscriber' AND na.gid in (%s)) + OR (ogm.nid > 0 and (na.nid in (%s)) or ogm.directory = 1) + OR (na.realm = 'term_access' AND na.nid in (%s))) + AND (na.grant_$op >= 1 OR (ogu.is_admin = 1 AND ogu.uid = %d)) + "; + $group_ids = implode(',', $gids); + $result = db_query($sql, $node->nid, $group_ids, $group_ids, $group_ids, $uid); + } + else { + $sql = " + SELECT COUNT(*) FROM {node_access} na + WHERE (na.nid = 0 OR na.nid = %d) + AND (na.realm = 'term_access' AND na.gid in (%s)) + AND na.grant_$op >= 1 + "; + $result = db_query($sql, $node->nid, implode(',', $rids)); + } + + $output = (db_result($result)); + + if ($output == 0) { + return FALSE; + } + if ($output > 0) { + return TRUE; + } + } + } + /** + * Called by og_user_roles_nodeapi('access') * To check taxonomy_access access permissions * + */ + function og_user_roles_taxonomy_access_check($op, $node = NULL) { + global $user; + + $uid = $user->uid; + + if ($op != 'create' && $node->nid && $node->status) { + // Discovered that I needed to continue using user->roles to get non-group roles. + // will get group roles using og_users_roles and og_ancestry + if (isset($user) && is_array($user->roles)) { $rids = array_keys($user->roles); + } else { $rids[] = 1; } + + $sql = "SELECT COUNT(*) FROM {node_access} na"; + $sql .= " LEFT OUTER JOIN {og_users_roles} ogr ON ogr.rid = na.gid"; + $sql .= " LEFT OUTER JOIN {og_ancestry} oga ON oga.nid = na.nid"; + $sql .= " LEFT OUTER JOIN {og_uid} ogu on ogu.nid = na.nid"; + $sql .= " WHERE (na.nid = 0 OR na.nid = %d) AND ((na.realm = 'term_access' AND na.gid in (%s)) OR (ogr.uid = %d AND na.realm = 'term_access' AND oga.group_nid = ogr.gid))"; + $sql .= " AND (na.grant_$op >= 1 OR (ogu.is_admin = 1 AND ogu.uid = %d))"; + + $result = db_query($sql, $node->nid, implode(',', $rids), $uid, $uid); + $output = (db_result($result)); + + if ($output == 0) { + return FALSE; + } + if ($output > 0) { + return TRUE; + } + } + } + /** + * Create content * + * Format: http://www.scbbs.com/node/ognodeadd?type=link&gids[]=29 * + */ + function og_user_roles_ognodeadd() { + global $user; + + $roles = og_user_roles_all_roles($user); // This returns normal $user->roles and includes OG roles if any + + $user->roles = $roles; + $gids = $_GET['gids']; + if ($gids) { + $group_node = node_load($gids[0]); + og_set_group_context($group_node); + } + + $type = $_GET['type']; + + if ($type) { + // + // Got this from node.module (node_access) + // No matter the type, this should return us the create permission. + // + $module = node_get_types('module', $type); + + if ($module == 'node') { + $module = 'node_content'; // Avoid function name collisions. + } + + $access = module_invoke($module, 'access', 'create', $type); + + if ($access === TRUE) { + $output = node_add($type); + } + else { + $output = 'Access denied.'; + watchdog('access denied', 'node/ognodeadd?type='. $type .'&gids[]='. $gids[0], WATCHDOG_WARNING); + } + } + + return $output; }