189 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
		
		
			
		
	
	
			189 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 * Copyright (C)2005-2019 Haxe Foundation
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * Permission is hereby granted, free of charge, to any person obtaining a
							 | 
						||
| 
								 | 
							
								 * copy of this software and associated documentation files (the "Software"),
							 | 
						||
| 
								 | 
							
								 * to deal in the Software without restriction, including without limitation
							 | 
						||
| 
								 | 
							
								 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
							 | 
						||
| 
								 | 
							
								 * and/or sell copies of the Software, and to permit persons to whom the
							 | 
						||
| 
								 | 
							
								 * Software is furnished to do so, subject to the following conditions:
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * The above copyright notice and this permission notice shall be included in
							 | 
						||
| 
								 | 
							
								 * all copies or substantial portions of the Software.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
							 | 
						||
| 
								 | 
							
								 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
							 | 
						||
| 
								 | 
							
								 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
							 | 
						||
| 
								 | 
							
								 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
							 | 
						||
| 
								 | 
							
								 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
							 | 
						||
| 
								 | 
							
								 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
							 | 
						||
| 
								 | 
							
								 * DEALINGS IN THE SOFTWARE.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								package php;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import php.Boot;
							 | 
						||
| 
								 | 
							
								import php.Global.*;
							 | 
						||
| 
								 | 
							
								import php.SuperGlobal.*;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
									Session consists of a way to preserve certain data across
							 | 
						||
