Ebitenのメモ
Go言語でゲームのプログラムが作れるebitenで画面表示の部分を作ったのでメモ
// copy
var (
subImg *ebiten.Image
op *ebiten.DrawImageOptions
)
func GrapCopyGet(fromScreen *ebiten.Image, x, y int, mx, my int) {
subImg = fromScreen.SubImage(image.Rect(x, y, mx, my)).(*ebiten.Image)
op = &ebiten.DrawImageOptions{}
}
func GrapCopyScale(dx, dy float64, angle float64) {
w, h := subImg.Size()
var wx, wy float64 = float64(w) * dx, float64(h) * dy
op.GeoM.Scale(dx, dy)
op.GeoM.Translate(-wx/2, -wy/2)
op.GeoM.Rotate(angle / 180 * math.Pi)
op.GeoM.Translate(wx/2, wy/2)
}
func GrapCopyAlpha(alpha float64) {
op.ColorM.Scale(1, 1, 1, alpha)
}
func GrapCopyDraw(x,y float64) {
op.GeoM.Translate(x, y)
screenImage.DrawImage(subImg, op)
}
久しぶりでURLルーティングを作り直す
仮組みで、とりあえず動いている
-------
<?php
/*
Web Cheep Framework "Typoon".
Copyright(C)2021 kubohisa.
*/
ini_set('display_errors',1);
error_reporting(E_ALL);
// Setting.
class TyRouter {
public static $SessionName = "hoge";
public static $domain = "localhost";
public static $https = false;
public static $rule = array(
"/form/:hoge/:hogi/:hoe" => "form"
);
}
// Echo files.
$_SERVER = TyRouterInter::sanitizer($_SERVER);
$_url = ltrim($_SERVER["REQUEST_URI"], "\/");
if ($_url == "" && file_exists("index.html")) {
TyRouterInter::echo("index.html");
} elseif (file_exists($_url.".html")) {
TyRouterInter::echo($_url.".html");
} elseif(file_exists($_url."/index.html")) {
TyRouterInter::echo($_url."/index.html");
}
// ドメインチェック
if (!preg_match('#\A'.TyRouter::$domain.'\z#i', $_SERVER['SERVER_NAME'])) {
// 不正アクセス
TyRouterInter::error(500);
}
// md Setting.
mb_language("Japanese");
mb_internal_encoding("UTF-8");
// Session Seting.
ini_set('session.cookie_httponly', 1); // http only.
ini_set('session.use_strict_mode', 1); // server mode only.
ini_set('session.cookie_secure', 0); // if https then.
if (TyRouter::$https) {
if (empty($_SERVER['HTTPS'])) {
TyRouterInter::error(500);;
}
ini_set('session.cookie_secure', 1); // if https then.
}
// セッションIDリセット
session_name(TyRouter::$SessionName);
session_start();
session_regenerate_id(true);
// nullバイト
$_GET = null;
$_POST = TyRouterInter::sanitizer($_POST);
$_COOKIE = TyRouterInter::sanitizer($_COOKIE);
$_urlget = array();
TyData::$post = $_POST;
TyData::$cookie = $_COOKIE;
TyData::$server = $_SERVER;
//
$_url = $_SERVER["REQUEST_URI"];
// ライフチェック
if($_url == "/life"){
echo("life."); exit;
}
// URLルーティング
TyRouterInter::$exec = "";
// echo($_url); exit;
if ($_url == "/") {
TyData::$get = array();
TyRouterInter::execSet("index");
} else {
ksort(TyRouter::$rule);
foreach(TyRouter::$rule as $key => $value) {
$key = preg_replace("#\:(.+?)(\/|$)#", "(?<$1>.*?)$2", $key);
if (preg_match("#\A{$key}\z#", $_url, $arr)) {
foreach($arr as $key_ => $value_){
$arr[$key_] = preg_replace('#\A[\p{C}\p{Z}]++|[\p{C}\p{Z}]++\z#u', '', urldecode($arr[$key_]));
}
TyData::$get = $arr;
//print_r($arr);
TyRouterInter::execSet($value);
break;
}
}
}
TyData::$url = $_url;
//
if (TyRouterInter::$exec == "" || !file_exists(TyRouterInter::$exec)) {
TyRouterInter::error(404);
}
require_once '../lib/smarty/Smarty.class.php';
$smarty = new Smarty();
$smarty->template_dir = TyData::$dir;
$smarty->compile_dir = '../lib/smarty/templates_c/';
$smarty->cache_dir = '../lib/smarty/cache/';
$smarty->escape_html = true;
// php呼び出し
require_once("../lib/Typoon.php");
require_once(TyRouterInter::$exec);
exit;
// Classes.
class TyRouterInter {
public static $exec = "";
public static function delSpace($str) {
return preg_replace('/[\p{C}\p{Z}]/u', '', $str);
}
public static function sanitizer($arr) {
if (is_array($arr)){
return array_map('self::sanitizer', $arr);
} else {
return str_replace("\0", "", $arr);
}
}
public static function error($no) {
header('HTTP', true, $no);
//header("Location: {$no}.html");
exit;
}
public static function echo($file) {
if (!file_exists($file)) {
TyRouterInter::error(404);
}
echo(file_get_contents ($file));
exit;
}
public static function execSet($value) {
TyData::$dir = "../src/action/".$value."/";
TyRouterInter::$exec = TyData::$dir."index.php";
}
}
use TyData as TyD;
class TyData {
public static $get = array();
public static $post = array();
public static $cookie = array();
public static $server = array();
public static $url = "";
public static $dir = "";
}
PHPで変なテキトーなパスワードハッシュの作り方のパッチ var.20200715
少し機能を追加したのでパッチをブログで残しておく
ShiftとShiftをXorして、それをXorするのは、クロス・クロスオア・シフトって言うジョークで作った
static function NotXorLeft($x) {
if ($x > 16) {
$x = 16;
}
$x = self::$seed << $x;
self::Not();
self::$seed = self::$seed ^ $x;
}
static function NotXorRight($x) {
if ($x > 16) {
$x = 16;
}
$x = self::$seed >> $x;
self::Not();
self::$seed = self::$seed ^ $x;
}
static function XxorShift($x, $y) {
if ($x > 16) {
$x = 16;
}
if ($y > 16) {
$y = 16;
}
$x = self::$seed >> $x;
$y = self::$seed << $y;
$x = $x ^ $y;
self::$seed = self::$seed ^ $x;
}
static function NotXxorShift($x, $y) {
if ($x > 16) {
$x = 16;
}
if ($y > 16) {
$y = 16;
}
$x = self::$seed >> $x;
$y = self::$seed << $y;
$x = $x ^ $y;
self::Not();
self::$seed = self::$seed ^ $x;
}
PHPで変なテキトーなパスワードハッシュの作り方 var.20200713
パスワードハッシュプログラムの改良版を作った。
i*でunpuckして、暗号化後、i*のpackで戻して。それを暗号化すると元へ戻るのは面白い
ライセンスは、てきとーなMITライセンスで良いので
- 以下、ソースリスト ------
<?php
class Password {
static $seed;
static $OriginSeed;
static $HashHash;
static function SetSeed($seed) {
self::$seed = $seed;
self::$OriginSeed = $seed;
self::$HashHash = "efgsdsegew";
}
static function ResetSeed() {
self::$seed = self::$OriginSeed;
}
static function Lcg($x, $y) {
self::$seed = floor(self::$seed / 10000);
$x = $x | 1; // 奇数で掛ける
if ($x >= 10000) {
$x = 9999;
}
if ($y >= 10000) {
$y = 9999;
}
self::$seed = self::$seed * $x + $y;
}
static function Not() {
self::$seed = ~self::$seed;
}
static function Xor($x) {
self::$seed = self::$seed ^ $x;
}
static function XorLeft($x) {
if ($x > 16) {
$x = 16;
}
$x = self::$seed << $x;
self::$seed = self::$seed ^ $x;
}
static function XorRight($x) {
if ($x > 16) {
$x = 16;
}
$x = self::$seed >> $x;
self::$seed = self::$seed ^ $x;
}
static function RndSeed() {
// 適当なランダム処理
self::Lcg(3202, 1233); // 乗算+加算から始めるのがセオリーらしい
self::Not();
self::Xor(904845396);
self::Not();
self::Xor(12345678901234567);
self::XorRight(15);
// エラーチェック
if (is_float(self::$seed)) {
echo("Error: Float."); exit;
//self::$seed = self::$OriginSeed;
}
if (self::$seed == 0) {
self::$seed = self::$OriginSeed;
}
return self::$seed;
}
static function MakeHash ($password, $seed) {
self::SetSeed($seed);
$data = unpack("i*", $password);
$password = "";
foreach ($data as $value) {
$value ^= self::RndSeed();
$password .= pack("i*", $value);
}
return hash_hmac('ripemd160', $password, self::$HashHash);
}
// 参考URL
// https://qiita.com/k_nitadori/items/42970f850d5e2cffdff7
}
echo(Password::MakeHash("password", 1234567890));
PHPで変なテキトーなパスワードハッシュの作り方
ツイッターの方で、テキトーでパスワードハッシュを作ったら、悪いハッカーが嫌がるのではないのか?を考察していたけど
それを暇つぶしで実装して、大体で動いている物が出来た。いくつかパスワードを作成して、ハッシュが出来ているのは確かめたけど。実際で使えるかどうかは知らない
試験的な実装なので
- 以下、ソースリスト ------
<?php
class Password {
static $seed;
static function RndSeed() {
// 適当なランダム処理
self::$seed = ~self::$seed;
self::$seed = self::$seed ^ 904845396; //XOR
self::$seed = self::$seed ^ 12345678901234567; //XOR
self::$seed = ~self::$seed; //NOT
self::$seed = self::$seed * 6 + 1233;
// 丸める
self::$seed = self::$seed % 10000000000000000000;
return self::$seed;
}
static function MakeHash ($password, $seed) {
self::$seed = $seed;
$data = unpack("i*", $password);
$password = "";
foreach ($data as $value) {
$seed = self::RndSeed();
$value = $value ^ $seed;
$password .= pack("C*", $value);
}
return hash_hmac('ripemd160', $password, 'secret');
}
}
echo(Password::MakeHash("password", 1234567890));
Very Light Weight Frame work "Typon" Ver20200629
とりあえず、今の状況。本体のみ
-------
<?php
/**
* Very light framework is the "Typon".
* Ver.20200629.
* @author kubohisa at pdbrec.com.
*/
// Requires.
require_once('../lib/typon/stdio.phl');
require_once('../lib/typon/setting.phl');
require_once('../lib/smarty/Smarty.class.php'); // Smarty3.
/**
* Start Typoon IPL.
*/
// null.
function sanitizer($arr) {
if (is_array($arr) ){
return array_map('sanitizer', $arr);
}
return str_replace("\0", "", $arr);
}
$_POST = sanitizer($_POST);
$_COOKIE = sanitizer($_COOKIE);
$_SERVER = sanitizer($_SERVER);
$_GET = array(); // Delete gets.
// Domain check.
if ($_SERVER['SERVER_NAME'] != Ty\TyponReg::$DomeinName) {
Ty\STDIO::ErrorCode(500);
exit;
}
// Https check.
// テスト環境ではhttpなので外してます
/* if (empty($_SERVER['HTTPS'])) {
Ty\STDIO::ErrorCode(500);
exit;
}
*/
// Longer Url Check.
if (strlen($_SERVER["REQUEST_URI"]) > 1000) {
Ty\STDIO::ErrorCode(500);
exit;
}
// md Setting.
mb_language("Japanese");
mb_internal_encoding("UTF-8");
// セッションIDリセット
session_name(Ty\TyponReg::$SessionName);
session_start();
session_regenerate_id(true);
// Get Get.
$UrlGet = preg_split("/\//", $_SERVER["REQUEST_URI"]);
array_shift($UrlGet);
// Trim Get.
foreach ($UrlGet as $key => $value){
$UrlGet[$key] = Ty\Strings::Trim($value);
}
// ヘルスチェック(仮)
if ($UrlGet['0'] == "health") {
echo("Clean.");
exit;
}
// adtionがあるか?
if ($UrlGet['0'] == "" || $UrlGet['0'] == "index") {
$UrlGet['0'] = "index";
}
$ExecName = array_shift($UrlGet);
if (! preg_match('/\A[a-zA-Z0-9\-\_]++\z/i', $ExecName)) {
Ty\STDIO::ErrorCode(505);
exit;
}
$Statename = "";
if (! empty($_POST['state'])) {
$_POST['state'] = Ty\Strings::Trim($_POST['state']);
if (! preg_match('/\A[a-zA-Z0-9\-\_]++\z/i', $_POST['state'])) {
Ty\STDIO::ErrorCode(505);
exit;
}
$Statename = $_POST['state'];
} else {
$Statename = "index";
}
$PresentName = "../scripts/".$ExecName."/".$Statename.".action";
if (! file_exists($PresentName)) {
Ty\STDIO::ErrorCode(505);
exit;
}
// responseがあるか?
$ResponceName = "../scripts/".$ExecName."/".$Statename.".responce";
if (! file_exists($ResponceName)) {
$ResponceName = "";
}
// Seting Smarty.
$smarty = new Smarty();
$smarty->loadFilter('variable', 'htmlspecialchars');
$smarty->template_dir = '../html';
$smarty->compile_dir = '../lib/templates_c';
// 実行
require_once($PresentName);
if ($ResponceName != "") {
require_once($ResponceName);
}
exit;
Very Light Frame work is "Typoon" Ver.20200223.
とりあえず、ライブラリの実装を進めてますが、バリデーターが沼だ…
で、簡易MVPパターンで組んでたけど、ADRパターンを知ったので、POSTでActionのモードを投げてソースリストを分岐で読み込む部分を追加して、Actionのソースを分割できる風に実装した
その部分のみをブログで公開しますよ。進捗は進んでます
[Typoon.php]
<?php
/**
* Very light framework is the "Typoon".
* Ver.20200223.
* @author kubohisa at pdbrec.com.
*/
/**
* Typoon Seting.
*/
class TypoonReg
{
static $SessionName = "Hie4Ewxz";
static $DomeinName = "localhost";
static $HashDummyA = "esfdf4gesg";
static $HashDummyB = "erg6gefbdr";
}
// Requires.
require_once('../lib/typoon/stdio.phl'); // Smarty3.
require_once('../lib/smarty/Smarty.class.php'); // Smarty3.
/**
* Start Typoon IPL.
*/
// null.
function sanitizer($arr) {
if (is_array($arr) ){
return array_map('sanitizer', $arr);
}
return str_replace("\0", "", $arr);
}
$_POST = sanitizer($_POST);
$_COOKIE = sanitizer($_COOKIE);
$_SERVER = sanitizer($_SERVER);
$_GET = array(); // Delete gets.
// Domain check.
if ($_SERVER['SERVER_NAME'] != TypoonReg::$DomeinName) {
TypoonSTDIO::ErrorCode(500);
exit;
}
// Https check.
// テスト環境ではhttpなので外してます
/* if (empty($_SERVER['HTTPS'])) {
TypoonSTDIO::ErrorCode(500);
exit;
}
*/
// md Setting.
mb_language("Japanese");
mb_internal_encoding("UTF-8");
// セッションIDリセット
session_name(TypoonReg::$SessionName);
session_start();
session_regenerate_id(true);
// Get Get.
$UrlGet = preg_split("/\//", $_SERVER["REQUEST_URI"]);
array_shift($UrlGet);
// Trim get.
foreach ($UrlGet as $key => $value){
$UrlGet[$key] = TypoonStrings::Trim($value);
}
// プレゼンテーターがあるか?
if ($UrlGet['0'] == "") {
$UrlGet['0'] = "index";
}
if (! empty($_POST['mode'])) {
$UrlGet['0'] = $UrlGet['0']."@".$_POST['mode'];
}
if (! preg_match('/\A[a-zA-Z0-9\-\_\@]++\z/i', $UrlGet['0'])) {
TypoonSTDIO::ErrorCode(404);
exit;
}
if (! file_exists("presenter/".$UrlGet['0'].".present")) {
TypoonSTDIO::ErrorCode(404);
exit;
}
$PresentName = array_shift($UrlGet);
// Seting Smarty.
$smarty = new Smarty();
$smarty->loadFilter('variable', 'htmlspecialchars');
// 実行
require_once("presenter/".$PresentName.".present");
exit;
?>
phpマイクロ過ぎるフレームワーク”Typoon” Ver.20200216.
お久しぶりです、くぼひさです
暇なので、作り始めました。仮組みのプログラムぼろぼろで凄いよね…
とりあえず、ルーティングの部分のみを作りました。以下がソースですよ。後はバリデーションなどのメゾットを追加します
良い暇つぶしになりそうだ
[typoon.php]
<?php
/**
* Very light framework is the "Typoon".
* Ver.20200216.
* @author kubohisa at pdbrec.com.
*/
/**
* Typoon Seting.
*/
class TypoonReg
{
static $SessionName = "Hie4Ewxz";
static $DomeinName = "localhost";
}
/**
* Start Typoon IPL.
*/
// null.
function sanitizer($arr) {
if (is_array($arr) ){
return array_map('sanitizer', $arr);
}
return str_replace("\0", "", $arr);
}
$_POST = sanitizer($_POST);
$_COOKIE = sanitizer($_COOKIE);
$_SERVER = sanitizer($_SERVER);
$_GET = array(); // Delete gets.
// Domain check.
if ($_SERVER['SERVER_NAME'] != TypoonReg::$DomeinName) {
header('HTTP', true, 500);
exit;
}
// Https check.
// テスト環境ではhttpなので外してます
/* if (empty($_SERVER['HTTPS'])) {
header('HTTP', true, 500);
exit;
}
*/
// Requires.
require_once('../lib/smarty/Smarty.class.php'); // Smarty3.
// md Setting.
mb_language("Japanese");
mb_internal_encoding("UTF-8");
// セッションIDリセット
session_name(TypoonReg::$SessionName);
session_start();
session_regenerate_id(true);
// Get Get.
$UrlGet = preg_split("/\//", $_SERVER["REQUEST_URI"]);
array_shift($UrlGet);
// プレゼンテーターがあるか?
if ($UrlGet['0'] == "") {
$UrlGet['0'] = "index";
}
if (! preg_match('/\A[a-zA-Z0-9\-\_]+\z/i', $UrlGet['0'])) {
header('HTTP', true, 404);
exit;
}
if (! file_exists("presenter/".$UrlGet['0'].".present")) {
header('HTTP', true, 404);
exit;
}
$PresentName = array_shift($UrlGet);
// exec.
require_once("presenter/".$PresentName.".present");
exit;
?>
"Typon" Ver.20190609.
Typonのフレーム部分は動いていて、それぞれの関数は確かめてない版だ
動作チェックできてないので、使うなよ。責任は取らんぞ
以上
-------[index.php]-------
<?php
// Typon Seting.
define("typonDomain", "localhost");
define("typonExecNo", 0);
define("typonExecDir", "frames/");
define("typonDataDir", "data/");
define("typonSessionName", "Heni39EDc");
define("typonHashSeed", "edJIe23Om");
define("typonDebug", 0);
// Session Seting.
ini_set('session.cookie_httponly', 1); // http only.
ini_set('session.use_strict_mode', 1); // server mode only.
// ini_set('session.cookie_secure', 1); // if https then.
// ヌルバイトアタック処理
function sanitizer($array) {
if (is_array($array)) {
return array_map('sanitizer', $array);
}
return str_replace("\0", "", $array);
}
$_POST = sanitizer($_POST);
$_COOKIE = sanitizer($_COOKIE);
$_SERVER = sanitizer($_SERVER);
$_GET = array(); // Delete gets.
// Typon Debug Check.
if (typonDebug == 1) {
$error = 0;
if (!preg_match('/\A'.typonDomain.'/i', $_SERVER['SERVER_NAME'])) {
$error = 1;
} elseif (!file_exists(typonDataDir)) {
$error = 1;
} elseif (!file_exists(typonExecDir)) {
$error = 1;
} elseif (!file_exists(typonExecDir."toppage.frame")) {
$error = 1;
}
if ($error == 1) {
echo("[Typon] Error.");
} else {
echo("[Typon] No Error.");
}
exit;
}
// ドメインチェック
if (!preg_match('/\A'.typonDomain.'/i', $_SERVER['SERVER_NAME'])) {
// 不正アクセス
echo("[Typon] Domain name Error."); exit;
}
// md Setting.
mb_language("Japanese");
mb_internal_encoding("UTF-8");
// セッションIDリセット
session_name(typonSessionName);
session_start();
session_regenerate_id(true);
//Get $_GET.
$requestDATA = STD::cmdline();
// プレゼンテーターネームチェック
$exec = $requestDATA['0'];
if ($exec == "") {
// "/"なのでtoppageを実行。indexはindex.phpと競合する
$exec = "toppage";
$requestDATA['0'] = $exec;
} elseif (!preg_match('/\A[a-zA-Z0-9\-\_]+\z/i', $exec)) {
// 不正アクセスなのでログアウト
STD::logout();
exit;
}
// プレゼンテーターがあるか?
if (! file_exists(typonExecDir.$exec.".frame")) {
if ($exec == "toppage") {
// error.
echo("[Typon] Error: No thing [toppage.frame].");
exit;
} else {
// 不正アクセスなのでログアウト
STD::logout();
exit;
}
}
// 実行
require_once(typonExecDir.$exec.".frame");
exit;
class STR {
// 全角トリム
function mbTrim($str) {
$str = self::toUtf8($str);
$str = preg_replace('/[\r\n]/u', '', $str);
return preg_replace('/\A[\p{C}\p{Z}]++|[\p{C}\p{Z}]++\z/u', '', $str);
}
// UTF変換
function toUtf8($str) {
return mb_convert_encoding($str, "UTF-8", "auto");
}
// Nullバイト削除
function nullDelete($str) {
return str_replace("\0", "", $str);
}
// <br>変換
function toBr($str) {
$str = preg_replace('/\n\r/u', '\r\n', $str);
$str = preg_replace('/\r\n/u', '\r', $str);
$str = preg_replace('/\n/u', '\r', $str);
$str = preg_replace('/\r/u', '<br>', $str);
return $str;
}
function toRn($str) {
$str = preg_replace('/<br>/u', '\r\n', $str);
return $str;
}
function len($str) {
return mb_strlen($str);
}
function checkNull($str) {
return empty($str);
}
function htmlConvert($str) {
return htmlspecialchars($str, ENT_QUOTES);
}
function randomText($len) {
$char = array_merge(range('a', 'z'), range('A', 'Z'), range('0', '9'));
$salt = "";
for ($i = 0; $i < $len; $i++) {
$salt .= $char[mt_rand(0, count($char) - 1)];
}
return $salt;
}
function checkUrl($str) {
return preg_match('/\Ahttps?(:\/\/[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)\z/', $str);
}
function checkPassword($str) {
return preg_match('/\A[a-zA-Z0-9]+\z/i', $str);
}
function checkNumber($str) {
return preg_match('/\A[0-9]+\z/i', $str);
}
function checkMail($str) {
// https://gist.github.com/felds/864067
$regexp = '/^(?:[a-z0-9!#$%\'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&\'*+\/=?^_`{|}'.
'~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\['.
'\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-'.
'9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-'.
'9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?'.
'|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-' .
'\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])$/';
return preg_match($regexp, $str);
}
}
class FORM {
function session() {
$_SESSION['session'] = STR::randomText(60);
return $_SESSION['session'];
}
function sessionCheck($str) {
$check = $_SESSION['session'];
$_SESSION['session'] = null;
if ($check == $str) {
return true;
} else {
return false;
}
}
}
class STD {
// GET取得
function cmdline() {
$str = trim($_SERVER['REQUEST_URI'], "\/");
$data = explode("/", $str);
if (typonExecNo > 0) {
for ($i = 0; $i < typonExecNo; $i++) {
unset($data[$i]);
}
$data = array_values($data);
}
return $data;
}
// ドメインチェック
function refererCheck() {
if (!preg_match('/\Ahttps?(\:\/\/)'.typonDomain.'[\:\/]/i', $_SERVER['HTTP_REFERER'])) {
// 不正アクセスなのでログアウト
self::reset();
exit;
}
}
// Loginセーブ
function loginSave($userId) {
$_SESSION['id'] = $userId;
STD::uidMake($userId);
}
// Loginチェック
function loginCheck() {
if (empty($_SESSION['id'])) {
self::logout();
exit;
} else {
self::refererCheck();
}
}
// ログアウト
function logout() {
$_SESSION = array();
// クッキーを削除
setcookie(typonSessionName, '', time()-1000);
setcookie(typonSessionName, '', time()-1000, '/');
session_destroy();
header("Location: /");
}
// uID.
function uidMake() {
$user_id = $_SESSION['id'].STR::randomText(60);
$user_id = hash_hmac("ripemd160", $user_id, typonHashSeed);
$_SESSION['uid'] = $user_id;
return $_SESSION['uid'];
}
function uidCheck($str) {
$uid = $_SESSION['uid'];
// self::uidMake($_SESSION['id']);
if ($_SESSION['uid'] == $str) {
return true;
}
return false;
}
function uidGet() {
return $_SESSION['uid'];
}
// time.
function timeSectime($y, $mon, $d, $a, $m) {
return mktime($a, $m, 0, $mon, $d, $y);
}
function timeDateRss($sectime) {
return date(DATE_RFC822, $sectime);
}
function timeDate($sectime) {
return getdate($sectime);
}
}
class DB {
var $db;
// mysql
function make() {
if (empty($this->db)) {
$this->db = mysqli_connect('localhost', 'my_user', 'my_password', 'my_db');
}
return $this->db;
}
function get() {
return self::make();
}
function error() {
$str = "";
if($this->db->connect_errno) {
$str = $this->db->connect_errno . ' : ' . $this->db->connect_error;
}
return $str;
}
function close() {
mysqli_close($this->db);
}
// JSON.
function jsonWrite($data, $array) {
$file = typonDataDir."{$data}.data";
if (! file_exists($file)) {
return false;
}
if (file_put_contents($file, serialize($array)) == false) {
return false;
}
return true;
}
function jsonRead($data) {
$json = array();
$file = typonDataDir."{$data}.data";
if (! file_exists($file)) {
return $json;
}
$json = unserialize(file_get_contents($file));
return $json;
}
}
class MAIL {
function send($toAdrs, $fromAdrs, $subject, $body) {
if (!STR::checkMail($toAdrs)) {
return false;
} elseif (!STR::checkMail($fromAdrs)) {
return false;
}
$header = "From: $fromAdrs\nReply-To: $fromAdrs\n";
return mb_send_mail($toAdrs, $subject, $body, $header);
}
}
class SONOTA {
// Make Crypt's Salt.
function makeSalt() {
$char = array_merge(range('a', 'z'), range('A', 'Z'), array('.', '/'));
$salt = "$2y$07$";
for ($i = 0; $i < 22; $i++) {
$salt .= $char[mt_rand(0, count($char) - 1)];
}
$salt .= "$";
return $salt;
}
}
?>