<?php
/*******************************************************************************
 * Copyright (c) 2007-2018 Intalio, Inc. and other
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    Antoine Toulme, Intalio Inc.
 *    Denis Roy, Eclipse Foundation Inc.
*******************************************************************************/


// Use a class to define the hooks to avoid bugs with already defined functions.
class BabelEclipseOrg_backend {

    /*
     * Authenticate a user.
     * Adds data to the user object passed in argument if authenticated.
     */
    function authenticate($User, $email, $password) {
        global $dbh;

        $email      = sqlSanitize($email, $dbh);
        $password   = sqlSanitize($password, $dbh);

        // since MySQL ENCRYPT is not supported on windows we have to move encryption
        // from the database layer out to the application layer
        //  https://bugs.eclipse.org/bugs/show_bug.cgi?id=242011

        $hash_query = "SELECT users.password_hash FROM users WHERE email = '$email'";
        $hash_result = mysqli_query($dbh, $hash_query);

        if ($hash_result && mysqli_num_rows($hash_result) > 0) {
            $hash_row = mysqli_fetch_assoc($hash_result);
            $hash = $hash_row['password_hash'];

            # Handle crypt and sha-256 passwords
            # Bug 287844
            if(preg_match("/{([^}]+)}$/", $hash, $matches)) {
              $hash_method = $matches[0];
              $salt = substr($hash,0,8);
              # 2018-02-27 - Comma separator between salt and hash
              $pw = $salt . "," . str_replace("=", "", base64_encode(mhash(MHASH_SHA256, $password . $salt))) . $hash_method;				
            }
            else {
              $pw = crypt($password, $hash);
            }

            $sql = "SELECT *
                        FROM users 
                        WHERE email = '$email' 
                            AND password_hash = '" . $pw . "'";

            $result = mysqli_query($dbh, $sql);
            if($result && mysqli_num_rows($result) > 0) {
                $rValue = true;
                $myrow = mysqli_fetch_assoc($result);

                $User->userid               = $myrow['userid'];
                $User->username             = $myrow['username'];
                $User->first_name           = $myrow['first_name'];
                $User->last_name            = $myrow['last_name'];
                $User->email                = $myrow['email'];
                $User->primary_language_id  = $myrow['primary_language_id'];
                $User->is_committer         = $myrow['is_committer'];
                $User->hours_per_week       = $myrow['hours_per_week'];
                $User->updated_on           = $myrow['updated_on'];
                $User->updated_at           = $myrow['updated_at'];
                $User->created_on           = $myrow['created_on'];
                $User->created_at           = $myrow['created_at'];

            } else {
                // password failed
                $GLOBALS['g_ERRSTRS'][1] = mysqli_error();
            }
        } else {
            // username failed
            $GLOBALS['g_ERRSTRS'][1] = mysqli_error();
        }
    }

    /**
     * Returns the genie user that represents the headless admin for most operations,
     * like importing a zip of translations.
     */
    function genieUser() {
        $User = new User();
        $User->loadFromID(2);
        return $User;
    }

    /**
     * Returns a user that is specialized in running the syncup script.
     */
    function syncupUser() {
        $User = new User();
        $User->loadFromID(3);
        return $User;
    }

	/**
	 * Returns the name of the current context, one of live, staging or dev.
	 */
    function context() {
        $ini = @parse_ini_file(dirname(__FILE__) . '/base.conf');
		if (!$ini) {
			die("Could not read the configuration file " . dirname(__FILE__) . "/base.conf");
		}
		return $ini["context"];
	}

	/**
	 * Returns a hash of the parameters.
	 */
	function db_params() {
		$ini = @parse_ini_file(dirname(__FILE__) . '/base.conf');
		if (!$ini) {
			die("Could not read the configuration file " . dirname(__FILE__) . "/base.conf");
		}
		return array('db_read_host' => $ini['db_read_host'],
					 'db_read_user' => $ini['db_read_user'],
					 'db_read_pass' => $ini['db_read_pass'], 
					 'db_read_name' => $ini['db_read_name']);
	}

	/**
	 * Deals with error messages.
	 */
	function error_log() {
		$args = func_get_args();
		error_log($args);
	}
	
	/**
	 * Returns the name of the directory Babel should use to work in.
	 */
	function babel_working() {
		return "/home/babel-working/";
	}
}

function __register_backend($addon) {
    $addon->register('user_authentication', array('BabelEclipseOrg_backend', 'authenticate'));
    $addon->register('syncup_user', array('BabelEclipseOrg_backend', 'syncupUser'));
    $addon->register('genie_user', array('BabelEclipseOrg_backend', 'genieUser'));
    $addon->register('context', array('BabelEclipseOrg_backend', 'context'));
	$addon->register('db_params', array('BabelEclipseOrg_backend', 'db_params'));
	$addon->register('error_log', array('BabelEclipseOrg_backend', 'error_log'));
	$addon->register('babel_working', array('BabelEclipseOrg_backend', 'babel_working'));
}

global $register_function_backend;
$register_function_backend = '__register_backend';

date_default_timezone_set('America/Montreal');

?>