uid == 1) return TRUE; if (!isset($perm[$account->uid])) { // Initialize base permissions (no access) $base_perms = _navigate_permissions(); // Process Rules $perms = array(); $query = db_query('SELECT * FROM {navigate_permissions} WHERE status = 1 ORDER BY weight ASC'); while ($rule = db_fetch_object($query)) { $user_in_rule = FALSE; $roles = array(); $users = array(); $ids = explode(',', $rule->ids); foreach ($ids as $id) { $id = explode(':', $id); switch ($id[0]) { case 'rid': $roles[] = $id[1]; break; case 'uid': $users[] = $id[1]; break; } } // Process roles in rule first foreach($roles as $rid) { if (isset($account->roles[$rid])) { $user_in_rule = TRUE; break; } } // Process users next foreach($users as $uid) { if ($account->uid == $uid) { $user_in_rule = TRUE; break; } } // Only continue processing this rule if user is inside a role or specified specifically if ($user_in_rule) { switch($rule->type) { case 'all': foreach($base_perms as $base_plugin => $base_perms) { foreach($base_perms as $base_perm) { $perms[$base_plugin][$base_perm] = TRUE; } } break; case 'none': foreach($base_perms as $base_plugin => $base_perms) { foreach($base_perms as $base_perm) { if (isset($perms[$base_plugin][$base_perm])) unset($perms[$base_plugin][$base_perm]); } } break; case 'custom': $rule->permissions = unserialize($rule->permissions); foreach($rule->permissions as $key => $value) { $key = explode(':', $key); $custom_plugin = $key[0]; $custom_perm = str_replace('_', ' ', $key[1]); if ($value) { $perms[$custom_plugin][$custom_perm] = TRUE; } else { if (isset($perms[$custom_plugin][$custom_perm])) unset($perms[$custom_plugin][$custom_perm]); } } break; } } } $perm[$account->uid] = $perms; } // Convert permissions into an array if a string if (!is_array($permissions) && is_string($permissions)) { $permissions = array($permissions); } // Iterate through all permissions in array $return = array(); foreach ($permissions as $plugin => $permission) { // If permission does not have a plugin specified, go through all user permissions until the first match is found $name = implode('|', array($plugin, $permission)); if (is_numeric($plugin)) { $perms_access = FALSE; foreach ($perm[$account->uid] as $key => $value) { if ($permission == $value) { $perms_access = TRUE; break; } } $return[$name] = $perms_access; } // Return a specific plugin permission else if (is_string($plugin)) { $return[$name] = isset($perm[$account->uid][$plugin][$permission]); } } // All permissions must return TRUE for access $access = FALSE; foreach ($return as $value) { if ($value) { $access = TRUE; } else { $access = FALSE; break; } } return $access; } function navigate_user_load($uid = FALSE, $refresh = FALSE) { global $_navigate, $user; if (!$uid) $uid = $user->uid; if ($uid) { if (!isset($_navigate['users'][$uid]) || $refresh) { $data = db_result(db_query("SELECT data FROM {navigate} WHERE uid = '%d'", $uid)); if ($data) { $_navigate['users'][$uid] = unserialize($data); return $_navigate['users'][$uid]; } else { // Create a default user account $index = 0; $settings = $_navigate['users']['default']['settings']; $widgets = array(); foreach ($_navigate['plugin']['default']['widgets'] as $widget) { if ($widget['plugin']['user_default'] === TRUE) { unset($widget['plugin']['user_default']); $index++; $widget['wid'] = $index; $widgets[$index] = $widget; } } $settings['widgetIndex'] = $index; $defaults = array( 'settings' => $settings, 'widgets' => $widgets, ); $_navigate['users'][$uid] = $defaults; navigate_user_save($uid); return $_navigate['users'][$uid]; } } else { return $_navigate['users'][$uid]; } } return FALSE; } function navigate_user_save($uid = FALSE) { global $_navigate, $user; if (!$uid) $uid = $user->uid; if ($uid && isset($_navigate['users'][$uid])) { $data = serialize($_navigate['users'][$uid]); db_query("UPDATE {navigate} SET data = '%s' WHERE uid = '%d'", $data, $uid); if (!db_affected_rows()) { @db_query("INSERT INTO {navigate} (uid, data) VALUES ('%s', '%d')", $uid, $data); return db_affected_rows() > 0 ? TRUE : FALSE; } return TRUE; } return FALSE; }