| 
								 | 
							
									subsequent accesses.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								class Session {
							 | 
						||
| 
								 | 
							
									public static function getCacheLimiter() {
							 | 
						||
| 
								 | 
							
										switch (session_cache_limiter()) {
							 | 
						||
| 
								 | 
							
											case "public":
							 | 
						||
| 
								 | 
							
												return Public;
							 | 
						||
| 
								 | 
							
											case "private":
							 | 
						||
| 
								 | 
							
												return Private;
							 | 
						||
| 
								 | 
							
											case "nocache":
							 | 
						||
| 
								 | 
							
												return NoCache;
							 | 
						||
| 
								 | 
							
											case "private_no_expire":
							 | 
						||
| 
								 | 
							
												return PrivateNoExpire;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										return null;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public static function setCacheLimiter(l:CacheLimiter) {
							 | 
						||
| 
								 | 
							
										if (started)
							 | 
						||
| 
								 | 
							
											throw "You can't set the cache limiter while the session is already in use";
							 | 
						||
| 
								 | 
							
										switch (l) {
							 | 
						||
| 
								 | 
							
											case Public:
							 | 
						||
| 
								 | 
							
												session_cache_limiter("public");
							 | 
						||
| 
								 | 
							
											case Private:
							 | 
						||
| 
								 | 
							
												session_cache_limiter("private");
							 | 
						||
| 
								 | 
							
											case NoCache:
							 | 
						||
| 
								 | 
							
												session_cache_limiter("nocache");
							 | 
						||
| 
								 | 
							
											case PrivateNoExpire:
							 | 
						||
| 
								 | 
							
												session_cache_limiter("private_no_expire");
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public static function getCacheExpire():Int {
							 | 
						||
| 
								 | 
							
										return session_cache_expire();
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public static function setCacheExpire(minutes:Int) {
							 | 
						||
| 
								 | 
							
										if (started)
							 | 
						||
| 
								 | 
							
											throw "You can't set the cache expire time while the session is already in use";
							 | 
						||
| 
								 | 
							
										session_cache_expire(minutes);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public static function setName(name:String) {
							 | 
						||
| 
								 | 
							
										if (started)
							 | 
						||
| 
								 | 
							
											throw "You can't set the name while the session is already in use";
							 | 
						||
| 
								 | 
							
										session_name(name);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public static function getName():String {
							 | 
						||
| 
								 | 
							
										return session_name();
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public static function getId():String {
							 | 
						||
| 
								 | 
							
										return session_id();
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public static function setId(id:String) {
							 | 
						||
| 
								 | 
							
										if (started)
							 | 
						||
| 
								 | 
							
											throw "You can't set the session id while the session is already in use";
							 | 
						||
| 
								 | 
							
										session_id(id);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public static function getSavePath():String {
							 | 
						||
| 
								 | 
							
										return session_save_path();
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public static function setSavePath(path:String) {
							 | 
						||
| 
								 | 
							
										if (started)
							 | 
						||
| 
								 | 
							
											throw "You can't set the save path while the session is already in use";
							 | 
						||
| 
								 | 
							
										session_save_path(path);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public static function getModule():String {
							 | 
						||
| 
								 | 
							
										return session_module_name();
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public static function setModule(module:String) {
							 | 
						||
| 
								 | 
							
										if (started)
							 | 
						||
| 
								 | 
							
											throw "You can't set the module while the session is already in use";
							 | 
						||
| 
								 | 
							
										session_module_name(module);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public static function regenerateId(?deleteold:Bool):Bool {
							 | 
						||
| 
								 | 
							
										return session_regenerate_id(deleteold);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public static function get(name:String):Dynamic {
							 | 
						||
| 
								 | 
							
										start();
							 | 
						||
| 
								 | 
							
										if (!isset(_SESSION[name]))
							 | 
						||
| 
								 | 
							
											return null;
							 | 
						||
| 
								 | 
							
										return _SESSION[name];
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public static function set(name:String, value:Dynamic) {
							 | 
						||
| 
								 | 
							
										start();
							 | 
						||
| 
								 | 
							
										return _SESSION[name] = value;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public static function setCookieParams(?lifetime:Int, ?path:String, ?domain:String, ?secure:Bool, ?httponly:Bool) {
							 | 
						||
| 
								 | 
							
										if (started)
							 | 
						||
| 
								 | 
							
											throw "You can't set the cookie params while the session is already in use";
							 | 
						||
| 
								 | 
							
										session_set_cookie_params(lifetime, path, domain, secure, httponly);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public static function getCookieParams():{
							 | 
						||
| 
								 | 
							
										lifetime:Int,
							 | 
						||
| 
								 | 
							
										path:String,
							 | 
						||
| 
								 | 
							
										domain:String,
							 | 
						||
| 
								 | 
							
										secure:Bool,
							 | 
						||
| 
								 | 
							
										httponly:Bool
							 | 
						||
| 
								 | 
							
									} {
							 | 
						||
| 
								 | 
							
										return Boot.createAnon(session_get_cookie_params());
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// TODO: completely untested
							 | 
						||
| 
								 | 
							
									public static function setSaveHandler(open:String->String->Bool, close:Void->Bool, read:String->String, write:String->String->Bool, destroy, gc):Bool {
							 | 
						||
| 
								 | 
							
										return session_set_save_handler(open, close, read, write, destroy, gc);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public static function exists(name:String) {
							 | 
						||
| 
								 | 
							
										start();
							 | 
						||
| 
								 | 
							
										return array_key_exists(name, _SESSION);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public static function remove(name:String) {
							 | 
						||
| 
								 | 
							
										start();
							 | 
						||
| 
								 | 
							
										unset(_SESSION[name]);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public static var started(default, null):Bool;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public static function start() {
							 | 
						||
| 
								 | 
							
										if (started)
							 | 
						||
| 
								 | 
							
											return;
							 | 
						||
| 
								 | 
							
										started = true;
							 | 
						||
| 
								 | 
							
										session_start();
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public static function clear() {
							 | 
						||
| 
								 | 
							
										session_unset();
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public static function close() {
							 | 
						||
| 
								 | 
							
										session_write_close();
							 | 
						||
| 
								 | 
							
										started = false; // TODO: not sure this useful; test if a closed session can be re-opened (I doubt)
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									static function __init__() {
							 | 
						||
| 
								 | 
							
										started = isset(_SESSION);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								enum CacheLimiter {
							 | 
						||
| 
								 | 
							
									Public;
							 | 
						||
| 
								 | 
							
									Private;
							 | 
						||
| 
								 | 
							
									NoCache;
							 | 
						||
| 
								 | 
							
									PrivateNoExpire;
							 | 
						||
| 
								 | 
							
								}
							 |