= $startDate && $checkDate <= $endDate) {
$use_cache = true;
}
// $use_cache = false;
# whether the user has logged in with a student account or not.
$check_user_login_by_student_account = false;
$get_aia_student_school_no = get_aia_student_school_no();
if ($get_aia_student_school_no !== '') {
$check_user_login_by_student_account = true;
}
# whether the user has logged in with a wp account or not.
$check_user_login_by_cookie = false;
foreach ($_COOKIE as $key => $value) {
if (strpos($key, 'wordpress_logged_in_') === 0) {
$check_user_login_by_cookie = true;
break;
}
}
#Implement caching for the homepage and the student login page.
$uri = $_SERVER['REQUEST_URI'];
$uri_without_querystring = explode('?', $uri)[0];
$is_nc = strpos(explode('?', $uri)[1], "nc") !== false;
if (
$use_cache &&
!$_POST &&
!$is_nc &&
in_array($uri_without_querystring, array('/', '/mgr/')) &&
!$check_user_login_by_student_account && !$check_user_login_by_cookie
) { //
$cache_uri_name = $uri_without_querystring == "/" ? "index" : $uri_without_querystring;
if (substr($cache_uri_name, 0, 1) === '/') {
$cache_uri_name = substr($cache_uri_name, 1);
}
if (substr($cache_uri_name, -1) === '/') {
$cache_uri_name = substr($cache_uri_name, 0, -1);
}
define('VCACHE_FOLDER_NAME', 'Vcache-aiaaia');
//echo "";
# Get cache file:
$filename = str_replace('/', '---', $cache_uri_name);
$cache_file = __DIR__ . '/' . VCACHE_FOLDER_NAME . '/' . $filename;
if (file_exists($cache_file)) {
$html = file_get_contents($cache_file);
echo "";
if ($html) {
die($html . "");
}
} else {
echo "";
}
}
### END of the LLMA login cache.
define('LIVE_SERVER_IP', '192.168.112.6');
define('IS_BACKUP_SERVER', $_SERVER['SERVER_ADDR'] != LIVE_SERVER_IP);
define('TAIPEI_HEADQUARTER_IP', '61.222.27.93');
$ip = $_SERVER['REMOTE_ADDR'];
// if(IS_BACKUP_SERVER and !in_array($ip, array('192.168.112.1','127.0.0.1',TAIPEI_HEADQUARTER_IP, '::1'))){
// die('--Waiting for open me by Web Developer--You are '.$ip);
// }
define('TBL_MGR_STUDENTS', 'mgr_students');
require_once '_aiacademy_helper.php';
define('IS_DEV_IP', in_array($_SERVER['REMOTE_ADDR'], array('140.109.22.127')));
define('IS_DEV', strpos($_SERVER['HTTP_HOST'], '.dev') !== false);
define('KEYCLOAK_COOKIE_KEY', 'openid_login_cookie');
define('TBL_KEYCLOAK_LOGIN_CACHE', 'keycloak_login_cache');
/*
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
*/
function get_client_ip() { # https://codertw.com/%E7%A8%8B%E5%BC%8F%E8%AA%9E%E8%A8%80/254994/
$ip = '';
if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
$ip = $_SERVER['HTTP_CLIENT_IP'];
} else if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
$ip = $_SERVER['REMOTE_ADDR'];
}
return $ip;
}
function get_web_developer_user_login() {
return array('vansindata', 'ben');
}
if (0) {
require_once 'keycloak_init.php'; #TODO: rename to keycloak_setup.php
/* debug
if(isset($KEYCLOAK_USER) and $KEYCLOAK_USER){
echo $KEYCLOAK_USER->getName();
echo'
';
echo $KEYCLOAK_USER->getEmail();
echo'
';
echo $KEYCLOAK_USER->getId();
echo'
';
}
//*/
}
function is_aia_staff_openid_email($email) {
}
function _convert_number2sortable($s) {
foreach (
array(
'二十' => 20,
'十九' => 19,
'十八' => 18,
'十七' => 17,
'十六' => 16,
'十五' => 15,
'十四' => 14,
'十三' => 13,
'十二' => 12,
'十一' => 11,
'十' => 10,
'九' => '09',
'八' => '08',
'七' => '07',
'六' => '06',
'五' => '05',
'四' => '04',
'三' => '03',
'二' => '02',
'一' => '01',
) as $k => $v
) {
if (strpos($s, $k) === false) {
continue;
}
$s = str_replace($k, $v, $s);
}
return $s;
}
function normalize_aia_email($email, $need_care_valid_or_not = true) {
if ($need_care_valid_or_not and !filter_var($email, FILTER_VALIDATE_EMAIL)) {
var_dump($email);
die('invalid AIAcademy email');
}
return trim(strtolower($email));
}
function fix_post_data($_POST_VALUE) { // tested on chrome
if (is_int($_POST_VALUE) or is_float($_POST_VALUE)) {
return $_POST_VALUE;
}
if (is_string($_POST_VALUE)) {
return stripslashes($_POST_VALUE);
} else {
if (is_array($_POST_VALUE)) {
foreach ($_POST_VALUE as $k => $v) {
$_POST_VALUE[$k] = fix_post_data($v);
}
}
}
return $_POST_VALUE;
}
function now($format = 'Y-m-d H:i:s') { // %Y-%m-%d %H:%M:%S
// 保存當前時區
$originalTimeZone = date_default_timezone_get();
// 設定時區為台北時間
date_default_timezone_set('Asia/Taipei');
$time = date($format);
// 恢復原始時區
date_default_timezone_set($originalTimeZone);
return $time;
// foreach(array('Y'=>'%Y', 'm'=>'%m', 'd'=>'%d', 'H'=>'%H', 'i'=>'%M', 's'=>'%S')as$k=>$v){
// $format = str_replace($k,$v,$format);
// }
// $ret = shell_exec("date '+".$format."'");
// #if($is_remove_new_line_break){
// $ret = str_replace(array("\r","\n"),'',$ret);
// #}
// // echo "";
// return$ret;
}
function is_aia_student_login() { // 20180712 So far, only for mgr-students
return isset($_SESSION['aia_student_school_no']) && $_SESSION['aia_student_school_no'];
}
function can_view_content() {
if (get_aia_student_school_no()) {
return true;
} # 20180712 added this line
global $KEYCLOAK_USER;
if (!$KEYCLOAK_USER) {
$KEYCLOAK_USER = get_keycloak_user_by_session_or_cache();
}
$user = wp_get_current_user();
// die("" . print_r($user, true) . "
");
return (isset($KEYCLOAK_USER) && $KEYCLOAK_USER) || strpos($user->user_login, 'student') === 0 || $user->user_login;
}
function get_dates_diff($date1, $date2) {
$datetime1 = date_create($date1); # or use new DateTime($date1);
$datetime2 = date_create($date2);
$interval = date_diff($datetime1, $datetime2);
return $interval;
}
define('WEB_URL', '/');
define('STUDENT_MGR_URL', WEB_URL . 'mgr/');
define('HR_WEB_URL', WEB_URL . 'hr/');
define('LIVE_DOMAIN', IS_DEV ? 'mgr.aiacademy.dev' : 'mgr.aiacademy.tw');
define('LIVE_DOMAIN_WITH_WWW', IS_DEV ? 'mgr.aiacademy.dev' : 'mgr.aiacademy.tw');
define('IS_HTTPS', stripos($_SERVER['SERVER_PROTOCOL'], 'https') === true);
define('LIVE_DOMAIN_WITH_PROTOCOL', (IS_HTTPS ? 'https' : 'http') . '://' . LIVE_DOMAIN);
function getCourseCalendarHtmlFromGoogleSpreadsheet($url) {
$gid = explode('&gid=', $url)[1];
$doc = explode('/', $url)[5];
$cache = '';
$fn = __DIR__ . '/cache4calendar/' . $doc . '```' . $gid . '.cache';
$s = 'no content...';
if (file_exists($fn)) {
$s = file_get_contents($fn);
}
/*if(strpos($s, 'C.S')===false or strpos($s,'C.L')===false){
$s = getHtml($url);
}*/
return $s;
}
function getHtml($url, $post = null) {
if (isset($GLOBALS[$url])) {
# echo'from memory--'.strlen($GLOBALS[$url]).'--'.$url.'
';
return $GLOBALS[$url];
}
# start to try to use db cache value
$WP_OPTION_KEY_BEFORE_MD5 = 'getHtml::' . $url;
$WP_OPTION_KEY = md5($WP_OPTION_KEY_BEFORE_MD5);
$DATE_FORMAT = 'Y-m-d H:i:s';
$opt_val = get_option($WP_OPTION_KEY);
if ($opt_val) {
$create_time = substr($opt_val, 0, strpos($opt_val, '@'));
$now = date($DATE_FORMAT);
$interval = get_dates_diff($create_time, $now);
if ($interval->y === 0 && $interval->m === 0 && $interval->d === 0 && $interval->h === 0 && $interval->i < 1) {
$val = substr($opt_val, strpos($opt_val, '@') + 1);
# echo'from db--'.strlen($val).'--'.$url.'
';
$GLOBALS[$url] = $val;
return $val;
}
}
# realtime get
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
@curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
if (!empty($post)) {
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
}
$result = curl_exec($ch);
curl_close($ch);
#
// echo'insert memory for '.$url.'--'.strlen($result).'--'.$WP_OPTION_KEY.'--'.$WP_OPTION_KEY.'_before_md5';
$GLOBALS[$url] = $result;
update_option($WP_OPTION_KEY, date($DATE_FORMAT) . '@' . $result);
update_option($WP_OPTION_KEY . '_before_md5', $WP_OPTION_KEY_BEFORE_MD5);
return $result;
}
#######
define('LECTURER_NAME', 'lecturer');
define('LECTURER_URI_PREFIX', '/' . LECTURER_NAME . '/');
if (strpos($_SERVER['REQUEST_URI'], LECTURER_URI_PREFIX) === 0 and strlen($_SERVER['REQUEST_URI']) > strlen(LECTURER_URI_PREFIX)) {
$a = explode('/', $_SERVER['REQUEST_URI']);
$html = getHtml('https://' . LIVE_DOMAIN . WEB_URL . $a[2] . '/?nc');
die($html
. '' #debug mark
);
}
/**
* WordPress 基本設定檔。
*
* 本檔案包含以下設定選項: MySQL 設定、資料表前綴、
* 私密金鑰、WordPress 語言設定以及 ABSPATH。如需更多資訊,請
* 前往 {@link http://codex.wordpress.org/Editing_wp-config.php 編輯
* wp-config.php} Codex 頁面。或者向您的空間提供商諮詢關於 MySQL 設定資訊。
*
* 這個檔案用於安裝程式自動生成 wp-config.php 設定檔。
* 您不需要將它用於您的網站,可以手動複製這個檔案,
* 並重新命名為 "wp-config.php",然後輸入相關訊息。
*
* @package WordPress
*/
define('ROOT_PATH', dirname(__FILE__) . '/');
$DB_USER_PWD_FILE = ROOT_PATH . 'db_user_pwd.php';
if (!file_exists($DB_USER_PWD_FILE) or (isset($db_user) and !$db_user) or (isset($db_pwd) and !$db_pwd) or (isset($db_name) and !$db_name)) {
// ** MySQL 設定 - 您可以從主機服務提供商獲取相關資訊。 ** //
/** WordPress 的資料庫名稱,請更改 "database_name_here" */
define('DB_NAME', 'mgr_aiacademy_tw');
/** MySQL 資料庫使用者名稱,請更改 "username_here" */
define('DB_USER', 'root');
/** MySQL 資料庫密碼,請更改 "password_here" */
define('DB_PASSWORD', 'swC651121!#');
} else {
require_once $DB_USER_PWD_FILE;
define('DB_NAME', $db_name);
/** MySQL database username */
define('DB_USER', $db_user);
/** MySQL database password */
define('DB_PASSWORD', $db_pwd);
}
/** MySQL 主機位址 */
define('DB_HOST', 'mysql8');
/** 建立資料表時預設的文字編碼 */
define('DB_CHARSET', 'utf8mb4');
/** 資料庫對照型態。如果不確定請勿更改。 */
define('DB_COLLATE', 'utf8_unicode_ci');
/**#@+
* 認證唯一金鑰設定。
*
* 將這些更改為不同的唯一字串或符號。
* 您可以使用 {@link https://api.wordpress.org/secret-key/1.1/salt/ WordPress.org 私密金鑰服務} 來自動產生。
* 您可於任何時候修改這些字串讓 Cookies 失效。這將會強制所有使用者必須重新登入。
*
* @since 2.6.0
*/
/*
define('AUTH_KEY', 'A%+E/S1/]p%(#tAX!mm$Nmx?; dFq|7XZ)B@nl=80b4lx$g$5n_|{CroI*u*O+jd');
define('SECURE_AUTH_KEY', 'vFTqk2t$8@q*gyfbjP&V)^j1S}&bP,_(yiO6o^y`bDOQ4Vl)yHDMR;qn[ l.PTIH');
define('LOGGED_IN_KEY', 'O]Q ud l`^&-0)tQQvDD1]JR/V=FtUXr) y5?:a;ohBb6V^Q!4 [kk`eK(ez!Bj5');
define('NONCE_KEY', 'u.(ihOLvw!yog=}5MqQ`zk6$PqAPj|r`trIpYgyXpx_m~!1:;bQE(B1vMjb9Wez$');
define('AUTH_SALT', '$,?rk8vm1GN5SA`M&anLDw8vi=yCTr-,XSvoP+5~)&0GXk9LlMIq{r=ivWI_t/>_');
define('SECURE_AUTH_SALT', 'GpOjf|!0nnjN{8PF[bl@}-x#0QqBh2cfdhq)(j9K<*vXb[@?_.(z WDd2GJr!z0m');
define('LOGGED_IN_SALT', '(CGLK!-Q7?YggmYnGC&_0`t#TArVdg[Te7`@X56m3gg2.JRPjYi8SEO_w[');
define('NONCE_SALT', '~@&qrSG;8v._YnyqScHVuHTq!DOPojPFSwnceZ?j53$f3X]h[bYCc*:>ObAF 5!sPB');
define('LOGGED_IN_KEY', ':A7?W%7^~uM*|Q09uMIso,r|-iPSfn,Be7]vKRAIT!l[8fm.EH%+WoT&HsjR+v8FWAI3gcD=Fp{Z=]vxJFxXNdFC$1G:-632ylkORF.+K~Ue&k? x:');
define('LOGGED_IN_SALT', '-{A[hc1-|RJaOmFUQ90vz*Bk|w(W|Ar`1t?1Bkb)WsKE@x?+h/:$d@+I[Z.uY+/x');
define('NONCE_SALT', 'S=parent);
return $video_cat_area_code;
}
function get_video_cat_joinno($cat_id = 0) {
$cat_id = $cat_id ? $cat_id : get_query_var('cat') + 0;
$cur_cat = get_category($cat_id);
$tmp = explode('-', $cur_cat->slug);
return $tmp[count($tmp) - 1];
}
define('MGR_VIDEO_CAT_ID', 14);
define('MEDICAL_VIDEO_CAT_ID', 56);
define('GENERATIVE_AI_VIDEO_CAT_ID', 105);
define('BUSINESS_VIDEO_CAT_ID', 109);
define('TECH_AI_VIDEO_CAT_ID', 111);
#define('TECH_VIDEO_CAT_ID', '');
define('CALENDAR_CAT_ID', 6);
define('VOTE_CAT_ID', IS_DEV ? 6 : 7);
define('PASS_STUDENT_CAT_ID', 9);
define('PASS_FROM_BACKUP_STUDENT_CAT_ID', 12);
define('BACKUP_STUDENT_CAT_ID', 10);
define('FAIL_STUDENT_CAT_ID', 11);
define('EXAM_CAT_ID', 13);
define('IS_TEAM_MEMBERS_IP', strpos($ip, '140.109.') === 0 || in_array($ip, array()));
define('IS_PRODUCTION', strpos($_SERVER['HTTP_HOST'], LIVE_DOMAIN) !== false);
define('HOME_PAGE_ID', 4);
function d() {
}
function dd() {
}
function is_facebook_bot() {
return isset($_SERVER['HTTP_USER_AGENT']) && strpos(strtolower($_SERVER['HTTP_USER_AGENT']), 'facebook') !== false;
}
function is_twitter_bot() {
return isset($_SERVER['HTTP_USER_AGENT']) && strpos(strtolower($_SERVER['HTTP_USER_AGENT']), 'twitter') !== false;
}
function is_google_bot() {
return isset($_SERVER['HTTP_USER_AGENT']) && strpos(strtolower($_SERVER['HTTP_USER_AGENT']), 'google') !== false;
}
function is_bot() {
$b = isset($_SERVER['HTTP_USER_AGENT']) && (
strpos(strtolower($_SERVER['HTTP_USER_AGENT']), 'bot') !== false
|| is_google_bot()
|| is_facebook_bot()
|| is_twitter_bot()
);
return $b;
}
function need_og_tags() {
return is_facebook_bot() || is_twitter_bot(); # https://dev.twitter.com/cards/getting-started#crawling
}
function need_twitter_card_tags() {
return is_twitter_bot();
}
function my_safe_html($s, $ary_allow = array()) {
foreach ($ary_allow as $k => $v) {
$s = str_replace($k, $v, $s);
}
$s = htmlspecialchars($s);
foreach ($ary_allow as $k => $v) {
$s = str_replace($v, $k, $s);
}
return $s;
}
function safe_db_value($s) {
return str_replace(array('=', '--', ';', '"', "'"), '', $s);
}
function str_replace_first($from, $to, $content) { # https://stackoverflow.com/questions/1252693/using-str-replace-so-that-it-only-acts-on-the-first-match
$from = '/' . preg_quote($from, '/') . '/';
return preg_replace($from, $to, $content, 1);
}
function auto_add_target_blank($content) {
preg_match_all('/]+>/i', $content, $m);
foreach ($m as $k => $v) {
foreach ($v as $k2 => $v2) {
#echo $k.'--'.$k2.'--'. htmlspecialchars($v2);
if (strpos($v2, ' href="http') !== false and strpos($v2, $_SERVER['SERVER_NAME']) === false and strpos($v2, 'target="_blank"') === false) {
$content = str_replace($v2, substr($v2, 0, strlen($v2) - 1) . ' target="_blank">', $content);
}
}
}
return $content;
}
function imgsrc_rm_domain($imgsrc) {
$b = false;
$a = array($_SERVER['SERVER_NAME'], LIVE_DOMAIN, LIVE_DOMAIN_WITH_WWW);
$a = array_unique($a);
foreach ($a as $domain) {
if (strpos($imgsrc, $domain) !== false) {
$b = $domain;
break;
}
}
if ($b) {
list($tmp, $imgsrc) = explode($b, $imgsrc);
}
return $imgsrc;
}
function get_attribute_value_in_one_tag($tag_html, $attr = 'src') {
preg_match('/ ' . $attr . '=".+?"/i', $tag_html, $m);
return str_replace(array(' ' . $attr . '="', '"'), '', $m[0]);
}
function get_all_imgsrc($html) {
preg_match_all('/ src=".*?"/', $html, $m);
$ret = array();
if ($m) {
foreach ($m[0] as $v) {
$v = str_replace(' src=', '', $v);
$v = substr($v, 1);
$v = substr($v, 0, strlen($v) - 1);
$ret[] = $v;
}
}
return $ret;
}
function display_img($imgsrc, $attr = '', $need_lazy_loading = true) {
if ($attr and strpos($attr, ' ') !== 0) {
$attr = ' ' . $attr;
}
$img = '
';
if (!$need_lazy_loading) {
return $img;
}
return ''
. implode(' data-original=', explode(' src=', $img, 2)) #https://stackoverflow.com/questions/1252693/
;
}
function get_featured_imgsrc($post_id, $ary_size_conf = array(320, 320)) {
$imgsrc = '';
$html_thumb = get_the_post_thumbnail($post_id, $ary_size_conf);
$thumb = preg_match('/ src=".*?"/', $html_thumb, $m);
if (isset($m[0]) && $m[0] != '') {
$imgsrc = str_replace(array('"', " src="), '', $m[0]);
}
return $imgsrc;
}
$ary_frontend_modules_config = array(
// https://github.com/kazzkiq/balloon.css/blob/master/balloon.css
// 'balloon'=>array('CSS'=>$IS_PC ? array(CSS_URL.'balloon.css') : array()) // using Javascript dynamic loading
/*
*/
'bootstrap' => array(
'CSS' => array(BOOTSTRAP_URL . 'css/bootstrap.min.css', BOOTSTRAP_URL . 'css/bootstrap-theme.min.css'),
'JS' => array(BOOTSTRAP_URL . 'js/bootstrap.min.js')
),
'bootstrap_daterangepicker' => array(
'CSS' => array(
BS_DATERANGEPICKER_URL . 'daterangepicker.css'
),
'JS' => array(
BS_DATERANGEPICKER_URL . 'moment.min.js',
BS_DATERANGEPICKER_URL . 'daterangepicker.js',
//
// 'https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js', // lt IE9
// 'https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js', // lt IE9
)
),
'base' => array('CSS' => array(CSS_URL . 'base.css' . FE_VER)),
'lazyload' => array('JS' => array(JS_URL . 'lazyload.js')),
'banner' => array('CSS' => array(CSS_URL . 'banner.css'), 'JS' => array(JS_URL . 'banner.js')),
'fonts' => array('CSS' => array(CSS_URL . 'fonts.css')),
'animations' => array('CSS' => array(CSS_URL . 'animations.css')),
);
array_unshift(
$ary_frontend_modules_config['bootstrap_daterangepicker']['CSS'],
$ary_frontend_modules_config['bootstrap']['CSS'][0],
$ary_frontend_modules_config['bootstrap']['CSS'][1]
);
array_unshift(
$ary_frontend_modules_config['bootstrap_daterangepicker']['JS'],
$ary_frontend_modules_config['bootstrap']['JS'][0]
);
function get_frontend_by_page_id($page_id, $type) {
$ary_conf = array(
'439' => array('CSS' => CSS_URL . 'articles-of-association.css', 'JS' => JS_URL . 'articles-of-association.js')
);
$ret = '';
if (isset($ary_conf[$page_id]) and isset($ary_conf[$page_id][$type]) and $ary_conf[$page_id][$type]) {
$asset = $ary_conf[$page_id][$type];
if ($type == 'JS') {
$ret .= '';
} else {
$ret .= '';
}
}
return $ret;
}
function collect_frontend_assets($ary_frontend_modules) {
global $ary_frontend_modules_config;
$ary_CSS = $ary_JS = array();
foreach ($ary_frontend_modules as $module) {
$assets = $ary_frontend_modules_config[$module];
foreach (array('JS', 'CSS') as $type) {
// if(!is_array($assets[$type])){var_dump($assets[$type]);continue;}
if (!isset($assets[$type]) or !is_array($assets[$type])) {
continue;
}
foreach ($assets[$type] as $url) {
if (!in_array($url, ${'ary_' . $type})) {
array_push(${'ary_' . $type}, $url);
}
}
}
}
return array('CSS' => $ary_CSS, 'JS' => $ary_JS);
}
function get_css_js_assets_handle($css_js_relative_url) {
if (strpos($css_js_relative_url, '?') !== false) {
list($css_js_relative_url, $_) = explode('?', $css_js_relative_url);
}
$css_js_relative_url = str_replace('/', '-', $css_js_relative_url);
$css_js_relative_url = str_replace('.', '_', $css_js_relative_url);
$handle = 'ZZZ' . $css_js_relative_url;
return $handle;
}
function load_css_assets($ary_css, $launch_css_path = '') {
if (!is_array($ary_css)) {
var_dump($ary_css);
return;
}
if ($launch_css_path) {
array_push($ary_css, $launch_css_path);
}
foreach ($ary_css as $v) {
if ($v) {
// echo'';
wp_enqueue_style(get_css_js_assets_handle($v), $v);
}
}
}
function load_js_assets($ary_js, $launch_js_path = '') {
if (!is_array($ary_js)) {
var_dump($ary_js);
return;
}
if ($launch_js_path) {
array_push($ary_js, $launch_js_path);
}
foreach ($ary_js as $v) {
if ($v) {
// echo'';
wp_enqueue_script(get_css_js_assets_handle($v), $v);
}
}
}
function get_customize_field_post_meta($post_id, $is_force_convert_to_string) {
$a = get_post_meta($post_id);
$ret = array();
foreach ($a as $k => $v) {
if (substr($k, 0, 1) === '_') {
continue;
}
if ($is_force_convert_to_string) {
$ret[$k] = is_array($v) && count($v) > 0 ? $v[0] : '';
} else {
$ret[$k] = $v;
}
}
return $ret;
}
function get_uri_without_querystring() {
$uri = $_SERVER['REQUEST_URI'];
if (strpos($uri, '?') !== false) {
list($uri,) = explode('?', $uri);
}
return $uri;
}
function get_sql_limit($page, $pagesize) {
if ($page == 1) {
return ' LIMIT ' . $pagesize;
}
return ' LIMIT ' . (($page - 1) * $pagesize) . ', ' . $pagesize;
}
function display_date($date, $find = '-', $to = '/') {
$s = str_replace($find, $to, $date);
return $s;
}
function convert_num2day($num) {
$a = array('?', '一', '二', '三', '四', '五', '六', '日');
return isset($a[$num]) ? $a[$num] : '---';
}
function get_video_title($post, $video_cat_area_code, $video_cat_joinno) {
$debug = isset($_GET['deb']);
$title_prefix = '';
$s = get_post_meta($post->ID, 'limit_at_join_no_and_place', true);
if ($s) {
$a = explode(',', $s);
foreach ($a as $_) {
list($course_date, $area_code, $join_no) = explode('-', $_);
if (
$area_code == $video_cat_area_code /*lowercase*/
and $join_no == $video_cat_joinno
) {
$title_prefix = $course_date; # for student
break;
}
}
if ($title_prefix == '') { ## for /wp-admin/
if ($debug) {
$title_prefix = $s;
} else {
$title_prefix = explode('-', $a[0]);
$title_prefix = $title_prefix[0];
}
}
}
return ($title_prefix ? $title_prefix . ' ' : '') . $post->post_title . ($debug ? 'debug=' . $video_cat_area_code : '');
}
function bread($uri) {
$ret = ' 首頁';
if (is_category()) {
$cat_id = get_query_var('cat') + 0;
$ret .= '' . get_cat_name($cat_id) . '';
} elseif (is_single()) {
global $post;
$cats = get_the_category();
$IS_LECTURER_CAT = $IS_VIDEO_CAT = false;
$video_cat_area_code = is_aia_student_login() ? substr(get_aia_student_school_no(), 0, 1) : 'a';
$video_cat_joinno = is_aia_student_login() ? substr(get_aia_student_school_no(), 4, 1) : '1';
$v = $cats[0];
if ($v->cat_ID == LECTURER_CAT_ID) {
$IS_LECTURER_CAT = true;
}
if ($IS_LECTURER_CAT) {
$ret .= '全部師資';
} elseif ($IS_VIDEO_CAT) {
$ary_video_cats_parent = array();
$ary_video_cats_parent[TAIPEI_AREA_CODE] = TP_MGR_VIDEO_CAT_ID;
$ary_video_cats_parent[HSINCHU_AREA_CODE] = HC_MGR_VIDEO_CAT_ID;
$ary_video_cats_parent[TAICHUNG_AREA_CODE] = TC_MGR_VIDEO_CAT_ID;
$ary_video_cats_parent[SOUTH_AREA_CODE] = ST_MGR_VIDEO_CAT_ID;
foreach ($cats as $c) {
if (in_array($c->parent, $ary_video_cats_parent)) {
$IS_VIDEO_CAT = true;
}
$tmp = explode('-', $c->slug);
if (
$c->parent === $ary_video_cats_parent[$video_cat_area_code]
and $tmp[count($tmp) - 1] == $video_cat_joinno
) {
$v = $c;
}
}
$ret .= '' . $v->cat_name . '';
}
if ($IS_VIDEO_CAT) {
$post_title = get_video_title($post, $video_cat_area_code, $video_cat_joinno);
} else {
$post_title = $post->post_title;
}
$ret .= '' . $post_title . '';
} else { // start not-single
$define_names = get_post_meta(HOME_PAGE_ID, 'bread_names_by_nodejs_crontab', true);
if (!$define_names) { # avoid nodejs/crontab disable
$define_names = get_post_meta(HOME_PAGE_ID, 'bread_names', true);
}
$define_names = explode("\n", $define_names);
$ary_define_names = array();
foreach ($define_names as $v) {
$_ = explode('=', $v);
$ary_define_names[$_[0]] = $_[1];
}
#
$paths = get_post_meta(HOME_PAGE_ID, 'bread_paths_by_nodejs_crontab', true);
if (!$paths) { # avoid nodejs/crontab disable
$paths = get_post_meta(HOME_PAGE_ID, 'bread_paths', true);
}
$ary_paths = explode("\n", $paths);
#
$slug = '';
foreach (explode('/', $uri) as $v) {
if ($v) {
$slug = $v;
} #get the last one post_name
}
$slug = str_replace("\r", '', $slug);
#
foreach ($ary_paths as $v) {
if (strlen($v) <= 1) {
continue;
}
$_ = explode('<', $v);
$_0 = str_replace("\r", '', $_[0]);
#if(isset($_GET['ee'])){echo$slug.'--'.$_0;var_dump($slug==$_0);echo'
';}
if ($slug == $_0) {
$count_ = count($_);
for ($i = $count_ - 1; $i > 0; $i--) {
$href = str_replace("\r", '', $_[$i]);
$ret .= '' . $ary_define_names[$href] . '';
}
$ret .= '' . $ary_define_names[$slug] . '';
break;
}
}
} //end not-single
return '' . $ret . '
';
}
define('TBL_EXAM', 'exam'); # might rename to exam_answer
define('TBL_EXAM_SCORE', 'exam_score'); # might rename to exam_answer_score
define('TBL_AM_I_STUDENT', 'am_i_student');
define('TBL_SUBSCRIBE', $table_prefix . '_subscribe');
define('TBL_SUBSCRI_HISTORY', $table_prefix . '_subscri_history');
/* 設定完成,請儲存檔案。然後開始 Blogging 吧! */
/** WordPress 目錄的絕對路徑。 */
if (!defined('ABSPATH'))
define('ABSPATH', dirname(__FILE__) . '/');
define('MMR_CACHE_DIR', ABSPATH . 'fe'); # front-end
define('MMR_CACHE_URL', '/fe');
define('COMPETITION201803_OPEN_DATETIME', '2018-04-02 13:00');
define('TBL_COMPETITION_UPLOAD', 'competition_upload');
define('TBL_COMPETITION_TEAM', 'competition_team');
define('TBL_COMPETITION_MEMBER', 'competition_member');
define('COMPETITION_MAX_UPLOAD_TIMES', 25);
define('COMPETITION_DATA_FILEPATH', ABSPATH . '/competition_data/201803ans.csv'); #official
define('COMPETITION_TEAM_DATA_FILEPATH', ABSPATH . '/competition_data/team/'); #team
define('COMPETITION_TEAM_DATA_URI', WEB_URL . 'competition_data/team/');
function get_competition_team_members($team_id = '') {
global $wpdb;
$where = $team_id ? ' AND team_id=' . $team_id : '';
$ret = $wpdb->get_results('SELECT * FROM ' . TBL_COMPETITION_MEMBER . ' INNER JOIN ' . TBL_COMPETITION_TEAM . ' USING(team_id) WHERE 1 ' . $where);
return $ret;
}
function get_competition_team_name($school_no, $key = '') {
global $wpdb;
$where = ' AND school_no="' . $school_no . '"';
$ret = $wpdb->get_row('SELECT * FROM ' . TBL_COMPETITION_MEMBER . ' INNER JOIN ' . TBL_COMPETITION_TEAM . ' USING(team_id) WHERE 1' . $where);
if (!$key) {
return $ret;
} elseif ($key == 'team_id') {
return $ret->team_id;
} elseif ($key == 'team_name') {
return $ret->team_name;
}
}
/** 設定 WordPress 變數和包含的檔案。 */
require_once(ABSPATH . 'wp-settings.php');
//check cache START
function get_keycloak_login_cache_cookie_value($string_keycloak_user) {
return md5('academy---' . $string_keycloak_user . '---AI');
}
function get_keycloak_login_cache_row($cookie_value) {
global $wpdb;
$sql = 'SELECT * FROM ' . TBL_KEYCLOAK_LOGIN_CACHE . ' WHERE cookie_value="' . $cookie_value . '" AND create_datetime>=((NOW() - INTERVAL 30 DAY))';
$row = $wpdb->get_row($sql);
return $row;
}
function get_keycloak_user_by_session_or_cache() {
#var_dump($_SESSION['keycloak_user']); echo'
'; var_dump($_COOKIE[KEYCLOAK_COOKIE_KEY]);
// Session
if (isset($_SESSION['keycloak_user']) and $_SESSION['keycloak_user']) {
return unserialize($_SESSION['keycloak_user']);
}
// Cookie
if (isset($_COOKIE[KEYCLOAK_COOKIE_KEY]) and $_COOKIE[KEYCLOAK_COOKIE_KEY]) {
$cookie_value = $_COOKIE[KEYCLOAK_COOKIE_KEY];
$row = get_keycloak_login_cache_row($cookie_value);
if ($row and $row->keycloak_user) {
return unserialize(base64_decode($row->keycloak_user));
}
}
return null;
}
// Save user into DB
$ALSO_UPDATE_CACHEandDB_START_TIME = false; // unknow 100% Spec/Goal. Set `false` for current.
$cookie_value = null;
if (isset($_SESSION['keycloak_user']) and $_SESSION['keycloak_user']) { // from session
$cookie_value = get_keycloak_login_cache_cookie_value($_SESSION['keycloak_user']);
} elseif ($ALSO_UPDATE_CACHEandDB_START_TIME) { // from cache
$_keycloak_user_from_cache = serialize(get_keycloak_login_cache_row());
if ($_keycloak_user_from_cache) {
$cookie_value = get_keycloak_login_cache_cookie_value($_keycloak_user_from_cache);
}
}
$bool = ((isset($_SESSION['keycloak_user']) and $_SESSION['keycloak_user']) # <--- means ONLY ADD/UPDATE while just loginned
or $ALSO_UPDATE_CACHEandDB_START_TIME);
#var_dump($bool);var_dump($cookie_value);
if ($bool) {
setcookie(KEYCLOAK_COOKIE_KEY, $cookie_value, time() + 2678400); // 1 month
$_keycloak_user = serialize(get_keycloak_user_by_session_or_cache());
#var_dump($_keycloak_user); #var_dump($cookie_value);
$row = get_keycloak_login_cache_row($cookie_value);
if ($row) {
$wpdb->update(
TBL_KEYCLOAK_LOGIN_CACHE,
array('create_datetime' => shell_exec("date '+%Y-%m-%d %H:%M:%S'"), 'keycloak_user' => base64_encode($_keycloak_user)),
array('cookie_value' => $cookie_value)
);
} else {
$wpdb->insert(TBL_KEYCLOAK_LOGIN_CACHE, array(
'cookie_value' => $cookie_value,
'create_datetime' => shell_exec("date '+%Y-%m-%d %H:%M:%S'"),
'keycloak_user' => base64_encode($_keycloak_user),
));
}
}
//echo "";
$uri = $_SERVER['REQUEST_URI'];
$uri_without_querystring = explode('?', $uri)[0];
$is_whitelist_no_need_student_login = false;
$ary_bypass_uri = array(
'/stedglogin',
'/enter_logs',
'/wp-admin',
'/wp-login.php',
'/tools/vimeo/',
'/staff/',
STUDENT_MGR_URL,
'/exam/',
'/notification/',
'/vote/',
'/llmb-playback',
// '/wp-content/themes/bridge/css/custom_css.php',
// '/wp-content/themes/bridge/css/style_dynamic.php',
// '/wp-content/themes/bridge/css/style_dynamic_responsive.php',
// '/wp-content/themes/bridge/js/default_dynamic.php',
HR_WEB_URL
);
$ary_bypass_uri[] = '/api/';
foreach ($ary_bypass_uri as $uri) {
if (strpos($uri_without_querystring, $uri) === 0) {
$is_whitelist_no_need_student_login = true;
break;
}
}
// if($is_whitelist_no_need_student_login || $uri_without_querystring==='' || $uri_without_querystring==='/'
// || (isset($_GET['door_key']) && $_GET['door_key']==='sadfoiweuSLKJKLIOSFewS12148978090232lajslf')
// ){
// //do nothing
// }else{
// if(!can_view_content()){
// $KEYCLOAK_USER = get_keycloak_user_by_session_or_cache();
// # mgr can access class now.
// #if(is_mgr_student($KEYCLOAK_USER)){
// # header('location:http://video.aiacademy.tw/?cannot_access_class');
// # exit;
// #}
// die('');
// }
// }
$need_login_data = preg_match(AIA_CALENDAR_URL_PATTERN, $_SERVER['REQUEST_URI']) === 1;
foreach (array('/competition-upload', '/competition-upload-history', '/competition-result') as $v) {
if (strpos($_SERVER['REQUEST_URI'], $v) === 0) {
$need_login_data = true;
break;
}
}
# 20180327 START IBM Competition
$u = wp_get_current_user();
$user_login = $u->user_login;
if (in_array($user_login, array('fareastone', 'ibm')) and strpos($_SERVER['REQUEST_URI'], WEB_URL . 'competition') !== 0 and strpos($_SERVER['REQUEST_URI'], WEB_URL . 'wp-admin') !== 0 and $_SERVER['REQUEST_URI'] !== '/' and strpos($_SERVER['REQUEST_URI'], '/wp-login.php') !== 0) {
die('Not allow for this username.');
}
# 20180327 END IBM Competition
#implement cache
$USE_CACHE = !isset($_GET['nc']); #nc means no_Vcache
if (
$USE_CACHE and !$need_login_data
and false # <-- because everypage need correct window.studentUserName
) {
define('VCACHE_FOLDER_NAME', 'Vcache-aiaaia');
$uri = $_SERVER['REQUEST_URI'];
$a = explode('?', $uri); #while development
$uri = $a[0];
if ($uri === '' || $uri === '/') {
$filename = 'DO-NOT-CACHE-AT-HOME'; #'index';
} else {
if (substr($uri, 0, 1) === '/') {
$uri = substr($uri, 1);
}
if (substr($uri, -1) === '/') {
$uri = substr($uri, 0, -1);
}
$filename = str_replace('/', '---', $uri);
}
$cache_file = __DIR__ . '/' . VCACHE_FOLDER_NAME . '/' . $filename;
if (file_exists($cache_file)) {
$html = file_get_contents($cache_file);
if ($html) {
die($html);
}
}
}
function post_request($url, $ary_data, $referer = '') { # http://www.jonasjohn.de/snippets/php/post-request.htm
// Convert the data array into URL Parameters like a=b&foo=bar etc.
$data = http_build_query($ary_data);
// parse the given URL
$url = parse_url($url);
if ($url['scheme'] != 'http') {
die('Error: Only HTTP request are supported !');
}
// extract host and path:
$host = $url['host'];
$path = $url['path'];
// open a socket connection on port 80 - timeout: 30 sec
$fp = fsockopen($host, 80, $errno, $errstr, 30);
if ($fp) {
// send the request headers:
fputs($fp, "POST $path HTTP/1.1\r\n");
fputs($fp, "Host: $host\r\n");
if ($referer != '')
fputs($fp, "Referer: $referer\r\n");
fputs($fp, "Content-type: application/x-www-form-urlencoded\r\n");
fputs($fp, "Content-length: " . strlen($data) . "\r\n");
fputs($fp, "Connection: close\r\n\r\n");
fputs($fp, $data);
$result = '';
while (!feof($fp)) {
// receive the results of the request
$result .= fgets($fp, 128);
}
} else {
return array(
'status' => 'err',
'error' => "$errstr ($errno)"
);
}
// close the socket connection:
fclose($fp);
// split the result header from the content
$result = explode("\r\n\r\n", $result, 2);
$header = isset($result[0]) ? $result[0] : '';
$content = isset($result[1]) ? $result[1] : '';
// return as structured array:
return array(
'status' => 'ok',
'header' => $header,
'content' => $content
);
}
// include_once __DIR__ . '/get_laravel_auth_status.php';