<?php
/*************************
  Coppermine Photo Gallery
  ************************
  Copyright (c) 2003-2008 Dev Team
  v1.1 originally written by Gregory DEMAR

  This program is free software; you can redistribute it and/or modify
  it under the terms of the GNU General Public License version 3
  as published by the Free Software Foundation.
  
  ********************************************
  Coppermine version: 1.5.0
  $HeadURL$
  $Revision: 4648 $
  $LastChangedBy: nibbler999 $
  $Date: 2008-07-01 03:09:46 +0200 (Tue, 01 Jul 2008) $
**********************************************/

/* 

Logout redirection:

edit phpbb file ucp.php

find:

		meta_refresh(3, append_sid("{$phpbb_root_path}index.$phpEx"));
	
		$message = $message . '<br /><br />' . sprintf($user->lang['RETURN_INDEX'], '<a href="' . append_sid("{$phpbb_root_path}index.$phpEx") . '">', '</a> ');
		
		
change to : 

		meta_refresh(3, request_var('redirect', append_sid("{$phpbb_root_path}index.$phpEx")));
	
		$message = $message . '<br /><br />' . sprintf($user->lang['RETURN_INDEX'], '<a href="' . request_var('redirect', append_sid("{$phpbb_root_path}index.$phpEx")) . '">', '</a> ');

*/

if (!defined('IN_COPPERMINE')) die('Not in Coppermine...');

// Switch that allows overriding the bridge manager with hard-coded values
define('USE_BRIDGEMGR', 1);

require_once 'bridge/udb_base.inc.php';

class cpg_udb extends core_udb {

	function cpg_udb()
	{
		global $BRIDGE;
		
		if (!USE_BRIDGEMGR) { // the vars that are used when bridgemgr is disabled

			// URL of your punbb
			$this->boardurl = 'http://localhost/phpBB2';

			// local path to your punbb config file
			require_once('../phpBB2/config.php');

		} else { // the vars from the bridgemgr
			$this->boardurl = $BRIDGE['full_forum_url'];
			require_once($BRIDGE['relative_path_to_config_file'] . 'config.php');
			$this->use_post_based_groups = $BRIDGE['use_post_based_groups'];
		}

    // Add by John Degey [webmaster@johndegey.org], otherwise trigger an error		
    $this->multigroups = 1;
    // Add by John Degey [webmaster@johndegey.org], otherwise trigger an error    
		$this->group_overrride = 0;

		// Database connection settings
		$this->db = array(
			'name' => $dbname,
			'host' => $dbhost ? $dbhost : 'localhost',
			'user' => $dbuser,
			'password' => $dbpasswd,
			'prefix' =>$table_prefix
		);
		
		// Board table names
		$this->table = array(
			'users' => 'users',
			'groups' => 'groups',
      'sessions' => 'sessions',
      // Add by John Degey [webmaster@johndegey.org]  
			'usersgroups' => 'user_group'
		);

		// Derived full table names
		$this->usertable = '`' . $this->db['name'] . '`.`' . $this->db['prefix'] . $this->table['users'].'`';
		$this->groupstable =  '`' . $this->db['name'] . '`.`' . $this->db['prefix'] . $this->table['groups'].'`';
		$this->sessionstable =  '`' . $this->db['name'] . '`.`' . $this->db['prefix'] . $this->table['sessions'].'`';
    // Add by John Degey [webmaster@johndegey.org]  
    $this->usergroupstable = '`' . $this->db['name'] . '`.`' . $this->db['prefix'] . $this->table['usersgroups'].'`';
		
		// Table field names
		$this->field = array(
			'username' => 'username', // name of 'username' field in users table
			'user_id' => 'user_id', // name of 'id' field in users table
			'password' => 'user_password', // name of 'password' field in users table
			'email' => 'user_email', // name of 'email' field in users table
			'regdate' => 'user_regdate', // name of 'registered' field in users table
			'active' => 'user_active', // is user account active?
			'lastvisit' => 'user_lastvisit', // name of 'location' field in users table
			'location' => 'user_from', // name of 'location' field in users table
			'website' => 'user_website', // name of 'website' field in users table
			'usertbl_group_id' => 'group_id', // name of 'group id' field in users table
			'grouptbl_group_id' => 'group_id', // name of 'group id' field in groups table
			'grouptbl_group_name' => 'group_name' // name of 'group name' field in groups table
		);
		
		// Pages to redirect to
		$this->page = array(
			'register' => '/ucp.php?mode=register',
			'editusers' => '/memberlist.php',
			'edituserprofile' => "/memberlist.php?mode=viewprofile&u=",
		);

		// Add by John Degey [webmaster@johndegey.org] : phpbb3 upgraded from phpbb2, had to change the group id here to reflect the ids in the phpbb3_groups table 
		$this->admingroups = array(435);
		$this->guestgroup = 431;
		
		// Cookie settings - used in following functions only
		$this->cookie_name = $BRIDGE['cookie_prefix'];
		$this->cookie_seed = '';
		
		// Connect to db
		$this->connect();
	}

