<?php

/*
	TODO:
	- custom_encode_data and custom_decode_data functions use the same algorythm, need to optimize them
*/


class security {

	//Constructor (does nothing atm)
	private function __construct() {
	}
	
	public static function check_request_data($data='') {
		if (isset($data) && strlen($data)>0)
			return true;
		else
			return false;
	}
	
	public static function secure_request_data($data, $level='') {
		if ($level) {
			switch ($level) {
				case 1:
					$data = preg_replace("/[^A-Za-z]/", "", $data); //Letters only
				break;
				case 2:
					$data = preg_replace("/[^0-9]/", "", $data); //Numbers only
				break;
				case 3:
					$data = preg_replace("/[^A-Za-z0-9]/", "", $data); //Letters and numbers only
				break;
				default:
					$data = $data; //Default - no security
				break;
			}
		} else {
			$data = $data; //If no level is set - no security
		}
		return $data;
	}
	
	/* FORM FIELDS VALIDATION : START */
	public static function validate_data($data, $type) {
		switch ($type) {
			case 'email':
				return preg_match('/^(?!(?:(?:\x22?\x5C[\x00-\x7E]\x22?)|(?:\x22?[^\x5C\x22]\x22?)){255,})(?!(?:(?:\x22?\x5C[\x00-\x7E]\x22?)|(?:\x22?[^\x5C\x22]\x22?)){65,}@)(?:(?:[\x21\x23-\x27\x2A\x2B\x2D\x2F-\x39\x3D\x3F\x5E-\x7E]+)|(?:\x22(?:[\x01-\x08\x0B\x0C\x0E-\x1F\x21\x23-\x5B\x5D-\x7F]|(?:\x5C[\x00-\x7F]))*\x22))(?:\.(?:(?:[\x21\x23-\x27\x2A\x2B\x2D\x2F-\x39\x3D\x3F\x5E-\x7E]+)|(?:\x22(?:[\x01-\x08\x0B\x0C\x0E-\x1F\x21\x23-\x5B\x5D-\x7F]|(?:\x5C[\x00-\x7F]))*\x22)))*@(?:(?:(?!.*[^.]{64,})(?:(?:(?:xn--)?[a-z0-9]+(?:-[a-z0-9]+)*\.){1,126}){1,}(?:(?:[a-z][a-z0-9]*)|(?:(?:xn--)[a-z0-9]+))(?:-[a-z0-9]+)*)|(?:\[(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){7})|(?:(?!(?:.*[a-f0-9][:\]]){7,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?)))|(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){5}:)|(?:(?!(?:.*[a-f0-9]:){5,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3}:)?)))?(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))(?:\.(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))){3}))\]))$/iD', $data);
			break;
		}
		return false;
	}
	/* FORM FIELDS VALIDATION : END */
	
	/* FILTER AND PREPARE CHAT MESSAGE : START */
	// Currently only some Lithuanian cursewords are filtered. Add any words necessary.
	public static function filter_chat($message) {
		$cursewords[] = 'blet';
		$cursewords[] = 'blia';
		$cursewords[] = 'bibi';
		$cursewords[] = 'biby';
		$cursewords[] = 'bybi';
		$cursewords[] = 'byby';
		$cursewords[] = 'huj';
		$cursewords[] = 'keks';
		$cursewords[] = 'kekš';
		$cursewords[] = 'kurv';
		$cursewords[] = 'kurw';
		$cursewords[] = 'qrva';
		$cursewords[] = 'qrwa';
		$cursewords[] = 'pisa';
		$cursewords[] = 'pist';
		$cursewords[] = 'pidar';
		$cursewords[] = 'pydar';
		$cursewords[] = 'pider';
		$cursewords[] = 'pyder';
		$cursewords[] = 'pizd';
		$cursewords[] = 'pyzd';
		$cursewords[] = 'šud';
		$cursewords[] = 'šūd';
		$cursewords_count = sizeof($cursewords);
		for($i=0; $i<$cursewords_count; $i++){
			//$message = preg_replace('/'.$cursewords[$i].'/ie',"str_repeat('*',strlen('$0'))",$message);
			$message = preg_replace_callback('/('.$cursewords[$i].')/', function($matches) { return str_repeat('*', strlen($matches[0])); },$message);
		}
		$message = htmlentities(strip_tags($message));
		return $message;
	}
	/* FILTER AND PREPARE CHAT MESSAGE : END */
	
