Path : /home/vishqocm/pcib.in/includes/
File Upload :
Current File : /home/vishqocm//pcib.in/includes/oauth_config.php

<?php
/**
 * OAuth Configuration
 * 
 * This file contains configuration for Google and other OAuth providers.
 * Before using, you must set up OAuth credentials in the Google Cloud Console,
 * Facebook Developers, Twitter Developer Portal, etc.
 */

// Google OAuth Configuration
define('GOOGLE_CLIENT_ID', '1083250401299-34p3qtevuk9f258hbudavd22s56os972.apps.googleusercontent.com');
define('GOOGLE_CLIENT_SECRET', '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');
// Use flexible redirect URI determination
// Get the current scheme (http or https)
$scheme = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? 'https' : 'http';
// Get the current host
$host = $_SERVER['HTTP_HOST'] ?? 'localhost';
// Define the redirect URI
define('GOOGLE_REDIRECT_URL', $scheme . '://' . $host . '/google_auth.php');

// Facebook OAuth Configuration (for future implementation)
define('FACEBOOK_APP_ID', 'your-facebook-app-id');
define('FACEBOOK_APP_SECRET', 'your-facebook-app-secret');
define('FACEBOOK_REDIRECT_URL', 'http://' . $_SERVER['HTTP_HOST'] . '/facebook_auth.php');

// Twitter OAuth Configuration (for future implementation)
define('TWITTER_API_KEY', 'your-twitter-api-key');
define('TWITTER_API_SECRET', 'your-twitter-api-secret');
define('TWITTER_REDIRECT_URL', 'http://' . $_SERVER['HTTP_HOST'] . '/twitter_auth.php');

/**
 * Function to generate OAuth login URLs
 * 
 * @param string $provider The OAuth provider (google, facebook, twitter)
 * @param string $redirect_after Optional URL to redirect after login
 * @return string The login URL
 */
function getOAuthLoginUrl($provider, $redirect_after = '') {
    switch (strtolower($provider)) {
        case 'google':
            $url = 'https://accounts.google.com/o/oauth2/v2/auth';
            $params = [
                'client_id' => GOOGLE_CLIENT_ID,
                'redirect_uri' => GOOGLE_REDIRECT_URL,
                'response_type' => 'code',
                'scope' => 'email profile',
                'access_type' => 'online',
                'state' => !empty($redirect_after) ? urlencode($redirect_after) : '',
            ];
            return $url . '?' . http_build_query($params);
            
        case 'facebook':
            $url = 'https://www.facebook.com/v12.0/dialog/oauth';
            $params = [
                'client_id' => FACEBOOK_APP_ID,
                'redirect_uri' => FACEBOOK_REDIRECT_URL,
                'state' => !empty($redirect_after) ? urlencode($redirect_after) : '',
                'scope' => 'email',
            ];
            return $url . '?' . http_build_query($params);
            
        case 'twitter':
            // Twitter uses OAuth 1.0a which is more complex
            // This is a placeholder for future implementation
            return '#';
            
        default:
            return '#';
    }
}

/**
 * Function to get Google user information from authorization code
 * 
 * @param string $code The authorization code from Google
 * @return array|false User information or false on failure
 */