	// definition of how to extract id, name, group from a session cookie
	function session_extraction()
	{
		//$superCage = Inspekt::makeSuperCage();
		if (isset($_COOKIE[$this->cookie_name . '_sid'])) {
			$this->session_id = addslashes($_COOKIE[$this->cookie_name . '_sid']);
		//if ($superCage->cookie->keyExists($this->cookie_name . '_sid')) {
			//$this->session_id = $superCage->cookie->getEscaped($this->cookie_name . '_sid');
			
			$sql = "SELECT user_id, user_password FROM {$this->sessionstable} INNER JOIN {$this->usertable} ON session_user_id = user_id WHERE session_id='{$this->session_id}';"; // AND session_user_id ='$cookie_id'"; (Maybe session_id is unique enough?)
			
			$result = cpg_db_query($sql, $this->link_id);
			
			if (mysql_num_rows($result)){
				$row = mysql_fetch_array($result);
				return $row['user_id'] == 1 ? false : $row;
			} else {
			    return false;
			}
		}
	}
	
	// definition of how to extract an id and password hash from a cookie
	function cookie_extraction()
	{
		return false;
	}
	
	// definition of actions required to convert a password from user database form to cookie form
	function udb_hash_db($password)
	{
		return $password; // unused
	}
	
	function login_page()
	{
		global $CONFIG;
		
		$redirect = urlencode($CONFIG['site_url']);
		$this->redirect("/ucp.php?mode=login&redirect=$redirect");
	}

	function logout_page()
	{
		global $CONFIG;
		
		$redirect = urlencode($CONFIG['site_url']);
		$this->redirect("/ucp.php?mode=logout&redirect=$redirect&sid=" . $this->session_id);
	}