	public static function custom_encode_data($data) {
		$data_length = mb_strlen($data, 'UTF-8');
		$data_arr = [];
		$new_data = '';
		for ($i=0; $i<$data_length; $i++) {
			$data_arr[] = mb_substr($data, $i, 1, 'UTF-8');
		}
		foreach($data_arr as $k=>$v) {
			if ($v=='A') {
				$new_data .= str_replace('A', 'Z', $v);
			} elseif ($v=='B') {
				$new_data .= str_replace('B', 'Y', $v);
			} elseif ($v=='C') {
				$new_data .= str_replace('C', 'X', $v);
			} elseif ($v=='D') {
				$new_data .= str_replace('D', 'W', $v);
			} elseif ($v=='E') {
				$new_data .= str_replace('E', 'V', $v);
			} elseif ($v=='F') {
				$new_data .= str_replace('F', 'U', $v);
			} elseif ($v=='G') {
				$new_data .= str_replace('G', 'T', $v);
			} elseif ($v=='H') {
				$new_data .= str_replace('H', 'S', $v);
			} elseif ($v=='I') {
				$new_data .= str_replace('I', 'R', $v);
			} elseif ($v=='J') {
				$new_data .= str_replace('J', 'Q', $v);
			} elseif ($v=='K') {
				$new_data .= str_replace('K', 'P', $v);
			} elseif ($v=='L') {
				$new_data .= str_replace('L', 'O', $v);
			} elseif ($v=='M') {
				$new_data .= str_replace('M', 'N', $v);
			} elseif ($v=='N') {
				$new_data .= str_replace('N', 'M', $v);
			} elseif ($v=='O') {
				$new_data .= str_replace('O', 'L', $v);
			} elseif ($v=='P') {
				$new_data .= str_replace('P', 'K', $v);
			} elseif ($v=='Q') {
				$new_data .= str_replace('Q', 'J', $v);
			} elseif ($v=='R') {
				$new_data .= str_replace('R', 'I', $v);
			} elseif ($v=='S') {
				$new_data .= str_replace('S', 'H', $v);
			} elseif ($v=='T') {
				$new_data .= str_replace('T', 'G', $v);
			} elseif ($v=='U') {
				$new_data .= str_replace('U', 'F', $v);
			} elseif ($v=='V') {
				$new_data .= str_replace('V', 'E', $v);
			} elseif ($v=='W') {
				$new_data .= str_replace('W', 'D', $v);
			} elseif ($v=='X') {
				$new_data .= str_replace('X', 'C', $v);
			} elseif ($v=='Y') {
				$new_data .= str_replace('Y', 'B', $v);
			} elseif ($v=='Z') {
				$new_data .= str_replace('Z', 'A', $v);
			} elseif ($v=='a') {
				$new_data .= str_replace('a', 'z', $v);
			} elseif ($v=='b') {
				$new_data .= str_replace('b', 'y', $v);
			} elseif ($v=='c') {
				$new_data .= str_replace('c', 'x', $v);
			} elseif ($v=='d') {
				$new_data .= str_replace('d', 'w', $v);
			} elseif ($v=='e') {
				$new_data .= str_replace('e', 'v', $v);
			} elseif ($v=='f') {
				$new_data .= str_replace('f', 'u', $v);
			} elseif ($v=='g') {
				$new_data .= str_replace('g', 't', $v);
			} elseif ($v=='h') {
				$new_data .= str_replace('h', 's', $v);
			} elseif ($v=='i') {
				$new_data .= str_replace('i', 'r', $v);
			} elseif ($v=='j') {
				$new_data .= str_replace('j', 'q', $v);
			} elseif ($v=='k') {
				$new_data .= str_replace('k', 'p', $v);
			} elseif ($v=='l') {
				$new_data .= str_replace('l', 'o', $v);
			} elseif ($v=='m') {
				$new_data .= str_replace('m', 'n', $v);
			} elseif ($v=='n') {
				$new_data .= str_replace('n', 'm', $v);
			} elseif ($v=='o') {
				$new_data .= str_replace('o', 'l', $v);
			} elseif ($v=='p') {
				$new_data .= str_replace('p', 'k', $v);
			} elseif ($v=='q') {
				$new_data .= str_replace('q', 'j', $v);
			} elseif ($v=='r') {
				$new_data .= str_replace('r', 'i', $v);
			} elseif ($v=='s') {
				$new_data .= str_replace('s', 'h', $v);
			} elseif ($v=='t') {
				$new_data .= str_replace('t', 'g', $v);
			} elseif ($v=='u') {
				$new_data .= str_replace('u', 'f', $v);
			} elseif ($v=='v') {
				$new_data .= str_replace('v', 'e', $v);
			} elseif ($v=='w') {
				$new_data .= str_replace('w', 'd', $v);
			} elseif ($v=='x') {
				$new_data .= str_replace('x', 'c', $v);
			} elseif ($v=='y') {
				$new_data .= str_replace('y', 'b', $v);
			} elseif ($v=='z') {
				$new_data .= str_replace('z', 'a', $v);
			} else {
				$new_data .= $v;
			}
			$new_data .= strtoupper(chr(64+rand(0,26)));
		}
		return base64_encode($new_data);
	}
	