function getGoogleUserInfo($code) {
    // Enable error reporting for debugging
    error_reporting(E_ALL);
    ini_set('display_errors', 1);

    // Exchange authorization code for access token
    $token_url = 'https://oauth2.googleapis.com/token';
    $token_data = [
        'code' => $code,
        'client_id' => GOOGLE_CLIENT_ID,
        'client_secret' => GOOGLE_CLIENT_SECRET,
        'redirect_uri' => GOOGLE_REDIRECT_URL,
        'grant_type' => 'authorization_code',
    ];
    
    // Log request parameters for debugging
    error_log("Google OAuth token request: " . json_encode($token_data));
    
    $token_options = [
        'http' => [
            'header' => "Content-type: application/x-www-form-urlencoded\r\n",
            'method' => 'POST',
            'content' => http_build_query($token_data),
            'ignore_errors' => true, // This allows us to see error responses
        ],
        'ssl' => [
            'verify_peer' => false,
            'verify_peer_name' => false,
        ],
    ];
    
    $token_context = stream_context_create($token_options);
    
    // Use try-catch to capture errors
    try {
        $token_response = file_get_contents($token_url, false, $token_context);
        // Get response headers to check for errors
        $response_headers = $http_response_header ?? [];
        $status_line = $response_headers[0] ?? '';
        
        error_log("Google OAuth token response status: " . $status_line);
        error_log("Google OAuth token response: " . $token_response);
        
        if (!$token_response) {
            error_log("Failed to get access token from Google OAuth");
            return false;
        }
        
        $token_data = json_decode($token_response, true);
        if (!isset($token_data['access_token'])) {
            error_log("No access token in Google OAuth response: " . $token_response);
            return false;
        }
        
        // Get user info with access token
        $info_url = 'https://www.googleapis.com/oauth2/v2/userinfo';
        $info_options = [
            'http' => [
                'header' => "Authorization: Bearer " . $token_data['access_token'] . "\r\n",
                'method' => 'GET',
                'ignore_errors' => true, // This allows us to see error responses
            ],
            'ssl' => [
                'verify_peer' => false,
                'verify_peer_name' => false,
            ],
        ];
        
        error_log("Google OAuth userinfo request with token: " . substr($token_data['access_token'], 0, 10) . "...");
        
        $info_context = stream_context_create($info_options);
        try {
            $info_response = file_get_contents($info_url, false, $info_context);
            // Get response headers
            $response_headers = $http_response_header ?? [];
            $status_line = $response_headers[0] ?? '';
            
            error_log("Google OAuth userinfo response status: " . $status_line);
            error_log("Google OAuth userinfo response: " . $info_response);
            
            if (!$info_response) {
                error_log("Failed to get user info from Google OAuth - empty response");
                return false;
            }
            
            $user_info = json_decode($info_response, true);
            if (!$user_info) {
                error_log("Failed to parse user info JSON: " . json_last_error_msg());
                return false;
            }
            
            if (empty($user_info['id']) || empty($user_info['email'])) {
                error_log("Missing required user info fields. Response: " . json_encode($user_info));
                return false;
            }
            
            // Add token data to user info
            $user_info['access_token'] = $token_data['access_token'];
            $user_info['refresh_token'] = $token_data['refresh_token'] ?? null;
            
            error_log("Successfully retrieved Google user info for email: " . $user_info['email']);
            return $user_info;
        } catch (Exception $e) {
            error_log("Google OAuth userinfo request failed: " . $e->getMessage());
            return false;
        }
    } catch (Exception $e) {
        error_log("Google OAuth token request failed: " . $e->getMessage());
        return false;
    }
}

/**
 * Create or get user from OAuth data
 * 
 * @param array $oauth_data OAuth user data
 * @param string $provider Provider name (google, facebook, etc)
 * @return array|false User data array with user_id or false on failure
 */