	function get_users($options = array())
    {
    	global $CONFIG;
		

		// Copy UDB fields and config variables (just to make it easier to read)
    	$f =& $this->field;
		$C =& $CONFIG;
		
		// Sort codes
        $sort_codes = array('name_a' => 'user_name ASC',
                            'name_d' => 'user_name DESC',
                            'group_a' => 'group_name ASC',
                            'group_d' => 'group_name DESC',
                            'reg_a' => 'user_regdate ASC',
                            'reg_d' => 'user_regdate DESC',
                            'pic_a' => 'pic_count ASC',
                            'pic_d' => 'pic_count DESC',
                            'disku_a' => 'disk_usage ASC',
                            'disku_d' => 'disk_usage DESC',
                            'lv_a' => 'user_lastvisit ASC',
                            'lv_d' => 'user_lastvisit DESC',
                           );
        
		if (in_array($options['sort'], array('group_a', 'group_d', 'pic_a', 'pic_d', 'disku_a', 'disku_d'))){
			
			$sort = '';
			list($this->sortfield, $this->sortdir) = explode(' ', $sort_codes[$options['sort']]);
			$this->adv_sort = true;
			
		} else {
			
			$sort = "ORDER BY " . $sort_codes[$options['sort']];
			$this->adv_sort = false;
		}

		// Build WHERE clause, if this is a username search
        if ($options['search']) {
            $options['search'] = 'AND u.'.$f['username'].' LIKE "'.$options['search'].'" ';
        }

        $sql = "SELECT group_id, group_name, group_quota FROM {$C['TABLE_USERGROUPS']}";

		$result = cpg_db_query($sql);
		
		$groups = array();
	
		while ($row = mysql_fetch_assoc($result)) {
			$groups[$row['group_id']] = $row;
		}
		
		$sql ="SELECT group_id FROM {$this->groupstable} WHERE group_id != 6";
	
		$result = cpg_db_query($sql, $this->link_id);
		$udb_groups = array();
		
		while ($row = mysql_fetch_assoc($result)) {
			$udb_groups[] = $row['group_id'];
		}


        $sql = "SELECT u.{$f['user_id']} as user_id, u.{$f['usertbl_group_id']} AS user_group, {$f['username']} as user_name, {$f['email']} as user_email, {$f['regdate']} as user_regdate, {$f['lastvisit']} as user_lastvisit, '' as user_active, 0 as pic_count, 0 as disk_usage ".
               "FROM {$this->usertable} AS u ".
               "WHERE u.{$f['user_id']} <> 1 AND u.{$f['usertbl_group_id']} <> 6 " . $options['search'].
					$sort .
               " LIMIT {$options['lower_limit']}, {$options['users_per_page']};";

		$result = cpg_db_query($sql, $this->link_id);
		
		// If no records, return empty value
		if (!mysql_num_rows($result)) {
			return array();
		}

		// Extract user list to an array
		while ($user = mysql_fetch_assoc($result)) {
			
			$gid = 2;

			if ($this->use_post_based_groups){
				if (in_array($user['user_group'], $udb_groups)){
					$gid = $user['user_group'] + 100;
		
				} elseif ($user['user_level'] == 1 || in_array($user['user_group'], $this->admingroups)){
					$gid = 102;
				}
			} else {
				if ($user['user_level'] == 1 || in_array($user['user_group'], $this->admingroups)){
					$gid = 1;
				}
			}

			$userlist[$user['user_id']] = array_merge($user, $groups[$gid]);
			$users[] = $user['user_id'];
		}
		
		$user_list_string = implode(', ', $users);
		
		$sql = "SELECT owner_id, COUNT(pid) as pic_count, ROUND(SUM(total_filesize)/1024) as disk_usage FROM {$C['TABLE_PICTURES']} WHERE owner_id IN ($user_list_string) GROUP BY owner_id";

		$result = cpg_db_query($sql);


		while ($owner = mysql_fetch_assoc($result)) {
			$userlist[$owner['owner_id']] = array_merge($userlist[$owner['owner_id']], $owner);
		}

		if ($this->adv_sort) usort($userlist, array('cpg_udb', 'adv_sort'));

        return $userlist;
    }
   
   function view_users() {}
   
	function view_profile() {}
	
	// Add By John Degey [webmaster@johndegey.org]
	// Adapted from the one in the phpbb2018.inc.php
  // Get groups of which user is member
  function get_groups($row)
  {
    $data = array();
    
    if ($this->use_post_based_groups){

      $sql = "SELECT ug.{$this->field['usertbl_group_id']}+100 AS group_id FROM {$this->usertable} AS u, {$this->usergroupstable} AS ug, {$this->groupstable} as g WHERE u.{$this->field['user_id']}=ug.{$this->field['user_id']} AND u.{$this->field['user_id']}='{$row['id']}' AND g.{$this->field['grouptbl_group_id']} = ug.{$this->field['grouptbl_group_id']}";

      $result = cpg_db_query($sql, $this->link_id);

      while ($row2 = mysql_fetch_array($result)) {
        $data[] = $row2['group_id'];
      }
			// no more userlevel in phpbb3
      foreach($this->admingroups as $admin_group_id) {
        if (in_array(($admin_group_id+100), $data)) {
      	 array_unshift($data, ($admin_group_id + 100));
				}
			}
    } else {
    	// don't know if the last hardcoded "2" is for the default admin group id in phpbb2 
      $data[0] = ($this->userlevel == 1 || in_array($row[$this->field['usertbl_group_id']] , $this->admingroups)) ? 1 : 2;
      // if not, maybe should it be set like this, but as i don't know, i keep the original one and let this one commented 
      //$data[0] = (in_array($row[$this->field['usertbl_group_id']] , $this->admingroups)) ? 1 : $this->admingroups[0];
    }
    
    return $data;
  }
	
}

// and go !
$cpg_udb = new cpg_udb;
?>
