mirror of
				https://bitbucket.org/jsuto/piler.git
				synced 2025-10-31 13:32:27 +01:00 
			
		
		
		
	added google authenticator support to the gui
This commit is contained in:
		| @@ -173,7 +173,9 @@ create table if not exists `user_settings` ( | |||||||
|    `username` char(64) not null unique, |    `username` char(64) not null unique, | ||||||
|    `pagelen` int default 20, |    `pagelen` int default 20, | ||||||
|    `theme` char(8) default 'default', |    `theme` char(8) default 'default', | ||||||
|    `lang` char(2) default NULL |    `lang` char(2) default null, | ||||||
|  |    `ga_enabled` int default 0, | ||||||
|  |    `ga_secret` varchar(255) default null | ||||||
| ); | ); | ||||||
|  |  | ||||||
| create index `user_settings_idx` on `user_settings`(`username`); | create index `user_settings_idx` on `user_settings`(`username`); | ||||||
|   | |||||||
							
								
								
									
										4
									
								
								util/db-upgrade-0.1.24-vs-0.1.25.sql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								util/db-upgrade-0.1.24-vs-0.1.25.sql
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,4 @@ | |||||||
|  |  | ||||||
|  | alter table `user_settings` add column `ga_enabled` int default 0; | ||||||
|  | alter table `user_settings` add column `ga_secret` varchar(255) default null; | ||||||
|  |  | ||||||
| @@ -379,6 +379,7 @@ webui_install() { | |||||||
|    cp -R webui/.htaccess $DOCROOT |    cp -R webui/.htaccess $DOCROOT | ||||||
|    chmod 770 $DOCROOT/tmp $DOCROOT/images |    chmod 770 $DOCROOT/tmp $DOCROOT/images | ||||||
|    chgrp $WWWGROUP $DOCROOT/tmp |    chgrp $WWWGROUP $DOCROOT/tmp | ||||||
|  |    chgrp $WWWGROUP $DOCROOT/system/helper/phpqrcode/cache | ||||||
|  |  | ||||||
|    echo "<?php" > $DOCROOT/config-site.php |    echo "<?php" > $DOCROOT/config-site.php | ||||||
|    echo >> $DOCROOT/config-site.php |    echo >> $DOCROOT/config-site.php | ||||||
|   | |||||||
| @@ -9,6 +9,7 @@ class ControllerCommonMenu extends Controller { | |||||||
|       $this->template = "common/menu.tpl"; |       $this->template = "common/menu.tpl"; | ||||||
|  |  | ||||||
|       $db = Registry::get('db'); |       $db = Registry::get('db'); | ||||||
|  |       $session = Registry::get('session'); | ||||||
|  |  | ||||||
|       $this->load->model('saas/customer'); |       $this->load->model('saas/customer'); | ||||||
|  |  | ||||||
| @@ -18,6 +19,8 @@ class ControllerCommonMenu extends Controller { | |||||||
|  |  | ||||||
|       $this->data['settings'] = $this->model_saas_customer->get_customer_settings_by_email(); |       $this->data['settings'] = $this->model_saas_customer->get_customer_settings_by_email(); | ||||||
|  |  | ||||||
|  |       $this->data['realname'] = $session->get('realname'); | ||||||
|  |  | ||||||
|       $this->render(); |       $this->render(); | ||||||
|    } |    } | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										93
									
								
								webui/controller/login/ga.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										93
									
								
								webui/controller/login/ga.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,93 @@ | |||||||
|  | <?php | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class ControllerLoginGA extends Controller { | ||||||
|  |    private $error = array(); | ||||||
|  |  | ||||||
|  |    public function index(){ | ||||||
|  |  | ||||||
|  |       $this->id = "content"; | ||||||
|  |       $this->template = "login/ga.tpl"; | ||||||
|  |       $this->layout = "common/layout-empty"; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |       $request = Registry::get('request'); | ||||||
|  |       $session = Registry::get('session'); | ||||||
|  |  | ||||||
|  |       $db = Registry::get('db'); | ||||||
|  |  | ||||||
|  |       $this->load->model('user/auth'); | ||||||
|  |       $this->load->model('user/user'); | ||||||
|  |       $this->load->model('user/prefs'); | ||||||
|  |  | ||||||
|  |       if(ENABLE_SAAS == 1) { | ||||||
|  |          $this->load->model('saas/ldap'); | ||||||
|  |          $this->load->model('saas/customer'); | ||||||
|  |       } | ||||||
|  |  | ||||||
|  |       require(DIR_BASE . 'system/helper/PHPGangsta_GoogleAuthenticator.php'); | ||||||
|  |  | ||||||
|  |       $this->data['title'] = $this->data['text_login']; | ||||||
|  |       $this->data['title_prefix'] = TITLE_PREFIX; | ||||||
|  |  | ||||||
|  |       $this->data['failed_login_count'] = $this->model_user_auth->get_failed_login_count(); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |       if($this->request->server['REQUEST_METHOD'] == 'POST' && $this->validate() == true) { | ||||||
|  |  | ||||||
|  |          $GA = new PHPGangsta_GoogleAuthenticator(); | ||||||
|  |  | ||||||
|  |          $settings = $this->model_user_prefs->get_ga_settings($session->get('username')); | ||||||
|  |  | ||||||
|  |          if(strlen($this->request->post['ga_code']) > 5 && $GA->verifyCode($settings['ga_secret'], $this->request->post['ga_code'], 2)) { | ||||||
|  |  | ||||||
|  |             $session->set("ga_block", ""); | ||||||
|  |  | ||||||
|  |             $this->model_user_prefs->get_user_preferences($session->get('username')); | ||||||
|  |  | ||||||
|  |             if(ENABLE_SAAS == 1) { | ||||||
|  |                $this->model_saas_customer->online($session->get('email')); | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             LOGGER('logged in'); | ||||||
|  |  | ||||||
|  |             if(isAdminUser() == 1) { | ||||||
|  |                header("Location: " . SITE_URL . "index.php?route=health/health"); | ||||||
|  |                exit; | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             header("Location: " . SITE_URL . "search.php"); | ||||||
|  |             exit; | ||||||
|  |          } | ||||||
|  |          else { | ||||||
|  |             $this->model_user_auth->increment_failed_login_count($this->data['failed_login_count']); | ||||||
|  |             $this->data['failed_login_count']++; | ||||||
|  |          } | ||||||
|  |  | ||||||
|  |          $this->data['x'] = $this->data['text_invalid_pin_code']; | ||||||
|  |  | ||||||
|  |       } | ||||||
|  |  | ||||||
|  |       $this->render(); | ||||||
|  |    } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |    private function validate() { | ||||||
|  |  | ||||||
|  |       if(!isset($this->request->post['ga_code'])){ | ||||||
|  |          $this->error['ga_code'] = $this->data['text_invalid_data']; | ||||||
|  |       } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |       if (!$this->error) { | ||||||
|  |          return true; | ||||||
|  |       } else { | ||||||
|  |          return false; | ||||||
|  |       } | ||||||
|  |  | ||||||
|  |    } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
|  | ?> | ||||||
| @@ -43,6 +43,11 @@ class ControllerLoginLogin extends Controller { | |||||||
|  |  | ||||||
|          if($this->model_user_auth->checkLogin($this->request->post['username'], $_POST['password']) == 1) { |          if($this->model_user_auth->checkLogin($this->request->post['username'], $_POST['password']) == 1) { | ||||||
|  |  | ||||||
|  |             if($session->get("ga_block") == 1) { | ||||||
|  |                header("Location: " . SITE_URL . "index.php?route=login/ga"); | ||||||
|  |                exit; | ||||||
|  |             } | ||||||
|  |             else { | ||||||
|                $this->model_user_prefs->get_user_preferences($session->get('username')); |                $this->model_user_prefs->get_user_preferences($session->get('username')); | ||||||
|  |  | ||||||
|                if(ENABLE_SAAS == 1) { |                if(ENABLE_SAAS == 1) { | ||||||
| @@ -59,6 +64,7 @@ class ControllerLoginLogin extends Controller { | |||||||
|                header("Location: " . SITE_URL . "search.php"); |                header("Location: " . SITE_URL . "search.php"); | ||||||
|                exit; |                exit; | ||||||
|             } |             } | ||||||
|  |          } | ||||||
|          else { |          else { | ||||||
|             $this->model_user_auth->increment_failed_login_count($this->data['failed_login_count']); |             $this->model_user_auth->increment_failed_login_count($this->data['failed_login_count']); | ||||||
|             $this->data['failed_login_count']++; |             $this->data['failed_login_count']++; | ||||||
|   | |||||||
| @@ -12,6 +12,8 @@ class ControllerUserSettings extends Controller { | |||||||
|  |  | ||||||
|  |  | ||||||
|       $request = Registry::get('request'); |       $request = Registry::get('request'); | ||||||
|  |       $session = Registry::get('session'); | ||||||
|  |  | ||||||
|       $db = Registry::get('db'); |       $db = Registry::get('db'); | ||||||
|  |  | ||||||
|       $this->load->model('user/auth'); |       $this->load->model('user/auth'); | ||||||
| @@ -19,6 +21,10 @@ class ControllerUserSettings extends Controller { | |||||||
|       $this->load->model('user/user'); |       $this->load->model('user/user'); | ||||||
|       $this->load->model('group/group'); |       $this->load->model('group/group'); | ||||||
|  |  | ||||||
|  |       require(DIR_BASE . 'system/helper/PHPGangsta_GoogleAuthenticator.php'); | ||||||
|  |  | ||||||
|  |       $this->data['ga'] = $this->model_user_prefs->get_ga_settings($session->get('username')); | ||||||
|  |  | ||||||
|       $this->document->title = $this->data['text_settings']; |       $this->document->title = $this->data['text_settings']; | ||||||
|    |    | ||||||
|       $d = $r = ''; |       $d = $r = ''; | ||||||
|   | |||||||
| @@ -70,7 +70,11 @@ Registry::set('actions', $actions); | |||||||
| Registry::set('import_status', $import_status); | Registry::set('import_status', $import_status); | ||||||
|  |  | ||||||
|  |  | ||||||
| if(Registry::get('username')) { |  | ||||||
|  | if($session->get("ga_block") == 1 && $request->get['route'] != 'login/logout' ) { | ||||||
|  |    $action = new Router('login/ga'); | ||||||
|  | } | ||||||
|  | else if(Registry::get('username')) { | ||||||
|  |  | ||||||
|    if(isset($request->get['route'])){ |    if(isset($request->get['route'])){ | ||||||
|       $action = new Router($request->get['route']); |       $action = new Router($request->get['route']); | ||||||
|   | |||||||
| @@ -460,5 +460,12 @@ $_['text_with_selected'] = 'mit ausgewählten'; | |||||||
|  |  | ||||||
| $_['text_download_all_hits'] = "Download all"; | $_['text_download_all_hits'] = "Download all"; | ||||||
| $_['text_archive_size_before_compression'] = "Archive size before compression"; | $_['text_archive_size_before_compression'] = "Archive size before compression"; | ||||||
|  | $_['text_create_new_secret'] = "Create new secret"; | ||||||
|  | $_['text_enter_google_authenticator_code'] = "Enter Google Authenticator code"; | ||||||
|  | $_['text_google_authenticator_code'] = "Google Authenticator code"; | ||||||
|  | $_['text_google_authenticator_settings'] = "Google Authenticator settings"; | ||||||
|  | $_['text_invalid_pin_code'] = "Invalid pin code"; | ||||||
|  | $_['text_qr_code'] = "QR"; | ||||||
|  | $_['text_refresh_qr_code'] = "Refresh QR code"; | ||||||
|  |  | ||||||
| ?> | ?> | ||||||
|   | |||||||
| @@ -57,6 +57,7 @@ $_['text_copied'] = "Copied"; | |||||||
| $_['text_counters'] = "Counters"; | $_['text_counters'] = "Counters"; | ||||||
| $_['text_cpu_load'] = "CPU load"; | $_['text_cpu_load'] = "CPU load"; | ||||||
| $_['text_cpu_usage'] = "CPU usage"; | $_['text_cpu_usage'] = "CPU usage"; | ||||||
|  | $_['text_create_new_secret'] = "Create new secret"; | ||||||
| $_['text_customers'] = "Customers"; | $_['text_customers'] = "Customers"; | ||||||
|  |  | ||||||
| $_['text_daily_quarantine_report'] = "Daily quarantine report"; | $_['text_daily_quarantine_report'] = "Daily quarantine report"; | ||||||
| @@ -106,6 +107,7 @@ $_['text_empty_search_criteria'] = "'Empty criteria'"; | |||||||
| $_['text_empty_search_result'] = "Empty search result. Try adding the wildcard character(*) after a word snippet, eg. duplic* to find \"duplicate\", \"duplicated\", etc."; | $_['text_empty_search_result'] = "Empty search result. Try adding the wildcard character(*) after a word snippet, eg. duplic* to find \"duplicate\", \"duplicated\", etc."; | ||||||
| $_['text_enable'] = "Enable"; | $_['text_enable'] = "Enable"; | ||||||
| $_['text_enabled'] = "enabled"; | $_['text_enabled'] = "enabled"; | ||||||
|  | $_['text_enter_google_authenticator_code'] = "Enter Google Authenticator code"; | ||||||
| $_['text_enter_one_email_address_per_line'] = "Enter one email address per line"; | $_['text_enter_one_email_address_per_line'] = "Enter one email address per line"; | ||||||
| $_['text_enter_one_group_per_line'] = "Enter one group per line"; | $_['text_enter_one_group_per_line'] = "Enter one group per line"; | ||||||
| $_['text_enter_search_terms'] = "Enter your search terms"; | $_['text_enter_search_terms'] = "Enter your search terms"; | ||||||
| @@ -139,6 +141,8 @@ $_['text_folders'] = "Folders"; | |||||||
| $_['text_from'] = "From"; | $_['text_from'] = "From"; | ||||||
| $_['text_from_domain'] = "From domain"; | $_['text_from_domain'] = "From domain"; | ||||||
|  |  | ||||||
|  | $_['text_google_authenticator_code'] = "Google Authenticator code"; | ||||||
|  | $_['text_google_authenticator_settings'] = "Google Authenticator settings"; | ||||||
| $_['text_group_id'] = "Group id"; | $_['text_group_id'] = "Group id"; | ||||||
| $_['text_groupname'] = "Group name"; | $_['text_groupname'] = "Group name"; | ||||||
| $_['text_groups'] = "Groups"; | $_['text_groups'] = "Groups"; | ||||||
| @@ -165,6 +169,7 @@ $_['text_invalid_email'] = "Invalid email"; | |||||||
| $_['text_invalid_email_or_password'] = "Invalid email or password"; | $_['text_invalid_email_or_password'] = "Invalid email or password"; | ||||||
| $_['text_invalid_gid'] = "Invalid gid"; | $_['text_invalid_gid'] = "Invalid gid"; | ||||||
| $_['text_invalid_password'] = "Invalid password"; | $_['text_invalid_password'] = "Invalid password"; | ||||||
|  | $_['text_invalid_pin_code'] = "Invalid pin code"; | ||||||
| $_['text_invalid_policy_group'] = "Invalid policy group"; | $_['text_invalid_policy_group'] = "Invalid policy group"; | ||||||
| $_['text_invalid_policy_name'] = "Invalid policy name"; | $_['text_invalid_policy_name'] = "Invalid policy name"; | ||||||
| $_['text_invalid_policy_setting'] = "Invalid policy setting"; | $_['text_invalid_policy_setting'] = "Invalid policy setting"; | ||||||
| @@ -253,6 +258,7 @@ $_['text_purge_all_messages_from_quarantine'] = "Purge all your own messages fro | |||||||
| $_['text_purge_selected_messages'] = "Purge selected messages"; | $_['text_purge_selected_messages'] = "Purge selected messages"; | ||||||
| $_['text_purged'] = "Purged"; | $_['text_purged'] = "Purged"; | ||||||
|  |  | ||||||
|  | $_['text_qr_code'] = "QR"; | ||||||
| $_['text_queue_status'] = "Queue status"; | $_['text_queue_status'] = "Queue status"; | ||||||
| $_['text_quick_search'] = "Quick search"; | $_['text_quick_search'] = "Quick search"; | ||||||
|  |  | ||||||
| @@ -260,6 +266,7 @@ $_['text_realname'] = "Realname"; | |||||||
| $_['text_recipient'] = "Recipient"; | $_['text_recipient'] = "Recipient"; | ||||||
| $_['text_ref'] = "Reference"; | $_['text_ref'] = "Reference"; | ||||||
| $_['text_refresh_period'] = "Refresh period"; | $_['text_refresh_period'] = "Refresh period"; | ||||||
|  | $_['text_refresh_qr_code'] = "Refresh QR code"; | ||||||
| $_['text_relay_details'] = "Relay details"; | $_['text_relay_details'] = "Relay details"; | ||||||
| $_['text_relay_status'] = "Relay status"; | $_['text_relay_status'] = "Relay status"; | ||||||
| $_['text_remove'] = "Remove"; | $_['text_remove'] = "Remove"; | ||||||
|   | |||||||
| @@ -459,5 +459,12 @@ $_['text_with_selected'] = 'Con seleccionado'; | |||||||
|  |  | ||||||
| $_['text_download_all_hits'] = "Download all"; | $_['text_download_all_hits'] = "Download all"; | ||||||
| $_['text_archive_size_before_compression'] = "Archive size before compression"; | $_['text_archive_size_before_compression'] = "Archive size before compression"; | ||||||
|  | $_['text_create_new_secret'] = "Create new secret"; | ||||||
|  | $_['text_enter_google_authenticator_code'] = "Enter Google Authenticator code"; | ||||||
|  | $_['text_google_authenticator_code'] = "Google Authenticator code"; | ||||||
|  | $_['text_google_authenticator_settings'] = "Google Authenticator settings"; | ||||||
|  | $_['text_invalid_pin_code'] = "Invalid pin code"; | ||||||
|  | $_['text_qr_code'] = "QR"; | ||||||
|  | $_['text_refresh_qr_code'] = "Refresh QR code"; | ||||||
|  |  | ||||||
| ?> | ?> | ||||||
|   | |||||||
| @@ -57,6 +57,7 @@ $_['text_copied'] = " | |||||||
| $_['text_counters'] = "Sz<EFBFBD>ml<EFBFBD>l<EFBFBD>k"; | $_['text_counters'] = "Sz<EFBFBD>ml<EFBFBD>l<EFBFBD>k"; | ||||||
| $_['text_cpu_load'] = "CPU terhel<65>s"; | $_['text_cpu_load'] = "CPU terhel<65>s"; | ||||||
| $_['text_cpu_usage'] = "CPU haszn<7A>lat"; | $_['text_cpu_usage'] = "CPU haszn<7A>lat"; | ||||||
|  | $_['text_create_new_secret'] = "<EFBFBD>j k<>d"; | ||||||
| $_['text_customers'] = "<EFBFBD>gyfelek"; | $_['text_customers'] = "<EFBFBD>gyfelek"; | ||||||
|  |  | ||||||
| $_['text_daily_quarantine_report'] = "Napi karant<6E>n riport"; | $_['text_daily_quarantine_report'] = "Napi karant<6E>n riport"; | ||||||
| @@ -106,6 +107,8 @@ $_['text_empty_search_criteria'] = "' | |||||||
| $_['text_empty_search_result'] = "Nincs tal<61>lat a keres<65>sre. Pr<50>b<EFBFBD>ljon meg csillagot (*) tenni a sz<73>t<EFBFBD>red<65>k ut<75>n, pl. titkos*, hogy megtal<61>lja a \"titkos<EFBFBD>t<EFBFBD>s\", \"titkos<EFBFBD>tott\", stb. szavakat tartalmaz<61> leveleket."; | $_['text_empty_search_result'] = "Nincs tal<61>lat a keres<65>sre. Pr<50>b<EFBFBD>ljon meg csillagot (*) tenni a sz<73>t<EFBFBD>red<65>k ut<75>n, pl. titkos*, hogy megtal<61>lja a \"titkos<EFBFBD>t<EFBFBD>s\", \"titkos<EFBFBD>tott\", stb. szavakat tartalmaz<61> leveleket."; | ||||||
| $_['text_enable'] = "Enged<EFBFBD>lyez"; | $_['text_enable'] = "Enged<EFBFBD>lyez"; | ||||||
| $_['text_enabled'] = "enged<EFBFBD>lyezve"; | $_['text_enabled'] = "enged<EFBFBD>lyezve"; | ||||||
|  | $_['text_enter_google_authenticator_code'] = "Adja meg a Google Authenticator k<>dot"; | ||||||
|  |  | ||||||
| $_['text_enter_one_email_address_per_line'] = "Egy sorba egy email c<>met <20>rjon"; | $_['text_enter_one_email_address_per_line'] = "Egy sorba egy email c<>met <20>rjon"; | ||||||
| $_['text_enter_one_group_per_line'] = "Egy sorba egy csoportnevet <20>rjon"; | $_['text_enter_one_group_per_line'] = "Egy sorba egy csoportnevet <20>rjon"; | ||||||
| $_['text_enter_search_terms'] = "<EFBFBD>rja be a keres<65>si felt<6C>teleket"; | $_['text_enter_search_terms'] = "<EFBFBD>rja be a keres<65>si felt<6C>teleket"; | ||||||
| @@ -145,6 +148,8 @@ $_['text_help'] = "Seg | |||||||
| $_['text_history'] = "T<EFBFBD>rt<EFBFBD>net"; | $_['text_history'] = "T<EFBFBD>rt<EFBFBD>net"; | ||||||
| $_['text_home'] = "Kezd<EFBFBD>lap"; | $_['text_home'] = "Kezd<EFBFBD>lap"; | ||||||
|  |  | ||||||
|  | $_['text_google_authenticator_code'] = "Google Authenticator k<>d"; | ||||||
|  | $_['text_google_authenticator_settings'] = "Google Authenticator be<62>ll<6C>t<EFBFBD>sok"; | ||||||
| $_['text_group_id'] = "Csoport azonos<6F>t<EFBFBD>"; | $_['text_group_id'] = "Csoport azonos<6F>t<EFBFBD>"; | ||||||
| $_['text_groupname'] = "Csoportn<EFBFBD>v"; | $_['text_groupname'] = "Csoportn<EFBFBD>v"; | ||||||
| $_['text_groups'] = "Csoportok"; | $_['text_groups'] = "Csoportok"; | ||||||
| @@ -165,6 +170,7 @@ $_['text_invalid_email'] = " | |||||||
| $_['text_invalid_email_or_password'] = "<EFBFBD>rv<EFBFBD>nytelen email c<>m vagy jelsz<73>"; | $_['text_invalid_email_or_password'] = "<EFBFBD>rv<EFBFBD>nytelen email c<>m vagy jelsz<73>"; | ||||||
| $_['text_invalid_gid'] = "<EFBFBD>rv<EFBFBD>nytelen csoportazonos<6F>t<EFBFBD>"; | $_['text_invalid_gid'] = "<EFBFBD>rv<EFBFBD>nytelen csoportazonos<6F>t<EFBFBD>"; | ||||||
| $_['text_invalid_password'] = "<EFBFBD>rv<EFBFBD>nytelen jelsz<73>"; | $_['text_invalid_password'] = "<EFBFBD>rv<EFBFBD>nytelen jelsz<73>"; | ||||||
|  | $_['text_invalid_pin_code'] = "<EFBFBD>rv<EFBFBD>nytelen pin k<>d"; | ||||||
| $_['text_invalid_policy_group'] = "<EFBFBD>rv<EFBFBD>nytelen h<>zirend szonos<6F>t<EFBFBD>"; | $_['text_invalid_policy_group'] = "<EFBFBD>rv<EFBFBD>nytelen h<>zirend szonos<6F>t<EFBFBD>"; | ||||||
| $_['text_invalid_policy_name'] = "<EFBFBD>rv<EFBFBD>nytelen h<>zirend n<>v"; | $_['text_invalid_policy_name'] = "<EFBFBD>rv<EFBFBD>nytelen h<>zirend n<>v"; | ||||||
| $_['text_invalid_policy_setting'] = "<EFBFBD>rv<EFBFBD>nytelen be<62>ll<6C>t<EFBFBD>s(ok)"; | $_['text_invalid_policy_setting'] = "<EFBFBD>rv<EFBFBD>nytelen be<62>ll<6C>t<EFBFBD>s(ok)"; | ||||||
| @@ -253,6 +259,7 @@ $_['text_purge_all_messages_from_quarantine'] = " | |||||||
| $_['text_purge_selected_messages'] = "Kiv<EFBFBD>lasztott <20>zenetek elt<6C>vol<6F>t<EFBFBD>sa"; | $_['text_purge_selected_messages'] = "Kiv<EFBFBD>lasztott <20>zenetek elt<6C>vol<6F>t<EFBFBD>sa"; | ||||||
| $_['text_purged'] = "Elt<EFBFBD>vol<EFBFBD>tva"; | $_['text_purged'] = "Elt<EFBFBD>vol<EFBFBD>tva"; | ||||||
|  |  | ||||||
|  | $_['text_qr_code'] = "QR"; | ||||||
| $_['text_queue_status'] = "Queue st<73>tusz"; | $_['text_queue_status'] = "Queue st<73>tusz"; | ||||||
| $_['text_quick_search'] = "Gyorskeres<EFBFBD>s"; | $_['text_quick_search'] = "Gyorskeres<EFBFBD>s"; | ||||||
|  |  | ||||||
| @@ -260,6 +267,7 @@ $_['text_realname'] = "N | |||||||
| $_['text_recipient'] = "C<EFBFBD>mzett"; | $_['text_recipient'] = "C<EFBFBD>mzett"; | ||||||
| $_['text_ref'] = "Hivatkoz<EFBFBD>s"; | $_['text_ref'] = "Hivatkoz<EFBFBD>s"; | ||||||
| $_['text_refresh_period'] = "Friss<EFBFBD>t<EFBFBD>si peri<72>dus"; | $_['text_refresh_period'] = "Friss<EFBFBD>t<EFBFBD>si peri<72>dus"; | ||||||
|  | $_['text_refresh_qr_code'] = "QR k<>d friss<73>t<EFBFBD>se"; | ||||||
| $_['text_relay_details'] = "Relay r<>szletek"; | $_['text_relay_details'] = "Relay r<>szletek"; | ||||||
| $_['text_relay_status'] = "Relay st<73>tusz"; | $_['text_relay_status'] = "Relay st<73>tusz"; | ||||||
| $_['text_remove'] = "T<EFBFBD>rl<EFBFBD>s"; | $_['text_remove'] = "T<EFBFBD>rl<EFBFBD>s"; | ||||||
|   | |||||||
| @@ -57,6 +57,7 @@ $_['text_copied'] = "Átmásolva"; | |||||||
| $_['text_counters'] = "Számlálók"; | $_['text_counters'] = "Számlálók"; | ||||||
| $_['text_cpu_load'] = "CPU terhelés"; | $_['text_cpu_load'] = "CPU terhelés"; | ||||||
| $_['text_cpu_usage'] = "CPU használat"; | $_['text_cpu_usage'] = "CPU használat"; | ||||||
|  | $_['text_create_new_secret'] = "Új kód"; | ||||||
| $_['text_customers'] = "Ügyfelek"; | $_['text_customers'] = "Ügyfelek"; | ||||||
|  |  | ||||||
| $_['text_daily_quarantine_report'] = "Napi karantén riport"; | $_['text_daily_quarantine_report'] = "Napi karantén riport"; | ||||||
| @@ -106,6 +107,8 @@ $_['text_empty_search_criteria'] = "'Üres feltétel'"; | |||||||
| $_['text_empty_search_result'] = "Nincs találat a keresésre. Próbáljon meg csillagot (*) tenni a szótöredék után, pl. titkos*, hogy megtalálja a \"titkosítás\", \"titkosított\", stb. szavakat tartalmazó leveleket."; | $_['text_empty_search_result'] = "Nincs találat a keresésre. Próbáljon meg csillagot (*) tenni a szótöredék után, pl. titkos*, hogy megtalálja a \"titkosítás\", \"titkosított\", stb. szavakat tartalmazó leveleket."; | ||||||
| $_['text_enable'] = "Engedélyez"; | $_['text_enable'] = "Engedélyez"; | ||||||
| $_['text_enabled'] = "engedélyezve"; | $_['text_enabled'] = "engedélyezve"; | ||||||
|  | $_['text_enter_google_authenticator_code'] = "Adja meg a Google Authenticator kódot"; | ||||||
|  |  | ||||||
| $_['text_enter_one_email_address_per_line'] = "Egy sorba egy email címet írjon"; | $_['text_enter_one_email_address_per_line'] = "Egy sorba egy email címet írjon"; | ||||||
| $_['text_enter_one_group_per_line'] = "Egy sorba egy csoportnevet írjon"; | $_['text_enter_one_group_per_line'] = "Egy sorba egy csoportnevet írjon"; | ||||||
| $_['text_enter_search_terms'] = "Írja be a keresési feltételeket"; | $_['text_enter_search_terms'] = "Írja be a keresési feltételeket"; | ||||||
| @@ -145,6 +148,8 @@ $_['text_help'] = "Segítség"; | |||||||
| $_['text_history'] = "Történet"; | $_['text_history'] = "Történet"; | ||||||
| $_['text_home'] = "Kezdőlap"; | $_['text_home'] = "Kezdőlap"; | ||||||
|  |  | ||||||
|  | $_['text_google_authenticator_code'] = "Google Authenticator kód"; | ||||||
|  | $_['text_google_authenticator_settings'] = "Google Authenticator beállítások"; | ||||||
| $_['text_group_id'] = "Csoport azonosító"; | $_['text_group_id'] = "Csoport azonosító"; | ||||||
| $_['text_groupname'] = "Csoportnév"; | $_['text_groupname'] = "Csoportnév"; | ||||||
| $_['text_groups'] = "Csoportok"; | $_['text_groups'] = "Csoportok"; | ||||||
| @@ -165,6 +170,7 @@ $_['text_invalid_email'] = "Érvénytelen email cím"; | |||||||
| $_['text_invalid_email_or_password'] = "Érvénytelen email cím vagy jelszó"; | $_['text_invalid_email_or_password'] = "Érvénytelen email cím vagy jelszó"; | ||||||
| $_['text_invalid_gid'] = "Érvénytelen csoportazonosító"; | $_['text_invalid_gid'] = "Érvénytelen csoportazonosító"; | ||||||
| $_['text_invalid_password'] = "Érvénytelen jelszó"; | $_['text_invalid_password'] = "Érvénytelen jelszó"; | ||||||
|  | $_['text_invalid_pin_code'] = "Érvénytelen pin kód"; | ||||||
| $_['text_invalid_policy_group'] = "Érvénytelen házirend szonosító"; | $_['text_invalid_policy_group'] = "Érvénytelen házirend szonosító"; | ||||||
| $_['text_invalid_policy_name'] = "Érvénytelen házirend név"; | $_['text_invalid_policy_name'] = "Érvénytelen házirend név"; | ||||||
| $_['text_invalid_policy_setting'] = "Érvénytelen beállítás(ok)"; | $_['text_invalid_policy_setting'] = "Érvénytelen beállítás(ok)"; | ||||||
| @@ -253,6 +259,7 @@ $_['text_purge_all_messages_from_quarantine'] = "Összes saját üzenet törlés | |||||||
| $_['text_purge_selected_messages'] = "Kiválasztott üzenetek eltávolítása"; | $_['text_purge_selected_messages'] = "Kiválasztott üzenetek eltávolítása"; | ||||||
| $_['text_purged'] = "Eltávolítva"; | $_['text_purged'] = "Eltávolítva"; | ||||||
|  |  | ||||||
|  | $_['text_qr_code'] = "QR"; | ||||||
| $_['text_queue_status'] = "Queue státusz"; | $_['text_queue_status'] = "Queue státusz"; | ||||||
| $_['text_quick_search'] = "Gyorskeresés"; | $_['text_quick_search'] = "Gyorskeresés"; | ||||||
|  |  | ||||||
| @@ -260,6 +267,7 @@ $_['text_realname'] = "Név"; | |||||||
| $_['text_recipient'] = "Címzett"; | $_['text_recipient'] = "Címzett"; | ||||||
| $_['text_ref'] = "Hivatkozás"; | $_['text_ref'] = "Hivatkozás"; | ||||||
| $_['text_refresh_period'] = "Frissítési periódus"; | $_['text_refresh_period'] = "Frissítési periódus"; | ||||||
|  | $_['text_refresh_qr_code'] = "QR kód frissítése"; | ||||||
| $_['text_relay_details'] = "Relay részletek"; | $_['text_relay_details'] = "Relay részletek"; | ||||||
| $_['text_relay_status'] = "Relay státusz"; | $_['text_relay_status'] = "Relay státusz"; | ||||||
| $_['text_remove'] = "Törlés"; | $_['text_remove'] = "Törlés"; | ||||||
|   | |||||||
| @@ -452,5 +452,12 @@ $_['text_with_selected'] = 'With Selected'; | |||||||
|  |  | ||||||
| $_['text_download_all_hits'] = "Download all"; | $_['text_download_all_hits'] = "Download all"; | ||||||
| $_['text_archive_size_before_compression'] = "Archive size before compression"; | $_['text_archive_size_before_compression'] = "Archive size before compression"; | ||||||
|  | $_['text_create_new_secret'] = "Create new secret"; | ||||||
|  | $_['text_enter_google_authenticator_code'] = "Enter Google Authenticator code"; | ||||||
|  | $_['text_google_authenticator_code'] = "Google Authenticator code"; | ||||||
|  | $_['text_google_authenticator_settings'] = "Google Authenticator settings"; | ||||||
|  | $_['text_invalid_pin_code'] = "Invalid pin code"; | ||||||
|  | $_['text_qr_code'] = "QR"; | ||||||
|  | $_['text_refresh_qr_code'] = "Refresh QR code"; | ||||||
|  |  | ||||||
| ?> | ?> | ||||||
|   | |||||||
| @@ -3,6 +3,7 @@ | |||||||
| class ModelUserAuth extends Model { | class ModelUserAuth extends Model { | ||||||
|  |  | ||||||
|    public function checkLogin($username = '', $password = '') { |    public function checkLogin($username = '', $password = '') { | ||||||
|  |       $session = Registry::get('session'); | ||||||
|       $ok = 0; |       $ok = 0; | ||||||
|  |  | ||||||
|       if($username == '' || $password == '') { return 0; } |       if($username == '' || $password == '') { return 0; } | ||||||
| @@ -47,17 +48,19 @@ class ModelUserAuth extends Model { | |||||||
|  |  | ||||||
|  |  | ||||||
|       if($ok == 1) { |       if($ok == 1) { | ||||||
|          $_SESSION['username'] = $query->row['username']; |          $session->set("username", $username); | ||||||
|          $_SESSION['uid'] = $query->row['uid']; |          $session->set("uid", $query->row['uid']); | ||||||
|          $_SESSION['admin_user'] = $query->row['isadmin']; |          $session->set("admin_user", $query->row['isadmin']); | ||||||
|          $_SESSION['email'] = $username; |          $session->set("email", $username); | ||||||
|          $_SESSION['domain'] = $query->row['domain']; |          $session->set("domain", $query->row['domain']); | ||||||
|          $_SESSION['realname'] = $query->row['realname']; |          $session->set("realname", $query->row['realname']); | ||||||
|  |  | ||||||
|          $_SESSION['auditdomains'] = $this->model_user_user->get_users_all_domains($query->row['uid']); |          $session->set("auditdomains", $this->model_user_user->get_users_all_domains($query->row['uid'])); | ||||||
|          $_SESSION['emails'] = $this->model_user_user->get_users_all_email_addresses($query->row['uid']); |          $session->set("emails", $this->model_user_user->get_users_all_email_addresses($query->row['uid'])); | ||||||
|          $_SESSION['folders'] = $this->model_folder_folder->get_all_folder_ids($query->row['uid']); |          $session->set("folders", $this->model_folder_folder->get_all_folder_ids($query->row['uid'])); | ||||||
|          $_SESSION['extra_folders'] = $this->model_folder_folder->get_all_extra_folder_ids($query->row['uid']); |          $session->set("extra_folders", $this->model_folder_folder->get_all_extra_folder_ids($query->row['uid'])); | ||||||
|  |  | ||||||
|  |          $this->is_ga_code_needed(); | ||||||
|  |  | ||||||
|          return 1; |          return 1; | ||||||
|       } |       } | ||||||
| @@ -190,6 +193,8 @@ class ModelUserAuth extends Model { | |||||||
|  |  | ||||||
|  |  | ||||||
|    private function add_session_vars($name = '', $email = '', $emails = array(), $role = 0) { |    private function add_session_vars($name = '', $email = '', $emails = array(), $role = 0) { | ||||||
|  |       $session = Registry::get('session'); | ||||||
|  |  | ||||||
|       $a = explode("@", $email); |       $a = explode("@", $email); | ||||||
|  |  | ||||||
|       $uid = $this->model_user_user->get_uid_by_email($email); |       $uid = $this->model_user_user->get_uid_by_email($email); | ||||||
| @@ -198,23 +203,26 @@ class ModelUserAuth extends Model { | |||||||
|          $query = $this->db->query("INSERT INTO " . TABLE_EMAIL . " (uid, email) VALUES(?,?)", array($uid, $email)); |          $query = $this->db->query("INSERT INTO " . TABLE_EMAIL . " (uid, email) VALUES(?,?)", array($uid, $email)); | ||||||
|       } |       } | ||||||
|  |  | ||||||
|       $_SESSION['username'] = $name; |  | ||||||
|       $_SESSION['uid'] = $uid; |       $session->set("username", $email); | ||||||
|  |       $session->set("uid", $uid); | ||||||
|  |  | ||||||
|       if($role > 0) { |       if($role > 0) { | ||||||
|          $_SESSION['admin_user'] = $role; |          $session->set("admin_user", $role); | ||||||
|       } else { |       } else { | ||||||
|          $_SESSION['admin_user'] = 0; |          $session->set("admin_user", 0); | ||||||
|       } |       } | ||||||
|  |  | ||||||
|       $_SESSION['email'] = $email; |       $session->set("email", $email); | ||||||
|       $_SESSION['domain'] = $a[1]; |       $session->set("domain", $a[1]); | ||||||
|       $_SESSION['realname'] = $name; |       $session->set("realname", $name); | ||||||
|  |  | ||||||
|       $_SESSION['auditdomains'] = $this->model_domain_domain->get_your_all_domains_by_email($email); |       $session->set("auditdomains", $this->model_domain_domain->get_your_all_domains_by_email($email)); | ||||||
|       $_SESSION['emails'] = $emails; |       $session->set("emails", $emails); | ||||||
|       $_SESSION['folders'] = array(); |       $session->set("folders", array()); | ||||||
|       $_SESSION['extra_folders'] = array(); |       $session->set("extra_folders", array()); | ||||||
|  |  | ||||||
|  |       $this->is_ga_code_needed(); | ||||||
|    } |    } | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -243,6 +251,8 @@ class ModelUserAuth extends Model { | |||||||
|  |  | ||||||
|  |  | ||||||
|    private function checkLoginAgainstIMAP($username = '', $password = '') { |    private function checkLoginAgainstIMAP($username = '', $password = '') { | ||||||
|  |       $session = Registry::get('session'); | ||||||
|  |  | ||||||
|       $user = array(); |       $user = array(); | ||||||
|  |  | ||||||
|       $imap = new Zend_Mail_Protocol_Imap(IMAP_HOST, IMAP_PORT, IMAP_SSL); |       $imap = new Zend_Mail_Protocol_Imap(IMAP_HOST, IMAP_PORT, IMAP_SSL); | ||||||
| @@ -251,7 +261,7 @@ class ModelUserAuth extends Model { | |||||||
|  |  | ||||||
|          $this->add_session_vars($username, $username, array($username), 0); |          $this->add_session_vars($username, $username, array($username), 0); | ||||||
|  |  | ||||||
|          $_SESSION['password'] = $password; |          $session->set("password", $password); | ||||||
|  |  | ||||||
|          return 1; |          return 1; | ||||||
|       } |       } | ||||||
| @@ -357,6 +367,17 @@ class ModelUserAuth extends Model { | |||||||
|    } |    } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |    private function is_ga_code_needed() { | ||||||
|  |       $session = Registry::get('session'); | ||||||
|  |  | ||||||
|  |       $query = $this->db->query("SELECT ga_enabled FROM " . TABLE_USER_SETTINGS . " WHERE username=?", array($session->get("username"))); | ||||||
|  |  | ||||||
|  |       if(isset($query->row['ga_enabled']) && $query->row['ga_enabled'] == 1) { | ||||||
|  |          $session->set("ga_block", 1); | ||||||
|  |       } | ||||||
|  |    } | ||||||
|  |  | ||||||
|  |  | ||||||
|    public function change_password($username = '', $password = '') { |    public function change_password($username = '', $password = '') { | ||||||
|       if($username == "" || $password == ""){ return 0; } |       if($username == "" || $password == ""){ return 0; } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -39,6 +39,53 @@ class ModelUserPrefs extends Model { | |||||||
|       return 1; |       return 1; | ||||||
|    } |    } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |    public function get_ga_settings($username = '') { | ||||||
|  |       $data = array('ga_enabled' => 0, 'ga_secret' => ''); | ||||||
|  |  | ||||||
|  |       if($username == ""){ return $data; } | ||||||
|  |  | ||||||
|  |       $GA = new PHPGangsta_GoogleAuthenticator(); | ||||||
|  |  | ||||||
|  |       $query = $this->db->query("SELECT ga_enabled, ga_secret FROM " . TABLE_USER_SETTINGS . " WHERE username=?", array($username)); | ||||||
|  |  | ||||||
|  |       if(isset($query->row['ga_enabled'])) { | ||||||
|  |          $data['ga_enabled'] = $query->row['ga_enabled']; | ||||||
|  |          $data['ga_secret'] = $query->row['ga_secret']; | ||||||
|  |  | ||||||
|  |          if($data['ga_secret'] == '') { | ||||||
|  |             $data['ga_secret'] = $GA->createSecret(); | ||||||
|  |             $this->update_ga_secret($username, $data['ga_secret']); | ||||||
|  |          } | ||||||
|  |       } | ||||||
|  |       else { | ||||||
|  |          $query = $this->db->query("INSERT INTO " . TABLE_USER_SETTINGS . " (username, ga_enabled, ga_secret) VALUES(?,0,?)", array($username, $GA->createSecret())); | ||||||
|  |       } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |       return $data; | ||||||
|  |    } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |    public function update_ga_secret($username = '', $ga_secret = '') { | ||||||
|  |       if($username == "" || $ga_secret == "") { return 0; } | ||||||
|  |  | ||||||
|  |       $query = $this->db->query("UPDATE " . TABLE_USER_SETTINGS . " SET ga_secret=? WHERE username=?", array($ga_secret, $username)); | ||||||
|  |  | ||||||
|  |       return 1; | ||||||
|  |    } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |    public function toggle_ga($username = '', $ga_enabled = '') { | ||||||
|  |       if($username == "" || $ga_enabled < 0 || $ga_enabled > 1) { return 0; } | ||||||
|  |  | ||||||
|  |       $query = $this->db->query("UPDATE " . TABLE_USER_SETTINGS . " SET ga_enabled=? WHERE username=?", array($ga_enabled, $username)); | ||||||
|  |  | ||||||
|  |       return 1; | ||||||
|  |    } | ||||||
|  |  | ||||||
|  |  | ||||||
| } | } | ||||||
|  |  | ||||||
| ?> | ?> | ||||||
|   | |||||||
							
								
								
									
										43
									
								
								webui/qr.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								webui/qr.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,43 @@ | |||||||
|  | <?php | ||||||
|  |  | ||||||
|  | session_start(); | ||||||
|  |  | ||||||
|  |  | ||||||
|  | require_once("config.php"); | ||||||
|  |  | ||||||
|  | require(DIR_SYSTEM . "/startup.php"); | ||||||
|  |  | ||||||
|  | $session = new Session(); | ||||||
|  | $loader = new Loader(); | ||||||
|  | $language = new Language(); | ||||||
|  |  | ||||||
|  | $db = new DB(DB_DRIVER, DB_HOSTNAME, DB_USERNAME, DB_PASSWORD, DB_DATABASE, DB_PREFIX); | ||||||
|  | Registry::set('db', $db); | ||||||
|  |  | ||||||
|  | $loader->model('user/prefs'); | ||||||
|  | $loader->helper('phpqrcode/qrlib'); | ||||||
|  | $loader->helper('PHPGangsta_GoogleAuthenticator'); | ||||||
|  |  | ||||||
|  | $p = new ModelUserPrefs(); | ||||||
|  |  | ||||||
|  | if(isset($_GET['refresh'])) { | ||||||
|  |    $GA = new PHPGangsta_GoogleAuthenticator(); | ||||||
|  |  | ||||||
|  |    $new_secret = $GA->createSecret(); | ||||||
|  |  | ||||||
|  |    $p->update_ga_secret($session->get('username'), $new_secret); | ||||||
|  |  | ||||||
|  |    print "$new_secret <a href=\"#\" onclick=\"Piler.new_qr(); return false;\">" . $language->data['text_refresh_qr_code'] . "</a><br /><img src=\"qr.php?ts=" . microtime(true) . "\" />\n"; | ||||||
|  |  | ||||||
|  |    exit; | ||||||
|  | } | ||||||
|  | else if(isset($_GET['toggle'])) { | ||||||
|  |    $p->toggle_ga($session->get('username'), $_GET['toggle']); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | $ga = $p->get_ga_settings($session->get('username')); | ||||||
|  |  | ||||||
|  | QRcode::png($ga['ga_secret'], false, "L", 8, 2); | ||||||
|  |  | ||||||
|  | ?> | ||||||
							
								
								
									
										203
									
								
								webui/system/helper/PHPGangsta_GoogleAuthenticator.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										203
									
								
								webui/system/helper/PHPGangsta_GoogleAuthenticator.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,203 @@ | |||||||
|  | <?php | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * PHP Class for handling Google Authenticator 2-factor authentication | ||||||
|  |  * | ||||||
|  |  * @author Michael Kliewe | ||||||
|  |  * @copyright 2012 Michael Kliewe | ||||||
|  |  * @license http://www.opensource.org/licenses/bsd-license.php BSD License | ||||||
|  |  * @link http://www.phpgangsta.de/ | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | class PHPGangsta_GoogleAuthenticator | ||||||
|  | { | ||||||
|  |     protected $_codeLength = 6; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Create new secret. | ||||||
|  |      * 16 characters, randomly chosen from the allowed base32 characters. | ||||||
|  |      * | ||||||
|  |      * @param int $secretLength | ||||||
|  |      * @return string | ||||||
|  |      */ | ||||||
|  |     public function createSecret($secretLength = 16) | ||||||
|  |     { | ||||||
|  |         $validChars = $this->_getBase32LookupTable(); | ||||||
|  |         unset($validChars[32]); | ||||||
|  |  | ||||||
|  |         $secret = ''; | ||||||
|  |         for ($i = 0; $i < $secretLength; $i++) { | ||||||
|  |             $secret .= $validChars[array_rand($validChars)]; | ||||||
|  |         } | ||||||
|  |         return $secret; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Calculate the code, with given secret and point in time | ||||||
|  |      * | ||||||
|  |      * @param string $secret | ||||||
|  |      * @param int|null $timeSlice | ||||||
|  |      * @return string | ||||||
|  |      */ | ||||||
|  |     public function getCode($secret, $timeSlice = null) | ||||||
|  |     { | ||||||
|  |         if ($timeSlice === null) { | ||||||
|  |             $timeSlice = floor(time() / 30); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         $secretkey = $this->_base32Decode($secret); | ||||||
|  |  | ||||||
|  |         // Pack time into binary string | ||||||
|  |         $time = chr(0).chr(0).chr(0).chr(0).pack('N*', $timeSlice); | ||||||
|  |         // Hash it with users secret key | ||||||
|  |         $hm = hash_hmac('SHA1', $time, $secretkey, true); | ||||||
|  |         // Use last nipple of result as index/offset | ||||||
|  |         $offset = ord(substr($hm, -1)) & 0x0F; | ||||||
|  |         // grab 4 bytes of the result | ||||||
|  |         $hashpart = substr($hm, $offset, 4); | ||||||
|  |  | ||||||
|  |         // Unpak binary value | ||||||
|  |         $value = unpack('N', $hashpart); | ||||||
|  |         $value = $value[1]; | ||||||
|  |         // Only 32 bits | ||||||
|  |         $value = $value & 0x7FFFFFFF; | ||||||
|  |  | ||||||
|  |         $modulo = pow(10, $this->_codeLength); | ||||||
|  |         return str_pad($value % $modulo, $this->_codeLength, '0', STR_PAD_LEFT); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Get QR-Code URL for image, from google charts | ||||||
|  |      * | ||||||
|  |      * @param string $name | ||||||
|  |      * @param string $secret | ||||||
|  |      * @return string | ||||||
|  |      */ | ||||||
|  |     public function getQRCodeGoogleUrl($name, $secret) { | ||||||
|  |         $urlencoded = urlencode('otpauth://totp/'.$name.'?secret='.$secret.''); | ||||||
|  |         return 'https://chart.googleapis.com/chart?chs=200x200&chld=M|0&cht=qr&chl='.$urlencoded.''; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Check if the code is correct. This will accept codes starting from $discrepancy*30sec ago to $discrepancy*30sec from now | ||||||
|  |      * | ||||||
|  |      * @param string $secret | ||||||
|  |      * @param string $code | ||||||
|  |      * @param int $discrepancy This is the allowed time drift in 30 second units (8 means 4 minutes before or after) | ||||||
|  |      * @return bool | ||||||
|  |      */ | ||||||
|  |     public function verifyCode($secret, $code, $discrepancy = 1) | ||||||
|  |     { | ||||||
|  |         $currentTimeSlice = floor(time() / 30); | ||||||
|  |  | ||||||
|  |         for ($i = -$discrepancy; $i <= $discrepancy; $i++) { | ||||||
|  |             $calculatedCode = $this->getCode($secret, $currentTimeSlice + $i); | ||||||
|  |             if ($calculatedCode == $code ) { | ||||||
|  |                 return true; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         return false; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Set the code length, should be >=6 | ||||||
|  |      * | ||||||
|  |      * @param int $length | ||||||
|  |      * @return PHPGangsta_GoogleAuthenticator | ||||||
|  |      */ | ||||||
|  |     public function setCodeLength($length) | ||||||
|  |     { | ||||||
|  |         $this->_codeLength = $length; | ||||||
|  |         return $this; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Helper class to decode base32 | ||||||
|  |      * | ||||||
|  |      * @param $secret | ||||||
|  |      * @return bool|string | ||||||
|  |      */ | ||||||
|  |     protected function _base32Decode($secret) | ||||||
|  |     { | ||||||
|  |         if (empty($secret)) return ''; | ||||||
|  |  | ||||||
|  |         $base32chars = $this->_getBase32LookupTable(); | ||||||
|  |         $base32charsFlipped = array_flip($base32chars); | ||||||
|  |  | ||||||
|  |         $paddingCharCount = substr_count($secret, $base32chars[32]); | ||||||
|  |         $allowedValues = array(6, 4, 3, 1, 0); | ||||||
|  |         if (!in_array($paddingCharCount, $allowedValues)) return false; | ||||||
|  |         for ($i = 0; $i < 4; $i++){ | ||||||
|  |             if ($paddingCharCount == $allowedValues[$i] && | ||||||
|  |                 substr($secret, -($allowedValues[$i])) != str_repeat($base32chars[32], $allowedValues[$i])) return false; | ||||||
|  |         } | ||||||
|  |         $secret = str_replace('=','', $secret); | ||||||
|  |         $secret = str_split($secret); | ||||||
|  |         $binaryString = ""; | ||||||
|  |         for ($i = 0; $i < count($secret); $i = $i+8) { | ||||||
|  |             $x = ""; | ||||||
|  |             if (!in_array($secret[$i], $base32chars)) return false; | ||||||
|  |             for ($j = 0; $j < 8; $j++) { | ||||||
|  |                 $x .= str_pad(base_convert(@$base32charsFlipped[@$secret[$i + $j]], 10, 2), 5, '0', STR_PAD_LEFT); | ||||||
|  |             } | ||||||
|  |             $eightBits = str_split($x, 8); | ||||||
|  |             for ($z = 0; $z < count($eightBits); $z++) { | ||||||
|  |                 $binaryString .= ( ($y = chr(base_convert($eightBits[$z], 2, 10))) || ord($y) == 48 ) ? $y:""; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         return $binaryString; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Helper class to encode base32 | ||||||
|  |      * | ||||||
|  |      * @param string $secret | ||||||
|  |      * @param bool $padding | ||||||
|  |      * @return string | ||||||
|  |      */ | ||||||
|  |     protected function _base32Encode($secret, $padding = true) | ||||||
|  |     { | ||||||
|  |         if (empty($secret)) return ''; | ||||||
|  |  | ||||||
|  |         $base32chars = $this->_getBase32LookupTable(); | ||||||
|  |  | ||||||
|  |         $secret = str_split($secret); | ||||||
|  |         $binaryString = ""; | ||||||
|  |         for ($i = 0; $i < count($secret); $i++) { | ||||||
|  |             $binaryString .= str_pad(base_convert(ord($secret[$i]), 10, 2), 8, '0', STR_PAD_LEFT); | ||||||
|  |         } | ||||||
|  |         $fiveBitBinaryArray = str_split($binaryString, 5); | ||||||
|  |         $base32 = ""; | ||||||
|  |         $i = 0; | ||||||
|  |         while ($i < count($fiveBitBinaryArray)) { | ||||||
|  |             $base32 .= $base32chars[base_convert(str_pad($fiveBitBinaryArray[$i], 5, '0'), 2, 10)]; | ||||||
|  |             $i++; | ||||||
|  |         } | ||||||
|  |         if ($padding && ($x = strlen($binaryString) % 40) != 0) { | ||||||
|  |             if ($x == 8) $base32 .= str_repeat($base32chars[32], 6); | ||||||
|  |             elseif ($x == 16) $base32 .= str_repeat($base32chars[32], 4); | ||||||
|  |             elseif ($x == 24) $base32 .= str_repeat($base32chars[32], 3); | ||||||
|  |             elseif ($x == 32) $base32 .= $base32chars[32]; | ||||||
|  |         } | ||||||
|  |         return $base32; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Get array with all 32 characters for decoding from/encoding to base32 | ||||||
|  |      * | ||||||
|  |      * @return array | ||||||
|  |      */ | ||||||
|  |     protected function _getBase32LookupTable() | ||||||
|  |     { | ||||||
|  |         return array( | ||||||
|  |             'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', //  7 | ||||||
|  |             'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', // 15 | ||||||
|  |             'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', // 23 | ||||||
|  |             'Y', 'Z', '2', '3', '4', '5', '6', '7', // 31 | ||||||
|  |             '='  // padding char | ||||||
|  |         ); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | ?> | ||||||
							
								
								
									
										38
									
								
								webui/system/helper/phpqrcode/CHANGELOG
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								webui/system/helper/phpqrcode/CHANGELOG
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,38 @@ | |||||||
|  | * 1.0.0 build 2010031920  | ||||||
|  |  | ||||||
|  |   - first public release | ||||||
|  |   - help in readme, install | ||||||
|  |   - cleanup ans separation of QRtools and QRspec | ||||||
|  |   - now TCPDF binding requires minimal changes in TCPDF, having most of job | ||||||
|  |     done in QRtools tcpdfBarcodeArray | ||||||
|  |   - nicer QRtools::timeBenchmark output | ||||||
|  |   - license and copyright notices in files | ||||||
|  |   - indent cleanup - from tab to 4spc, keep it that way please :) | ||||||
|  |   - sf project, repository, wiki | ||||||
|  |   - simple code generator in index.php | ||||||
|  |    | ||||||
|  | * 1.1.0 build 2010032113 | ||||||
|  |  | ||||||
|  |   - added merge tool wich generate merged version of code | ||||||
|  |     located in phpqrcode.php | ||||||
|  |   - splited qrconst.php from qrlib.php | ||||||
|  |    | ||||||
|  | * 1.1.1 build 2010032405 | ||||||
|  |  | ||||||
|  |   - patch by Rick Seymour allowing saving PNG and displaying it at the same time | ||||||
|  |   - added version info in VERSION file | ||||||
|  |   - modified merge tool to include version info into generated file | ||||||
|  |   - fixed e-mail in almost all head comments | ||||||
|  |    | ||||||
|  | * 1.1.2 build 2010032722 | ||||||
|  |  | ||||||
|  |   - full integration with TCPDF thanks to Nicola Asuni, it's author | ||||||
|  |   - fixed bug with alphanumeric encoding detection | ||||||
|  |    | ||||||
|  | * 1.1.3 build 2010081807 | ||||||
|  |  | ||||||
|  |   - short opening tags replaced with standard ones | ||||||
|  |    | ||||||
|  | * 1.1.4 build 2010100721 | ||||||
|  |  | ||||||
|  |   - added missing static keyword QRinput::check (found by Luke Brookhart, Onjax LLC) | ||||||
							
								
								
									
										67
									
								
								webui/system/helper/phpqrcode/INSTALL
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										67
									
								
								webui/system/helper/phpqrcode/INSTALL
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,67 @@ | |||||||
|  | == REQUIREMENTS == | ||||||
|  |  | ||||||
|  |  * PHP5 | ||||||
|  |  * PHP GD2 extension with JPEG and PNG support | ||||||
|  |   | ||||||
|  | == INSTALLATION == | ||||||
|  |  | ||||||
|  | If you want to recreate cache by yourself make sure cache directory is | ||||||
|  | writable and you have permisions to write into it. Also make sure you are | ||||||
|  | able to read files in it if you have cache option enabled | ||||||
|  |   | ||||||
|  | == CONFIGURATION == | ||||||
|  |  | ||||||
|  | Feel free to modify config constants in qrconfig.php file. Read about it in | ||||||
|  | provided comments and project wiki page (links in README file) | ||||||
|  |  | ||||||
|  | == QUICK START == | ||||||
|  |  | ||||||
|  | Notice: probably you should'nt use all of this in same script :) | ||||||
|  |  | ||||||
|  | <?phpb | ||||||
|  |  | ||||||
|  | //include only that one, rest required files will be included from it | ||||||
|  | include "qrlib.php" | ||||||
|  |  | ||||||
|  | //write code into file, Error corection lecer is lowest, L (one form: L,M,Q,H) | ||||||
|  | //each code square will be 4x4 pixels (4x zoom) | ||||||
|  | //code will have 2 code squares white boundary around  | ||||||
|  |  | ||||||
|  | QRcode::png('PHP QR Code :)', 'test.png', 'L', 4, 2); | ||||||
|  |  | ||||||
|  | //same as above but outputs file directly into browser (with appr. header etc.) | ||||||
|  | //all other settings are default | ||||||
|  | //WARNING! it should be FIRST and ONLY output generated by script, otherwise | ||||||
|  | //rest of output will land inside PNG binary, breaking it for sure | ||||||
|  | QRcode::png('PHP QR Code :)'); | ||||||
|  |  | ||||||
|  | //show benchmark | ||||||
|  | QRtools::timeBenchmark(); | ||||||
|  |  | ||||||
|  | //rebuild cache | ||||||
|  | QRtools::buildCache(); | ||||||
|  |  | ||||||
|  | //code generated in text mode - as a binary table | ||||||
|  | //then displayed out as HTML using Unicode block building chars :) | ||||||
|  | $tab = $qr->encode('PHP QR Code :)'); | ||||||
|  | QRspec::debug($tab, true); | ||||||
|  |  | ||||||
|  | == TCPDF INTEGRATION == | ||||||
|  |  | ||||||
|  | Inside bindings/tcpdf you will find slightly modified 2dbarcodes.php. | ||||||
|  | Instal phpqrcode liblaty inside tcpdf folder, then overwrite (or merge) | ||||||
|  | 2dbarcodes.php  | ||||||
|  |  | ||||||
|  | Then use similar as example #50 from TCPDF examples: | ||||||
|  |  | ||||||
|  | <?php | ||||||
|  |  | ||||||
|  | $style = array( | ||||||
|  |     'border' => true, | ||||||
|  |     'padding' => 4, | ||||||
|  |     'fgcolor' => array(0,0,0), | ||||||
|  |     'bgcolor' => false, //array(255,255,255) | ||||||
|  | ); | ||||||
|  |  | ||||||
|  | //code name: QR, specify error correction level after semicolon (L,M,Q,H) | ||||||
|  | $pdf->write2DBarcode('PHP QR Code :)', 'QR,L', '', '', 30, 30, $style, 'N'); | ||||||
							
								
								
									
										165
									
								
								webui/system/helper/phpqrcode/LICENSE
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										165
									
								
								webui/system/helper/phpqrcode/LICENSE
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,165 @@ | |||||||
|  |                   GNU LESSER GENERAL PUBLIC LICENSE | ||||||
|  |                        Version 3, 29 June 2007 | ||||||
|  |  | ||||||
|  |  Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> | ||||||
|  |  Everyone is permitted to copy and distribute verbatim copies | ||||||
|  |  of this license document, but changing it is not allowed. | ||||||
|  |  | ||||||
|  |  | ||||||
|  |   This version of the GNU Lesser General Public License incorporates | ||||||
|  | the terms and conditions of version 3 of the GNU General Public | ||||||
|  | License, supplemented by the additional permissions listed below. | ||||||
|  |  | ||||||
|  |   0. Additional Definitions. | ||||||
|  |  | ||||||
|  |   As used herein, "this License" refers to version 3 of the GNU Lesser | ||||||
|  | General Public License, and the "GNU GPL" refers to version 3 of the GNU | ||||||
|  | General Public License. | ||||||
|  |  | ||||||
|  |   "The Library" refers to a covered work governed by this License, | ||||||
|  | other than an Application or a Combined Work as defined below. | ||||||
|  |  | ||||||
|  |   An "Application" is any work that makes use of an interface provided | ||||||
|  | by the Library, but which is not otherwise based on the Library. | ||||||
|  | Defining a subclass of a class defined by the Library is deemed a mode | ||||||
|  | of using an interface provided by the Library. | ||||||
|  |  | ||||||
|  |   A "Combined Work" is a work produced by combining or linking an | ||||||
|  | Application with the Library.  The particular version of the Library | ||||||
|  | with which the Combined Work was made is also called the "Linked | ||||||
|  | Version". | ||||||
|  |  | ||||||
|  |   The "Minimal Corresponding Source" for a Combined Work means the | ||||||
|  | Corresponding Source for the Combined Work, excluding any source code | ||||||
|  | for portions of the Combined Work that, considered in isolation, are | ||||||
|  | based on the Application, and not on the Linked Version. | ||||||
|  |  | ||||||
|  |   The "Corresponding Application Code" for a Combined Work means the | ||||||
|  | object code and/or source code for the Application, including any data | ||||||
|  | and utility programs needed for reproducing the Combined Work from the | ||||||
|  | Application, but excluding the System Libraries of the Combined Work. | ||||||
|  |  | ||||||
|  |   1. Exception to Section 3 of the GNU GPL. | ||||||
|  |  | ||||||
|  |   You may convey a covered work under sections 3 and 4 of this License | ||||||
|  | without being bound by section 3 of the GNU GPL. | ||||||
|  |  | ||||||
|  |   2. Conveying Modified Versions. | ||||||
|  |  | ||||||
|  |   If you modify a copy of the Library, and, in your modifications, a | ||||||
|  | facility refers to a function or data to be supplied by an Application | ||||||
|  | that uses the facility (other than as an argument passed when the | ||||||
|  | facility is invoked), then you may convey a copy of the modified | ||||||
|  | version: | ||||||
|  |  | ||||||
|  |    a) under this License, provided that you make a good faith effort to | ||||||
|  |    ensure that, in the event an Application does not supply the | ||||||
|  |    function or data, the facility still operates, and performs | ||||||
|  |    whatever part of its purpose remains meaningful, or | ||||||
|  |  | ||||||
|  |    b) under the GNU GPL, with none of the additional permissions of | ||||||
|  |    this License applicable to that copy. | ||||||
|  |  | ||||||
|  |   3. Object Code Incorporating Material from Library Header Files. | ||||||
|  |  | ||||||
|  |   The object code form of an Application may incorporate material from | ||||||
|  | a header file that is part of the Library.  You may convey such object | ||||||
|  | code under terms of your choice, provided that, if the incorporated | ||||||
|  | material is not limited to numerical parameters, data structure | ||||||
|  | layouts and accessors, or small macros, inline functions and templates | ||||||
|  | (ten or fewer lines in length), you do both of the following: | ||||||
|  |  | ||||||
|  |    a) Give prominent notice with each copy of the object code that the | ||||||
|  |    Library is used in it and that the Library and its use are | ||||||
|  |    covered by this License. | ||||||
|  |  | ||||||
|  |    b) Accompany the object code with a copy of the GNU GPL and this license | ||||||
|  |    document. | ||||||
|  |  | ||||||
|  |   4. Combined Works. | ||||||
|  |  | ||||||
|  |   You may convey a Combined Work under terms of your choice that, | ||||||
|  | taken together, effectively do not restrict modification of the | ||||||
|  | portions of the Library contained in the Combined Work and reverse | ||||||
|  | engineering for debugging such modifications, if you also do each of | ||||||
|  | the following: | ||||||
|  |  | ||||||
|  |    a) Give prominent notice with each copy of the Combined Work that | ||||||
|  |    the Library is used in it and that the Library and its use are | ||||||
|  |    covered by this License. | ||||||
|  |  | ||||||
|  |    b) Accompany the Combined Work with a copy of the GNU GPL and this license | ||||||
|  |    document. | ||||||
|  |  | ||||||
|  |    c) For a Combined Work that displays copyright notices during | ||||||
|  |    execution, include the copyright notice for the Library among | ||||||
|  |    these notices, as well as a reference directing the user to the | ||||||
|  |    copies of the GNU GPL and this license document. | ||||||
|  |  | ||||||
|  |    d) Do one of the following: | ||||||
|  |  | ||||||
|  |        0) Convey the Minimal Corresponding Source under the terms of this | ||||||
|  |        License, and the Corresponding Application Code in a form | ||||||
|  |        suitable for, and under terms that permit, the user to | ||||||
|  |        recombine or relink the Application with a modified version of | ||||||
|  |        the Linked Version to produce a modified Combined Work, in the | ||||||
|  |        manner specified by section 6 of the GNU GPL for conveying | ||||||
|  |        Corresponding Source. | ||||||
|  |  | ||||||
|  |        1) Use a suitable shared library mechanism for linking with the | ||||||
|  |        Library.  A suitable mechanism is one that (a) uses at run time | ||||||
|  |        a copy of the Library already present on the user's computer | ||||||
|  |        system, and (b) will operate properly with a modified version | ||||||
|  |        of the Library that is interface-compatible with the Linked | ||||||
|  |        Version. | ||||||
|  |  | ||||||
|  |    e) Provide Installation Information, but only if you would otherwise | ||||||
|  |    be required to provide such information under section 6 of the | ||||||
|  |    GNU GPL, and only to the extent that such information is | ||||||
|  |    necessary to install and execute a modified version of the | ||||||
|  |    Combined Work produced by recombining or relinking the | ||||||
|  |    Application with a modified version of the Linked Version. (If | ||||||
|  |    you use option 4d0, the Installation Information must accompany | ||||||
|  |    the Minimal Corresponding Source and Corresponding Application | ||||||
|  |    Code. If you use option 4d1, you must provide the Installation | ||||||
|  |    Information in the manner specified by section 6 of the GNU GPL | ||||||
|  |    for conveying Corresponding Source.) | ||||||
|  |  | ||||||
|  |   5. Combined Libraries. | ||||||
|  |  | ||||||
|  |   You may place library facilities that are a work based on the | ||||||
|  | Library side by side in a single library together with other library | ||||||
|  | facilities that are not Applications and are not covered by this | ||||||
|  | License, and convey such a combined library under terms of your | ||||||
|  | choice, if you do both of the following: | ||||||
|  |  | ||||||
|  |    a) Accompany the combined library with a copy of the same work based | ||||||
|  |    on the Library, uncombined with any other library facilities, | ||||||
|  |    conveyed under the terms of this License. | ||||||
|  |  | ||||||
|  |    b) Give prominent notice with the combined library that part of it | ||||||
|  |    is a work based on the Library, and explaining where to find the | ||||||
|  |    accompanying uncombined form of the same work. | ||||||
|  |  | ||||||
|  |   6. Revised Versions of the GNU Lesser General Public License. | ||||||
|  |  | ||||||
|  |   The Free Software Foundation may publish revised and/or new versions | ||||||
|  | of the GNU Lesser General Public License from time to time. Such new | ||||||
|  | versions will be similar in spirit to the present version, but may | ||||||
|  | differ in detail to address new problems or concerns. | ||||||
|  |  | ||||||
|  |   Each version is given a distinguishing version number. If the | ||||||
|  | Library as you received it specifies that a certain numbered version | ||||||
|  | of the GNU Lesser General Public License "or any later version" | ||||||
|  | applies to it, you have the option of following the terms and | ||||||
|  | conditions either of that published version or of any later version | ||||||
|  | published by the Free Software Foundation. If the Library as you | ||||||
|  | received it does not specify a version number of the GNU Lesser | ||||||
|  | General Public License, you may choose any version of the GNU Lesser | ||||||
|  | General Public License ever published by the Free Software Foundation. | ||||||
|  |  | ||||||
|  |   If the Library as you received it specifies that a proxy can decide | ||||||
|  | whether future versions of the GNU Lesser General Public License shall | ||||||
|  | apply, that proxy's public statement of acceptance of any version is | ||||||
|  | permanent authorization for you to choose that version for the | ||||||
|  | Library. | ||||||
							
								
								
									
										45
									
								
								webui/system/helper/phpqrcode/README
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								webui/system/helper/phpqrcode/README
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,45 @@ | |||||||
|  | This is PHP implementation of QR Code 2-D barcode generator. It is pure-php | ||||||
|  | LGPL-licensed implementation based on C libqrencode by Kentaro Fukuchi. | ||||||
|  |  | ||||||
|  | == LICENSING == | ||||||
|  |  | ||||||
|  | Copyright (C) 2010 by Dominik Dzienia  | ||||||
|  |  | ||||||
|  | This library is free software; you can redistribute it and/or modify it under | ||||||
|  | the terms of the GNU Lesser General Public License as published by the Free | ||||||
|  | Software Foundation; either version 3 of the License, or any later version. | ||||||
|  |  | ||||||
|  | This library is distributed in the hope that it will be useful, but WITHOUT ANY | ||||||
|  | WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A | ||||||
|  | PARTICULAR PURPOSE. See the GNU Lesser General Public License (LICENSE file) | ||||||
|  | for more details. | ||||||
|  |  | ||||||
|  | You should have received a copy of the GNU Lesser General Public License along | ||||||
|  | with this library; if not, write to the Free Software Foundation, Inc., 51 | ||||||
|  | Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||||||
|  |  | ||||||
|  | == INSTALATION AND USAGE == | ||||||
|  |  | ||||||
|  |  * INSTALL file | ||||||
|  |  * http://sourceforge.net/apps/mediawiki/phpqrcode/index.php?title=Main_Page | ||||||
|  |  | ||||||
|  | == CONTACT == | ||||||
|  |  | ||||||
|  | Fell free to contact me via e-mail (deltalab at poczta dot fm) or using | ||||||
|  | folowing project pages: | ||||||
|  |  | ||||||
|  |  * http://sourceforge.net/projects/phpqrcode/ | ||||||
|  |  * http://phpqrcode.sourceforge.net/ | ||||||
|  |    | ||||||
|  | == ACKNOWLEDGMENTS == | ||||||
|  |  | ||||||
|  | Based on C libqrencode library (ver. 3.1.1)  | ||||||
|  | Copyright (C) 2006-2010 by Kentaro Fukuchi | ||||||
|  | http://megaui.net/fukuchi/works/qrencode/index.en.html | ||||||
|  |  | ||||||
|  | QR Code is registered trademarks of DENSO WAVE INCORPORATED in JAPAN and other | ||||||
|  | countries. | ||||||
|  |  | ||||||
|  | Reed-Solomon code encoder is written by Phil Karn, KA9Q. | ||||||
|  | Copyright (C) 2002, 2003, 2004, 2006 Phil Karn, KA9Q | ||||||
|  |   | ||||||
							
								
								
									
										2
									
								
								webui/system/helper/phpqrcode/VERSION
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								webui/system/helper/phpqrcode/VERSION
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,2 @@ | |||||||
|  | 1.1.4 | ||||||
|  | 2010100721 | ||||||
							
								
								
									
										2875
									
								
								webui/system/helper/phpqrcode/bindings/tcpdf/qrcode.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2875
									
								
								webui/system/helper/phpqrcode/bindings/tcpdf/qrcode.php
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										94
									
								
								webui/system/helper/phpqrcode/index.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										94
									
								
								webui/system/helper/phpqrcode/index.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,94 @@ | |||||||
|  | <?php     | ||||||
|  | /* | ||||||
|  |  * PHP QR Code encoder | ||||||
|  |  * | ||||||
|  |  * Exemplatory usage | ||||||
|  |  * | ||||||
|  |  * PHP QR Code is distributed under LGPL 3 | ||||||
|  |  * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm> | ||||||
|  |  * | ||||||
|  |  * This library is free software; you can redistribute it and/or | ||||||
|  |  * modify it under the terms of the GNU Lesser General Public | ||||||
|  |  * License as published by the Free Software Foundation; either | ||||||
|  |  * version 3 of the License, or any later version. | ||||||
|  |  * | ||||||
|  |  * This library is distributed in the hope that it will be useful, | ||||||
|  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||||||
|  |  * Lesser General Public License for more details. | ||||||
|  |  * | ||||||
|  |  * You should have received a copy of the GNU Lesser General Public | ||||||
|  |  * License along with this library; if not, write to the Free Software | ||||||
|  |  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||||||
|  |  */ | ||||||
|  |      | ||||||
|  |     echo "<h1>PHP QR Code</h1><hr/>"; | ||||||
|  |      | ||||||
|  |     //set it to writable location, a place for temp generated PNG files | ||||||
|  |     $PNG_TEMP_DIR = dirname(__FILE__).DIRECTORY_SEPARATOR.'temp'.DIRECTORY_SEPARATOR; | ||||||
|  |      | ||||||
|  |     //html PNG location prefix | ||||||
|  |     $PNG_WEB_DIR = 'temp/'; | ||||||
|  |  | ||||||
|  |     include "qrlib.php";     | ||||||
|  |      | ||||||
|  |     //ofcourse we need rights to create temp dir | ||||||
|  |     if (!file_exists($PNG_TEMP_DIR)) | ||||||
|  |         mkdir($PNG_TEMP_DIR); | ||||||
|  |      | ||||||
|  |      | ||||||
|  |     $filename = $PNG_TEMP_DIR.'test.png'; | ||||||
|  |      | ||||||
|  |     //processing form input | ||||||
|  |     //remember to sanitize user input in real-life solution !!! | ||||||
|  |     $errorCorrectionLevel = 'L'; | ||||||
|  |     if (isset($_REQUEST['level']) && in_array($_REQUEST['level'], array('L','M','Q','H'))) | ||||||
|  |         $errorCorrectionLevel = $_REQUEST['level'];     | ||||||
|  |  | ||||||
|  |     $matrixPointSize = 4; | ||||||
|  |     if (isset($_REQUEST['size'])) | ||||||
|  |         $matrixPointSize = min(max((int)$_REQUEST['size'], 1), 10); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     if (isset($_REQUEST['data'])) {  | ||||||
|  |      | ||||||
|  |         //it's very important! | ||||||
|  |         if (trim($_REQUEST['data']) == '') | ||||||
|  |             die('data cannot be empty! <a href="?">back</a>'); | ||||||
|  |              | ||||||
|  |         // user data | ||||||
|  |         $filename = $PNG_TEMP_DIR.'test'.md5($_REQUEST['data'].'|'.$errorCorrectionLevel.'|'.$matrixPointSize).'.png'; | ||||||
|  |         QRcode::png($_REQUEST['data'], $filename, $errorCorrectionLevel, $matrixPointSize, 2);     | ||||||
|  |          | ||||||
|  |     } else {     | ||||||
|  |      | ||||||
|  |         //default data | ||||||
|  |         echo 'You can provide data in GET parameter: <a href="?data=like_that">like that</a><hr/>';     | ||||||
|  |         QRcode::png('PHP QR Code :)', $filename, $errorCorrectionLevel, $matrixPointSize, 2);     | ||||||
|  |          | ||||||
|  |     }     | ||||||
|  |          | ||||||
|  |     //display generated file | ||||||
|  |     echo '<img src="'.$PNG_WEB_DIR.basename($filename).'" /><hr/>';   | ||||||
|  |      | ||||||
|  |     //config form | ||||||
|  |     echo '<form action="index.php" method="post"> | ||||||
|  |         Data: <input name="data" value="'.(isset($_REQUEST['data'])?htmlspecialchars($_REQUEST['data']):'PHP QR Code :)').'" />  | ||||||
|  |         ECC: <select name="level"> | ||||||
|  |             <option value="L"'.(($errorCorrectionLevel=='L')?' selected':'').'>L - smallest</option> | ||||||
|  |             <option value="M"'.(($errorCorrectionLevel=='M')?' selected':'').'>M</option> | ||||||
|  |             <option value="Q"'.(($errorCorrectionLevel=='Q')?' selected':'').'>Q</option> | ||||||
|  |             <option value="H"'.(($errorCorrectionLevel=='H')?' selected':'').'>H - best</option> | ||||||
|  |         </select>  | ||||||
|  |         Size: <select name="size">'; | ||||||
|  |          | ||||||
|  |     for($i=1;$i<=10;$i++) | ||||||
|  |         echo '<option value="'.$i.'"'.(($matrixPointSize==$i)?' selected':'').'>'.$i.'</option>'; | ||||||
|  |          | ||||||
|  |     echo '</select>  | ||||||
|  |         <input type="submit" value="GENERATE"></form><hr/>'; | ||||||
|  |          | ||||||
|  |     // benchmark | ||||||
|  |     QRtools::timeBenchmark();     | ||||||
|  |  | ||||||
|  |      | ||||||
							
								
								
									
										3312
									
								
								webui/system/helper/phpqrcode/phpqrcode.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3312
									
								
								webui/system/helper/phpqrcode/phpqrcode.php
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										180
									
								
								webui/system/helper/phpqrcode/qrbitstream.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										180
									
								
								webui/system/helper/phpqrcode/qrbitstream.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,180 @@ | |||||||
|  | <?php | ||||||
|  | /* | ||||||
|  |  * PHP QR Code encoder | ||||||
|  |  * | ||||||
|  |  * Bitstream class | ||||||
|  |  * | ||||||
|  |  * Based on libqrencode C library distributed under LGPL 2.1 | ||||||
|  |  * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi <fukuchi@megaui.net> | ||||||
|  |  * | ||||||
|  |  * PHP QR Code is distributed under LGPL 3 | ||||||
|  |  * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm> | ||||||
|  |  * | ||||||
|  |  * This library is free software; you can redistribute it and/or | ||||||
|  |  * modify it under the terms of the GNU Lesser General Public | ||||||
|  |  * License as published by the Free Software Foundation; either | ||||||
|  |  * version 3 of the License, or any later version. | ||||||
|  |  * | ||||||
|  |  * This library is distributed in the hope that it will be useful, | ||||||
|  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||||||
|  |  * Lesser General Public License for more details. | ||||||
|  |  * | ||||||
|  |  * You should have received a copy of the GNU Lesser General Public | ||||||
|  |  * License along with this library; if not, write to the Free Software | ||||||
|  |  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||||||
|  |  */ | ||||||
|  |       | ||||||
|  |     class QRbitstream { | ||||||
|  |      | ||||||
|  |         public $data = array(); | ||||||
|  |          | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public function size() | ||||||
|  |         { | ||||||
|  |             return count($this->data); | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public function allocate($setLength) | ||||||
|  |         { | ||||||
|  |             $this->data = array_fill(0, $setLength, 0); | ||||||
|  |             return 0; | ||||||
|  |         } | ||||||
|  |      | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public static function newFromNum($bits, $num) | ||||||
|  |         { | ||||||
|  |             $bstream = new QRbitstream(); | ||||||
|  |             $bstream->allocate($bits); | ||||||
|  |              | ||||||
|  |             $mask = 1 << ($bits - 1); | ||||||
|  |             for($i=0; $i<$bits; $i++) { | ||||||
|  |                 if($num & $mask) { | ||||||
|  |                     $bstream->data[$i] = 1; | ||||||
|  |                 } else { | ||||||
|  |                     $bstream->data[$i] = 0; | ||||||
|  |                 } | ||||||
|  |                 $mask = $mask >> 1; | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             return $bstream; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public static function newFromBytes($size, $data) | ||||||
|  |         { | ||||||
|  |             $bstream = new QRbitstream(); | ||||||
|  |             $bstream->allocate($size * 8); | ||||||
|  |             $p=0; | ||||||
|  |  | ||||||
|  |             for($i=0; $i<$size; $i++) { | ||||||
|  |                 $mask = 0x80; | ||||||
|  |                 for($j=0; $j<8; $j++) { | ||||||
|  |                     if($data[$i] & $mask) { | ||||||
|  |                         $bstream->data[$p] = 1; | ||||||
|  |                     } else { | ||||||
|  |                         $bstream->data[$p] = 0; | ||||||
|  |                     } | ||||||
|  |                     $p++; | ||||||
|  |                     $mask = $mask >> 1; | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             return $bstream; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public function append(QRbitstream $arg) | ||||||
|  |         { | ||||||
|  |             if (is_null($arg)) { | ||||||
|  |                 return -1; | ||||||
|  |             } | ||||||
|  |              | ||||||
|  |             if($arg->size() == 0) { | ||||||
|  |                 return 0; | ||||||
|  |             } | ||||||
|  |              | ||||||
|  |             if($this->size() == 0) { | ||||||
|  |                 $this->data = $arg->data; | ||||||
|  |                 return 0; | ||||||
|  |             } | ||||||
|  |              | ||||||
|  |             $this->data = array_values(array_merge($this->data, $arg->data)); | ||||||
|  |  | ||||||
|  |             return 0; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public function appendNum($bits, $num) | ||||||
|  |         { | ||||||
|  |             if ($bits == 0)  | ||||||
|  |                 return 0; | ||||||
|  |  | ||||||
|  |             $b = QRbitstream::newFromNum($bits, $num); | ||||||
|  |              | ||||||
|  |             if(is_null($b)) | ||||||
|  |                 return -1; | ||||||
|  |  | ||||||
|  |             $ret = $this->append($b); | ||||||
|  |             unset($b); | ||||||
|  |  | ||||||
|  |             return $ret; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public function appendBytes($size, $data) | ||||||
|  |         { | ||||||
|  |             if ($size == 0)  | ||||||
|  |                 return 0; | ||||||
|  |  | ||||||
|  |             $b = QRbitstream::newFromBytes($size, $data); | ||||||
|  |              | ||||||
|  |             if(is_null($b)) | ||||||
|  |                 return -1; | ||||||
|  |  | ||||||
|  |             $ret = $this->append($b); | ||||||
|  |             unset($b); | ||||||
|  |  | ||||||
|  |             return $ret; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public function toByte() | ||||||
|  |         { | ||||||
|  |          | ||||||
|  |             $size = $this->size(); | ||||||
|  |  | ||||||
|  |             if($size == 0) { | ||||||
|  |                 return array(); | ||||||
|  |             } | ||||||
|  |              | ||||||
|  |             $data = array_fill(0, (int)(($size + 7) / 8), 0); | ||||||
|  |             $bytes = (int)($size / 8); | ||||||
|  |  | ||||||
|  |             $p = 0; | ||||||
|  |              | ||||||
|  |             for($i=0; $i<$bytes; $i++) { | ||||||
|  |                 $v = 0; | ||||||
|  |                 for($j=0; $j<8; $j++) { | ||||||
|  |                     $v = $v << 1; | ||||||
|  |                     $v |= $this->data[$p]; | ||||||
|  |                     $p++; | ||||||
|  |                 } | ||||||
|  |                 $data[$i] = $v; | ||||||
|  |             } | ||||||
|  |              | ||||||
|  |             if($size & 7) { | ||||||
|  |                 $v = 0; | ||||||
|  |                 for($j=0; $j<($size & 7); $j++) { | ||||||
|  |                     $v = $v << 1; | ||||||
|  |                     $v |= $this->data[$p]; | ||||||
|  |                     $p++; | ||||||
|  |                 } | ||||||
|  |                 $data[$bytes] = $v; | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             return $data; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |     } | ||||||
							
								
								
									
										18
									
								
								webui/system/helper/phpqrcode/qrconfig.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								webui/system/helper/phpqrcode/qrconfig.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,18 @@ | |||||||
|  | <?php | ||||||
|  | /* | ||||||
|  |  * PHP QR Code encoder | ||||||
|  |  * | ||||||
|  |  * Config file, feel free to modify | ||||||
|  |  */ | ||||||
|  |       | ||||||
|  |     define('QR_CACHEABLE', false);                                                              // use cache - more disk reads but less CPU power, masks and format templates are stored there | ||||||
|  |     define('QR_CACHE_DIR', dirname(__FILE__).DIRECTORY_SEPARATOR.'cache'.DIRECTORY_SEPARATOR);  // used when QR_CACHEABLE === true | ||||||
|  |     //define('QR_LOG_DIR', dirname(__FILE__).DIRECTORY_SEPARATOR);                              // default error logs dir    | ||||||
|  |     define('QR_LOG_DIR', false); | ||||||
|  |   | ||||||
|  |     define('QR_FIND_BEST_MASK', true);                                                          // if true, estimates best mask (spec. default, but extremally slow; set to false to significant performance boost but (propably) worst quality code | ||||||
|  |     define('QR_FIND_FROM_RANDOM', false);                                                       // if false, checks all masks available, otherwise value tells count of masks need to be checked, mask id are got randomly | ||||||
|  |     define('QR_DEFAULT_MASK', 2);                                                               // when QR_FIND_BEST_MASK === false | ||||||
|  |                                                    | ||||||
|  |     define('QR_PNG_MAXIMUM_SIZE',  1024);                                                       // maximum allowed png image width (in pixels), tune to make sure GD and PHP can handle such big images | ||||||
|  |                                                    | ||||||
							
								
								
									
										54
									
								
								webui/system/helper/phpqrcode/qrconst.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								webui/system/helper/phpqrcode/qrconst.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,54 @@ | |||||||
|  | <?php | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * PHP QR Code encoder | ||||||
|  |  * | ||||||
|  |  * Common constants | ||||||
|  |  * | ||||||
|  |  * Based on libqrencode C library distributed under LGPL 2.1 | ||||||
|  |  * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi <fukuchi@megaui.net> | ||||||
|  |  * | ||||||
|  |  * PHP QR Code is distributed under LGPL 3 | ||||||
|  |  * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm> | ||||||
|  |  * | ||||||
|  |  * This library is free software; you can redistribute it and/or | ||||||
|  |  * modify it under the terms of the GNU Lesser General Public | ||||||
|  |  * License as published by the Free Software Foundation; either | ||||||
|  |  * version 3 of the License, or any later version. | ||||||
|  |  * | ||||||
|  |  * This library is distributed in the hope that it will be useful, | ||||||
|  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||||||
|  |  * Lesser General Public License for more details. | ||||||
|  |  * | ||||||
|  |  * You should have received a copy of the GNU Lesser General Public | ||||||
|  |  * License along with this library; if not, write to the Free Software | ||||||
|  |  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||||||
|  |  */ | ||||||
|  |   | ||||||
|  | 	// Encoding modes | ||||||
|  | 	  | ||||||
|  | 	define('QR_MODE_NUL', -1); | ||||||
|  | 	define('QR_MODE_NUM', 0); | ||||||
|  | 	define('QR_MODE_AN', 1); | ||||||
|  | 	define('QR_MODE_8', 2); | ||||||
|  | 	define('QR_MODE_KANJI', 3); | ||||||
|  | 	define('QR_MODE_STRUCTURE', 4); | ||||||
|  |  | ||||||
|  | 	// Levels of error correction. | ||||||
|  |  | ||||||
|  | 	define('QR_ECLEVEL_L', 0); | ||||||
|  | 	define('QR_ECLEVEL_M', 1); | ||||||
|  | 	define('QR_ECLEVEL_Q', 2); | ||||||
|  | 	define('QR_ECLEVEL_H', 3); | ||||||
|  | 	 | ||||||
|  | 	// Supported output formats | ||||||
|  | 	 | ||||||
|  | 	define('QR_FORMAT_TEXT', 0); | ||||||
|  | 	define('QR_FORMAT_PNG',  1); | ||||||
|  | 	 | ||||||
|  | 	class qrstr { | ||||||
|  | 		public static function set(&$srctab, $x, $y, $repl, $replLen = false) { | ||||||
|  | 			$srctab[$y] = substr_replace($srctab[$y], ($replLen !== false)?substr($repl,0,$replLen):$repl, $x, ($replLen !== false)?$replLen:strlen($repl)); | ||||||
|  | 		} | ||||||
|  | 	}	 | ||||||
							
								
								
									
										502
									
								
								webui/system/helper/phpqrcode/qrencode.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										502
									
								
								webui/system/helper/phpqrcode/qrencode.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,502 @@ | |||||||
|  | <?php | ||||||
|  | /* | ||||||
|  |  * PHP QR Code encoder | ||||||
|  |  * | ||||||
|  |  * Main encoder classes. | ||||||
|  |  * | ||||||
|  |  * Based on libqrencode C library distributed under LGPL 2.1 | ||||||
|  |  * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi <fukuchi@megaui.net> | ||||||
|  |  * | ||||||
|  |  * PHP QR Code is distributed under LGPL 3 | ||||||
|  |  * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm> | ||||||
|  |  * | ||||||
|  |  * This library is free software; you can redistribute it and/or | ||||||
|  |  * modify it under the terms of the GNU Lesser General Public | ||||||
|  |  * License as published by the Free Software Foundation; either | ||||||
|  |  * version 3 of the License, or any later version. | ||||||
|  |  * | ||||||
|  |  * This library is distributed in the hope that it will be useful, | ||||||
|  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||||||
|  |  * Lesser General Public License for more details. | ||||||
|  |  * | ||||||
|  |  * You should have received a copy of the GNU Lesser General Public | ||||||
|  |  * License along with this library; if not, write to the Free Software | ||||||
|  |  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||||||
|  |  */ | ||||||
|  |   | ||||||
|  |     class QRrsblock { | ||||||
|  |         public $dataLength; | ||||||
|  |         public $data = array(); | ||||||
|  |         public $eccLength; | ||||||
|  |         public $ecc = array(); | ||||||
|  |          | ||||||
|  |         public function __construct($dl, $data, $el, &$ecc, QRrsItem $rs) | ||||||
|  |         { | ||||||
|  |             $rs->encode_rs_char($data, $ecc); | ||||||
|  |          | ||||||
|  |             $this->dataLength = $dl; | ||||||
|  |             $this->data = $data; | ||||||
|  |             $this->eccLength = $el; | ||||||
|  |             $this->ecc = $ecc; | ||||||
|  |         } | ||||||
|  |     }; | ||||||
|  |      | ||||||
|  |     //########################################################################## | ||||||
|  |  | ||||||
|  |     class QRrawcode { | ||||||
|  |         public $version; | ||||||
|  |         public $datacode = array(); | ||||||
|  |         public $ecccode = array(); | ||||||
|  |         public $blocks; | ||||||
|  |         public $rsblocks = array(); //of RSblock | ||||||
|  |         public $count; | ||||||
|  |         public $dataLength; | ||||||
|  |         public $eccLength; | ||||||
|  |         public $b1; | ||||||
|  |          | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public function __construct(QRinput $input) | ||||||
|  |         { | ||||||
|  |             $spec = array(0,0,0,0,0); | ||||||
|  |              | ||||||
|  |             $this->datacode = $input->getByteStream(); | ||||||
|  |             if(is_null($this->datacode)) { | ||||||
|  |                 throw new Exception('null imput string'); | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             QRspec::getEccSpec($input->getVersion(), $input->getErrorCorrectionLevel(), $spec); | ||||||
|  |  | ||||||
|  |             $this->version = $input->getVersion(); | ||||||
|  |             $this->b1 = QRspec::rsBlockNum1($spec); | ||||||
|  |             $this->dataLength = QRspec::rsDataLength($spec); | ||||||
|  |             $this->eccLength = QRspec::rsEccLength($spec); | ||||||
|  |             $this->ecccode = array_fill(0, $this->eccLength, 0); | ||||||
|  |             $this->blocks = QRspec::rsBlockNum($spec); | ||||||
|  |              | ||||||
|  |             $ret = $this->init($spec); | ||||||
|  |             if($ret < 0) { | ||||||
|  |                 throw new Exception('block alloc error'); | ||||||
|  |                 return null; | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             $this->count = 0; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public function init(array $spec) | ||||||
|  |         { | ||||||
|  |             $dl = QRspec::rsDataCodes1($spec); | ||||||
|  |             $el = QRspec::rsEccCodes1($spec); | ||||||
|  |             $rs = QRrs::init_rs(8, 0x11d, 0, 1, $el, 255 - $dl - $el); | ||||||
|  |              | ||||||
|  |  | ||||||
|  |             $blockNo = 0; | ||||||
|  |             $dataPos = 0; | ||||||
|  |             $eccPos = 0; | ||||||
|  |             for($i=0; $i<QRspec::rsBlockNum1($spec); $i++) { | ||||||
|  |                 $ecc = array_slice($this->ecccode,$eccPos); | ||||||
|  |                 $this->rsblocks[$blockNo] = new QRrsblock($dl, array_slice($this->datacode, $dataPos), $el,  $ecc, $rs); | ||||||
|  |                 $this->ecccode = array_merge(array_slice($this->ecccode,0, $eccPos), $ecc); | ||||||
|  |                  | ||||||
|  |                 $dataPos += $dl; | ||||||
|  |                 $eccPos += $el; | ||||||
|  |                 $blockNo++; | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             if(QRspec::rsBlockNum2($spec) == 0) | ||||||
|  |                 return 0; | ||||||
|  |  | ||||||
|  |             $dl = QRspec::rsDataCodes2($spec); | ||||||
|  |             $el = QRspec::rsEccCodes2($spec); | ||||||
|  |             $rs = QRrs::init_rs(8, 0x11d, 0, 1, $el, 255 - $dl - $el); | ||||||
|  |              | ||||||
|  |             if($rs == NULL) return -1; | ||||||
|  |              | ||||||
|  |             for($i=0; $i<QRspec::rsBlockNum2($spec); $i++) { | ||||||
|  |                 $ecc = array_slice($this->ecccode,$eccPos); | ||||||
|  |                 $this->rsblocks[$blockNo] = new QRrsblock($dl, array_slice($this->datacode, $dataPos), $el, $ecc, $rs); | ||||||
|  |                 $this->ecccode = array_merge(array_slice($this->ecccode,0, $eccPos), $ecc); | ||||||
|  |                  | ||||||
|  |                 $dataPos += $dl; | ||||||
|  |                 $eccPos += $el; | ||||||
|  |                 $blockNo++; | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             return 0; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public function getCode() | ||||||
|  |         { | ||||||
|  |             $ret; | ||||||
|  |  | ||||||
|  |             if($this->count < $this->dataLength) { | ||||||
|  |                 $row = $this->count % $this->blocks; | ||||||
|  |                 $col = $this->count / $this->blocks; | ||||||
|  |                 if($col >= $this->rsblocks[0]->dataLength) { | ||||||
|  |                     $row += $this->b1; | ||||||
|  |                 } | ||||||
|  |                 $ret = $this->rsblocks[$row]->data[$col]; | ||||||
|  |             } else if($this->count < $this->dataLength + $this->eccLength) { | ||||||
|  |                 $row = ($this->count - $this->dataLength) % $this->blocks; | ||||||
|  |                 $col = ($this->count - $this->dataLength) / $this->blocks; | ||||||
|  |                 $ret = $this->rsblocks[$row]->ecc[$col]; | ||||||
|  |             } else { | ||||||
|  |                 return 0; | ||||||
|  |             } | ||||||
|  |             $this->count++; | ||||||
|  |              | ||||||
|  |             return $ret; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     //########################################################################## | ||||||
|  |      | ||||||
|  |     class QRcode { | ||||||
|  |      | ||||||
|  |         public $version; | ||||||
|  |         public $width; | ||||||
|  |         public $data;  | ||||||
|  |          | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public function encodeMask(QRinput $input, $mask) | ||||||
|  |         { | ||||||
|  |             if($input->getVersion() < 0 || $input->getVersion() > QRSPEC_VERSION_MAX) { | ||||||
|  |                 throw new Exception('wrong version'); | ||||||
|  |             } | ||||||
|  |             if($input->getErrorCorrectionLevel() > QR_ECLEVEL_H) { | ||||||
|  |                 throw new Exception('wrong level'); | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             $raw = new QRrawcode($input); | ||||||
|  |              | ||||||
|  |             QRtools::markTime('after_raw'); | ||||||
|  |              | ||||||
|  |             $version = $raw->version; | ||||||
|  |             $width = QRspec::getWidth($version); | ||||||
|  |             $frame = QRspec::newFrame($version); | ||||||
|  |              | ||||||
|  |             $filler = new FrameFiller($width, $frame); | ||||||
|  |             if(is_null($filler)) { | ||||||
|  |                 return NULL; | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             // inteleaved data and ecc codes | ||||||
|  |             for($i=0; $i<$raw->dataLength + $raw->eccLength; $i++) { | ||||||
|  |                 $code = $raw->getCode(); | ||||||
|  |                 $bit = 0x80; | ||||||
|  |                 for($j=0; $j<8; $j++) { | ||||||
|  |                     $addr = $filler->next(); | ||||||
|  |                     $filler->setFrameAt($addr, 0x02 | (($bit & $code) != 0)); | ||||||
|  |                     $bit = $bit >> 1; | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |              | ||||||
|  |             QRtools::markTime('after_filler'); | ||||||
|  |              | ||||||
|  |             unset($raw); | ||||||
|  |              | ||||||
|  |             // remainder bits | ||||||
|  |             $j = QRspec::getRemainder($version); | ||||||
|  |             for($i=0; $i<$j; $i++) { | ||||||
|  |                 $addr = $filler->next(); | ||||||
|  |                 $filler->setFrameAt($addr, 0x02); | ||||||
|  |             } | ||||||
|  |              | ||||||
|  |             $frame = $filler->frame; | ||||||
|  |             unset($filler); | ||||||
|  |              | ||||||
|  |              | ||||||
|  |             // masking | ||||||
|  |             $maskObj = new QRmask(); | ||||||
|  |             if($mask < 0) { | ||||||
|  |              | ||||||
|  |                 if (QR_FIND_BEST_MASK) { | ||||||
|  |                     $masked = $maskObj->mask($width, $frame, $input->getErrorCorrectionLevel()); | ||||||
|  |                 } else { | ||||||
|  |                     $masked = $maskObj->makeMask($width, $frame, (intval(QR_DEFAULT_MASK) % 8), $input->getErrorCorrectionLevel()); | ||||||
|  |                 } | ||||||
|  |             } else { | ||||||
|  |                 $masked = $maskObj->makeMask($width, $frame, $mask, $input->getErrorCorrectionLevel()); | ||||||
|  |             } | ||||||
|  |              | ||||||
|  |             if($masked == NULL) { | ||||||
|  |                 return NULL; | ||||||
|  |             } | ||||||
|  |              | ||||||
|  |             QRtools::markTime('after_mask'); | ||||||
|  |              | ||||||
|  |             $this->version = $version; | ||||||
|  |             $this->width = $width; | ||||||
|  |             $this->data = $masked; | ||||||
|  |              | ||||||
|  |             return $this; | ||||||
|  |         } | ||||||
|  |      | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public function encodeInput(QRinput $input) | ||||||
|  |         { | ||||||
|  |             return $this->encodeMask($input, -1); | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public function encodeString8bit($string, $version, $level) | ||||||
|  |         { | ||||||
|  |             if(string == NULL) { | ||||||
|  |                 throw new Exception('empty string!'); | ||||||
|  |                 return NULL; | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             $input = new QRinput($version, $level); | ||||||
|  |             if($input == NULL) return NULL; | ||||||
|  |  | ||||||
|  |             $ret = $input->append($input, QR_MODE_8, strlen($string), str_split($string)); | ||||||
|  |             if($ret < 0) { | ||||||
|  |                 unset($input); | ||||||
|  |                 return NULL; | ||||||
|  |             } | ||||||
|  |             return $this->encodeInput($input); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public function encodeString($string, $version, $level, $hint, $casesensitive) | ||||||
|  |         { | ||||||
|  |  | ||||||
|  |             if($hint != QR_MODE_8 && $hint != QR_MODE_KANJI) { | ||||||
|  |                 throw new Exception('bad hint'); | ||||||
|  |                 return NULL; | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             $input = new QRinput($version, $level); | ||||||
|  |             if($input == NULL) return NULL; | ||||||
|  |  | ||||||
|  |             $ret = QRsplit::splitStringToQRinput($string, $input, $hint, $casesensitive); | ||||||
|  |             if($ret < 0) { | ||||||
|  |                 return NULL; | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             return $this->encodeInput($input); | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public static function png($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4, $saveandprint=false)  | ||||||
|  |         { | ||||||
|  |             $enc = QRencode::factory($level, $size, $margin); | ||||||
|  |             return $enc->encodePNG($text, $outfile, $saveandprint=false); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public static function text($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4)  | ||||||
|  |         { | ||||||
|  |             $enc = QRencode::factory($level, $size, $margin); | ||||||
|  |             return $enc->encode($text, $outfile); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public static function raw($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4)  | ||||||
|  |         { | ||||||
|  |             $enc = QRencode::factory($level, $size, $margin); | ||||||
|  |             return $enc->encodeRAW($text, $outfile); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     //########################################################################## | ||||||
|  |      | ||||||
|  |     class FrameFiller { | ||||||
|  |      | ||||||
|  |         public $width; | ||||||
|  |         public $frame; | ||||||
|  |         public $x; | ||||||
|  |         public $y; | ||||||
|  |         public $dir; | ||||||
|  |         public $bit; | ||||||
|  |          | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public function __construct($width, &$frame) | ||||||
|  |         { | ||||||
|  |             $this->width = $width; | ||||||
|  |             $this->frame = $frame; | ||||||
|  |             $this->x = $width - 1; | ||||||
|  |             $this->y = $width - 1; | ||||||
|  |             $this->dir = -1; | ||||||
|  |             $this->bit = -1; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public function setFrameAt($at, $val) | ||||||
|  |         { | ||||||
|  |             $this->frame[$at['y']][$at['x']] = chr($val); | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public function getFrameAt($at) | ||||||
|  |         { | ||||||
|  |             return ord($this->frame[$at['y']][$at['x']]); | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public function next() | ||||||
|  |         { | ||||||
|  |             do { | ||||||
|  |              | ||||||
|  |                 if($this->bit == -1) { | ||||||
|  |                     $this->bit = 0; | ||||||
|  |                     return array('x'=>$this->x, 'y'=>$this->y); | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 $x = $this->x; | ||||||
|  |                 $y = $this->y; | ||||||
|  |                 $w = $this->width; | ||||||
|  |  | ||||||
|  |                 if($this->bit == 0) { | ||||||
|  |                     $x--; | ||||||
|  |                     $this->bit++; | ||||||
|  |                 } else { | ||||||
|  |                     $x++; | ||||||
|  |                     $y += $this->dir; | ||||||
|  |                     $this->bit--; | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 if($this->dir < 0) { | ||||||
|  |                     if($y < 0) { | ||||||
|  |                         $y = 0; | ||||||
|  |                         $x -= 2; | ||||||
|  |                         $this->dir = 1; | ||||||
|  |                         if($x == 6) { | ||||||
|  |                             $x--; | ||||||
|  |                             $y = 9; | ||||||
|  |                         } | ||||||
|  |                     } | ||||||
|  |                 } else { | ||||||
|  |                     if($y == $w) { | ||||||
|  |                         $y = $w - 1; | ||||||
|  |                         $x -= 2; | ||||||
|  |                         $this->dir = -1; | ||||||
|  |                         if($x == 6) { | ||||||
|  |                             $x--; | ||||||
|  |                             $y -= 8; | ||||||
|  |                         } | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |                 if($x < 0 || $y < 0) return null; | ||||||
|  |  | ||||||
|  |                 $this->x = $x; | ||||||
|  |                 $this->y = $y; | ||||||
|  |  | ||||||
|  |             } while(ord($this->frame[$y][$x]) & 0x80); | ||||||
|  |                          | ||||||
|  |             return array('x'=>$x, 'y'=>$y); | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |     } ; | ||||||
|  |      | ||||||
|  |     //##########################################################################     | ||||||
|  |      | ||||||
|  |     class QRencode { | ||||||
|  |      | ||||||
|  |         public $casesensitive = true; | ||||||
|  |         public $eightbit = false; | ||||||
|  |          | ||||||
|  |         public $version = 0; | ||||||
|  |         public $size = 3; | ||||||
|  |         public $margin = 4; | ||||||
|  |          | ||||||
|  |         public $structured = 0; // not supported yet | ||||||
|  |          | ||||||
|  |         public $level = QR_ECLEVEL_L; | ||||||
|  |         public $hint = QR_MODE_8; | ||||||
|  |          | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public static function factory($level = QR_ECLEVEL_L, $size = 3, $margin = 4) | ||||||
|  |         { | ||||||
|  |             $enc = new QRencode(); | ||||||
|  |             $enc->size = $size; | ||||||
|  |             $enc->margin = $margin; | ||||||
|  |              | ||||||
|  |             switch ($level.'') { | ||||||
|  |                 case '0': | ||||||
|  |                 case '1': | ||||||
|  |                 case '2': | ||||||
|  |                 case '3': | ||||||
|  |                         $enc->level = $level; | ||||||
|  |                     break; | ||||||
|  |                 case 'l': | ||||||
|  |                 case 'L': | ||||||
|  |                         $enc->level = QR_ECLEVEL_L; | ||||||
|  |                     break; | ||||||
|  |                 case 'm': | ||||||
|  |                 case 'M': | ||||||
|  |                         $enc->level = QR_ECLEVEL_M; | ||||||
|  |                     break; | ||||||
|  |                 case 'q': | ||||||
|  |                 case 'Q': | ||||||
|  |                         $enc->level = QR_ECLEVEL_Q; | ||||||
|  |                     break; | ||||||
|  |                 case 'h': | ||||||
|  |                 case 'H': | ||||||
|  |                         $enc->level = QR_ECLEVEL_H; | ||||||
|  |                     break; | ||||||
|  |             } | ||||||
|  |              | ||||||
|  |             return $enc; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public function encodeRAW($intext, $outfile = false)  | ||||||
|  |         { | ||||||
|  |             $code = new QRcode(); | ||||||
|  |  | ||||||
|  |             if($this->eightbit) { | ||||||
|  |                 $code->encodeString8bit($intext, $this->version, $this->level); | ||||||
|  |             } else { | ||||||
|  |                 $code->encodeString($intext, $this->version, $this->level, $this->hint, $this->casesensitive); | ||||||
|  |             } | ||||||
|  |              | ||||||
|  |             return $code->data; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public function encode($intext, $outfile = false)  | ||||||
|  |         { | ||||||
|  |             $code = new QRcode(); | ||||||
|  |  | ||||||
|  |             if($this->eightbit) { | ||||||
|  |                 $code->encodeString8bit($intext, $this->version, $this->level); | ||||||
|  |             } else { | ||||||
|  |                 $code->encodeString($intext, $this->version, $this->level, $this->hint, $this->casesensitive); | ||||||
|  |             } | ||||||
|  |              | ||||||
|  |             QRtools::markTime('after_encode'); | ||||||
|  |              | ||||||
|  |             if ($outfile!== false) { | ||||||
|  |                 file_put_contents($outfile, join("\n", QRtools::binarize($code->data))); | ||||||
|  |             } else { | ||||||
|  |                 return QRtools::binarize($code->data); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public function encodePNG($intext, $outfile = false,$saveandprint=false)  | ||||||
|  |         { | ||||||
|  |             try { | ||||||
|  |              | ||||||
|  |                 ob_start(); | ||||||
|  |                 $tab = $this->encode($intext); | ||||||
|  |                 $err = ob_get_contents(); | ||||||
|  |                 ob_end_clean(); | ||||||
|  |                  | ||||||
|  |                 if ($err != '') | ||||||
|  |                     QRtools::log($outfile, $err); | ||||||
|  |                  | ||||||
|  |                 $maxSize = (int)(QR_PNG_MAXIMUM_SIZE / (count($tab)+2*$this->margin)); | ||||||
|  |                  | ||||||
|  |                 QRimage::png($tab, $outfile, min(max(1, $this->size), $maxSize), $this->margin,$saveandprint); | ||||||
|  |              | ||||||
|  |             } catch (Exception $e) { | ||||||
|  |              | ||||||
|  |                 QRtools::log($outfile, $e->getMessage()); | ||||||
|  |              | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
							
								
								
									
										95
									
								
								webui/system/helper/phpqrcode/qrimage.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										95
									
								
								webui/system/helper/phpqrcode/qrimage.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,95 @@ | |||||||
|  | <?php | ||||||
|  | /* | ||||||
|  |  * PHP QR Code encoder | ||||||
|  |  * | ||||||
|  |  * Image output of code using GD2 | ||||||
|  |  * | ||||||
|  |  * PHP QR Code is distributed under LGPL 3 | ||||||
|  |  * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm> | ||||||
|  |  * | ||||||
|  |  * This library is free software; you can redistribute it and/or | ||||||
|  |  * modify it under the terms of the GNU Lesser General Public | ||||||
|  |  * License as published by the Free Software Foundation; either | ||||||
|  |  * version 3 of the License, or any later version. | ||||||
|  |  * | ||||||
|  |  * This library is distributed in the hope that it will be useful, | ||||||
|  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||||||
|  |  * Lesser General Public License for more details. | ||||||
|  |  * | ||||||
|  |  * You should have received a copy of the GNU Lesser General Public | ||||||
|  |  * License along with this library; if not, write to the Free Software | ||||||
|  |  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||||||
|  |  */ | ||||||
|  |   | ||||||
|  |     define('QR_IMAGE', true); | ||||||
|  |  | ||||||
|  |     class QRimage { | ||||||
|  |      | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public static function png($frame, $filename = false, $pixelPerPoint = 4, $outerFrame = 4,$saveandprint=FALSE)  | ||||||
|  |         { | ||||||
|  |             $image = self::image($frame, $pixelPerPoint, $outerFrame); | ||||||
|  |              | ||||||
|  |             if ($filename === false) { | ||||||
|  |                 Header("Content-type: image/png"); | ||||||
|  |                 ImagePng($image); | ||||||
|  |             } else { | ||||||
|  |                 if($saveandprint===TRUE){ | ||||||
|  |                     ImagePng($image, $filename); | ||||||
|  |                     header("Content-type: image/png"); | ||||||
|  |                     ImagePng($image); | ||||||
|  |                 }else{ | ||||||
|  |                     ImagePng($image, $filename); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |              | ||||||
|  |             ImageDestroy($image); | ||||||
|  |         } | ||||||
|  |      | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public static function jpg($frame, $filename = false, $pixelPerPoint = 8, $outerFrame = 4, $q = 85)  | ||||||
|  |         { | ||||||
|  |             $image = self::image($frame, $pixelPerPoint, $outerFrame); | ||||||
|  |              | ||||||
|  |             if ($filename === false) { | ||||||
|  |                 Header("Content-type: image/jpeg"); | ||||||
|  |                 ImageJpeg($image, null, $q); | ||||||
|  |             } else { | ||||||
|  |                 ImageJpeg($image, $filename, $q);             | ||||||
|  |             } | ||||||
|  |              | ||||||
|  |             ImageDestroy($image); | ||||||
|  |         } | ||||||
|  |      | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         private static function image($frame, $pixelPerPoint = 4, $outerFrame = 4)  | ||||||
|  |         { | ||||||
|  |             $h = count($frame); | ||||||
|  |             $w = strlen($frame[0]); | ||||||
|  |              | ||||||
|  |             $imgW = $w + 2*$outerFrame; | ||||||
|  |             $imgH = $h + 2*$outerFrame; | ||||||
|  |              | ||||||
|  |             $base_image =ImageCreate($imgW, $imgH); | ||||||
|  |              | ||||||
|  |             $col[0] = ImageColorAllocate($base_image,255,255,255); | ||||||
|  |             $col[1] = ImageColorAllocate($base_image,0,0,0); | ||||||
|  |  | ||||||
|  |             imagefill($base_image, 0, 0, $col[0]); | ||||||
|  |  | ||||||
|  |             for($y=0; $y<$h; $y++) { | ||||||
|  |                 for($x=0; $x<$w; $x++) { | ||||||
|  |                     if ($frame[$y][$x] == '1') { | ||||||
|  |                         ImageSetPixel($base_image,$x+$outerFrame,$y+$outerFrame,$col[1]);  | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |              | ||||||
|  |             $target_image =ImageCreate($imgW * $pixelPerPoint, $imgH * $pixelPerPoint); | ||||||
|  |             ImageCopyResized($target_image, $base_image, 0, 0, 0, 0, $imgW * $pixelPerPoint, $imgH * $pixelPerPoint, $imgW, $imgH); | ||||||
|  |             ImageDestroy($base_image); | ||||||
|  |              | ||||||
|  |             return $target_image; | ||||||
|  |         } | ||||||
|  |     } | ||||||
							
								
								
									
										729
									
								
								webui/system/helper/phpqrcode/qrinput.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										729
									
								
								webui/system/helper/phpqrcode/qrinput.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,729 @@ | |||||||
|  | <?php | ||||||
|  | /* | ||||||
|  |  * PHP QR Code encoder | ||||||
|  |  * | ||||||
|  |  * Input encoding class | ||||||
|  |  * | ||||||
|  |  * Based on libqrencode C library distributed under LGPL 2.1 | ||||||
|  |  * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi <fukuchi@megaui.net> | ||||||
|  |  * | ||||||
|  |  * PHP QR Code is distributed under LGPL 3 | ||||||
|  |  * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm> | ||||||
|  |  * | ||||||
|  |  * This library is free software; you can redistribute it and/or | ||||||
|  |  * modify it under the terms of the GNU Lesser General Public | ||||||
|  |  * License as published by the Free Software Foundation; either | ||||||
|  |  * version 3 of the License, or any later version. | ||||||
|  |  * | ||||||
|  |  * This library is distributed in the hope that it will be useful, | ||||||
|  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||||||
|  |  * Lesser General Public License for more details. | ||||||
|  |  * | ||||||
|  |  * You should have received a copy of the GNU Lesser General Public | ||||||
|  |  * License along with this library; if not, write to the Free Software | ||||||
|  |  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||||||
|  |  */ | ||||||
|  |   | ||||||
|  |     define('STRUCTURE_HEADER_BITS',  20); | ||||||
|  |     define('MAX_STRUCTURED_SYMBOLS', 16); | ||||||
|  |  | ||||||
|  |     class QRinputItem { | ||||||
|  |      | ||||||
|  |         public $mode; | ||||||
|  |         public $size; | ||||||
|  |         public $data; | ||||||
|  |         public $bstream; | ||||||
|  |  | ||||||
|  |         public function __construct($mode, $size, $data, $bstream = null)  | ||||||
|  |         { | ||||||
|  |             $setData = array_slice($data, 0, $size); | ||||||
|  |              | ||||||
|  |             if (count($setData) < $size) { | ||||||
|  |                 $setData = array_merge($setData, array_fill(0,$size-count($setData),0)); | ||||||
|  |             } | ||||||
|  |          | ||||||
|  |             if(!QRinput::check($mode, $size, $setData)) { | ||||||
|  |                 throw new Exception('Error m:'.$mode.',s:'.$size.',d:'.join(',',$setData)); | ||||||
|  |                 return null; | ||||||
|  |             } | ||||||
|  |              | ||||||
|  |             $this->mode = $mode; | ||||||
|  |             $this->size = $size; | ||||||
|  |             $this->data = $setData; | ||||||
|  |             $this->bstream = $bstream; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public function encodeModeNum($version) | ||||||
|  |         { | ||||||
|  |             try { | ||||||
|  |              | ||||||
|  |                 $words = (int)($this->size / 3); | ||||||
|  |                 $bs = new QRbitstream(); | ||||||
|  |                  | ||||||
|  |                 $val = 0x1; | ||||||
|  |                 $bs->appendNum(4, $val); | ||||||
|  |                 $bs->appendNum(QRspec::lengthIndicator(QR_MODE_NUM, $version), $this->size); | ||||||
|  |  | ||||||
|  |                 for($i=0; $i<$words; $i++) { | ||||||
|  |                     $val  = (ord($this->data[$i*3  ]) - ord('0')) * 100; | ||||||
|  |                     $val += (ord($this->data[$i*3+1]) - ord('0')) * 10; | ||||||
|  |                     $val += (ord($this->data[$i*3+2]) - ord('0')); | ||||||
|  |                     $bs->appendNum(10, $val); | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 if($this->size - $words * 3 == 1) { | ||||||
|  |                     $val = ord($this->data[$words*3]) - ord('0'); | ||||||
|  |                     $bs->appendNum(4, $val); | ||||||
|  |                 } else if($this->size - $words * 3 == 2) { | ||||||
|  |                     $val  = (ord($this->data[$words*3  ]) - ord('0')) * 10; | ||||||
|  |                     $val += (ord($this->data[$words*3+1]) - ord('0')); | ||||||
|  |                     $bs->appendNum(7, $val); | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 $this->bstream = $bs; | ||||||
|  |                 return 0; | ||||||
|  |                  | ||||||
|  |             } catch (Exception $e) { | ||||||
|  |                 return -1; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public function encodeModeAn($version) | ||||||
|  |         { | ||||||
|  |             try { | ||||||
|  |                 $words = (int)($this->size / 2); | ||||||
|  |                 $bs = new QRbitstream(); | ||||||
|  |                  | ||||||
|  |                 $bs->appendNum(4, 0x02); | ||||||
|  |                 $bs->appendNum(QRspec::lengthIndicator(QR_MODE_AN, $version), $this->size); | ||||||
|  |  | ||||||
|  |                 for($i=0; $i<$words; $i++) { | ||||||
|  |                     $val  = (int)QRinput::lookAnTable(ord($this->data[$i*2  ])) * 45; | ||||||
|  |                     $val += (int)QRinput::lookAnTable(ord($this->data[$i*2+1])); | ||||||
|  |  | ||||||
|  |                     $bs->appendNum(11, $val); | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 if($this->size & 1) { | ||||||
|  |                     $val = QRinput::lookAnTable(ord($this->data[$words * 2])); | ||||||
|  |                     $bs->appendNum(6, $val); | ||||||
|  |                 } | ||||||
|  |          | ||||||
|  |                 $this->bstream = $bs; | ||||||
|  |                 return 0; | ||||||
|  |              | ||||||
|  |             } catch (Exception $e) { | ||||||
|  |                 return -1; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public function encodeMode8($version) | ||||||
|  |         { | ||||||
|  |             try { | ||||||
|  |                 $bs = new QRbitstream(); | ||||||
|  |  | ||||||
|  |                 $bs->appendNum(4, 0x4); | ||||||
|  |                 $bs->appendNum(QRspec::lengthIndicator(QR_MODE_8, $version), $this->size); | ||||||
|  |  | ||||||
|  |                 for($i=0; $i<$this->size; $i++) { | ||||||
|  |                     $bs->appendNum(8, ord($this->data[$i])); | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 $this->bstream = $bs; | ||||||
|  |                 return 0; | ||||||
|  |              | ||||||
|  |             } catch (Exception $e) { | ||||||
|  |                 return -1; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public function encodeModeKanji($version) | ||||||
|  |         { | ||||||
|  |             try { | ||||||
|  |  | ||||||
|  |                 $bs = new QRbitrtream(); | ||||||
|  |                  | ||||||
|  |                 $bs->appendNum(4, 0x8); | ||||||
|  |                 $bs->appendNum(QRspec::lengthIndicator(QR_MODE_KANJI, $version), (int)($this->size / 2)); | ||||||
|  |  | ||||||
|  |                 for($i=0; $i<$this->size; $i+=2) { | ||||||
|  |                     $val = (ord($this->data[$i]) << 8) | ord($this->data[$i+1]); | ||||||
|  |                     if($val <= 0x9ffc) { | ||||||
|  |                         $val -= 0x8140; | ||||||
|  |                     } else { | ||||||
|  |                         $val -= 0xc140; | ||||||
|  |                     } | ||||||
|  |                      | ||||||
|  |                     $h = ($val >> 8) * 0xc0; | ||||||
|  |                     $val = ($val & 0xff) + $h; | ||||||
|  |  | ||||||
|  |                     $bs->appendNum(13, $val); | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 $this->bstream = $bs; | ||||||
|  |                 return 0; | ||||||
|  |              | ||||||
|  |             } catch (Exception $e) { | ||||||
|  |                 return -1; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public function encodeModeStructure() | ||||||
|  |         { | ||||||
|  |             try { | ||||||
|  |                 $bs =  new QRbitstream(); | ||||||
|  |                  | ||||||
|  |                 $bs->appendNum(4, 0x03); | ||||||
|  |                 $bs->appendNum(4, ord($this->data[1]) - 1); | ||||||
|  |                 $bs->appendNum(4, ord($this->data[0]) - 1); | ||||||
|  |                 $bs->appendNum(8, ord($this->data[2])); | ||||||
|  |  | ||||||
|  |                 $this->bstream = $bs; | ||||||
|  |                 return 0; | ||||||
|  |              | ||||||
|  |             } catch (Exception $e) { | ||||||
|  |                 return -1; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public function estimateBitStreamSizeOfEntry($version) | ||||||
|  |         { | ||||||
|  |             $bits = 0; | ||||||
|  |  | ||||||
|  |             if($version == 0)  | ||||||
|  |                 $version = 1; | ||||||
|  |  | ||||||
|  |             switch($this->mode) { | ||||||
|  |                 case QR_MODE_NUM:        $bits = QRinput::estimateBitsModeNum($this->size);    break; | ||||||
|  |                 case QR_MODE_AN:        $bits = QRinput::estimateBitsModeAn($this->size);    break; | ||||||
|  |                 case QR_MODE_8:            $bits = QRinput::estimateBitsMode8($this->size);    break; | ||||||
|  |                 case QR_MODE_KANJI:        $bits = QRinput::estimateBitsModeKanji($this->size);break; | ||||||
|  |                 case QR_MODE_STRUCTURE:    return STRUCTURE_HEADER_BITS;             | ||||||
|  |                 default: | ||||||
|  |                     return 0; | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             $l = QRspec::lengthIndicator($this->mode, $version); | ||||||
|  |             $m = 1 << $l; | ||||||
|  |             $num = (int)(($this->size + $m - 1) / $m); | ||||||
|  |  | ||||||
|  |             $bits += $num * (4 + $l); | ||||||
|  |  | ||||||
|  |             return $bits; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public function encodeBitStream($version) | ||||||
|  |         { | ||||||
|  |             try { | ||||||
|  |              | ||||||
|  |                 unset($this->bstream); | ||||||
|  |                 $words = QRspec::maximumWords($this->mode, $version); | ||||||
|  |                  | ||||||
|  |                 if($this->size > $words) { | ||||||
|  |                  | ||||||
|  |                     $st1 = new QRinputItem($this->mode, $words, $this->data); | ||||||
|  |                     $st2 = new QRinputItem($this->mode, $this->size - $words, array_slice($this->data, $words)); | ||||||
|  |  | ||||||
|  |                     $st1->encodeBitStream($version); | ||||||
|  |                     $st2->encodeBitStream($version); | ||||||
|  |                      | ||||||
|  |                     $this->bstream = new QRbitstream(); | ||||||
|  |                     $this->bstream->append($st1->bstream); | ||||||
|  |                     $this->bstream->append($st2->bstream); | ||||||
|  |                      | ||||||
|  |                     unset($st1); | ||||||
|  |                     unset($st2); | ||||||
|  |                      | ||||||
|  |                 } else { | ||||||
|  |                      | ||||||
|  |                     $ret = 0; | ||||||
|  |                      | ||||||
|  |                     switch($this->mode) { | ||||||
|  |                         case QR_MODE_NUM:        $ret = $this->encodeModeNum($version);    break; | ||||||
|  |                         case QR_MODE_AN:        $ret = $this->encodeModeAn($version);    break; | ||||||
|  |                         case QR_MODE_8:            $ret = $this->encodeMode8($version);    break; | ||||||
|  |                         case QR_MODE_KANJI:        $ret = $this->encodeModeKanji($version);break; | ||||||
|  |                         case QR_MODE_STRUCTURE:    $ret = $this->encodeModeStructure();    break; | ||||||
|  |                          | ||||||
|  |                         default: | ||||||
|  |                             break; | ||||||
|  |                     } | ||||||
|  |                      | ||||||
|  |                     if($ret < 0) | ||||||
|  |                         return -1; | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 return $this->bstream->size(); | ||||||
|  |              | ||||||
|  |             } catch (Exception $e) { | ||||||
|  |                 return -1; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     }; | ||||||
|  |      | ||||||
|  |     //########################################################################## | ||||||
|  |  | ||||||
|  |     class QRinput { | ||||||
|  |  | ||||||
|  |         public $items; | ||||||
|  |          | ||||||
|  |         private $version; | ||||||
|  |         private $level; | ||||||
|  |          | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public function __construct($version = 0, $level = QR_ECLEVEL_L) | ||||||
|  |         { | ||||||
|  |             if ($version < 0 || $version > QRSPEC_VERSION_MAX || $level > QR_ECLEVEL_H) { | ||||||
|  |                 throw new Exception('Invalid version no'); | ||||||
|  |                 return NULL; | ||||||
|  |             } | ||||||
|  |              | ||||||
|  |             $this->version = $version; | ||||||
|  |             $this->level = $level; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public function getVersion() | ||||||
|  |         { | ||||||
|  |             return $this->version; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public function setVersion($version) | ||||||
|  |         { | ||||||
|  |             if($version < 0 || $version > QRSPEC_VERSION_MAX) { | ||||||
|  |                 throw new Exception('Invalid version no'); | ||||||
|  |                 return -1; | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             $this->version = $version; | ||||||
|  |  | ||||||
|  |             return 0; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public function getErrorCorrectionLevel() | ||||||
|  |         { | ||||||
|  |             return $this->level; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public function setErrorCorrectionLevel($level) | ||||||
|  |         { | ||||||
|  |             if($level > QR_ECLEVEL_H) { | ||||||
|  |                 throw new Exception('Invalid ECLEVEL'); | ||||||
|  |                 return -1; | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             $this->level = $level; | ||||||
|  |  | ||||||
|  |             return 0; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public function appendEntry(QRinputItem $entry) | ||||||
|  |         { | ||||||
|  |             $this->items[] = $entry; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public function append($mode, $size, $data) | ||||||
|  |         { | ||||||
|  |             try { | ||||||
|  |                 $entry = new QRinputItem($mode, $size, $data); | ||||||
|  |                 $this->items[] = $entry; | ||||||
|  |                 return 0; | ||||||
|  |             } catch (Exception $e) { | ||||||
|  |                 return -1; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |          | ||||||
|  |         public function insertStructuredAppendHeader($size, $index, $parity) | ||||||
|  |         { | ||||||
|  |             if( $size > MAX_STRUCTURED_SYMBOLS ) { | ||||||
|  |                 throw new Exception('insertStructuredAppendHeader wrong size'); | ||||||
|  |             } | ||||||
|  |              | ||||||
|  |             if( $index <= 0 || $index > MAX_STRUCTURED_SYMBOLS ) { | ||||||
|  |                 throw new Exception('insertStructuredAppendHeader wrong index'); | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             $buf = array($size, $index, $parity); | ||||||
|  |              | ||||||
|  |             try { | ||||||
|  |                 $entry = new QRinputItem(QR_MODE_STRUCTURE, 3, buf); | ||||||
|  |                 array_unshift($this->items, $entry); | ||||||
|  |                 return 0; | ||||||
|  |             } catch (Exception $e) { | ||||||
|  |                 return -1; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public function calcParity() | ||||||
|  |         { | ||||||
|  |             $parity = 0; | ||||||
|  |              | ||||||
|  |             foreach($this->items as $item) { | ||||||
|  |                 if($item->mode != QR_MODE_STRUCTURE) { | ||||||
|  |                     for($i=$item->size-1; $i>=0; $i--) { | ||||||
|  |                         $parity ^= $item->data[$i]; | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             return $parity; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public static function checkModeNum($size, $data) | ||||||
|  |         { | ||||||
|  |             for($i=0; $i<$size; $i++) { | ||||||
|  |                 if((ord($data[$i]) < ord('0')) || (ord($data[$i]) > ord('9'))){ | ||||||
|  |                     return false; | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             return true; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public static function estimateBitsModeNum($size) | ||||||
|  |         { | ||||||
|  |             $w = (int)$size / 3; | ||||||
|  |             $bits = $w * 10; | ||||||
|  |              | ||||||
|  |             switch($size - $w * 3) { | ||||||
|  |                 case 1: | ||||||
|  |                     $bits += 4; | ||||||
|  |                     break; | ||||||
|  |                 case 2: | ||||||
|  |                     $bits += 7; | ||||||
|  |                     break; | ||||||
|  |                 default: | ||||||
|  |                     break; | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             return $bits; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public static $anTable = array( | ||||||
|  |             -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, | ||||||
|  |             -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, | ||||||
|  |             36, -1, -1, -1, 37, 38, -1, -1, -1, -1, 39, 40, -1, 41, 42, 43, | ||||||
|  |              0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 44, -1, -1, -1, -1, -1, | ||||||
|  |             -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, | ||||||
|  |             25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, | ||||||
|  |             -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, | ||||||
|  |             -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 | ||||||
|  |         ); | ||||||
|  |          | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public static function lookAnTable($c) | ||||||
|  |         { | ||||||
|  |             return (($c > 127)?-1:self::$anTable[$c]); | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public static function checkModeAn($size, $data) | ||||||
|  |         { | ||||||
|  |             for($i=0; $i<$size; $i++) { | ||||||
|  |                 if (self::lookAnTable(ord($data[$i])) == -1) { | ||||||
|  |                     return false; | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             return true; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public static function estimateBitsModeAn($size) | ||||||
|  |         { | ||||||
|  |             $w = (int)($size / 2); | ||||||
|  |             $bits = $w * 11; | ||||||
|  |              | ||||||
|  |             if($size & 1) { | ||||||
|  |                 $bits += 6; | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             return $bits; | ||||||
|  |         } | ||||||
|  |      | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public static function estimateBitsMode8($size) | ||||||
|  |         { | ||||||
|  |             return $size * 8; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public function estimateBitsModeKanji($size) | ||||||
|  |         { | ||||||
|  |             return (int)(($size / 2) * 13); | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public static function checkModeKanji($size, $data) | ||||||
|  |         { | ||||||
|  |             if($size & 1) | ||||||
|  |                 return false; | ||||||
|  |  | ||||||
|  |             for($i=0; $i<$size; $i+=2) { | ||||||
|  |                 $val = (ord($data[$i]) << 8) | ord($data[$i+1]); | ||||||
|  |                 if( $val < 0x8140  | ||||||
|  |                 || ($val > 0x9ffc && $val < 0xe040)  | ||||||
|  |                 || $val > 0xebbf) { | ||||||
|  |                     return false; | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             return true; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         /*********************************************************************** | ||||||
|  |          * Validation | ||||||
|  |          **********************************************************************/ | ||||||
|  |  | ||||||
|  |         public static function check($mode, $size, $data) | ||||||
|  |         { | ||||||
|  |             if($size <= 0)  | ||||||
|  |                 return false; | ||||||
|  |  | ||||||
|  |             switch($mode) { | ||||||
|  |                 case QR_MODE_NUM:       return self::checkModeNum($size, $data);   break; | ||||||
|  |                 case QR_MODE_AN:        return self::checkModeAn($size, $data);    break; | ||||||
|  |                 case QR_MODE_KANJI:     return self::checkModeKanji($size, $data); break; | ||||||
|  |                 case QR_MODE_8:         return true; break; | ||||||
|  |                 case QR_MODE_STRUCTURE: return true; break; | ||||||
|  |                  | ||||||
|  |                 default: | ||||||
|  |                     break; | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             return false; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |          | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public function estimateBitStreamSize($version) | ||||||
|  |         { | ||||||
|  |             $bits = 0; | ||||||
|  |  | ||||||
|  |             foreach($this->items as $item) { | ||||||
|  |                 $bits += $item->estimateBitStreamSizeOfEntry($version); | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             return $bits; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public function estimateVersion() | ||||||
|  |         { | ||||||
|  |             $version = 0; | ||||||
|  |             $prev = 0; | ||||||
|  |             do { | ||||||
|  |                 $prev = $version; | ||||||
|  |                 $bits = $this->estimateBitStreamSize($prev); | ||||||
|  |                 $version = QRspec::getMinimumVersion((int)(($bits + 7) / 8), $this->level); | ||||||
|  |                 if ($version < 0) { | ||||||
|  |                     return -1; | ||||||
|  |                 } | ||||||
|  |             } while ($version > $prev); | ||||||
|  |  | ||||||
|  |             return $version; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public static function lengthOfCode($mode, $version, $bits) | ||||||
|  |         { | ||||||
|  |             $payload = $bits - 4 - QRspec::lengthIndicator($mode, $version); | ||||||
|  |             switch($mode) { | ||||||
|  |                 case QR_MODE_NUM: | ||||||
|  |                     $chunks = (int)($payload / 10); | ||||||
|  |                     $remain = $payload - $chunks * 10; | ||||||
|  |                     $size = $chunks * 3; | ||||||
|  |                     if($remain >= 7) { | ||||||
|  |                         $size += 2; | ||||||
|  |                     } else if($remain >= 4) { | ||||||
|  |                         $size += 1; | ||||||
|  |                     } | ||||||
|  |                     break; | ||||||
|  |                 case QR_MODE_AN: | ||||||
|  |                     $chunks = (int)($payload / 11); | ||||||
|  |                     $remain = $payload - $chunks * 11; | ||||||
|  |                     $size = $chunks * 2; | ||||||
|  |                     if($remain >= 6)  | ||||||
|  |                         $size++; | ||||||
|  |                     break; | ||||||
|  |                 case QR_MODE_8: | ||||||
|  |                     $size = (int)($payload / 8); | ||||||
|  |                     break; | ||||||
|  |                 case QR_MODE_KANJI: | ||||||
|  |                     $size = (int)(($payload / 13) * 2); | ||||||
|  |                     break; | ||||||
|  |                 case QR_MODE_STRUCTURE: | ||||||
|  |                     $size = (int)($payload / 8); | ||||||
|  |                     break; | ||||||
|  |                 default: | ||||||
|  |                     $size = 0; | ||||||
|  |                     break; | ||||||
|  |             } | ||||||
|  |              | ||||||
|  |             $maxsize = QRspec::maximumWords($mode, $version); | ||||||
|  |             if($size < 0) $size = 0; | ||||||
|  |             if($size > $maxsize) $size = $maxsize; | ||||||
|  |  | ||||||
|  |             return $size; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public function createBitStream() | ||||||
|  |         { | ||||||
|  |             $total = 0; | ||||||
|  |  | ||||||
|  |             foreach($this->items as $item) { | ||||||
|  |                 $bits = $item->encodeBitStream($this->version); | ||||||
|  |                  | ||||||
|  |                 if($bits < 0)  | ||||||
|  |                     return -1; | ||||||
|  |                      | ||||||
|  |                 $total += $bits; | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             return $total; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public function convertData() | ||||||
|  |         { | ||||||
|  |             $ver = $this->estimateVersion(); | ||||||
|  |             if($ver > $this->getVersion()) { | ||||||
|  |                 $this->setVersion($ver); | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             for(;;) { | ||||||
|  |                 $bits = $this->createBitStream(); | ||||||
|  |                  | ||||||
|  |                 if($bits < 0)  | ||||||
|  |                     return -1; | ||||||
|  |                      | ||||||
|  |                 $ver = QRspec::getMinimumVersion((int)(($bits + 7) / 8), $this->level); | ||||||
|  |                 if($ver < 0) { | ||||||
|  |                     throw new Exception('WRONG VERSION'); | ||||||
|  |                     return -1; | ||||||
|  |                 } else if($ver > $this->getVersion()) { | ||||||
|  |                     $this->setVersion($ver); | ||||||
|  |                 } else { | ||||||
|  |                     break; | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             return 0; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public function appendPaddingBit(&$bstream) | ||||||
|  |         { | ||||||
|  |             $bits = $bstream->size(); | ||||||
|  |             $maxwords = QRspec::getDataLength($this->version, $this->level); | ||||||
|  |             $maxbits = $maxwords * 8; | ||||||
|  |  | ||||||
|  |             if ($maxbits == $bits) { | ||||||
|  |                 return 0; | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             if ($maxbits - $bits < 5) { | ||||||
|  |                 return $bstream->appendNum($maxbits - $bits, 0); | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             $bits += 4; | ||||||
|  |             $words = (int)(($bits + 7) / 8); | ||||||
|  |  | ||||||
|  |             $padding = new QRbitstream(); | ||||||
|  |             $ret = $padding->appendNum($words * 8 - $bits + 4, 0); | ||||||
|  |              | ||||||
|  |             if($ret < 0)  | ||||||
|  |                 return $ret; | ||||||
|  |  | ||||||
|  |             $padlen = $maxwords - $words; | ||||||
|  |              | ||||||
|  |             if($padlen > 0) { | ||||||
|  |                  | ||||||
|  |                 $padbuf = array(); | ||||||
|  |                 for($i=0; $i<$padlen; $i++) { | ||||||
|  |                     $padbuf[$i] = ($i&1)?0x11:0xec; | ||||||
|  |                 } | ||||||
|  |                  | ||||||
|  |                 $ret = $padding->appendBytes($padlen, $padbuf); | ||||||
|  |                  | ||||||
|  |                 if($ret < 0) | ||||||
|  |                     return $ret; | ||||||
|  |                  | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             $ret = $bstream->append($padding); | ||||||
|  |              | ||||||
|  |             return $ret; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public function mergeBitStream() | ||||||
|  |         { | ||||||
|  |             if($this->convertData() < 0) { | ||||||
|  |                 return null; | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             $bstream = new QRbitstream(); | ||||||
|  |              | ||||||
|  |             foreach($this->items as $item) { | ||||||
|  |                 $ret = $bstream->append($item->bstream); | ||||||
|  |                 if($ret < 0) { | ||||||
|  |                     return null; | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             return $bstream; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public function getBitStream() | ||||||
|  |         { | ||||||
|  |  | ||||||
|  |             $bstream = $this->mergeBitStream(); | ||||||
|  |              | ||||||
|  |             if($bstream == null) { | ||||||
|  |                 return null; | ||||||
|  |             } | ||||||
|  |              | ||||||
|  |             $ret = $this->appendPaddingBit($bstream); | ||||||
|  |             if($ret < 0) { | ||||||
|  |                 return null; | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             return $bstream; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public function getByteStream() | ||||||
|  |         { | ||||||
|  |             $bstream = $this->getBitStream(); | ||||||
|  |             if($bstream == null) { | ||||||
|  |                 return null; | ||||||
|  |             } | ||||||
|  |              | ||||||
|  |             return $bstream->toByte(); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |          | ||||||
|  |          | ||||||
|  |      | ||||||
							
								
								
									
										43
									
								
								webui/system/helper/phpqrcode/qrlib.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								webui/system/helper/phpqrcode/qrlib.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,43 @@ | |||||||
|  | <?php | ||||||
|  | /* | ||||||
|  |  * PHP QR Code encoder | ||||||
|  |  * | ||||||
|  |  * Root library file, prepares environment and includes dependencies | ||||||
|  |  * | ||||||
|  |  * Based on libqrencode C library distributed under LGPL 2.1 | ||||||
|  |  * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi <fukuchi@megaui.net> | ||||||
|  |  * | ||||||
|  |  * PHP QR Code is distributed under LGPL 3 | ||||||
|  |  * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm> | ||||||
|  |  * | ||||||
|  |  * This library is free software; you can redistribute it and/or | ||||||
|  |  * modify it under the terms of the GNU Lesser General Public | ||||||
|  |  * License as published by the Free Software Foundation; either | ||||||
|  |  * version 3 of the License, or any later version. | ||||||
|  |  * | ||||||
|  |  * This library is distributed in the hope that it will be useful, | ||||||
|  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||||||
|  |  * Lesser General Public License for more details. | ||||||
|  |  * | ||||||
|  |  * You should have received a copy of the GNU Lesser General Public | ||||||
|  |  * License along with this library; if not, write to the Free Software | ||||||
|  |  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||||||
|  |  */ | ||||||
|  | 	 | ||||||
|  | 	$QR_BASEDIR = dirname(__FILE__).DIRECTORY_SEPARATOR; | ||||||
|  | 	 | ||||||
|  | 	// Required libs | ||||||
|  | 	 | ||||||
|  | 	include $QR_BASEDIR."qrconst.php"; | ||||||
|  | 	include $QR_BASEDIR."qrconfig.php"; | ||||||
|  | 	include $QR_BASEDIR."qrtools.php"; | ||||||
|  | 	include $QR_BASEDIR."qrspec.php"; | ||||||
|  | 	include $QR_BASEDIR."qrimage.php"; | ||||||
|  | 	include $QR_BASEDIR."qrinput.php"; | ||||||
|  | 	include $QR_BASEDIR."qrbitstream.php"; | ||||||
|  | 	include $QR_BASEDIR."qrsplit.php"; | ||||||
|  | 	include $QR_BASEDIR."qrrscode.php"; | ||||||
|  | 	include $QR_BASEDIR."qrmask.php"; | ||||||
|  | 	include $QR_BASEDIR."qrencode.php"; | ||||||
|  |  | ||||||
							
								
								
									
										328
									
								
								webui/system/helper/phpqrcode/qrmask.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										328
									
								
								webui/system/helper/phpqrcode/qrmask.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,328 @@ | |||||||
|  | <?php | ||||||
|  | /* | ||||||
|  |  * PHP QR Code encoder | ||||||
|  |  * | ||||||
|  |  * Masking | ||||||
|  |  * | ||||||
|  |  * Based on libqrencode C library distributed under LGPL 2.1 | ||||||
|  |  * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi <fukuchi@megaui.net> | ||||||
|  |  * | ||||||
|  |  * PHP QR Code is distributed under LGPL 3 | ||||||
|  |  * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm> | ||||||
|  |  * | ||||||
|  |  * This library is free software; you can redistribute it and/or | ||||||
|  |  * modify it under the terms of the GNU Lesser General Public | ||||||
|  |  * License as published by the Free Software Foundation; either | ||||||
|  |  * version 3 of the License, or any later version. | ||||||
|  |  * | ||||||
|  |  * This library is distributed in the hope that it will be useful, | ||||||
|  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||||||
|  |  * Lesser General Public License for more details. | ||||||
|  |  * | ||||||
|  |  * You should have received a copy of the GNU Lesser General Public | ||||||
|  |  * License along with this library; if not, write to the Free Software | ||||||
|  |  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||||||
|  |  */ | ||||||
|  |   | ||||||
|  | 	define('N1', 3); | ||||||
|  | 	define('N2', 3); | ||||||
|  | 	define('N3', 40); | ||||||
|  | 	define('N4', 10); | ||||||
|  |  | ||||||
|  | 	class QRmask { | ||||||
|  | 	 | ||||||
|  | 		public $runLength = array(); | ||||||
|  | 		 | ||||||
|  | 		//---------------------------------------------------------------------- | ||||||
|  | 		public function __construct()  | ||||||
|  |         { | ||||||
|  |             $this->runLength = array_fill(0, QRSPEC_WIDTH_MAX + 1, 0); | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public function writeFormatInformation($width, &$frame, $mask, $level) | ||||||
|  |         { | ||||||
|  |             $blacks = 0; | ||||||
|  |             $format =  QRspec::getFormatInfo($mask, $level); | ||||||
|  |  | ||||||
|  |             for($i=0; $i<8; $i++) { | ||||||
|  |                 if($format & 1) { | ||||||
|  |                     $blacks += 2; | ||||||
|  |                     $v = 0x85; | ||||||
|  |                 } else { | ||||||
|  |                     $v = 0x84; | ||||||
|  |                 } | ||||||
|  |                  | ||||||
|  |                 $frame[8][$width - 1 - $i] = chr($v); | ||||||
|  |                 if($i < 6) { | ||||||
|  |                     $frame[$i][8] = chr($v); | ||||||
|  |                 } else { | ||||||
|  |                     $frame[$i + 1][8] = chr($v); | ||||||
|  |                 } | ||||||
|  |                 $format = $format >> 1; | ||||||
|  |             } | ||||||
|  |              | ||||||
|  |             for($i=0; $i<7; $i++) { | ||||||
|  |                 if($format & 1) { | ||||||
|  |                     $blacks += 2; | ||||||
|  |                     $v = 0x85; | ||||||
|  |                 } else { | ||||||
|  |                     $v = 0x84; | ||||||
|  |                 } | ||||||
|  |                  | ||||||
|  |                 $frame[$width - 7 + $i][8] = chr($v); | ||||||
|  |                 if($i == 0) { | ||||||
|  |                     $frame[8][7] = chr($v); | ||||||
|  |                 } else { | ||||||
|  |                     $frame[8][6 - $i] = chr($v); | ||||||
|  |                 } | ||||||
|  |                  | ||||||
|  |                 $format = $format >> 1; | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             return $blacks; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public function mask0($x, $y) { return ($x+$y)&1;                       } | ||||||
|  |         public function mask1($x, $y) { return ($y&1);                          } | ||||||
|  |         public function mask2($x, $y) { return ($x%3);                          } | ||||||
|  |         public function mask3($x, $y) { return ($x+$y)%3;                       } | ||||||
|  |         public function mask4($x, $y) { return (((int)($y/2))+((int)($x/3)))&1; } | ||||||
|  |         public function mask5($x, $y) { return (($x*$y)&1)+($x*$y)%3;           } | ||||||
|  |         public function mask6($x, $y) { return ((($x*$y)&1)+($x*$y)%3)&1;       } | ||||||
|  |         public function mask7($x, $y) { return ((($x*$y)%3)+(($x+$y)&1))&1;     } | ||||||
|  |          | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         private function generateMaskNo($maskNo, $width, $frame) | ||||||
|  |         { | ||||||
|  |             $bitMask = array_fill(0, $width, array_fill(0, $width, 0)); | ||||||
|  |              | ||||||
|  |             for($y=0; $y<$width; $y++) { | ||||||
|  |                 for($x=0; $x<$width; $x++) { | ||||||
|  |                     if(ord($frame[$y][$x]) & 0x80) { | ||||||
|  |                         $bitMask[$y][$x] = 0; | ||||||
|  |                     } else { | ||||||
|  |                         $maskFunc = call_user_func(array($this, 'mask'.$maskNo), $x, $y); | ||||||
|  |                         $bitMask[$y][$x] = ($maskFunc == 0)?1:0; | ||||||
|  |                     } | ||||||
|  |                      | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |              | ||||||
|  |             return $bitMask; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public static function serial($bitFrame) | ||||||
|  |         { | ||||||
|  |             $codeArr = array(); | ||||||
|  |              | ||||||
|  |             foreach ($bitFrame as $line) | ||||||
|  |                 $codeArr[] = join('', $line); | ||||||
|  |                  | ||||||
|  |             return gzcompress(join("\n", $codeArr), 9); | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public static function unserial($code) | ||||||
|  |         { | ||||||
|  |             $codeArr = array(); | ||||||
|  |              | ||||||
|  |             $codeLines = explode("\n", gzuncompress($code)); | ||||||
|  |             foreach ($codeLines as $line) | ||||||
|  |                 $codeArr[] = str_split($line); | ||||||
|  |              | ||||||
|  |             return $codeArr; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public function makeMaskNo($maskNo, $width, $s, &$d, $maskGenOnly = false)  | ||||||
|  |         { | ||||||
|  |             $b = 0; | ||||||
|  |             $bitMask = array(); | ||||||
|  |              | ||||||
|  |             $fileName = QR_CACHE_DIR.'mask_'.$maskNo.DIRECTORY_SEPARATOR.'mask_'.$width.'_'.$maskNo.'.dat'; | ||||||
|  |  | ||||||
|  |             if (QR_CACHEABLE) { | ||||||
|  |                 if (file_exists($fileName)) { | ||||||
|  |                     $bitMask = self::unserial(file_get_contents($fileName)); | ||||||
|  |                 } else { | ||||||
|  |                     $bitMask = $this->generateMaskNo($maskNo, $width, $s, $d); | ||||||
|  |                     if (!file_exists(QR_CACHE_DIR.'mask_'.$maskNo)) | ||||||
|  |                         mkdir(QR_CACHE_DIR.'mask_'.$maskNo); | ||||||
|  |                     file_put_contents($fileName, self::serial($bitMask)); | ||||||
|  |                 } | ||||||
|  |             } else { | ||||||
|  |                 $bitMask = $this->generateMaskNo($maskNo, $width, $s, $d); | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             if ($maskGenOnly) | ||||||
|  |                 return; | ||||||
|  |                  | ||||||
|  |             $d = $s; | ||||||
|  |  | ||||||
|  |             for($y=0; $y<$width; $y++) { | ||||||
|  |                 for($x=0; $x<$width; $x++) { | ||||||
|  |                     if($bitMask[$y][$x] == 1) { | ||||||
|  |                         $d[$y][$x] = chr(ord($s[$y][$x]) ^ (int)$bitMask[$y][$x]); | ||||||
|  |                     } | ||||||
|  |                     $b += (int)(ord($d[$y][$x]) & 1); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             return $b; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public function makeMask($width, $frame, $maskNo, $level) | ||||||
|  |         { | ||||||
|  |             $masked = array_fill(0, $width, str_repeat("\0", $width)); | ||||||
|  |             $this->makeMaskNo($maskNo, $width, $frame, $masked); | ||||||
|  |             $this->writeFormatInformation($width, $masked, $maskNo, $level); | ||||||
|  |         | ||||||
|  |             return $masked; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public function calcN1N3($length) | ||||||
|  |         { | ||||||
|  |             $demerit = 0; | ||||||
|  |  | ||||||
|  |             for($i=0; $i<$length; $i++) { | ||||||
|  |                  | ||||||
|  |                 if($this->runLength[$i] >= 5) { | ||||||
|  |                     $demerit += (N1 + ($this->runLength[$i] - 5)); | ||||||
|  |                 } | ||||||
|  |                 if($i & 1) { | ||||||
|  |                     if(($i >= 3) && ($i < ($length-2)) && ($this->runLength[$i] % 3 == 0)) { | ||||||
|  |                         $fact = (int)($this->runLength[$i] / 3); | ||||||
|  |                         if(($this->runLength[$i-2] == $fact) && | ||||||
|  |                            ($this->runLength[$i-1] == $fact) && | ||||||
|  |                            ($this->runLength[$i+1] == $fact) && | ||||||
|  |                            ($this->runLength[$i+2] == $fact)) { | ||||||
|  |                             if(($this->runLength[$i-3] < 0) || ($this->runLength[$i-3] >= (4 * $fact))) { | ||||||
|  |                                 $demerit += N3; | ||||||
|  |                             } else if((($i+3) >= $length) || ($this->runLength[$i+3] >= (4 * $fact))) { | ||||||
|  |                                 $demerit += N3; | ||||||
|  |                             } | ||||||
|  |                         } | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |             return $demerit; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public function evaluateSymbol($width, $frame) | ||||||
|  |         { | ||||||
|  |             $head = 0; | ||||||
|  |             $demerit = 0; | ||||||
|  |  | ||||||
|  |             for($y=0; $y<$width; $y++) { | ||||||
|  |                 $head = 0; | ||||||
|  |                 $this->runLength[0] = 1; | ||||||
|  |                  | ||||||
|  |                 $frameY = $frame[$y]; | ||||||
|  |                  | ||||||
|  |                 if ($y>0) | ||||||
|  |                     $frameYM = $frame[$y-1]; | ||||||
|  |                  | ||||||
|  |                 for($x=0; $x<$width; $x++) { | ||||||
|  |                     if(($x > 0) && ($y > 0)) { | ||||||
|  |                         $b22 = ord($frameY[$x]) & ord($frameY[$x-1]) & ord($frameYM[$x]) & ord($frameYM[$x-1]); | ||||||
|  |                         $w22 = ord($frameY[$x]) | ord($frameY[$x-1]) | ord($frameYM[$x]) | ord($frameYM[$x-1]); | ||||||
|  |                          | ||||||
|  |                         if(($b22 | ($w22 ^ 1))&1) {                                                                      | ||||||
|  |                             $demerit += N2; | ||||||
|  |                         } | ||||||
|  |                     } | ||||||
|  |                     if(($x == 0) && (ord($frameY[$x]) & 1)) { | ||||||
|  |                         $this->runLength[0] = -1; | ||||||
|  |                         $head = 1; | ||||||
|  |                         $this->runLength[$head] = 1; | ||||||
|  |                     } else if($x > 0) { | ||||||
|  |                         if((ord($frameY[$x]) ^ ord($frameY[$x-1])) & 1) { | ||||||
|  |                             $head++; | ||||||
|  |                             $this->runLength[$head] = 1; | ||||||
|  |                         } else { | ||||||
|  |                             $this->runLength[$head]++; | ||||||
|  |                         } | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |      | ||||||
|  |                 $demerit += $this->calcN1N3($head+1); | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             for($x=0; $x<$width; $x++) { | ||||||
|  |                 $head = 0; | ||||||
|  |                 $this->runLength[0] = 1; | ||||||
|  |                  | ||||||
|  |                 for($y=0; $y<$width; $y++) { | ||||||
|  |                     if($y == 0 && (ord($frame[$y][$x]) & 1)) { | ||||||
|  |                         $this->runLength[0] = -1; | ||||||
|  |                         $head = 1; | ||||||
|  |                         $this->runLength[$head] = 1; | ||||||
|  |                     } else if($y > 0) { | ||||||
|  |                         if((ord($frame[$y][$x]) ^ ord($frame[$y-1][$x])) & 1) { | ||||||
|  |                             $head++; | ||||||
|  |                             $this->runLength[$head] = 1; | ||||||
|  |                         } else { | ||||||
|  |                             $this->runLength[$head]++; | ||||||
|  |                         } | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |              | ||||||
|  |                 $demerit += $this->calcN1N3($head+1); | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             return $demerit; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |          | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public function mask($width, $frame, $level) | ||||||
|  |         { | ||||||
|  |             $minDemerit = PHP_INT_MAX; | ||||||
|  |             $bestMaskNum = 0; | ||||||
|  |             $bestMask = array(); | ||||||
|  |              | ||||||
|  |             $checked_masks = array(0,1,2,3,4,5,6,7); | ||||||
|  |              | ||||||
|  |             if (QR_FIND_FROM_RANDOM !== false) { | ||||||
|  |              | ||||||
|  |                 $howManuOut = 8-(QR_FIND_FROM_RANDOM % 9); | ||||||
|  |                 for ($i = 0; $i <  $howManuOut; $i++) { | ||||||
|  |                     $remPos = rand (0, count($checked_masks)-1); | ||||||
|  |                     unset($checked_masks[$remPos]); | ||||||
|  |                     $checked_masks = array_values($checked_masks); | ||||||
|  |                 } | ||||||
|  |              | ||||||
|  |             } | ||||||
|  |              | ||||||
|  |             $bestMask = $frame; | ||||||
|  |               | ||||||
|  |             foreach($checked_masks as $i) { | ||||||
|  |                 $mask = array_fill(0, $width, str_repeat("\0", $width)); | ||||||
|  |  | ||||||
|  |                 $demerit = 0; | ||||||
|  |                 $blacks = 0; | ||||||
|  |                 $blacks  = $this->makeMaskNo($i, $width, $frame, $mask); | ||||||
|  |                 $blacks += $this->writeFormatInformation($width, $mask, $i, $level); | ||||||
|  |                 $blacks  = (int)(100 * $blacks / ($width * $width)); | ||||||
|  |                 $demerit = (int)((int)(abs($blacks - 50) / 5) * N4); | ||||||
|  |                 $demerit += $this->evaluateSymbol($width, $mask); | ||||||
|  |                  | ||||||
|  |                 if($demerit < $minDemerit) { | ||||||
|  |                     $minDemerit = $demerit; | ||||||
|  |                     $bestMask = $mask; | ||||||
|  |                     $bestMaskNum = $i; | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |              | ||||||
|  |             return $bestMask; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |     } | ||||||
							
								
								
									
										210
									
								
								webui/system/helper/phpqrcode/qrrscode.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										210
									
								
								webui/system/helper/phpqrcode/qrrscode.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,210 @@ | |||||||
|  | <?php | ||||||
|  | /* | ||||||
|  |  * PHP QR Code encoder | ||||||
|  |  * | ||||||
|  |  * Reed-Solomon error correction support | ||||||
|  |  *  | ||||||
|  |  * Copyright (C) 2002, 2003, 2004, 2006 Phil Karn, KA9Q | ||||||
|  |  * (libfec is released under the GNU Lesser General Public License.) | ||||||
|  |  * | ||||||
|  |  * Based on libqrencode C library distributed under LGPL 2.1 | ||||||
|  |  * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi <fukuchi@megaui.net> | ||||||
|  |  * | ||||||
|  |  * PHP QR Code is distributed under LGPL 3 | ||||||
|  |  * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm> | ||||||
|  |  * | ||||||
|  |  * This library is free software; you can redistribute it and/or | ||||||
|  |  * modify it under the terms of the GNU Lesser General Public | ||||||
|  |  * License as published by the Free Software Foundation; either | ||||||
|  |  * version 3 of the License, or any later version. | ||||||
|  |  * | ||||||
|  |  * This library is distributed in the hope that it will be useful, | ||||||
|  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||||||
|  |  * Lesser General Public License for more details. | ||||||
|  |  * | ||||||
|  |  * You should have received a copy of the GNU Lesser General Public | ||||||
|  |  * License along with this library; if not, write to the Free Software | ||||||
|  |  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||||||
|  |  */ | ||||||
|  |   | ||||||
|  |     class QRrsItem { | ||||||
|  |      | ||||||
|  |         public $mm;                  // Bits per symbol  | ||||||
|  |         public $nn;                  // Symbols per block (= (1<<mm)-1)  | ||||||
|  |         public $alpha_to = array();  // log lookup table  | ||||||
|  |         public $index_of = array();  // Antilog lookup table  | ||||||
|  |         public $genpoly = array();   // Generator polynomial  | ||||||
|  |         public $nroots;              // Number of generator roots = number of parity symbols  | ||||||
|  |         public $fcr;                 // First consecutive root, index form  | ||||||
|  |         public $prim;                // Primitive element, index form  | ||||||
|  |         public $iprim;               // prim-th root of 1, index form  | ||||||
|  |         public $pad;                 // Padding bytes in shortened block  | ||||||
|  |         public $gfpoly; | ||||||
|  |      | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public function modnn($x) | ||||||
|  |         { | ||||||
|  |             while ($x >= $this->nn) { | ||||||
|  |                 $x -= $this->nn; | ||||||
|  |                 $x = ($x >> $this->mm) + ($x & $this->nn); | ||||||
|  |             } | ||||||
|  |              | ||||||
|  |             return $x; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public static function init_rs_char($symsize, $gfpoly, $fcr, $prim, $nroots, $pad) | ||||||
|  |         { | ||||||
|  |             // Common code for intializing a Reed-Solomon control block (char or int symbols) | ||||||
|  |             // Copyright 2004 Phil Karn, KA9Q | ||||||
|  |             // May be used under the terms of the GNU Lesser General Public License (LGPL) | ||||||
|  |  | ||||||
|  |             $rs = null; | ||||||
|  |              | ||||||
|  |             // Check parameter ranges | ||||||
|  |             if($symsize < 0 || $symsize > 8)                     return $rs; | ||||||
|  |             if($fcr < 0 || $fcr >= (1<<$symsize))                return $rs; | ||||||
|  |             if($prim <= 0 || $prim >= (1<<$symsize))             return $rs; | ||||||
|  |             if($nroots < 0 || $nroots >= (1<<$symsize))          return $rs; // Can't have more roots than symbol values! | ||||||
|  |             if($pad < 0 || $pad >= ((1<<$symsize) -1 - $nroots)) return $rs; // Too much padding | ||||||
|  |  | ||||||
|  |             $rs = new QRrsItem(); | ||||||
|  |             $rs->mm = $symsize; | ||||||
|  |             $rs->nn = (1<<$symsize)-1; | ||||||
|  |             $rs->pad = $pad; | ||||||
|  |  | ||||||
|  |             $rs->alpha_to = array_fill(0, $rs->nn+1, 0); | ||||||
|  |             $rs->index_of = array_fill(0, $rs->nn+1, 0); | ||||||
|  |            | ||||||
|  |             // PHP style macro replacement ;) | ||||||
|  |             $NN =& $rs->nn; | ||||||
|  |             $A0 =& $NN; | ||||||
|  |              | ||||||
|  |             // Generate Galois field lookup tables | ||||||
|  |             $rs->index_of[0] = $A0; // log(zero) = -inf | ||||||
|  |             $rs->alpha_to[$A0] = 0; // alpha**-inf = 0 | ||||||
|  |             $sr = 1; | ||||||
|  |            | ||||||
|  |             for($i=0; $i<$rs->nn; $i++) { | ||||||
|  |                 $rs->index_of[$sr] = $i; | ||||||
|  |                 $rs->alpha_to[$i] = $sr; | ||||||
|  |                 $sr <<= 1; | ||||||
|  |                 if($sr & (1<<$symsize)) { | ||||||
|  |                     $sr ^= $gfpoly; | ||||||
|  |                 } | ||||||
|  |                 $sr &= $rs->nn; | ||||||
|  |             } | ||||||
|  |              | ||||||
|  |             if($sr != 1){ | ||||||
|  |                 // field generator polynomial is not primitive! | ||||||
|  |                 $rs = NULL; | ||||||
|  |                 return $rs; | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             /* Form RS code generator polynomial from its roots */ | ||||||
|  |             $rs->genpoly = array_fill(0, $nroots+1, 0); | ||||||
|  |          | ||||||
|  |             $rs->fcr = $fcr; | ||||||
|  |             $rs->prim = $prim; | ||||||
|  |             $rs->nroots = $nroots; | ||||||
|  |             $rs->gfpoly = $gfpoly; | ||||||
|  |  | ||||||
|  |             /* Find prim-th root of 1, used in decoding */ | ||||||
|  |             for($iprim=1;($iprim % $prim) != 0;$iprim += $rs->nn) | ||||||
|  |             ; // intentional empty-body loop! | ||||||
|  |              | ||||||
|  |             $rs->iprim = (int)($iprim / $prim); | ||||||
|  |             $rs->genpoly[0] = 1; | ||||||
|  |              | ||||||
|  |             for ($i = 0,$root=$fcr*$prim; $i < $nroots; $i++, $root += $prim) { | ||||||
|  |                 $rs->genpoly[$i+1] = 1; | ||||||
|  |  | ||||||
|  |                 // Multiply rs->genpoly[] by  @**(root + x) | ||||||
|  |                 for ($j = $i; $j > 0; $j--) { | ||||||
|  |                     if ($rs->genpoly[$j] != 0) { | ||||||
|  |                         $rs->genpoly[$j] = $rs->genpoly[$j-1] ^ $rs->alpha_to[$rs->modnn($rs->index_of[$rs->genpoly[$j]] + $root)]; | ||||||
|  |                     } else { | ||||||
|  |                         $rs->genpoly[$j] = $rs->genpoly[$j-1]; | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |                 // rs->genpoly[0] can never be zero | ||||||
|  |                 $rs->genpoly[0] = $rs->alpha_to[$rs->modnn($rs->index_of[$rs->genpoly[0]] + $root)]; | ||||||
|  |             } | ||||||
|  |              | ||||||
|  |             // convert rs->genpoly[] to index form for quicker encoding | ||||||
|  |             for ($i = 0; $i <= $nroots; $i++) | ||||||
|  |                 $rs->genpoly[$i] = $rs->index_of[$rs->genpoly[$i]]; | ||||||
|  |  | ||||||
|  |             return $rs; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public function encode_rs_char($data, &$parity) | ||||||
|  |         { | ||||||
|  |             $MM       =& $this->mm; | ||||||
|  |             $NN       =& $this->nn; | ||||||
|  |             $ALPHA_TO =& $this->alpha_to; | ||||||
|  |             $INDEX_OF =& $this->index_of; | ||||||
|  |             $GENPOLY  =& $this->genpoly; | ||||||
|  |             $NROOTS   =& $this->nroots; | ||||||
|  |             $FCR      =& $this->fcr; | ||||||
|  |             $PRIM     =& $this->prim; | ||||||
|  |             $IPRIM    =& $this->iprim; | ||||||
|  |             $PAD      =& $this->pad; | ||||||
|  |             $A0       =& $NN; | ||||||
|  |  | ||||||
|  |             $parity = array_fill(0, $NROOTS, 0); | ||||||
|  |  | ||||||
|  |             for($i=0; $i< ($NN-$NROOTS-$PAD); $i++) { | ||||||
|  |                  | ||||||
|  |                 $feedback = $INDEX_OF[$data[$i] ^ $parity[0]]; | ||||||
|  |                 if($feedback != $A0) {       | ||||||
|  |                     // feedback term is non-zero | ||||||
|  |              | ||||||
|  |                     // This line is unnecessary when GENPOLY[NROOTS] is unity, as it must | ||||||
|  |                     // always be for the polynomials constructed by init_rs() | ||||||
|  |                     $feedback = $this->modnn($NN - $GENPOLY[$NROOTS] + $feedback); | ||||||
|  |              | ||||||
|  |                     for($j=1;$j<$NROOTS;$j++) { | ||||||
|  |                         $parity[$j] ^= $ALPHA_TO[$this->modnn($feedback + $GENPOLY[$NROOTS-$j])]; | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |                  | ||||||
|  |                 // Shift  | ||||||
|  |                 array_shift($parity); | ||||||
|  |                 if($feedback != $A0) { | ||||||
|  |                     array_push($parity, $ALPHA_TO[$this->modnn($feedback + $GENPOLY[0])]); | ||||||
|  |                 } else { | ||||||
|  |                     array_push($parity, 0); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     //########################################################################## | ||||||
|  |      | ||||||
|  |     class QRrs { | ||||||
|  |      | ||||||
|  |         public static $items = array(); | ||||||
|  |          | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public static function init_rs($symsize, $gfpoly, $fcr, $prim, $nroots, $pad) | ||||||
|  |         { | ||||||
|  |             foreach(self::$items as $rs) { | ||||||
|  |                 if($rs->pad != $pad)       continue; | ||||||
|  |                 if($rs->nroots != $nroots) continue; | ||||||
|  |                 if($rs->mm != $symsize)    continue; | ||||||
|  |                 if($rs->gfpoly != $gfpoly) continue; | ||||||
|  |                 if($rs->fcr != $fcr)       continue; | ||||||
|  |                 if($rs->prim != $prim)     continue; | ||||||
|  |  | ||||||
|  |                 return $rs; | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             $rs = QRrsItem::init_rs_char($symsize, $gfpoly, $fcr, $prim, $nroots, $pad); | ||||||
|  |             array_unshift(self::$items, $rs); | ||||||
|  |  | ||||||
|  |             return $rs; | ||||||
|  |         } | ||||||
|  |     } | ||||||
							
								
								
									
										592
									
								
								webui/system/helper/phpqrcode/qrspec.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										592
									
								
								webui/system/helper/phpqrcode/qrspec.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,592 @@ | |||||||
|  | <?php | ||||||
|  | /* | ||||||
|  |  * PHP QR Code encoder | ||||||
|  |  * | ||||||
|  |  * QR Code specifications | ||||||
|  |  * | ||||||
|  |  * Based on libqrencode C library distributed under LGPL 2.1 | ||||||
|  |  * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi <fukuchi@megaui.net> | ||||||
|  |  * | ||||||
|  |  * PHP QR Code is distributed under LGPL 3 | ||||||
|  |  * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm> | ||||||
|  |  * | ||||||
|  |  * The following data / specifications are taken from | ||||||
|  |  * "Two dimensional symbol -- QR-code -- Basic Specification" (JIS X0510:2004) | ||||||
|  |  *  or | ||||||
|  |  * "Automatic identification and data capture techniques --  | ||||||
|  |  *  QR Code 2005 bar code symbology specification" (ISO/IEC 18004:2006) | ||||||
|  |  * | ||||||
|  |  * This library is free software; you can redistribute it and/or | ||||||
|  |  * modify it under the terms of the GNU Lesser General Public | ||||||
|  |  * License as published by the Free Software Foundation; either | ||||||
|  |  * version 3 of the License, or any later version. | ||||||
|  |  * | ||||||
|  |  * This library is distributed in the hope that it will be useful, | ||||||
|  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||||||
|  |  * Lesser General Public License for more details. | ||||||
|  |  * | ||||||
|  |  * You should have received a copy of the GNU Lesser General Public | ||||||
|  |  * License along with this library; if not, write to the Free Software | ||||||
|  |  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||||||
|  |  */ | ||||||
|  |   | ||||||
|  |     define('QRSPEC_VERSION_MAX', 40); | ||||||
|  |     define('QRSPEC_WIDTH_MAX',   177); | ||||||
|  |  | ||||||
|  |     define('QRCAP_WIDTH',        0); | ||||||
|  |     define('QRCAP_WORDS',        1); | ||||||
|  |     define('QRCAP_REMINDER',     2); | ||||||
|  |     define('QRCAP_EC',           3); | ||||||
|  |  | ||||||
|  |     class QRspec { | ||||||
|  |      | ||||||
|  |         public static $capacity = array( | ||||||
|  |             array(  0,    0, 0, array(   0,    0,    0,    0)), | ||||||
|  |             array( 21,   26, 0, array(   7,   10,   13,   17)), // 1 | ||||||
|  |             array( 25,   44, 7, array(  10,   16,   22,   28)), | ||||||
|  |             array( 29,   70, 7, array(  15,   26,   36,   44)), | ||||||
|  |             array( 33,  100, 7, array(  20,   36,   52,   64)), | ||||||
|  |             array( 37,  134, 7, array(  26,   48,   72,   88)), // 5 | ||||||
|  |             array( 41,  172, 7, array(  36,   64,   96,  112)), | ||||||
|  |             array( 45,  196, 0, array(  40,   72,  108,  130)), | ||||||
|  |             array( 49,  242, 0, array(  48,   88,  132,  156)), | ||||||
|  |             array( 53,  292, 0, array(  60,  110,  160,  192)), | ||||||
|  |             array( 57,  346, 0, array(  72,  130,  192,  224)), //10 | ||||||
|  |             array( 61,  404, 0, array(  80,  150,  224,  264)), | ||||||
|  |             array( 65,  466, 0, array(  96,  176,  260,  308)), | ||||||
|  |             array( 69,  532, 0, array( 104,  198,  288,  352)), | ||||||
|  |             array( 73,  581, 3, array( 120,  216,  320,  384)), | ||||||
|  |             array( 77,  655, 3, array( 132,  240,  360,  432)), //15 | ||||||
|  |             array( 81,  733, 3, array( 144,  280,  408,  480)), | ||||||
|  |             array( 85,  815, 3, array( 168,  308,  448,  532)), | ||||||
|  |             array( 89,  901, 3, array( 180,  338,  504,  588)), | ||||||
|  |             array( 93,  991, 3, array( 196,  364,  546,  650)), | ||||||
|  |             array( 97, 1085, 3, array( 224,  416,  600,  700)), //20 | ||||||
|  |             array(101, 1156, 4, array( 224,  442,  644,  750)), | ||||||
|  |             array(105, 1258, 4, array( 252,  476,  690,  816)), | ||||||
|  |             array(109, 1364, 4, array( 270,  504,  750,  900)), | ||||||
|  |             array(113, 1474, 4, array( 300,  560,  810,  960)), | ||||||
|  |             array(117, 1588, 4, array( 312,  588,  870, 1050)), //25 | ||||||
|  |             array(121, 1706, 4, array( 336,  644,  952, 1110)), | ||||||
|  |             array(125, 1828, 4, array( 360,  700, 1020, 1200)), | ||||||
|  |             array(129, 1921, 3, array( 390,  728, 1050, 1260)), | ||||||
|  |             array(133, 2051, 3, array( 420,  784, 1140, 1350)), | ||||||
|  |             array(137, 2185, 3, array( 450,  812, 1200, 1440)), //30 | ||||||
|  |             array(141, 2323, 3, array( 480,  868, 1290, 1530)), | ||||||
|  |             array(145, 2465, 3, array( 510,  924, 1350, 1620)), | ||||||
|  |             array(149, 2611, 3, array( 540,  980, 1440, 1710)), | ||||||
|  |             array(153, 2761, 3, array( 570, 1036, 1530, 1800)), | ||||||
|  |             array(157, 2876, 0, array( 570, 1064, 1590, 1890)), //35 | ||||||
|  |             array(161, 3034, 0, array( 600, 1120, 1680, 1980)), | ||||||
|  |             array(165, 3196, 0, array( 630, 1204, 1770, 2100)), | ||||||
|  |             array(169, 3362, 0, array( 660, 1260, 1860, 2220)), | ||||||
|  |             array(173, 3532, 0, array( 720, 1316, 1950, 2310)), | ||||||
|  |             array(177, 3706, 0, array( 750, 1372, 2040, 2430)) //40 | ||||||
|  |         ); | ||||||
|  |          | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public static function getDataLength($version, $level) | ||||||
|  |         { | ||||||
|  |             return self::$capacity[$version][QRCAP_WORDS] - self::$capacity[$version][QRCAP_EC][$level]; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public static function getECCLength($version, $level) | ||||||
|  |         { | ||||||
|  |             return self::$capacity[$version][QRCAP_EC][$level]; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public static function getWidth($version) | ||||||
|  |         { | ||||||
|  |             return self::$capacity[$version][QRCAP_WIDTH]; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public static function getRemainder($version) | ||||||
|  |         { | ||||||
|  |             return self::$capacity[$version][QRCAP_REMINDER]; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public static function getMinimumVersion($size, $level) | ||||||
|  |         { | ||||||
|  |  | ||||||
|  |             for($i=1; $i<= QRSPEC_VERSION_MAX; $i++) { | ||||||
|  |                 $words  = self::$capacity[$i][QRCAP_WORDS] - self::$capacity[$i][QRCAP_EC][$level]; | ||||||
|  |                 if($words >= $size)  | ||||||
|  |                     return $i; | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             return -1; | ||||||
|  |         } | ||||||
|  |      | ||||||
|  |         //###################################################################### | ||||||
|  |          | ||||||
|  |         public static $lengthTableBits = array( | ||||||
|  |             array(10, 12, 14), | ||||||
|  |             array( 9, 11, 13), | ||||||
|  |             array( 8, 16, 16), | ||||||
|  |             array( 8, 10, 12) | ||||||
|  |         ); | ||||||
|  |          | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public static function lengthIndicator($mode, $version) | ||||||
|  |         { | ||||||
|  |             if ($mode == QR_MODE_STRUCTURE) | ||||||
|  |                 return 0; | ||||||
|  |                  | ||||||
|  |             if ($version <= 9) { | ||||||
|  |                 $l = 0; | ||||||
|  |             } else if ($version <= 26) { | ||||||
|  |                 $l = 1; | ||||||
|  |             } else { | ||||||
|  |                 $l = 2; | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             return self::$lengthTableBits[$mode][$l]; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public static function maximumWords($mode, $version) | ||||||
|  |         { | ||||||
|  |             if($mode == QR_MODE_STRUCTURE)  | ||||||
|  |                 return 3; | ||||||
|  |                  | ||||||
|  |             if($version <= 9) { | ||||||
|  |                 $l = 0; | ||||||
|  |             } else if($version <= 26) { | ||||||
|  |                 $l = 1; | ||||||
|  |             } else { | ||||||
|  |                 $l = 2; | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             $bits = self::$lengthTableBits[$mode][$l]; | ||||||
|  |             $words = (1 << $bits) - 1; | ||||||
|  |              | ||||||
|  |             if($mode == QR_MODE_KANJI) { | ||||||
|  |                 $words *= 2; // the number of bytes is required | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             return $words; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         // Error correction code ----------------------------------------------- | ||||||
|  |         // Table of the error correction code (Reed-Solomon block) | ||||||
|  |         // See Table 12-16 (pp.30-36), JIS X0510:2004. | ||||||
|  |  | ||||||
|  |         public static $eccTable = array( | ||||||
|  |             array(array( 0,  0), array( 0,  0), array( 0,  0), array( 0,  0)), | ||||||
|  |             array(array( 1,  0), array( 1,  0), array( 1,  0), array( 1,  0)), // 1 | ||||||
|  |             array(array( 1,  0), array( 1,  0), array( 1,  0), array( 1,  0)), | ||||||
|  |             array(array( 1,  0), array( 1,  0), array( 2,  0), array( 2,  0)), | ||||||
|  |             array(array( 1,  0), array( 2,  0), array( 2,  0), array( 4,  0)), | ||||||
|  |             array(array( 1,  0), array( 2,  0), array( 2,  2), array( 2,  2)), // 5 | ||||||
|  |             array(array( 2,  0), array( 4,  0), array( 4,  0), array( 4,  0)), | ||||||
|  |             array(array( 2,  0), array( 4,  0), array( 2,  4), array( 4,  1)), | ||||||
|  |             array(array( 2,  0), array( 2,  2), array( 4,  2), array( 4,  2)), | ||||||
|  |             array(array( 2,  0), array( 3,  2), array( 4,  4), array( 4,  4)), | ||||||
|  |             array(array( 2,  2), array( 4,  1), array( 6,  2), array( 6,  2)), //10 | ||||||
|  |             array(array( 4,  0), array( 1,  4), array( 4,  4), array( 3,  8)), | ||||||
|  |             array(array( 2,  2), array( 6,  2), array( 4,  6), array( 7,  4)), | ||||||
|  |             array(array( 4,  0), array( 8,  1), array( 8,  4), array(12,  4)), | ||||||
|  |             array(array( 3,  1), array( 4,  5), array(11,  5), array(11,  5)), | ||||||
|  |             array(array( 5,  1), array( 5,  5), array( 5,  7), array(11,  7)), //15 | ||||||
|  |             array(array( 5,  1), array( 7,  3), array(15,  2), array( 3, 13)), | ||||||
|  |             array(array( 1,  5), array(10,  1), array( 1, 15), array( 2, 17)), | ||||||
|  |             array(array( 5,  1), array( 9,  4), array(17,  1), array( 2, 19)), | ||||||
|  |             array(array( 3,  4), array( 3, 11), array(17,  4), array( 9, 16)), | ||||||
|  |             array(array( 3,  5), array( 3, 13), array(15,  5), array(15, 10)), //20 | ||||||
|  |             array(array( 4,  4), array(17,  0), array(17,  6), array(19,  6)), | ||||||
|  |             array(array( 2,  7), array(17,  0), array( 7, 16), array(34,  0)), | ||||||
|  |             array(array( 4,  5), array( 4, 14), array(11, 14), array(16, 14)), | ||||||
|  |             array(array( 6,  4), array( 6, 14), array(11, 16), array(30,  2)), | ||||||
|  |             array(array( 8,  4), array( 8, 13), array( 7, 22), array(22, 13)), //25 | ||||||
|  |             array(array(10,  2), array(19,  4), array(28,  6), array(33,  4)), | ||||||
|  |             array(array( 8,  4), array(22,  3), array( 8, 26), array(12, 28)), | ||||||
|  |             array(array( 3, 10), array( 3, 23), array( 4, 31), array(11, 31)), | ||||||
|  |             array(array( 7,  7), array(21,  7), array( 1, 37), array(19, 26)), | ||||||
|  |             array(array( 5, 10), array(19, 10), array(15, 25), array(23, 25)), //30 | ||||||
|  |             array(array(13,  3), array( 2, 29), array(42,  1), array(23, 28)), | ||||||
|  |             array(array(17,  0), array(10, 23), array(10, 35), array(19, 35)), | ||||||
|  |             array(array(17,  1), array(14, 21), array(29, 19), array(11, 46)), | ||||||
|  |             array(array(13,  6), array(14, 23), array(44,  7), array(59,  1)), | ||||||
|  |             array(array(12,  7), array(12, 26), array(39, 14), array(22, 41)), //35 | ||||||
|  |             array(array( 6, 14), array( 6, 34), array(46, 10), array( 2, 64)), | ||||||
|  |             array(array(17,  4), array(29, 14), array(49, 10), array(24, 46)), | ||||||
|  |             array(array( 4, 18), array(13, 32), array(48, 14), array(42, 32)), | ||||||
|  |             array(array(20,  4), array(40,  7), array(43, 22), array(10, 67)), | ||||||
|  |             array(array(19,  6), array(18, 31), array(34, 34), array(20, 61)),//40 | ||||||
|  |         );                                                                        | ||||||
|  |  | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         // CACHEABLE!!! | ||||||
|  |          | ||||||
|  |         public static function getEccSpec($version, $level, array &$spec) | ||||||
|  |         { | ||||||
|  |             if (count($spec) < 5) { | ||||||
|  |                 $spec = array(0,0,0,0,0); | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             $b1   = self::$eccTable[$version][$level][0]; | ||||||
|  |             $b2   = self::$eccTable[$version][$level][1]; | ||||||
|  |             $data = self::getDataLength($version, $level); | ||||||
|  |             $ecc  = self::getECCLength($version, $level); | ||||||
|  |  | ||||||
|  |             if($b2 == 0) { | ||||||
|  |                 $spec[0] = $b1; | ||||||
|  |                 $spec[1] = (int)($data / $b1); | ||||||
|  |                 $spec[2] = (int)($ecc / $b1); | ||||||
|  |                 $spec[3] = 0;  | ||||||
|  |                 $spec[4] = 0; | ||||||
|  |             } else { | ||||||
|  |                 $spec[0] = $b1; | ||||||
|  |                 $spec[1] = (int)($data / ($b1 + $b2)); | ||||||
|  |                 $spec[2] = (int)($ecc  / ($b1 + $b2)); | ||||||
|  |                 $spec[3] = $b2; | ||||||
|  |                 $spec[4] = $spec[1] + 1; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         // Alignment pattern --------------------------------------------------- | ||||||
|  |  | ||||||
|  |         // Positions of alignment patterns. | ||||||
|  |         // This array includes only the second and the third position of the  | ||||||
|  |         // alignment patterns. Rest of them can be calculated from the distance  | ||||||
|  |         // between them. | ||||||
|  |           | ||||||
|  |         // See Table 1 in Appendix E (pp.71) of JIS X0510:2004. | ||||||
|  |           | ||||||
|  |         public static $alignmentPattern = array(       | ||||||
|  |             array( 0,  0), | ||||||
|  |             array( 0,  0), array(18,  0), array(22,  0), array(26,  0), array(30,  0), // 1- 5 | ||||||
|  |             array(34,  0), array(22, 38), array(24, 42), array(26, 46), array(28, 50), // 6-10 | ||||||
|  |             array(30, 54), array(32, 58), array(34, 62), array(26, 46), array(26, 48), //11-15 | ||||||
|  |             array(26, 50), array(30, 54), array(30, 56), array(30, 58), array(34, 62), //16-20 | ||||||
|  |             array(28, 50), array(26, 50), array(30, 54), array(28, 54), array(32, 58), //21-25 | ||||||
|  |             array(30, 58), array(34, 62), array(26, 50), array(30, 54), array(26, 52), //26-30 | ||||||
|  |             array(30, 56), array(34, 60), array(30, 58), array(34, 62), array(30, 54), //31-35 | ||||||
|  |             array(24, 50), array(28, 54), array(32, 58), array(26, 54), array(30, 58), //35-40 | ||||||
|  |         );                                                                                   | ||||||
|  |  | ||||||
|  |          | ||||||
|  |         /** -------------------------------------------------------------------- | ||||||
|  |          * Put an alignment marker. | ||||||
|  |          * @param frame | ||||||
|  |          * @param width | ||||||
|  |          * @param ox,oy center coordinate of the pattern | ||||||
|  |          */ | ||||||
|  |         public static function putAlignmentMarker(array &$frame, $ox, $oy) | ||||||
|  |         { | ||||||
|  |             $finder = array( | ||||||
|  |                 "\xa1\xa1\xa1\xa1\xa1", | ||||||
|  |                 "\xa1\xa0\xa0\xa0\xa1", | ||||||
|  |                 "\xa1\xa0\xa1\xa0\xa1", | ||||||
|  |                 "\xa1\xa0\xa0\xa0\xa1", | ||||||
|  |                 "\xa1\xa1\xa1\xa1\xa1" | ||||||
|  |             );                         | ||||||
|  |              | ||||||
|  |             $yStart = $oy-2;          | ||||||
|  |             $xStart = $ox-2; | ||||||
|  |              | ||||||
|  |             for($y=0; $y<5; $y++) { | ||||||
|  |                 QRstr::set($frame, $xStart, $yStart+$y, $finder[$y]); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public static function putAlignmentPattern($version, &$frame, $width) | ||||||
|  |         { | ||||||
|  |             if($version < 2) | ||||||
|  |                 return; | ||||||
|  |  | ||||||
|  |             $d = self::$alignmentPattern[$version][1] - self::$alignmentPattern[$version][0]; | ||||||
|  |             if($d < 0) { | ||||||
|  |                 $w = 2; | ||||||
|  |             } else { | ||||||
|  |                 $w = (int)(($width - self::$alignmentPattern[$version][0]) / $d + 2); | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             if($w * $w - 3 == 1) { | ||||||
|  |                 $x = self::$alignmentPattern[$version][0]; | ||||||
|  |                 $y = self::$alignmentPattern[$version][0]; | ||||||
|  |                 self::putAlignmentMarker($frame, $x, $y); | ||||||
|  |                 return; | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             $cx = self::$alignmentPattern[$version][0]; | ||||||
|  |             for($x=1; $x<$w - 1; $x++) { | ||||||
|  |                 self::putAlignmentMarker($frame, 6, $cx); | ||||||
|  |                 self::putAlignmentMarker($frame, $cx,  6); | ||||||
|  |                 $cx += $d; | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             $cy = self::$alignmentPattern[$version][0]; | ||||||
|  |             for($y=0; $y<$w-1; $y++) { | ||||||
|  |                 $cx = self::$alignmentPattern[$version][0]; | ||||||
|  |                 for($x=0; $x<$w-1; $x++) { | ||||||
|  |                     self::putAlignmentMarker($frame, $cx, $cy); | ||||||
|  |                     $cx += $d; | ||||||
|  |                 } | ||||||
|  |                 $cy += $d; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         // Version information pattern ----------------------------------------- | ||||||
|  |  | ||||||
|  | 		// Version information pattern (BCH coded). | ||||||
|  |         // See Table 1 in Appendix D (pp.68) of JIS X0510:2004. | ||||||
|  |          | ||||||
|  | 		// size: [QRSPEC_VERSION_MAX - 6] | ||||||
|  | 		 | ||||||
|  |         public static $versionPattern = array( | ||||||
|  |             0x07c94, 0x085bc, 0x09a99, 0x0a4d3, 0x0bbf6, 0x0c762, 0x0d847, 0x0e60d, | ||||||
|  |             0x0f928, 0x10b78, 0x1145d, 0x12a17, 0x13532, 0x149a6, 0x15683, 0x168c9, | ||||||
|  |             0x177ec, 0x18ec4, 0x191e1, 0x1afab, 0x1b08e, 0x1cc1a, 0x1d33f, 0x1ed75, | ||||||
|  |             0x1f250, 0x209d5, 0x216f0, 0x228ba, 0x2379f, 0x24b0b, 0x2542e, 0x26a64, | ||||||
|  |             0x27541, 0x28c69 | ||||||
|  |         ); | ||||||
|  |  | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public static function getVersionPattern($version) | ||||||
|  |         { | ||||||
|  |             if($version < 7 || $version > QRSPEC_VERSION_MAX) | ||||||
|  |                 return 0; | ||||||
|  |  | ||||||
|  |             return self::$versionPattern[$version -7]; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         // Format information -------------------------------------------------- | ||||||
|  |         // See calcFormatInfo in tests/test_qrspec.c (orginal qrencode c lib) | ||||||
|  |          | ||||||
|  |         public static $formatInfo = array( | ||||||
|  |             array(0x77c4, 0x72f3, 0x7daa, 0x789d, 0x662f, 0x6318, 0x6c41, 0x6976), | ||||||
|  |             array(0x5412, 0x5125, 0x5e7c, 0x5b4b, 0x45f9, 0x40ce, 0x4f97, 0x4aa0), | ||||||
|  |             array(0x355f, 0x3068, 0x3f31, 0x3a06, 0x24b4, 0x2183, 0x2eda, 0x2bed), | ||||||
|  |             array(0x1689, 0x13be, 0x1ce7, 0x19d0, 0x0762, 0x0255, 0x0d0c, 0x083b) | ||||||
|  |         ); | ||||||
|  |  | ||||||
|  |         public static function getFormatInfo($mask, $level) | ||||||
|  |         { | ||||||
|  |             if($mask < 0 || $mask > 7) | ||||||
|  |                 return 0; | ||||||
|  |                  | ||||||
|  |             if($level < 0 || $level > 3) | ||||||
|  |                 return 0;                 | ||||||
|  |  | ||||||
|  |             return self::$formatInfo[$level][$mask]; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         // Frame --------------------------------------------------------------- | ||||||
|  |         // Cache of initial frames. | ||||||
|  |           | ||||||
|  |         public static $frames = array(); | ||||||
|  |  | ||||||
|  |         /** -------------------------------------------------------------------- | ||||||
|  |          * Put a finder pattern. | ||||||
|  |          * @param frame | ||||||
|  |          * @param width | ||||||
|  |          * @param ox,oy upper-left coordinate of the pattern | ||||||
|  |          */ | ||||||
|  |         public static function putFinderPattern(&$frame, $ox, $oy) | ||||||
|  |         { | ||||||
|  |             $finder = array( | ||||||
|  |                 "\xc1\xc1\xc1\xc1\xc1\xc1\xc1", | ||||||
|  |                 "\xc1\xc0\xc0\xc0\xc0\xc0\xc1", | ||||||
|  |                 "\xc1\xc0\xc1\xc1\xc1\xc0\xc1", | ||||||
|  |                 "\xc1\xc0\xc1\xc1\xc1\xc0\xc1", | ||||||
|  |                 "\xc1\xc0\xc1\xc1\xc1\xc0\xc1", | ||||||
|  |                 "\xc1\xc0\xc0\xc0\xc0\xc0\xc1", | ||||||
|  |                 "\xc1\xc1\xc1\xc1\xc1\xc1\xc1" | ||||||
|  |             );                             | ||||||
|  |              | ||||||
|  |             for($y=0; $y<7; $y++) { | ||||||
|  |                 QRstr::set($frame, $ox, $oy+$y, $finder[$y]); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public static function createFrame($version) | ||||||
|  |         { | ||||||
|  |             $width = self::$capacity[$version][QRCAP_WIDTH]; | ||||||
|  |             $frameLine = str_repeat ("\0", $width); | ||||||
|  |             $frame = array_fill(0, $width, $frameLine); | ||||||
|  |  | ||||||
|  |             // Finder pattern | ||||||
|  |             self::putFinderPattern($frame, 0, 0); | ||||||
|  |             self::putFinderPattern($frame, $width - 7, 0); | ||||||
|  |             self::putFinderPattern($frame, 0, $width - 7); | ||||||
|  |              | ||||||
|  |             // Separator | ||||||
|  |             $yOffset = $width - 7; | ||||||
|  |              | ||||||
|  |             for($y=0; $y<7; $y++) { | ||||||
|  |                 $frame[$y][7] = "\xc0"; | ||||||
|  |                 $frame[$y][$width - 8] = "\xc0"; | ||||||
|  |                 $frame[$yOffset][7] = "\xc0"; | ||||||
|  |                 $yOffset++; | ||||||
|  |             } | ||||||
|  |              | ||||||
|  |             $setPattern = str_repeat("\xc0", 8); | ||||||
|  |              | ||||||
|  |             QRstr::set($frame, 0, 7, $setPattern); | ||||||
|  |             QRstr::set($frame, $width-8, 7, $setPattern); | ||||||
|  |             QRstr::set($frame, 0, $width - 8, $setPattern); | ||||||
|  |          | ||||||
|  |             // Format info | ||||||
|  |             $setPattern = str_repeat("\x84", 9); | ||||||
|  |             QRstr::set($frame, 0, 8, $setPattern); | ||||||
|  |             QRstr::set($frame, $width - 8, 8, $setPattern, 8); | ||||||
|  |              | ||||||
|  |             $yOffset = $width - 8; | ||||||
|  |  | ||||||
|  |             for($y=0; $y<8; $y++,$yOffset++) { | ||||||
|  |                 $frame[$y][8] = "\x84"; | ||||||
|  |                 $frame[$yOffset][8] = "\x84"; | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             // Timing pattern   | ||||||
|  |              | ||||||
|  |             for($i=1; $i<$width-15; $i++) { | ||||||
|  |                 $frame[6][7+$i] = chr(0x90 | ($i & 1)); | ||||||
|  |                 $frame[7+$i][6] = chr(0x90 | ($i & 1)); | ||||||
|  |             } | ||||||
|  |              | ||||||
|  |             // Alignment pattern   | ||||||
|  |             self::putAlignmentPattern($version, $frame, $width); | ||||||
|  |              | ||||||
|  |             // Version information  | ||||||
|  |             if($version >= 7) { | ||||||
|  |                 $vinf = self::getVersionPattern($version); | ||||||
|  |  | ||||||
|  |                 $v = $vinf; | ||||||
|  |                  | ||||||
|  |                 for($x=0; $x<6; $x++) { | ||||||
|  |                     for($y=0; $y<3; $y++) { | ||||||
|  |                         $frame[($width - 11)+$y][$x] = chr(0x88 | ($v & 1)); | ||||||
|  |                         $v = $v >> 1; | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 $v = $vinf; | ||||||
|  |                 for($y=0; $y<6; $y++) { | ||||||
|  |                     for($x=0; $x<3; $x++) { | ||||||
|  |                         $frame[$y][$x+($width - 11)] = chr(0x88 | ($v & 1)); | ||||||
|  |                         $v = $v >> 1; | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |      | ||||||
|  |             // and a little bit...   | ||||||
|  |             $frame[$width - 8][8] = "\x81"; | ||||||
|  |              | ||||||
|  |             return $frame; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public static function debug($frame, $binary_mode = false) | ||||||
|  |         { | ||||||
|  |             if ($binary_mode) { | ||||||
|  |              | ||||||
|  |                     foreach ($frame as &$frameLine) { | ||||||
|  |                         $frameLine = join('<span class="m">  </span>', explode('0', $frameLine)); | ||||||
|  |                         $frameLine = join('██', explode('1', $frameLine)); | ||||||
|  |                     } | ||||||
|  |                      | ||||||
|  |                     ?> | ||||||
|  |                 <style> | ||||||
|  |                     .m { background-color: white; } | ||||||
|  |                 </style> | ||||||
|  |                 <?php | ||||||
|  |                     echo '<pre><tt><br/ ><br/ ><br/ >        '; | ||||||
|  |                     echo join("<br/ >        ", $frame); | ||||||
|  |                     echo '</tt></pre><br/ ><br/ ><br/ ><br/ ><br/ ><br/ >'; | ||||||
|  |              | ||||||
|  |             } else { | ||||||
|  |              | ||||||
|  |                 foreach ($frame as &$frameLine) { | ||||||
|  |                     $frameLine = join('<span class="m"> </span>',  explode("\xc0", $frameLine)); | ||||||
|  |                     $frameLine = join('<span class="m">▒</span>', explode("\xc1", $frameLine)); | ||||||
|  |                     $frameLine = join('<span class="p"> </span>',  explode("\xa0", $frameLine)); | ||||||
|  |                     $frameLine = join('<span class="p">▒</span>', explode("\xa1", $frameLine)); | ||||||
|  |                     $frameLine = join('<span class="s">◇</span>', explode("\x84", $frameLine)); //format 0 | ||||||
|  |                     $frameLine = join('<span class="s">◆</span>', explode("\x85", $frameLine)); //format 1 | ||||||
|  |                     $frameLine = join('<span class="x">☢</span>', explode("\x81", $frameLine)); //special bit | ||||||
|  |                     $frameLine = join('<span class="c"> </span>',  explode("\x90", $frameLine)); //clock 0 | ||||||
|  |                     $frameLine = join('<span class="c">◷</span>', explode("\x91", $frameLine)); //clock 1 | ||||||
|  |                     $frameLine = join('<span class="f"> </span>',  explode("\x88", $frameLine)); //version | ||||||
|  |                     $frameLine = join('<span class="f">▒</span>', explode("\x89", $frameLine)); //version | ||||||
|  |                     $frameLine = join('♦', explode("\x01", $frameLine)); | ||||||
|  |                     $frameLine = join('⋅', explode("\0", $frameLine)); | ||||||
|  |                 } | ||||||
|  |                  | ||||||
|  |                 ?> | ||||||
|  |                 <style> | ||||||
|  |                     .p { background-color: yellow; } | ||||||
|  |                     .m { background-color: #00FF00; } | ||||||
|  |                     .s { background-color: #FF0000; } | ||||||
|  |                     .c { background-color: aqua; } | ||||||
|  |                     .x { background-color: pink; } | ||||||
|  |                     .f { background-color: gold; } | ||||||
|  |                 </style> | ||||||
|  |                 <?php | ||||||
|  |                 echo "<pre><tt>"; | ||||||
|  |                 echo join("<br/ >", $frame); | ||||||
|  |                 echo "</tt></pre>"; | ||||||
|  |              | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public static function serial($frame) | ||||||
|  |         { | ||||||
|  |             return gzcompress(join("\n", $frame), 9); | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public static function unserial($code) | ||||||
|  |         { | ||||||
|  |             return explode("\n", gzuncompress($code)); | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public static function newFrame($version) | ||||||
|  |         { | ||||||
|  |             if($version < 1 || $version > QRSPEC_VERSION_MAX)  | ||||||
|  |                 return null; | ||||||
|  |  | ||||||
|  |             if(!isset(self::$frames[$version])) { | ||||||
|  |                  | ||||||
|  |                 $fileName = QR_CACHE_DIR.'frame_'.$version.'.dat'; | ||||||
|  |                  | ||||||
|  |                 if (QR_CACHEABLE) { | ||||||
|  |                     if (file_exists($fileName)) { | ||||||
|  |                         self::$frames[$version] = self::unserial(file_get_contents($fileName)); | ||||||
|  |                     } else { | ||||||
|  |                         self::$frames[$version] = self::createFrame($version); | ||||||
|  |                         file_put_contents($fileName, self::serial(self::$frames[$version])); | ||||||
|  |                     } | ||||||
|  |                 } else { | ||||||
|  |                     self::$frames[$version] = self::createFrame($version); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |              | ||||||
|  |             if(is_null(self::$frames[$version])) | ||||||
|  |                 return null; | ||||||
|  |  | ||||||
|  |             return self::$frames[$version]; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public static function rsBlockNum($spec)     { return $spec[0] + $spec[3]; } | ||||||
|  |         public static function rsBlockNum1($spec)    { return $spec[0]; } | ||||||
|  |         public static function rsDataCodes1($spec)   { return $spec[1]; } | ||||||
|  |         public static function rsEccCodes1($spec)    { return $spec[2]; } | ||||||
|  |         public static function rsBlockNum2($spec)    { return $spec[3]; } | ||||||
|  |         public static function rsDataCodes2($spec)   { return $spec[4]; } | ||||||
|  |         public static function rsEccCodes2($spec)    { return $spec[2]; } | ||||||
|  |         public static function rsDataLength($spec)   { return ($spec[0] * $spec[1]) + ($spec[3] * $spec[4]);    } | ||||||
|  |         public static function rsEccLength($spec)    { return ($spec[0] + $spec[3]) * $spec[2]; } | ||||||
|  |          | ||||||
|  |     } | ||||||
							
								
								
									
										311
									
								
								webui/system/helper/phpqrcode/qrsplit.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										311
									
								
								webui/system/helper/phpqrcode/qrsplit.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,311 @@ | |||||||
|  | <?php | ||||||
|  | /* | ||||||
|  |  * PHP QR Code encoder | ||||||
|  |  * | ||||||
|  |  * Input splitting classes | ||||||
|  |  * | ||||||
|  |  * Based on libqrencode C library distributed under LGPL 2.1 | ||||||
|  |  * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi <fukuchi@megaui.net> | ||||||
|  |  * | ||||||
|  |  * PHP QR Code is distributed under LGPL 3 | ||||||
|  |  * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm> | ||||||
|  |  * | ||||||
|  |  * The following data / specifications are taken from | ||||||
|  |  * "Two dimensional symbol -- QR-code -- Basic Specification" (JIS X0510:2004) | ||||||
|  |  *  or | ||||||
|  |  * "Automatic identification and data capture techniques --  | ||||||
|  |  *  QR Code 2005 bar code symbology specification" (ISO/IEC 18004:2006) | ||||||
|  |  * | ||||||
|  |  * This library is free software; you can redistribute it and/or | ||||||
|  |  * modify it under the terms of the GNU Lesser General Public | ||||||
|  |  * License as published by the Free Software Foundation; either | ||||||
|  |  * version 3 of the License, or any later version. | ||||||
|  |  * | ||||||
|  |  * This library is distributed in the hope that it will be useful, | ||||||
|  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||||||
|  |  * Lesser General Public License for more details. | ||||||
|  |  * | ||||||
|  |  * You should have received a copy of the GNU Lesser General Public | ||||||
|  |  * License along with this library; if not, write to the Free Software | ||||||
|  |  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||||||
|  |  */ | ||||||
|  |     class QRsplit { | ||||||
|  |  | ||||||
|  |         public $dataStr = ''; | ||||||
|  |         public $input; | ||||||
|  |         public $modeHint; | ||||||
|  |  | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public function __construct($dataStr, $input, $modeHint)  | ||||||
|  |         { | ||||||
|  |             $this->dataStr  = $dataStr; | ||||||
|  |             $this->input    = $input; | ||||||
|  |             $this->modeHint = $modeHint; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public static function isdigitat($str, $pos) | ||||||
|  |         {     | ||||||
|  |             if ($pos >= strlen($str)) | ||||||
|  |                 return false; | ||||||
|  |              | ||||||
|  |             return ((ord($str[$pos]) >= ord('0'))&&(ord($str[$pos]) <= ord('9'))); | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public static function isalnumat($str, $pos) | ||||||
|  |         { | ||||||
|  |             if ($pos >= strlen($str)) | ||||||
|  |                 return false; | ||||||
|  |                  | ||||||
|  |             return (QRinput::lookAnTable(ord($str[$pos])) >= 0); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public function identifyMode($pos) | ||||||
|  |         { | ||||||
|  |             if ($pos >= strlen($this->dataStr))  | ||||||
|  |                 return QR_MODE_NUL; | ||||||
|  |                  | ||||||
|  |             $c = $this->dataStr[$pos]; | ||||||
|  |              | ||||||
|  |             if(self::isdigitat($this->dataStr, $pos)) { | ||||||
|  |                 return QR_MODE_NUM; | ||||||
|  |             } else if(self::isalnumat($this->dataStr, $pos)) { | ||||||
|  |                 return QR_MODE_AN; | ||||||
|  |             } else if($this->modeHint == QR_MODE_KANJI) { | ||||||
|  |              | ||||||
|  |                 if ($pos+1 < strlen($this->dataStr))  | ||||||
|  |                 { | ||||||
|  |                     $d = $this->dataStr[$pos+1]; | ||||||
|  |                     $word = (ord($c) << 8) | ord($d); | ||||||
|  |                     if(($word >= 0x8140 && $word <= 0x9ffc) || ($word >= 0xe040 && $word <= 0xebbf)) { | ||||||
|  |                         return QR_MODE_KANJI; | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             return QR_MODE_8; | ||||||
|  |         }  | ||||||
|  |          | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public function eatNum() | ||||||
|  |         { | ||||||
|  |             $ln = QRspec::lengthIndicator(QR_MODE_NUM, $this->input->getVersion()); | ||||||
|  |  | ||||||
|  |             $p = 0; | ||||||
|  |             while(self::isdigitat($this->dataStr, $p)) { | ||||||
|  |                 $p++; | ||||||
|  |             } | ||||||
|  |              | ||||||
|  |             $run = $p; | ||||||
|  |             $mode = $this->identifyMode($p); | ||||||
|  |              | ||||||
|  |             if($mode == QR_MODE_8) { | ||||||
|  |                 $dif = QRinput::estimateBitsModeNum($run) + 4 + $ln | ||||||
|  |                      + QRinput::estimateBitsMode8(1)         // + 4 + l8 | ||||||
|  |                      - QRinput::estimateBitsMode8($run + 1); // - 4 - l8 | ||||||
|  |                 if($dif > 0) { | ||||||
|  |                     return $this->eat8(); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |             if($mode == QR_MODE_AN) { | ||||||
|  |                 $dif = QRinput::estimateBitsModeNum($run) + 4 + $ln | ||||||
|  |                      + QRinput::estimateBitsModeAn(1)        // + 4 + la | ||||||
|  |                      - QRinput::estimateBitsModeAn($run + 1);// - 4 - la | ||||||
|  |                 if($dif > 0) { | ||||||
|  |                     return $this->eatAn(); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |              | ||||||
|  |             $ret = $this->input->append(QR_MODE_NUM, $run, str_split($this->dataStr)); | ||||||
|  |             if($ret < 0) | ||||||
|  |                 return -1; | ||||||
|  |  | ||||||
|  |             return $run; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public function eatAn() | ||||||
|  |         { | ||||||
|  |             $la = QRspec::lengthIndicator(QR_MODE_AN,  $this->input->getVersion()); | ||||||
|  |             $ln = QRspec::lengthIndicator(QR_MODE_NUM, $this->input->getVersion()); | ||||||
|  |  | ||||||
|  |             $p = 0; | ||||||
|  |              | ||||||
|  |             while(self::isalnumat($this->dataStr, $p)) { | ||||||
|  |                 if(self::isdigitat($this->dataStr, $p)) { | ||||||
|  |                     $q = $p; | ||||||
|  |                     while(self::isdigitat($this->dataStr, $q)) { | ||||||
|  |                         $q++; | ||||||
|  |                     } | ||||||
|  |                      | ||||||
|  |                     $dif = QRinput::estimateBitsModeAn($p) // + 4 + la | ||||||
|  |                          + QRinput::estimateBitsModeNum($q - $p) + 4 + $ln | ||||||
|  |                          - QRinput::estimateBitsModeAn($q); // - 4 - la | ||||||
|  |                           | ||||||
|  |                     if($dif < 0) { | ||||||
|  |                         break; | ||||||
|  |                     } else { | ||||||
|  |                         $p = $q; | ||||||
|  |                     } | ||||||
|  |                 } else { | ||||||
|  |                     $p++; | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             $run = $p; | ||||||
|  |  | ||||||
|  |             if(!self::isalnumat($this->dataStr, $p)) { | ||||||
|  |                 $dif = QRinput::estimateBitsModeAn($run) + 4 + $la | ||||||
|  |                      + QRinput::estimateBitsMode8(1) // + 4 + l8 | ||||||
|  |                       - QRinput::estimateBitsMode8($run + 1); // - 4 - l8 | ||||||
|  |                 if($dif > 0) { | ||||||
|  |                     return $this->eat8(); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             $ret = $this->input->append(QR_MODE_AN, $run, str_split($this->dataStr)); | ||||||
|  |             if($ret < 0) | ||||||
|  |                 return -1; | ||||||
|  |  | ||||||
|  |             return $run; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public function eatKanji() | ||||||
|  |         { | ||||||
|  |             $p = 0; | ||||||
|  |              | ||||||
|  |             while($this->identifyMode($p) == QR_MODE_KANJI) { | ||||||
|  |                 $p += 2; | ||||||
|  |             } | ||||||
|  |              | ||||||
|  |             $ret = $this->input->append(QR_MODE_KANJI, $p, str_split($this->dataStr)); | ||||||
|  |             if($ret < 0) | ||||||
|  |                 return -1; | ||||||
|  |  | ||||||
|  |             return $run; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public function eat8() | ||||||
|  |         { | ||||||
|  |             $la = QRspec::lengthIndicator(QR_MODE_AN, $this->input->getVersion()); | ||||||
|  |             $ln = QRspec::lengthIndicator(QR_MODE_NUM, $this->input->getVersion()); | ||||||
|  |  | ||||||
|  |             $p = 1; | ||||||
|  |             $dataStrLen = strlen($this->dataStr); | ||||||
|  |              | ||||||
|  |             while($p < $dataStrLen) { | ||||||
|  |                  | ||||||
|  |                 $mode = $this->identifyMode($p); | ||||||
|  |                 if($mode == QR_MODE_KANJI) { | ||||||
|  |                     break; | ||||||
|  |                 } | ||||||
|  |                 if($mode == QR_MODE_NUM) { | ||||||
|  |                     $q = $p; | ||||||
|  |                     while(self::isdigitat($this->dataStr, $q)) { | ||||||
|  |                         $q++; | ||||||
|  |                     } | ||||||
|  |                     $dif = QRinput::estimateBitsMode8($p) // + 4 + l8 | ||||||
|  |                          + QRinput::estimateBitsModeNum($q - $p) + 4 + $ln | ||||||
|  |                          - QRinput::estimateBitsMode8($q); // - 4 - l8 | ||||||
|  |                     if($dif < 0) { | ||||||
|  |                         break; | ||||||
|  |                     } else { | ||||||
|  |                         $p = $q; | ||||||
|  |                     } | ||||||
|  |                 } else if($mode == QR_MODE_AN) { | ||||||
|  |                     $q = $p; | ||||||
|  |                     while(self::isalnumat($this->dataStr, $q)) { | ||||||
|  |                         $q++; | ||||||
|  |                     } | ||||||
|  |                     $dif = QRinput::estimateBitsMode8($p)  // + 4 + l8 | ||||||
|  |                          + QRinput::estimateBitsModeAn($q - $p) + 4 + $la | ||||||
|  |                          - QRinput::estimateBitsMode8($q); // - 4 - l8 | ||||||
|  |                     if($dif < 0) { | ||||||
|  |                         break; | ||||||
|  |                     } else { | ||||||
|  |                         $p = $q; | ||||||
|  |                     } | ||||||
|  |                 } else { | ||||||
|  |                     $p++; | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             $run = $p; | ||||||
|  |             $ret = $this->input->append(QR_MODE_8, $run, str_split($this->dataStr)); | ||||||
|  |              | ||||||
|  |             if($ret < 0) | ||||||
|  |                 return -1; | ||||||
|  |  | ||||||
|  |             return $run; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public function splitString() | ||||||
|  |         { | ||||||
|  |             while (strlen($this->dataStr) > 0) | ||||||
|  |             { | ||||||
|  |                 if($this->dataStr == '') | ||||||
|  |                     return 0; | ||||||
|  |  | ||||||
|  |                 $mode = $this->identifyMode(0); | ||||||
|  |                  | ||||||
|  |                 switch ($mode) { | ||||||
|  |                     case QR_MODE_NUM: $length = $this->eatNum(); break; | ||||||
|  |                     case QR_MODE_AN:  $length = $this->eatAn(); break; | ||||||
|  |                     case QR_MODE_KANJI: | ||||||
|  |                         if ($hint == QR_MODE_KANJI) | ||||||
|  |                                 $length = $this->eatKanji(); | ||||||
|  |                         else    $length = $this->eat8(); | ||||||
|  |                         break; | ||||||
|  |                     default: $length = $this->eat8(); break; | ||||||
|  |                  | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 if($length == 0) return 0; | ||||||
|  |                 if($length < 0)  return -1; | ||||||
|  |                  | ||||||
|  |                 $this->dataStr = substr($this->dataStr, $length); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public function toUpper() | ||||||
|  |         { | ||||||
|  |             $stringLen = strlen($this->dataStr); | ||||||
|  |             $p = 0; | ||||||
|  |              | ||||||
|  |             while ($p<$stringLen) { | ||||||
|  |                 $mode = self::identifyMode(substr($this->dataStr, $p), $this->modeHint); | ||||||
|  |                 if($mode == QR_MODE_KANJI) { | ||||||
|  |                     $p += 2; | ||||||
|  |                 } else { | ||||||
|  |                     if (ord($this->dataStr[$p]) >= ord('a') && ord($this->dataStr[$p]) <= ord('z')) { | ||||||
|  |                         $this->dataStr[$p] = chr(ord($this->dataStr[$p]) - 32); | ||||||
|  |                     } | ||||||
|  |                     $p++; | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             return $this->dataStr; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public static function splitStringToQRinput($string, QRinput $input, $modeHint, $casesensitive = true) | ||||||
|  |         { | ||||||
|  |             if(is_null($string) || $string == '\0' || $string == '') { | ||||||
|  |                 throw new Exception('empty string!!!'); | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             $split = new QRsplit($string, $input, $modeHint); | ||||||
|  |              | ||||||
|  |             if(!$casesensitive) | ||||||
|  |                 $split->toUpper(); | ||||||
|  |                  | ||||||
|  |             return $split->splitString(); | ||||||
|  |         } | ||||||
|  |     } | ||||||
							
								
								
									
										172
									
								
								webui/system/helper/phpqrcode/qrtools.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										172
									
								
								webui/system/helper/phpqrcode/qrtools.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,172 @@ | |||||||
|  | <?php | ||||||
|  | /* | ||||||
|  |  * PHP QR Code encoder | ||||||
|  |  * | ||||||
|  |  * Toolset, handy and debug utilites. | ||||||
|  |  * | ||||||
|  |  * PHP QR Code is distributed under LGPL 3 | ||||||
|  |  * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm> | ||||||
|  |  * | ||||||
|  |  * This library is free software; you can redistribute it and/or | ||||||
|  |  * modify it under the terms of the GNU Lesser General Public | ||||||
|  |  * License as published by the Free Software Foundation; either | ||||||
|  |  * version 3 of the License, or any later version. | ||||||
|  |  * | ||||||
|  |  * This library is distributed in the hope that it will be useful, | ||||||
|  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||||||
|  |  * Lesser General Public License for more details. | ||||||
|  |  * | ||||||
|  |  * You should have received a copy of the GNU Lesser General Public | ||||||
|  |  * License along with this library; if not, write to the Free Software | ||||||
|  |  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  |     class QRtools { | ||||||
|  |      | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public static function binarize($frame) | ||||||
|  |         { | ||||||
|  |             $len = count($frame); | ||||||
|  |             foreach ($frame as &$frameLine) { | ||||||
|  |                  | ||||||
|  |                 for($i=0; $i<$len; $i++) { | ||||||
|  |                     $frameLine[$i] = (ord($frameLine[$i])&1)?'1':'0'; | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |              | ||||||
|  |             return $frame; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public static function tcpdfBarcodeArray($code, $mode = 'QR,L', $tcPdfVersion = '4.5.037') | ||||||
|  |         { | ||||||
|  |             $barcode_array = array(); | ||||||
|  |              | ||||||
|  |             if (!is_array($mode)) | ||||||
|  |                 $mode = explode(',', $mode); | ||||||
|  |                  | ||||||
|  |             $eccLevel = 'L'; | ||||||
|  |                  | ||||||
|  |             if (count($mode) > 1) { | ||||||
|  |                 $eccLevel = $mode[1]; | ||||||
|  |             } | ||||||
|  |                  | ||||||
|  |             $qrTab = QRcode::text($code, false, $eccLevel); | ||||||
|  |             $size = count($qrTab); | ||||||
|  |                  | ||||||
|  |             $barcode_array['num_rows'] = $size; | ||||||
|  |             $barcode_array['num_cols'] = $size; | ||||||
|  |             $barcode_array['bcode'] = array(); | ||||||
|  |                  | ||||||
|  |             foreach ($qrTab as $line) { | ||||||
|  |                 $arrAdd = array(); | ||||||
|  |                 foreach(str_split($line) as $char) | ||||||
|  |                     $arrAdd[] = ($char=='1')?1:0; | ||||||
|  |                 $barcode_array['bcode'][] = $arrAdd; | ||||||
|  |             } | ||||||
|  |                      | ||||||
|  |             return $barcode_array; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public static function clearCache() | ||||||
|  |         { | ||||||
|  |             self::$frames = array(); | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public static function buildCache() | ||||||
|  |         { | ||||||
|  | 			QRtools::markTime('before_build_cache'); | ||||||
|  | 			 | ||||||
|  | 			$mask = new QRmask(); | ||||||
|  |             for ($a=1; $a <= QRSPEC_VERSION_MAX; $a++) { | ||||||
|  |                 $frame = QRspec::newFrame($a); | ||||||
|  |                 if (QR_IMAGE) { | ||||||
|  |                     $fileName = QR_CACHE_DIR.'frame_'.$a.'.png'; | ||||||
|  |                     QRimage::png(self::binarize($frame), $fileName, 1, 0); | ||||||
|  |                 } | ||||||
|  | 				 | ||||||
|  | 				$width = count($frame); | ||||||
|  | 				$bitMask = array_fill(0, $width, array_fill(0, $width, 0)); | ||||||
|  | 				for ($maskNo=0; $maskNo<8; $maskNo++) | ||||||
|  | 					$mask->makeMaskNo($maskNo, $width, $frame, $bitMask, true); | ||||||
|  |             } | ||||||
|  | 			 | ||||||
|  | 			QRtools::markTime('after_build_cache'); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public static function log($outfile, $err) | ||||||
|  |         { | ||||||
|  |             if (QR_LOG_DIR !== false) { | ||||||
|  |                 if ($err != '') { | ||||||
|  |                     if ($outfile !== false) { | ||||||
|  |                         file_put_contents(QR_LOG_DIR.basename($outfile).'-errors.txt', date('Y-m-d H:i:s').': '.$err, FILE_APPEND); | ||||||
|  |                     } else { | ||||||
|  |                         file_put_contents(QR_LOG_DIR.'errors.txt', date('Y-m-d H:i:s').': '.$err, FILE_APPEND); | ||||||
|  |                     } | ||||||
|  |                 }     | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public static function dumpMask($frame)  | ||||||
|  |         { | ||||||
|  |             $width = count($frame); | ||||||
|  |             for($y=0;$y<$width;$y++) { | ||||||
|  |                 for($x=0;$x<$width;$x++) { | ||||||
|  |                     echo ord($frame[$y][$x]).','; | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public static function markTime($markerId) | ||||||
|  |         { | ||||||
|  |             list($usec, $sec) = explode(" ", microtime()); | ||||||
|  |             $time = ((float)$usec + (float)$sec); | ||||||
|  |              | ||||||
|  |             if (!isset($GLOBALS['qr_time_bench'])) | ||||||
|  |                 $GLOBALS['qr_time_bench'] = array(); | ||||||
|  |              | ||||||
|  |             $GLOBALS['qr_time_bench'][$markerId] = $time; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         //---------------------------------------------------------------------- | ||||||
|  |         public static function timeBenchmark() | ||||||
|  |         { | ||||||
|  |             self::markTime('finish'); | ||||||
|  |          | ||||||
|  |             $lastTime = 0; | ||||||
|  |             $startTime = 0; | ||||||
|  |             $p = 0; | ||||||
|  |  | ||||||
|  |             echo '<table cellpadding="3" cellspacing="1"> | ||||||
|  |                     <thead><tr style="border-bottom:1px solid silver"><td colspan="2" style="text-align:center">BENCHMARK</td></tr></thead> | ||||||
|  |                     <tbody>'; | ||||||
|  |  | ||||||
|  |             foreach($GLOBALS['qr_time_bench'] as $markerId=>$thisTime) { | ||||||
|  |                 if ($p > 0) { | ||||||
|  |                     echo '<tr><th style="text-align:right">till '.$markerId.': </th><td>'.number_format($thisTime-$lastTime, 6).'s</td></tr>'; | ||||||
|  |                 } else { | ||||||
|  |                     $startTime = $thisTime; | ||||||
|  |                 } | ||||||
|  |                  | ||||||
|  |                 $p++; | ||||||
|  |                 $lastTime = $thisTime; | ||||||
|  |             } | ||||||
|  |              | ||||||
|  |             echo '</tbody><tfoot> | ||||||
|  |                 <tr style="border-top:2px solid black"><th style="text-align:right">TOTAL: </th><td>'.number_format($lastTime-$startTime, 6).'s</td></tr> | ||||||
|  |             </tfoot> | ||||||
|  |             </table>'; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     //########################################################################## | ||||||
|  |      | ||||||
|  |     QRtools::markTime('start'); | ||||||
|  |      | ||||||
							
								
								
									
										2
									
								
								webui/system/helper/phpqrcode/tools/merge.bat
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								webui/system/helper/phpqrcode/tools/merge.bat
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,2 @@ | |||||||
|  | php ./merge.php | ||||||
|  | pause | ||||||
							
								
								
									
										70
									
								
								webui/system/helper/phpqrcode/tools/merge.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										70
									
								
								webui/system/helper/phpqrcode/tools/merge.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,70 @@ | |||||||
|  | <?php | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * PHP QR Code encoder | ||||||
|  |  * | ||||||
|  |  * Tool for merging all library files into one, simpler to incorporate. | ||||||
|  |  *  | ||||||
|  |  * MAKE SURE THAT RESULTING PHPQRCode.php (and its dir) ARE WRITABLE! | ||||||
|  |  * | ||||||
|  |  * PHP QR Code is distributed under LGPL 3 | ||||||
|  |  * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm> | ||||||
|  |  * | ||||||
|  |  * This library is free software; you can redistribute it and/or | ||||||
|  |  * modify it under the terms of the GNU Lesser General Public | ||||||
|  |  * License as published by the Free Software Foundation; either | ||||||
|  |  * version 3 of the License, or any later version. | ||||||
|  |  * | ||||||
|  |  * This library is distributed in the hope that it will be useful, | ||||||
|  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||||||
|  |  * Lesser General Public License for more details. | ||||||
|  |  * | ||||||
|  |  * You should have received a copy of the GNU Lesser General Public | ||||||
|  |  * License along with this library; if not, write to the Free Software | ||||||
|  |  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||||||
|  |  */ | ||||||
|  |   | ||||||
|  |     $QR_BASEDIR = dirname(__FILE__).DIRECTORY_SEPARATOR.'..'.DIRECTORY_SEPARATOR; | ||||||
|  |     $QR_TOOLSDIR = dirname(__FILE__).DIRECTORY_SEPARATOR; | ||||||
|  |      | ||||||
|  |     $outputFile = $QR_BASEDIR.'phpqrcode.php'; | ||||||
|  |      | ||||||
|  |     // Required libs | ||||||
|  |      | ||||||
|  |     $fileList = array( | ||||||
|  |         $QR_BASEDIR.'qrconst.php', | ||||||
|  |         $QR_TOOLSDIR.'merged_config.php', | ||||||
|  |         $QR_BASEDIR.'qrtools.php', | ||||||
|  |         $QR_BASEDIR.'qrspec.php', | ||||||
|  |         $QR_BASEDIR.'qrimage.php', | ||||||
|  |         $QR_BASEDIR.'qrinput.php', | ||||||
|  |         $QR_BASEDIR.'qrbitstream.php', | ||||||
|  |         $QR_BASEDIR.'qrsplit.php', | ||||||
|  |         $QR_BASEDIR.'qrrscode.php', | ||||||
|  |         $QR_BASEDIR.'qrmask.php', | ||||||
|  |         $QR_BASEDIR.'qrencode.php' | ||||||
|  |     ); | ||||||
|  |      | ||||||
|  |     $headerFile = $QR_TOOLSDIR.'merged_header.php'; | ||||||
|  |     $versionFile = $QR_BASEDIR.'VERSION'; | ||||||
|  |      | ||||||
|  |     $outputCode = ''; | ||||||
|  |      | ||||||
|  |     foreach($fileList as $fileName) { | ||||||
|  |         $outputCode .= "\n\n".'//---- '.basename($fileName).' -----------------------------'."\n\n"; | ||||||
|  |         $anotherCode = file_get_contents($fileName); | ||||||
|  |         $anotherCode = preg_replace ('/^<\?php/', '', $anotherCode); | ||||||
|  |         $anotherCode = preg_replace ('/\?>\*$/', '', $anotherCode); | ||||||
|  |         $outputCode .= "\n\n".$anotherCode."\n\n"; | ||||||
|  |     } | ||||||
|  |      | ||||||
|  | 	$versionDataEx = explode("\n", file_get_contents($versionFile)); | ||||||
|  | 	 | ||||||
|  |     $outputContents = file_get_contents($headerFile); | ||||||
|  |     $outputContents .= "\n\n/*\n * Version: ".trim($versionDataEx[0])."\n * Build: ".trim($versionDataEx[1])."\n */\n\n"; | ||||||
|  |     $outputContents .= $outputCode; | ||||||
|  |      | ||||||
|  |     file_put_contents($outputFile, $outputContents); | ||||||
|  |      | ||||||
|  |      | ||||||
							
								
								
									
										2
									
								
								webui/system/helper/phpqrcode/tools/merge.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								webui/system/helper/phpqrcode/tools/merge.sh
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,2 @@ | |||||||
|  | #!/bin/sh | ||||||
|  | php ./merge.php | ||||||
							
								
								
									
										17
									
								
								webui/system/helper/phpqrcode/tools/merged_config.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								webui/system/helper/phpqrcode/tools/merged_config.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,17 @@ | |||||||
|  | <?php | ||||||
|  | /* | ||||||
|  |  * PHP QR Code encoder | ||||||
|  |  * | ||||||
|  |  * Config file, tuned-up for merged verion | ||||||
|  |  */ | ||||||
|  |       | ||||||
|  |     define('QR_CACHEABLE', false);       // use cache - more disk reads but less CPU power, masks and format templates are stored there | ||||||
|  |     define('QR_CACHE_DIR', false);       // used when QR_CACHEABLE === true | ||||||
|  |     define('QR_LOG_DIR', false);         // default error logs dir    | ||||||
|  |      | ||||||
|  |     define('QR_FIND_BEST_MASK', true);                                                          // if true, estimates best mask (spec. default, but extremally slow; set to false to significant performance boost but (propably) worst quality code | ||||||
|  |     define('QR_FIND_FROM_RANDOM', 2);                                                       // if false, checks all masks available, otherwise value tells count of masks need to be checked, mask id are got randomly | ||||||
|  |     define('QR_DEFAULT_MASK', 2);                                                               // when QR_FIND_BEST_MASK === false | ||||||
|  |                                                    | ||||||
|  |     define('QR_PNG_MAXIMUM_SIZE',  1024);                                                       // maximum allowed png image width (in pixels), tune to make sure GD and PHP can handle such big images | ||||||
|  |                                                    | ||||||
							
								
								
									
										36
									
								
								webui/system/helper/phpqrcode/tools/merged_header.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								webui/system/helper/phpqrcode/tools/merged_header.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,36 @@ | |||||||
|  | <?php | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * PHP QR Code encoder | ||||||
|  |  * | ||||||
|  |  * This file contains MERGED version of PHP QR Code library. | ||||||
|  |  * It was auto-generated from full version for your convenience. | ||||||
|  |  * | ||||||
|  |  * This merged version was configured to not requre any external files, | ||||||
|  |  * with disabled cache, error loging and weker but faster mask matching. | ||||||
|  |  * If you need tune it up please use non-merged version. | ||||||
|  |  * | ||||||
|  |  * For full version, documentation, examples of use please visit: | ||||||
|  |  * | ||||||
|  |  *    http://phpqrcode.sourceforge.net/ | ||||||
|  |  *    https://sourceforge.net/projects/phpqrcode/ | ||||||
|  |  * | ||||||
|  |  * PHP QR Code is distributed under LGPL 3 | ||||||
|  |  * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm> | ||||||
|  |  * | ||||||
|  |  * This library is free software; you can redistribute it and/or | ||||||
|  |  * modify it under the terms of the GNU Lesser General Public | ||||||
|  |  * License as published by the Free Software Foundation; either | ||||||
|  |  * version 3 of the License, or any later version. | ||||||
|  |  * | ||||||
|  |  * This library is distributed in the hope that it will be useful, | ||||||
|  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||||||
|  |  * Lesser General Public License for more details. | ||||||
|  |  * | ||||||
|  |  * You should have received a copy of the GNU Lesser General Public | ||||||
|  |  * License along with this library; if not, write to the Free Software | ||||||
|  |  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||||||
|  |  */ | ||||||
|  |   | ||||||
|  |   | ||||||
| @@ -1037,6 +1037,39 @@ var Piler = | |||||||
|     { |     { | ||||||
|        var colour = $('#' + srcid).val(); |        var colour = $('#' + srcid).val(); | ||||||
|        $('#' + dstid).css('background', colour); |        $('#' + dstid).css('background', colour); | ||||||
|  |     }, | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     new_qr: function() | ||||||
|  |     { | ||||||
|  |  | ||||||
|  |         Piler.log("[new_qr]"); | ||||||
|  |  | ||||||
|  |         document.body.style.cursor = 'wait'; | ||||||
|  |  | ||||||
|  |         jQuery.ajax('qr.php?refresh=1', { cache: true }) | ||||||
|  |         .done( function(a) { | ||||||
|  |            $('#QR').html(a); | ||||||
|  |            document.body.style.cursor = 'default'; | ||||||
|  |         }) | ||||||
|  |         .fail(function(a, b) { alert("Problem retrieving XML data:" + b) }); | ||||||
|  |  | ||||||
|  |     }, | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     toggle_ga: function() | ||||||
|  |     { | ||||||
|  |         var ga = 0; | ||||||
|  |  | ||||||
|  |         if(document.getElementById('ga_enabled').checked == 1){ ga = 1; } | ||||||
|  |  | ||||||
|  |         Piler.log("[toggle GA]", ga); | ||||||
|  |  | ||||||
|  |         jQuery.ajax('qr.php?toggle=' + ga, { cache: true }) | ||||||
|  |         .done( function(a) { | ||||||
|  |         }) | ||||||
|  |         .fail(function(a, b) { alert("Problem retrieving XML data:" + b) }); | ||||||
|  |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
| @@ -73,7 +73,7 @@ | |||||||
|     <?php } ?> |     <?php } ?> | ||||||
|  |  | ||||||
|                     <li class="dropdown"> |                     <li class="dropdown"> | ||||||
|                         <a href="#" class="dropdown-toggle" data-toggle="dropdown"><i class="icon-user"></i> <?php if(isset($_SESSION['realname'])) { print $_SESSION['realname']; ?> <?php } ?><b class="caret"></b></a> |                         <a href="#" class="dropdown-toggle" data-toggle="dropdown"><i class="icon-user"></i> <?php if($realname) { print $realname; ?> <?php } ?><b class="caret"></b></a> | ||||||
|                         <ul class="dropdown-menu"> |                         <ul class="dropdown-menu"> | ||||||
|     <?php if($settings['support_link']) { ?> |     <?php if($settings['support_link']) { ?> | ||||||
|                             <li><a href="<?php print $settings['support_link']; ?>" target="_blank" <?php if($settings['text_colour']) { ?> style="color: <?php print $settings['text_colour']; ?>;"<?php } ?>><i class="icon-question-sign"></i> <?php print $text_contact_support; ?></a></li> |                             <li><a href="<?php print $settings['support_link']; ?>" target="_blank" <?php if($settings['text_colour']) { ?> style="color: <?php print $settings['text_colour']; ?>;"<?php } ?>><i class="icon-question-sign"></i> <?php print $text_contact_support; ?></a></li> | ||||||
|   | |||||||
							
								
								
									
										58
									
								
								webui/view/theme/default/templates/login/ga.tpl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								webui/view/theme/default/templates/login/ga.tpl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,58 @@ | |||||||
|  | <!DOCTYPE html> | ||||||
|  | <html lang="en"> | ||||||
|  |   <head> | ||||||
|  |     <meta charset="utf-8"> | ||||||
|  |     <title><?php if($title_prefix) { print $title_prefix; ?> | <?php } ?><?php print $title; ?></title> | ||||||
|  |     <meta name="viewport" content="width=device-width, initial-scale=1.0"> | ||||||
|  |     <?php if(SITE_KEYWORDS) { ?><meta name="keywords" content="<?php print SITE_KEYWORDS; ?>" /><?php } ?> | ||||||
|  |     <?php if(SITE_DESCRIPTION) { ?><meta name="description" content="<?php print SITE_DESCRIPTION; ?>" /><?php } ?> | ||||||
|  |     <?php if(PROVIDED_BY) { ?><meta name="author" content="<?php print PROVIDED_BY; ?>" /><?php } ?> | ||||||
|  |  | ||||||
|  |     <link href="/view/theme/default/assets/css/metro-bootstrap.css" rel="stylesheet"> | ||||||
|  |  | ||||||
|  |     <!-- HTML5 shim, for IE6-8 support of HTML5 elements --> | ||||||
|  |     <!-- original location: http://html5shim.googlecode.com/svn/trunk/html5.js --> | ||||||
|  |     <!--[if lt IE 9]> | ||||||
|  |       <script src="/view/theme/default/assets/js/html5.js"></script> | ||||||
|  |     <![endif]--> | ||||||
|  |  | ||||||
|  |     <!-- Fav and touch icons --> | ||||||
|  |     <link rel="apple-touch-icon-precomposed" sizes="144x144" href="/view/theme/default/assets/ico/apple-touch-icon-144-precomposed.png"> | ||||||
|  |     <link rel="apple-touch-icon-precomposed" sizes="114x114" href="/view/theme/default/assets/ico/apple-touch-icon-114-precomposed.png"> | ||||||
|  |     <link rel="apple-touch-icon-precomposed" sizes="72x72" href="/view/theme/default/assets/ico/apple-touch-icon-72-precomposed.png"> | ||||||
|  |     <link rel="apple-touch-icon-precomposed" href="/view/theme/default/assets/ico/apple-touch-icon-57-precomposed.png"> | ||||||
|  |     <?php if(BRANDING_FAVICON) { ?><link rel="shortcut icon" href="<?php print BRANDING_FAVICON; ?>" /><?php } ?> | ||||||
|  |   </head> | ||||||
|  |  | ||||||
|  |  | ||||||
|  | <body class="loginpage"> | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     <div id="logincontainer" class="container"> | ||||||
|  |         <div id="logo-lg"><img src="<?php print SITE_URL; ?><?php print SITE_LOGO_LG; ?>" alt="Archive Logo Image" title="<?php print $text_login; ?>" /></div> | ||||||
|  |  | ||||||
|  |         <form name="login" action="index.php?route=login/ga" method="post" class="form-signin"> | ||||||
|  |  | ||||||
|  |             <h2 class="form-signin-heading"><?php print $text_enter_google_authenticator_code; ?></h2> | ||||||
|  |  | ||||||
|  |             <?php if(isset($x)){ ?><p class="alert alert-error lead"><?php print $x; ?></p><?php } ?> | ||||||
|  |             <input type="hidden" name="relocation" value="<?php if(isset($_GET['route']) && !preg_match("/^login/", $_GET['route']) ) { if(isset($_SERVER['REDIRECT_URL'])) { print $_SERVER['REDIRECT_URL']; } else { print $_SERVER['QUERY_STRING']; } } ?>" /> | ||||||
|  |  | ||||||
|  |             <input type="password" class="input-block-level bold" id="ga_code" name="ga_code" placeholder="<?php print $text_google_authenticator_code; ?>"> | ||||||
|  |  | ||||||
|  |             <button class="btn btn-large btn-primary" type="submit" value="<?php print $text_submit; ?>"><?php print $text_submit; ?></button> | ||||||
|  |  | ||||||
|  |         </form> | ||||||
|  |  | ||||||
|  |         <div id="compatibility" class="well well-large"> | ||||||
|  |             <p><?php print COMPATIBILITY; ?></p> | ||||||
|  |         </div> | ||||||
|  |  | ||||||
|  |    </div> | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | <?php if(TRACKING_CODE) { print TRACKING_CODE; } ?> | ||||||
|  |  | ||||||
|  | </body> | ||||||
|  | </html> | ||||||
| @@ -93,6 +93,29 @@ | |||||||
|      |      | ||||||
| </form> | </form> | ||||||
|  |  | ||||||
|  |  | ||||||
|  | <form method="post" name="setqr" class="form-horizontal"> | ||||||
|  |  | ||||||
|  |    <h4><?php print $text_google_authenticator_settings; ?></h4> | ||||||
|  |  | ||||||
|  |     <div class="control-group"> | ||||||
|  |         <label class="control-label" for="ga_enabled"><?php print $text_enable; ?></label> | ||||||
|  |         <div class="controls"> | ||||||
|  |            <input type="checkbox" name="ga_enabled" id="ga_enabled" onclick="Piler.toggle_ga();" <?php if($ga['ga_enabled'] == 1) { ?>checked="checked"<?php } ?> /> | ||||||
|  |         </div> | ||||||
|  |     </div> | ||||||
|  |  | ||||||
|  |     <div class="control-group"> | ||||||
|  |         <label class="control-label" for="ga_secret"><?php print $text_qr_code; ?></label> | ||||||
|  |         <div id="QR" class="controls"> | ||||||
|  |            <?php print $ga['ga_secret']; ?> <a href="#" onclick="Piler.new_qr(); return false;"> <?php print $text_refresh_qr_code; ?></a><br /><img src="qr.php?ts=<?php print time(); ?>" /> | ||||||
|  |         </div> | ||||||
|  |     </div> | ||||||
|  |  | ||||||
|  | </form> | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| <p> </p> | <p> </p> | ||||||
|  |  | ||||||
| <?php if(PASSWORD_CHANGE_ENABLED == 1) { ?> | <?php if(PASSWORD_CHANGE_ENABLED == 1) { ?> | ||||||
|   | |||||||
| @@ -69,7 +69,7 @@ | |||||||
|              <?php if($settings['branding_url']) { ?><li><a href="<?php print $settings['branding_url']; ?>" target="_blank" <?php if($settings['text_colour']) { ?> style="color: <?php print $settings['text_colour']; ?>;"<?php } ?>><i class="icon-share-alt icon-white"></i> <?php print $settings['branding_text']; ?></a></li><?php } ?> |              <?php if($settings['branding_url']) { ?><li><a href="<?php print $settings['branding_url']; ?>" target="_blank" <?php if($settings['text_colour']) { ?> style="color: <?php print $settings['text_colour']; ?>;"<?php } ?>><i class="icon-share-alt icon-white"></i> <?php print $settings['branding_text']; ?></a></li><?php } ?> | ||||||
|  |  | ||||||
|              <li class="dropdown"> |              <li class="dropdown"> | ||||||
|                 <a href="#" class="dropdown-toggle" data-toggle="dropdown" <?php if($settings['text_colour']) { ?> style="color: <?php print $settings['text_colour']; ?>;"<?php } ?>><?php print $_SESSION['realname']; ?> <i class="icon-user icon-white"></i> <b class="caret"></b></a> |                 <a href="#" class="dropdown-toggle" data-toggle="dropdown" <?php if($settings['text_colour']) { ?> style="color: <?php print $settings['text_colour']; ?>;"<?php } ?>><?php print $realname; ?> <i class="icon-user icon-white"></i> <b class="caret"></b></a> | ||||||
|                 <ul class="dropdown-menu"> |                 <ul class="dropdown-menu"> | ||||||
|                    <li><a href="settings.php"><i class="icon-cog"></i> <?php print $text_settings; ?></a></li> |                    <li><a href="settings.php"><i class="icon-cog"></i> <?php print $text_settings; ?></a></li> | ||||||
|                    <li class="divider"></li> |                    <li class="divider"></li> | ||||||
|   | |||||||
							
								
								
									
										61
									
								
								webui/view/theme/mobile/templates/login/ga.tpl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								webui/view/theme/mobile/templates/login/ga.tpl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,61 @@ | |||||||
|  | <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> | ||||||
|  | <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="hu" lang="hu"> | ||||||
|  |  | ||||||
|  | <head> | ||||||
|  |    <title><?php if($title_prefix) { print $title_prefix; ?> | <?php } ?><?php print $title; ?></title> | ||||||
|  |    <meta http-equiv="content-type" content="text/html; charset=utf-8" /> | ||||||
|  |    <meta http-equiv="Content-Language" content="en" /> | ||||||
|  |    <?php if(SITE_KEYWORDS) { ?><meta name="keywords" content="<?php print SITE_KEYWORDS; ?>" /><?php } ?> | ||||||
|  |    <?php if(SITE_DESCRIPTION) { ?><meta name="description" content="<?php print SITE_DESCRIPTION; ?>" /><?php } ?> | ||||||
|  |    <?php if(PROVIDED_BY) { ?><meta name="author" content="<?php print PROVIDED_BY; ?>" /><?php } ?> | ||||||
|  |    <meta name="rating" content="general" /> | ||||||
|  |    <meta name="robots" content="all" /> | ||||||
|  |  | ||||||
|  |    <meta name="viewport" content="width=device-width, initial-scale=1.0"> | ||||||
|  |  | ||||||
|  |    <link href="/bootstrap/css/bootstrap<?php print BOOTSTRAP_THEME; ?>.min.css" rel="stylesheet" media="screen"> | ||||||
|  |    <link href="/bootstrap/css/bootstrap-responsive.min.css" rel="stylesheet" media="screen"> | ||||||
|  |  | ||||||
|  |    <link rel="stylesheet" type="text/css" href="/view/theme/<?php print THEME; ?>/stylesheet/jquery-ui-custom.min.css" /> | ||||||
|  |    <link rel="stylesheet" type="text/css" href="/view/theme/<?php print THEME; ?>/stylesheet/style-<?php print THEME; ?>.css" /> | ||||||
|  |  | ||||||
|  |    <script type="text/javascript" src="/view/javascript/jquery.min.js"></script> | ||||||
|  |    <script type="text/javascript" src="/view/javascript/jquery-ui-custom.min.js"></script> | ||||||
|  |    <script type="text/javascript" src="/view/javascript/bootstrap.min.js"></script> | ||||||
|  |    <script type="text/javascript" src="/view/javascript/rc-splitter.js"></script> | ||||||
|  |    <script type="text/javascript" src="/view/javascript/piler.js"></script> | ||||||
|  |  | ||||||
|  |    <?php if(BRANDING_FAVICON) { ?><link rel="shortcut icon" href="<?php print BRANDING_FAVICON; ?>" /><?php } ?> | ||||||
|  | </head> | ||||||
|  |  | ||||||
|  | <body class="loginpage"> | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     <div id="logincontainer" class="container"> | ||||||
|  |         <div id="logo-lg"><img src="<?php print SITE_URL; ?><?php print SITE_LOGO_LG; ?>" alt="Archive Logo Image" title="<?php print $text_login; ?>" /></div> | ||||||
|  |  | ||||||
|  |         <form name="login" action="index.php?route=login/ga" method="post" class="form-signin"> | ||||||
|  |  | ||||||
|  |             <h2 class="form-signin-heading"><?php print $text_enter_google_authenticator_code; ?></h2> | ||||||
|  |  | ||||||
|  |             <?php if(isset($x)){ ?><p class="alert alert-error lead"><?php print $x; ?></p><?php } ?> | ||||||
|  |             <input type="hidden" name="relocation" value="<?php if(isset($_GET['route']) && !preg_match("/^login/", $_GET['route']) ) { if(isset($_SERVER['REDIRECT_URL'])) { print $_SERVER['REDIRECT_URL']; } else { print $_SERVER['QUERY_STRING']; } } ?>" /> | ||||||
|  |  | ||||||
|  |             <input type="password" class="input-block-level bold" name="ga_code" placeholder="<?php print $text_google_authenticator_code; ?>"> | ||||||
|  |  | ||||||
|  |             <button class="btn btn-large btn-primary" type="submit" value="<?php print $text_submit; ?>"><?php print $text_submit; ?></button> | ||||||
|  |  | ||||||
|  |         </form> | ||||||
|  |  | ||||||
|  |         <div id="compatibility" class="well well-large"> | ||||||
|  |             <p><?php print COMPATIBILITY; ?></p> | ||||||
|  |         </div> | ||||||
|  |  | ||||||
|  |    </div> | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | <?php if(TRACKING_CODE) { print TRACKING_CODE; } ?> | ||||||
|  |  | ||||||
|  | </body> | ||||||
|  | </html> | ||||||
| @@ -102,12 +102,38 @@ | |||||||
|       </div> |       </div> | ||||||
|  |  | ||||||
|    </div> |    </div> | ||||||
|  |  | ||||||
| </form> | </form> | ||||||
|  |  | ||||||
|  | <p> </p> | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |    <div id="search"> | ||||||
|  |  | ||||||
|  |       <h4><?php print $text_google_authenticator_settings; ?></h4> | ||||||
|  |  | ||||||
|  |       <div id="search1"> | ||||||
|  |  | ||||||
|  |          <div class="row"> | ||||||
|  |                 <div class="logincell"><?php print $text_enable; ?>:</div> | ||||||
|  |                 <div class="logincell"><input type="checkbox" name="ga_enabled" id="ga_enabled" onclick="Piler.toggle_ga();" <?php if($ga['ga_enabled'] == 1) { ?>checked="checked"<?php } ?> /></div> | ||||||
|  |          </div> | ||||||
|  |  | ||||||
|  |          <div class="row"> | ||||||
|  |                 <div class="logincell"><?php print $text_qr_code; ?>:</div> | ||||||
|  |                 <div id="QR" class="logincell"> | ||||||
|  |                    <?php print $ga['ga_secret']; ?> <a href="#" onclick="Piler.new_qr(); return false;"><?php print $text_refresh_qr_code; ?></a><br /><img src="qr.php?ts=<?php print time(); ?>" /> | ||||||
|  |  | ||||||
|  |                 </div> | ||||||
|  |          </div> | ||||||
|  |    </div> | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| <p> </p> | <p> </p> | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| <?php if(PASSWORD_CHANGE_ENABLED == 1) { ?> | <?php if(PASSWORD_CHANGE_ENABLED == 1) { ?> | ||||||
|    <div id="search"> |    <div id="search"> | ||||||
|       <form method="post" name="pwdchange" action="settings.php" class="formbottom"> |       <form method="post" name="pwdchange" action="settings.php" class="formbottom"> | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user