	public static function custom_decode_data($data) {
		$data = base64_decode($data);
		$data_length = mb_strlen($data, 'UTF-8');
		$data_arr = [];
		$new_data = '';
		for ($i=0; $i<$data_length; $i++) {
			$data_arr[] = mb_substr($data, $i, 1, 'UTF-8');
		}
		$i=0;
		foreach($data_arr as $k=>$v) {
			$i++;
			if($i%2!=0) {
				if ($v=='A') {
					$new_data .= str_replace('A', 'Z', $v);
				} elseif ($v=='B') {
					$new_data .= str_replace('B', 'Y', $v);
				} elseif ($v=='C') {
					$new_data .= str_replace('C', 'X', $v);
				} elseif ($v=='D') {
					$new_data .= str_replace('D', 'W', $v);
				} elseif ($v=='E') {
					$new_data .= str_replace('E', 'V', $v);
				} elseif ($v=='F') {
					$new_data .= str_replace('F', 'U', $v);
				} elseif ($v=='G') {
					$new_data .= str_replace('G', 'T', $v);
				} elseif ($v=='H') {
					$new_data .= str_replace('H', 'S', $v);
				} elseif ($v=='I') {
					$new_data .= str_replace('I', 'R', $v);
				} elseif ($v=='J') {
					$new_data .= str_replace('J', 'Q', $v);
				} elseif ($v=='K') {
					$new_data .= str_replace('K', 'P', $v);
				} elseif ($v=='L') {
					$new_data .= str_replace('L', 'O', $v);
				} elseif ($v=='M') {
					$new_data .= str_replace('M', 'N', $v);
				} elseif ($v=='N') {
					$new_data .= str_replace('N', 'M', $v);
				} elseif ($v=='O') {
					$new_data .= str_replace('O', 'L', $v);
				} elseif ($v=='P') {
					$new_data .= str_replace('P', 'K', $v);
				} elseif ($v=='Q') {
					$new_data .= str_replace('Q', 'J', $v);
				} elseif ($v=='R') {
					$new_data .= str_replace('R', 'I', $v);
				} elseif ($v=='S') {
					$new_data .= str_replace('S', 'H', $v);
				} elseif ($v=='T') {
					$new_data .= str_replace('T', 'G', $v);
				} elseif ($v=='U') {
					$new_data .= str_replace('U', 'F', $v);
				} elseif ($v=='V') {
					$new_data .= str_replace('V', 'E', $v);
				} elseif ($v=='W') {
					$new_data .= str_replace('W', 'D', $v);
				} elseif ($v=='X') {
					$new_data .= str_replace('X', 'C', $v);
				} elseif ($v=='Y') {
					$new_data .= str_replace('Y', 'B', $v);
				} elseif ($v=='Z') {
					$new_data .= str_replace('Z', 'A', $v);
				} elseif ($v=='a') {
					$new_data .= str_replace('a', 'z', $v);
				} elseif ($v=='b') {
					$new_data .= str_replace('b', 'y', $v);
				} elseif ($v=='c') {
					$new_data .= str_replace('c', 'x', $v);
				} elseif ($v=='d') {
					$new_data .= str_replace('d', 'w', $v);
				} elseif ($v=='e') {
					$new_data .= str_replace('e', 'v', $v);
				} elseif ($v=='f') {
					$new_data .= str_replace('f', 'u', $v);
				} elseif ($v=='g') {
					$new_data .= str_replace('g', 't', $v);
				} elseif ($v=='h') {
					$new_data .= str_replace('h', 's', $v);
				} elseif ($v=='i') {
					$new_data .= str_replace('i', 'r', $v);
				} elseif ($v=='j') {
					$new_data .= str_replace('j', 'q', $v);
				} elseif ($v=='k') {
					$new_data .= str_replace('k', 'p', $v);
				} elseif ($v=='l') {
					$new_data .= str_replace('l', 'o', $v);
				} elseif ($v=='m') {
					$new_data .= str_replace('m', 'n', $v);
				} elseif ($v=='n') {
					$new_data .= str_replace('n', 'm', $v);
				} elseif ($v=='o') {
					$new_data .= str_replace('o', 'l', $v);
				} elseif ($v=='p') {
					$new_data .= str_replace('p', 'k', $v);
				} elseif ($v=='q') {
					$new_data .= str_replace('q', 'j', $v);
				} elseif ($v=='r') {
					$new_data .= str_replace('r', 'i', $v);
				} elseif ($v=='s') {
					$new_data .= str_replace('s', 'h', $v);
				} elseif ($v=='t') {
					$new_data .= str_replace('t', 'g', $v);
				} elseif ($v=='u') {
					$new_data .= str_replace('u', 'f', $v);
				} elseif ($v=='v') {
					$new_data .= str_replace('v', 'e', $v);
				} elseif ($v=='w') {
					$new_data .= str_replace('w', 'd', $v);
				} elseif ($v=='x') {
					$new_data .= str_replace('x', 'c', $v);
				} elseif ($v=='y') {
					$new_data .= str_replace('y', 'b', $v);
				} elseif ($v=='z') {
					$new_data .= str_replace('z', 'a', $v);
				} else {
					$new_data .= $v;
				}
			}
		}
		return $new_data;
	}
	
	public static function format_message($message) {
		if (isset($message) && strlen($message)>0) {
			if (substr($message, 0, 6) == 'ERROR:') {
				$message = '<span class="error">'.substr($message, 6).'</span>';
			} else {
				$message = '<span class="success">'.$message.'</span>';
			}
			return $message;
		} else {
			return false;
		}
	}
	
}

?>