1
core.php in trunk/web – MultiMag

source: trunk/web/core.php @ 261

Last change on this file since 261 was 261, checked in by blacklight, 7 years ago
  • Улучшена производительность счётчика посещений
  • Добавлена подсветка отгруженных заявок в журнале документов
File size: 17.0 KB
Line 
1<?php
2//      MultiMag v0.1 - Complex sales system
3//
4//      Copyright (C) 2005-2010, BlackLight, TND Team, http://tndproject.org
5//
6//      This program is free software: you can redistribute it and/or modify
7//      it under the terms of the GNU Affero General Public License as
8//      published by the Free Software Foundation, either version 3 of the
9//      License, or (at your option) any later version.
10//
11//      This program is distributed in the hope that it will be useful,
12//      but WITHOUT ANY WARRANTY; without even the implied warranty of
13//      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14//      GNU Affero General Public License for more details.
15//
16//      You should have received a copy of the GNU Affero General Public License
17//      along with this program.  If not, see <http://www.gnu.org/licenses/>.
18//
19define("MULTIMAG_VERSION", "0.0.1r261");
20header("X-Powered-By: MultiMag ".MULTIMAG_VERSION);
21
22if(!function_exists('mysql_connect'))
23{
24        header("500 Internal Server Error");
25        echo"<h1>500 Внутренняя ошибка сервера</h1>Расширение php-mysql не найдено. Обратитесь к администратору по адресу <a href='mailto:{$CONFIG['site']['admin_email']}'>{$CONFIG['site']['admin_email']}</a> c описанием проблемы.";
26        exit();
27}
28
29$time_start = microtime(true);
30session_start();
31
32$c=explode('/',__FILE__);$base_path='';
33for($i=0;$i<(count($c)-2);$i++) $base_path.=$c[$i].'/';
34
35if(! @ include_once("$base_path/config_site.php"))
36{
37        header("500 Internal Server Error");
38        echo"<h1>500 Внутренняя ошибка сервера</h1>Конфигурационный файл не найден! Обратитесь к администратору по адресу <a href='mailto:{$CONFIG['site']['admin_email']}'>{$CONFIG['site']['admin_email']}</a> c описанием проблемы.";
39        exit();
40}
41
42if($CONFIG['site']['force_https'])
43{
44        header('Status-Code: 301');
45        header('Location: https://'.$_SERVER["HTTP_HOST"].$_SERVER['REQUEST_URI']);
46}
47
48if(!isset($CONFIG['site']['display_name']))     $CONFIG['site']['display_name']=$CONFIG['site']['name'];
49
50if(!@mysql_connect($CONFIG['mysql']['host'],$CONFIG['mysql']['login'],$CONFIG['mysql']['pass']))
51{
52        header("503 Service temporary unavariable");
53        echo"<h1>503 Сервис временно недоступен!</h1>Не удалось соединиться с сервером баз данных. Возможно он перегружен, и слишком медленно отвечает на запросы, либо выключен. Попробуйте подключиться через 5 минут. Если проблема сохранится - пожалуйста, напишите письмо по адресу <a href='mailto:{$CONFIG['site']['admin_email']}'>{$CONFIG['site']['admin_email']}</a> c описанием проблемы.";
54        exit();
55}
56if(!@mysql_select_db($CONFIG['mysql']['db']))
57{
58    echo"Невозможно активизировать базу данных! Возможно, база данных повреждена. Попробуйте подключиться через 5 минут. Если проблема сохранится - пожалуйста, напишите письмо по адресу <a href='mailto:{$CONFIG['site']['admin_email']}'>{$CONFIG['site']['admin_email']}</a> c описанием проблемы.";
59    exit();
60}
61
62mysql_query("SET CHARACTER SET UTF8");
63mysql_query("SET character_set_client = UTF8");
64mysql_query("SET character_set_results = UTF8");
65mysql_query("SET character_set_connection = UTF8");
66
67$ip=getenv("REMOTE_ADDR");
68$ag=getenv("HTTP_USER_AGENT");
69$rf=getenv("HTTP_REFERER");
70$qq=$_SERVER['QUERY_STRING'];
71$ff=$_SERVER['SCRIPT_NAME'];
72$tim=time();
73$skidka="";
74$ncnt=rcv('ncnt');
75if(!$ncnt) @mysql_query("INSERT INTO `counter` (`date`,`ip`,`agent`,`refer`,`query`,`file`) VALUES ('$tim','$ip','$ag','$rf','$qq','$ff')");
76
77function exception_handler($exception)
78{ 
79        $ip=getenv("REMOTE_ADDR");
80        $ag=getenv("HTTP_USER_AGENT");
81        $rf=getenv("HTTP_REFERER");
82        $ff=$_SERVER['REQUEST_URI'];
83        $uid=$_SESSION['uid'];
84        $s=mysql_real_escape_string($exception->getMessage());
85        $ag=mysql_real_escape_string($ag);
86        $rf=mysql_real_escape_string($rf);
87        $ff=mysql_real_escape_string($ff);
88        mysql_query("INSERT INTO `errorlog` (`page`,`referer`,`msg`,`date`,`ip`,`agent`, `uid`) VALUES
89        ('$ff','$rf','$s',NOW(),'$ip','$ag', '$uid')");
90        header("500 Internal error");
91        echo"<!DOCTYPE html><html><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><title>Error 500: Необработанная внутренняя ошибка</title>
92        <style type='text/css'>body{color: #0f0; background-color: #000; text-align: center;}</style></head><body>
93        <h1>Необработанная внутренняя ошибка</h1>".get_class($exception).": $s<br>Страница:$ff<br>Сообщение об ошибке передано администратору</body></html>";
94 
95} 
96set_exception_handler('exception_handler');
97
98// =================================== Подсветка найденного текста ====================================
99function SearchHilight($str,$substr)
100{
101        if(!$substr) return $str;
102        $tmp=split($substr,' '.$str.' ');
103        $result='';
104        foreach($tmp as $t)
105        {
106                if(!$result) $result=$t;
107                else $result.='<span class=b_selection>'.$substr.'</span>'.$t;
108        }
109        return $result;
110}
111
112// ====================================== Генератор кодов ==================================================
113function keygen_unique($num=0, $minlen=5, $maxlen=12)
114{
115        if($minlen<1) $minlen=5;
116        if($maxlen>10000) $maxlen=10000;
117        if($maxlen<$minlen) $maxlen=$minlen;
118        if(!$num)
119        {
120                $sstr="bcdfghjklmnprstvwxz";
121                $gstr="aeiouy1234567890aeiouy";
122                $rstr="aeiouy1234567890aeiouybcdfghjklmnprstvwxz";
123                $sln=18; // +1
124                $gln=21; // +1
125                $rln=40; //+1
126        }
127        else
128        {
129                $sstr="135790";
130                $gstr="24680";
131                $rstr="1234567890";
132                $sln=5; // +1
133                $gln=4; // +1
134                $rln=9; //+1
135        }
136        $r=rand(0,$rln);
137        $s=$rstr[$r];
138        $ln=rand($minlen,$maxlen);
139        $sig=0;
140        for($i=1;$i<$ln;$i++)
141        {
142                if(eregi($s[$i-1],$sstr))
143                {
144                        $r=rand(0,$gln);
145                        $s.=$gstr[$r];
146                }
147                else
148                {
149                        $r=rand(0,$sln);
150                        $s.=$sstr[$r];
151                }
152        }
153        return $s;
154}
155
156// ======================================= Обработчики ввода переменных ====================================
157/// Переделать: cохранить безопасность записи данных в базу, но убрать преобразование в html-символы
158function rcv($varname,$def="")
159{
160        $dt=htmlentities(@$_POST[$varname],ENT_QUOTES,"UTF-8");
161        if($dt=="") $dt=htmlentities(@$_GET[$varname],ENT_QUOTES,"UTF-8");
162        if($dt) return $dt;
163        else return $def;
164}
165
166function unhtmlentities ($string)
167{
168        return html_entity_decode ($string,ENT_QUOTES,"UTF-8");
169}
170
171// =================================== Аутентификация и контроль привилегий ============================================
172// Требование аутентификации
173function need_auth()
174{
175        global $tmpl;
176        if(!auth())
177        {
178                $SESSION['last_page']=$ff.$qq;
179                $_SESSION['cook_test']='data';
180                header('Location: /login.php');
181                $tmpl->msg("Для продолжения необходимо выполнить вход!","info","Требуется аутентификация");
182                $tmpl->write();
183                exit();
184        }
185        return 1;
186}
187
188// Проверка аутентификации
189function auth()
190{
191        return (@$_SESSION['uid']==0)?0:1;
192}
193
194// Получить привилегии (read, write, edit, delete) доступа к указанному объекту.
195// Не используется для остальных
196// Не рекомендуется к использованию с версии 0.0.1r221
197function getright($object,$uid)
198{
199        if($uid==1)
200        {
201                $nxt['read']=1;
202                $nxt['write']=1;
203                $nxt['edit']=1;
204                $nxt['delete']=1;
205                return $nxt;
206        }
207        $res=mysql_query("
208        SELECT MAX(`users_grouprights`.`a_read`) AS `read`, MAX(`users_grouprights`.`a_write`) AS `write`, MAX(`users_grouprights`.`a_edit`) AS `edit`, MAX(`users_grouprights`.`a_delete`) AS `delete`
209        FROM `users_grouprights`
210        INNER JOIN `users_groups` ON `users_groups`.`gid`=`users_grouprights`.`gid` AND ( `users_groups`.`uid`='$uid'
211        OR `users_groups`.`uid`='0')
212        WHERE `users_grouprights`.`object`='$object'
213        GROUP BY `users_grouprights`.`object`");
214        $nxt=mysql_fetch_assoc($res);
215        return $nxt;
216}
217
218// Есть ли право доступа к указанному объекту для указанной операции
219function isAccess($object, $action,$no_redirect=0)
220{
221        $uid=@$_SESSION['uid'];
222        if($uid==1)     return true;
223        $res=mysql_query("(
224        SELECT `users_acl`.`id` FROM `users_acl` WHERE `uid`='$uid' AND `object`='$object' AND `action`='$action'
225        ) UNION (
226        SELECT `users_groups_acl`.`id` FROM `users_groups_acl`
227        INNER JOIN `users_in_group` ON `users_in_group`.`gid`=`users_groups_acl`.`gid`
228        WHERE `uid`='$uid' AND `object`='$object' AND `action`='$action')
229        UNION (
230        SELECT `users_groups_acl`.`id` FROM `users_groups_acl`
231        INNER JOIN `users_in_group` ON `users_in_group`.`gid`=`users_groups_acl`.`gid`
232        WHERE `uid`='0' AND `object`='$object' AND `action`='$action')
233        UNION(
234        SELECT `users_acl`.`id` FROM `users_acl` WHERE `uid`='0' AND `object`='$object' AND `action`='$action')");
235        if(mysql_errno())       throw new MysqlException("Выборка привилегий не удалась");
236        $access=(mysql_num_rows($res)>0)?true:false;
237        if((!$uid) && (!$access) && (!$no_redirect))    need_auth();
238        return $access;
239}
240
241// ==================================== Рассылка ===================================================
242function SendSubscribe($tema,$msg)
243{
244        global $CONFIG;
245        $res=mysql_query("SELECT `firm_name` FROM `doc_vars` WHERE `id`='{$CONFIG['site']['default_firm']}'");
246        if(mysql_errno())       throw new MysqlException("Ошибка получения наименования организации");
247        $firm_name=mysql_result($res,0,0);
248        $res=mysql_query("(SELECT `name`, `email`, `rname` FROM `users` WHERE `subscribe`='1' AND `confirm`='0')
249        UNION
250        (SELECT `name`, `email`, `fullname` AS `rname` FROM `doc_agent` WHERE `no_mail`!='0' AND `email`!='')
251        ");
252        if(mysql_errno())       throw new MysqlException("Ошибка получения списка подписчиков");
253        while($nxt=mysql_fetch_row($res))
254        {
255                if($nxt[2])     $nxt[0]="$nxt[2] ($nxt[0])";
256                $txt="
257Здравствуйте, $nxt[0]!
258
259$tema
260------------------------------------------
261
262$msg
263
264------------------------------------------
265
266Вы получили это письмо потому что подписаны на рассылку сайта {$CONFIG['site']['display_name']} ( http://{$CONFIG['site']['name']} ), либо являетесь клиентом $firm_name.
267Отказаться от рассылки можно, перейдя по ссылке http://{$CONFIG['site']['name']}/login.php?mode=unsubscribe&email=$nxt[1]
268";
269                mail($nxt[1],$tema." - {$CONFIG['site']['name']}", $txt ,"Content-type: text/plain; charset=UTF-8\nFrom: {$CONFIG['site']['display_name']} <{$CONFIG['site']['admin_email']}>");
270        }
271}
272
273function mailto($email,$tema,$msg,$from="")
274{
275        global $mail;
276        $mail->Body = $msg;
277        $mail->ClearAddress();
278        $mail->AddAddress($email, $email ); 
279        $mail->Subject=$tema;
280        if($from) $mail->From = $from; 
281        return $mail->Send();
282}
283
284function date_day($date)
285{
286   $ee=date("d M Y 00:00:00",$date);
287   $tm=strtotime($ee);
288   return $tm;
289}
290
291function SafeLoadTemplate($template)
292{
293        global $tmpl, $CONFIG;
294        if($template)   $tmpl->LoadTemplate($template); 
295}
296
297class MysqlException extends Exception
298{
299        var $sql_error;
300        function __construct($text)
301        {
302                $this->sql_error=mysql_error();
303                parent::__construct($text);
304                $this->WriteLog();
305        }
306       
307        function WriteLog()
308        {
309                $ip=getenv("REMOTE_ADDR");
310                $ag=getenv("HTTP_USER_AGENT");
311                $rf=getenv("HTTP_REFERER");
312                $qq=$_SERVER['QUERY_STRING'];
313                $ff=$_SERVER['PHP_SELF'];
314                $uid=$_SESSION['uid'];
315                $s=mysql_real_escape_string($this->message);
316                $hidden_data=mysql_real_escape_string($this->sql_error);
317                $ag=mysql_real_escape_string($ag);
318                $rf=mysql_real_escape_string($rf);
319                $qq=mysql_real_escape_string($qq);
320                $ff=mysql_real_escape_string($ff);
321                @mysql_query("INSERT INTO `errorlog` (`page`,`referer`,`msg`,`date`,`ip`,`agent`, `uid`) VALUES
322                ('$ff $qq','$rf','$s $hidden_data',NOW(),'$ip','$ag', '$uid')");       
323        }
324};
325
326class AccessException extends Exception
327{
328        function __construct($text='')
329        {
330                parent::__construct($text);     
331        }
332};
333
334// ====================================== Шаблон страницы ===============================================
335class BETemplate
336{
337        var $tpl;                       // Шаблон
338        var $page;                  // Данные страницы
339        var $ajax;
340        var $tplname;
341        var $hide_blocks;               // Скрытые блоки. Блоки, отображать которые не нужно
342
343        function BETemplate()
344        {
345                global $CONFIG;
346                $this->page[0]=$this->page[1]=$this->page[2]=$this->page[3]=$this->page[4]=$this->page[5]=$this->page[6]="";
347                if($CONFIG['site']['skin'])     $this->LoadTemplate($CONFIG['site']['skin']);
348                else                            $this->LoadTemplate('default');
349                $this->ajax=0;
350                $this->hide_blocks=array();
351        }
352
353        function LoadTemplate($s)
354        {
355                $this->tplname=$s;
356                $fd=@file('skins/'.$s.'/style.tpl');
357                if($fd)
358                {
359                        $this->tpl="";
360                        foreach($fd as $item)
361                                $this->tpl.=$item;
362                }
363        }
364               
365        function HideBlock($block)
366        {
367                $this->hide_blocks[$block]=true;
368        }
369       
370        function ShowBlock($block)
371        {
372                unset($this->hide_blocks[$block]);
373        }
374       
375// TOP
376        function SetTMenu($s)
377        {
378                $this->page[1]=$s;
379        }
380        function AddTMenu($s)
381        {
382                $this->page[1].=$s;
383        }
384// RIGHT
385        function SetRMenu($s)
386        {
387                $this->page[2]=$s;
388        }
389        function InsRMenu($s)
390        {
391                $this->page[2]=$s.$this->page[2];
392        }
393        function AddRMenu($s)
394        {
395                $this->page[2].=$s;
396        }
397// LEFT
398        function AddLMenu($s)
399        {
400                $this->page[5].=$s;
401        }
402        function SetLMenu($s)
403        {
404                $this->page[5]=$s;
405        }
406        function SetTitle($s)
407        {
408                $this->page[3]=$s;
409        }
410// TEXT
411        function SetText($s)
412        {
413                $this->page[0]=$s;
414        }
415        function AddText($s)
416        {
417                $this->page[0].=$s;
418        }
419// STYLE
420        function AddStyle($s)
421        {
422                $this->page[4].=$s;
423        }
424
425        function AddNote($head,$text,$id)
426        {
427                $this->page[6].="<div class=note><div id=hd>(<a href='notes.php?mode=wait&amp;n=$id'>x</a>) $head</div><a href='notes.php?n=$id'><div id=txt>$text</div></a></div>";
428        }
429
430        function ClearNote()
431        {
432           $this->page[6]="";
433        }
434
435        // ====================================== Сообщение ======================================================
436        function msg($text="",$mode="",$head="")
437        {
438                if($text=="") return;
439                if($mode=="error") $mode="err";
440                if($mode=='info') $mode='notify';
441                if(($mode!="ok")&&($mode!="err")) $mode="notify";
442                if($head=="")
443                {
444                        $msg="Информация:";
445                        if($mode=="ok") $msg="Сделано!";
446                        if($mode=="err") $msg="Ошибка!";
447                }
448                else $msg=$head;
449
450                $this->page[0].="<div class='$mode'><b>$msg</b><br>$text</div>";
451        }
452
453
454        function write()
455        {
456                @include_once("skins/".$this->tplname."/style.php");
457                if($this->ajax)
458                        echo $this->page[0];
459                else
460                {
461                        @include_once("skins/".$this->tplname."/style.php");
462                        if(function_exists('skin_render'))
463                        {
464                                $res=skin_render($this->page,$this->tpl);
465                        }
466                        else
467                        {
468                                $res=$this->tpl;
469                                ksort($this->page);
470                                $sign=array("<!--site-text-->","<!--site-tmenu-->","<!--site-rmenu-->","<!--site-title-->","<!--site-style-->",
471                                "<!--site-lmenu-->","<!--site-notes-->");
472       
473                                if(!isset($this->hide_blocks['left']))
474                                        $this->page[5]="<td class=lmenu>".$this->page[5]."<td class=fvbl>";
475                                if(!isset($this->hide_blocks['right']))
476                                        $this->AddStyle(".rmenu { display: table-cell; }");
477                                else
478                                        $this->AddStyle(".rmenu { display: none; }");
479       
480                                $res=str_replace($sign,$this->page,$res);
481                        }
482                        echo"$res";
483                }
484                global $time_start;
485                $time = microtime(true) - $time_start;
486                if($time>=3)
487                        $this->logger("Exec time: $time",1);
488                echo"Страница сгенерирована за $time секунд";
489        }
490
491    function logger($s, $silent=0, $hidden_data='')
492    {
493       
494        $ip=getenv("REMOTE_ADDR");
495        $ag=getenv("HTTP_USER_AGENT");
496        $rf=getenv("HTTP_REFERER");
497        $ff=$_SERVER['REQUEST_URI'];
498        $uid=$_SESSION['uid'];
499        $s=mysql_real_escape_string($s);
500        $hidden_data=mysql_real_escape_string($hidden_data);
501        $ag=mysql_real_escape_string($ag);
502        $rf=mysql_real_escape_string($rf);
503        $qq=mysql_real_escape_string($qq);
504        $ff=mysql_real_escape_string($ff);
505        mysql_query("INSERT INTO `errorlog` (`page`,`referer`,`msg`,`date`,`ip`,`agent`, `uid`) VALUES
506        ('$ff','$rf','$s $hidden_data',NOW(),'$ip','$ag', '$uid')");
507
508        if(!$silent)
509        $this->msg("$s<br>Страница:$ff<br>Сообщение об ошибке передано администратору","err","Внутренняя ошибка!");
510    }
511};
512
513
514
515global $tmpl;
516global $uid;
517global $mode;
518$tmpl=new BETemplate;
519$mode=rcv('mode');
520if(isset($_SESSION['uid']))     $uid=$_SESSION['uid'];
521if($uid=='') $uid=0;
522
523require_once("include/wikiparser.php");
524
525$wikiparser=new WikiParser();
526
527$wikiparser->reference_wiki     = "http://{$CONFIG['site']['name']}/wiki/";
528$wikiparser->reference_site     = "http://{$CONFIG['site']['name']}/";
529$wikiparser->image_uri          = "/share/var/wikiphoto/";
530$wikiparser->ignore_images      = false;
531
532?>
Note: See TracBrowser for help on using the repository browser.