function processOAuthLogin($oauth_data, $provider) {
    global $conn;
    
    if (empty($oauth_data) || empty($oauth_data['id']) || empty($oauth_data['email'])) {
        error_log("Invalid OAuth data for provider: $provider");
        return false;
    }
    
    // Check if this OAuth account is already linked to a user
    $provider = mysqli_real_escape_string($conn, strtolower($provider));
    $provider_id = mysqli_real_escape_string($conn, $oauth_data['id']);
    $email = mysqli_real_escape_string($conn, $oauth_data['email']);
    
    // First check if the oauth_providers table exists
    $table_exists = mysqli_query($conn, "SHOW TABLES LIKE 'oauth_providers'");
    if (!$table_exists || mysqli_num_rows($table_exists) == 0) {
        // Table doesn't exist - try to create it
        $create_table_sql = "CREATE TABLE oauth_providers (
            id INT AUTO_INCREMENT PRIMARY KEY,
            user_id INT NOT NULL,
            provider VARCHAR(50) NOT NULL,
            provider_user_id VARCHAR(255) NOT NULL,
            email VARCHAR(255) NOT NULL,
            display_name VARCHAR(255),
            photo_url VARCHAR(255),
            access_token TEXT,
            refresh_token TEXT,
            created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
            updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
            FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
            UNIQUE KEY provider_user_id_unique (provider, provider_user_id)
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4";
        
        if (!mysqli_query($conn, $create_table_sql)) {
            error_log("Failed to create oauth_providers table: " . mysqli_error($conn));
        }
    }
    
    // Now check for existing OAuth link
    $check_oauth_query = "SELECT * FROM oauth_providers WHERE provider = '$provider' AND provider_user_id = '$provider_id'";
    $result = mysqli_query($conn, $check_oauth_query);
    
    if ($result && mysqli_num_rows($result) > 0) {
        // OAuth account exists, get the user
        $oauth_account = mysqli_fetch_assoc($result);
        $user_id = $oauth_account['user_id'];
        
        // Update OAuth data if needed
        $update_oauth_query = "UPDATE oauth_providers SET 
            email = '$email',
            display_name = '" . mysqli_real_escape_string($conn, $oauth_data['name'] ?? '') . "',
            photo_url = '" . mysqli_real_escape_string($conn, $oauth_data['picture'] ?? '') . "',
            access_token = '" . mysqli_real_escape_string($conn, $oauth_data['access_token'] ?? '') . "',
            refresh_token = '" . mysqli_real_escape_string($conn, $oauth_data['refresh_token'] ?? '') . "',
            updated_at = NOW()
            WHERE id = " . $oauth_account['id'];
        mysqli_query($conn, $update_oauth_query);
        
        // Get user data
        $user_query = "SELECT * FROM users WHERE id = $user_id";
        $user_result = mysqli_query($conn, $user_query);
        
        if ($user_result && mysqli_num_rows($user_result) > 0) {
            $user = mysqli_fetch_assoc($user_result);
            
            // Check if user is active
            if ($user['status'] != 'active') {
                error_log("User account not active for OAuth login: $email");
                return ['error' => 'Your account is not active. Please contact support.'];
            }
            
            return $user;
        } else {
            error_log("User not found for OAuth link: $user_id");
            return false;
        }
    } else {
        // Check if a user with this email already exists
        $check_email_query = "SELECT * FROM users WHERE email = '$email'";
        $email_result = mysqli_query($conn, $check_email_query);
        
        if ($email_result && mysqli_num_rows($email_result) > 0) {
            // User exists, link OAuth account
            $user = mysqli_fetch_assoc($email_result);
            $user_id = $user['id'];
            
            // Check if user is active
            if ($user['status'] != 'active') {
                error_log("User account not active for OAuth linking: $email");
                return ['error' => 'Your account is not active. Please contact support.'];
            }
            
            // Create OAuth link
            $create_oauth_query = "INSERT INTO oauth_providers (
                user_id, provider, provider_user_id, email, display_name, photo_url, 
                access_token, refresh_token, created_at, updated_at
            ) VALUES (
                $user_id, 
                '$provider', 
                '$provider_id', 
                '$email', 
                '" . mysqli_real_escape_string($conn, $oauth_data['name'] ?? '') . "', 
                '" . mysqli_real_escape_string($conn, $oauth_data['picture'] ?? '') . "', 
                '" . mysqli_real_escape_string($conn, $oauth_data['access_token'] ?? '') . "', 
                '" . mysqli_real_escape_string($conn, $oauth_data['refresh_token'] ?? '') . "', 
                NOW(), 
                NOW()
            )";
            
            mysqli_query($conn, $create_oauth_query);
            
            return $user;
        } else {
            // Create new user and link OAuth account
            $first_name = mysqli_real_escape_string($conn, $oauth_data['given_name'] ?? '');
            $last_name = mysqli_real_escape_string($conn, $oauth_data['family_name'] ?? '');
            $display_name = mysqli_real_escape_string($conn, $oauth_data['name'] ?? '');
            $profile_image = mysqli_real_escape_string($conn, $oauth_data['picture'] ?? '');
            
            // Generate username from email
            $username_base = strtolower(explode('@', $email)[0]);
            $username = $username_base;
            $counter = 1;
            
            // Make sure username is unique
            while (true) {
                $check_username_query = "SELECT id FROM users WHERE username = '$username'";
                $username_result = mysqli_query($conn, $check_username_query);
                
                if (!$username_result || mysqli_num_rows($username_result) == 0) {
                    break;
                }
                
                $username = $username_base . $counter;
                $counter++;
            }
            
            // Create user
            $create_user_query = "INSERT INTO users (
                username, email, password, first_name, last_name, profile_image, 
                role, status, email_verified, created_at
            ) VALUES (
                '$username', 
                '$email', 
                '', 
                '$first_name', 
                '$last_name', 
                '$profile_image', 
                'student', 
                'active', 
                1, 
                NOW()
            )";
            
            if (mysqli_query($conn, $create_user_query)) {
                $user_id = mysqli_insert_id($conn);
                
                // Create OAuth link
                $create_oauth_query = "INSERT INTO oauth_providers (
                    user_id, provider, provider_user_id, email, display_name, photo_url, 
                    access_token, refresh_token, created_at, updated_at
                ) VALUES (
                    $user_id, 
                    '$provider', 
                    '$provider_id', 
                    '$email', 
                    '$display_name', 
                    '$profile_image', 
                    '" . mysqli_real_escape_string($conn, $oauth_data['access_token'] ?? '') . "', 
                    '" . mysqli_real_escape_string($conn, $oauth_data['refresh_token'] ?? '') . "', 
                    NOW(), 
                    NOW()
                )";
                
                mysqli_query($conn, $create_oauth_query);
                
                // Get user data
                $user_query = "SELECT * FROM users WHERE id = $user_id";
                $user_result = mysqli_query($conn, $user_query);
                
                if ($user_result && mysqli_num_rows($user_result) > 0) {
                    return mysqli_fetch_assoc($user_result);
                }
            }
            
            error_log("Failed to create user for OAuth registration: $email");
            return false;
        }
    }
}