Files
web-discuz/source/class/class_sms.php
2025-06-27 21:04:18 +08:00

171 lines
6.1 KiB
PHP
Executable File

<?php
/**
* [Discuz!] (C)2001-2099 Comsenz Inc.
* This is NOT a freeware, use is subject to license terms
*
* $Id$
*/
if(!defined('IN_DISCUZ')) {
exit('Access Denied');
}
class sms {
const DISCUZ_CLASS_SMS_TYPE_SECCODE = 0;
const DISCUZ_CLASS_SMS_TYPE_MESSAGE = 1;
const DISCUZ_CLASS_SMS_SRVTYPE_OTHERSRV = 0;
const DISCUZ_CLASS_SMS_SRVTYPE_SECCHECK = 1;
const DISCUZ_CLASS_SMS_SRVTYPE_NEWSLETT = 2;
const DISCUZ_CLASS_SMS_ERROR_NOWNOERR = 0;
const DISCUZ_CLASS_SMS_ERROR_TIMELESS = -1;
const DISCUZ_CLASS_SMS_ERROR_NUMLIMIT = -2;
const DISCUZ_CLASS_SMS_ERROR_MILLIMIT = -3;
const DISCUZ_CLASS_SMS_ERROR_GLBLIMIT = -4;
const DISCUZ_CLASS_SMS_ERROR_CTFSMSGW = -5;
const DISCUZ_CLASS_SMS_ERROR_CTFGWNME = -6;
const DISCUZ_CLASS_SMS_ERROR_CTFGWCLS = -7;
const DISCUZ_CLASS_SMS_ERROR_SMSDISAB = -8;
const DISCUZ_CLASS_SMS_ERROR_SMSGWERR = -9;
const DISCUZ_CLASS_SMS_VERIFY_FAIL = 0;
const DISCUZ_CLASS_SMS_VERIFY_PASS = 1;
const DISCUZ_CLASS_SMSGW_GWTYPE_MSG = 0;
const DISCUZ_CLASS_SMSGW_GWTYPE_TPL = 1;
public static function verify($uid, $svctype, $secmobicc, $secmobile, $seccode, $updateverify = 1) {
$smstimelimit = getglobal('setting/smstimelimit');
$smstimelimit = $smstimelimit > 0 ? $smstimelimit : 86400;
$lastsend = C::t('common_smslog')->get_lastsms_by_uumm($uid, $svctype, $secmobicc, $secmobile);
$result = self::DISCUZ_CLASS_SMS_VERIFY_FAIL;
if($seccode == $lastsend['content'] && !$lastsend['verify'] && time() - $lastsend['dateline'] < $smstimelimit) {
$result = self::DISCUZ_CLASS_SMS_VERIFY_PASS;
}
if($updateverify) {
C::t('common_smslog')->update($lastsend['smslogid'], array('verify' => 1));
}
return $result;
}
public static function send($uid, $smstype, $svctype, $secmobicc, $secmobile, $content, $force) {
$time = time();
$ip = getglobal('clientip');
$port = getglobal('remoteport');
$check = self::check($uid, $secmobicc, $secmobile, $time, $ip, $port, $force);
if($check < 0) {
self::log($smstype, $svctype, 0, $check, $uid, $secmobicc, $secmobile, $time, $ip, $port, $content);
return $check;
}
$smsgw = self::smsgw($smstype, $secmobicc);
if($smsgw < 0) {
self::log($smstype, $svctype, 0, $smsgw, $uid, $secmobicc, $secmobile, $time, $ip, $port, $content);
return $smsgw;
}
$output = self::output($smsgw, $uid, $smstype, $svctype, $secmobicc, $secmobile, $content);
self::log($smstype, $svctype, 0, $output, $uid, $secmobicc, $secmobile, $time, $ip, $port, $content);
return $output;
}
protected static function check($uid, $secmobicc, $secmobile, $time, $ip, $port, $force) {
if(!getglobal('setting/smsstatus')) {
return self::DISCUZ_CLASS_SMS_ERROR_SMSDISAB;
}
if(!$force) {
$smstimelimit = getglobal('setting/smstimelimit');
$smstimelimit = $smstimelimit > 0 ? $smstimelimit : 86400;
$smsnumlimit = getglobal('setting/smsnumlimit');
$smsnumlimit = $smsnumlimit > 0 ? $smsnumlimit : 5;
$smsinterval = getglobal('setting/smsinterval');
$smsinterval = $smsinterval > 0 ? $smsinterval : 300;
$smsmillimit = getglobal('setting/smsmillimit');
$smsmillimit = $smsmillimit > 0 ? $smsmillimit : 20;
$smsglblimit = getglobal('setting/smsglblimit');
$smsglblimit = $smsglblimit > 0 ? $smsglblimit : 1000;
$ut = C::t('common_smslog')->get_sms_by_ut($uid, $smstimelimit);
$mmt = C::t('common_smslog')->get_sms_by_mmt($secmobicc, $secmobile, $smstimelimit);
if($time - $ut[0]['dateline'] < $smsinterval || $time - $mmt[0]['dateline'] < $smsinterval) {
return self::DISCUZ_CLASS_SMS_ERROR_TIMELESS;
}
if(count($ut) > $smsnumlimit || count($mmt) > $smsnumlimit) {
return self::DISCUZ_CLASS_SMS_ERROR_NUMLIMIT;
}
$lastmilion = C::t('common_smslog')->count_sms_by_milions_mmt($secmobicc, $secmobile, $smstimelimit);
if($lastmilion > $smsmillimit) {
return self::DISCUZ_CLASS_SMS_ERROR_MILLIMIT;
}
$globalsend = C::t('common_smslog')->count_sms_by_time($smstimelimit);
if($globalsend > $smsglblimit) {
return self::DISCUZ_CLASS_SMS_ERROR_GLBLIMIT;
}
}
return self::DISCUZ_CLASS_SMS_ERROR_NOWNOERR;
}
protected static function smsgw($smstype, $secmobicc) {
$smsgwlist = C::t('common_smsgw')->fetch_all_gw_avaliable();
foreach($smsgwlist as $key => $value) {
if(array_search($secmobicc, explode(',', $value['sendrule'])) !== false) {
if($smstype == self::DISCUZ_CLASS_SMS_TYPE_MESSAGE && $value['type'] == self::DISCUZ_CLASS_SMSGW_GWTYPE_TPL) {
continue;
}
$smsgw = $value;
}
}
if(isset($smsgw)) {
return $smsgw;
} else {
return self::DISCUZ_CLASS_SMS_ERROR_CTFSMSGW;
}
}
protected static function output($smsgw, $uid, $smstype, $svctype, $secmobicc, $secmobile, $content) {
global $_G;
$efile = explode(':', $smsgw['class']);
if(is_array($efile) && count($efile) > 1) {
$smsgwfile = in_array($efile[0], $_G['setting']['plugins']['available']) ? DISCUZ_ROOT.'./source/plugin/'.$efile[0].'/smsgw/smsgw_'. $efile[1] . '.php' : '';
} else {
$smsgwfile = DISCUZ_ROOT.'./source/class/smsgw/smsgw_' . $smsgw['class'] . '.php';
}
if($smsgwfile) {
include($smsgwfile);
$classname = 'smsgw_' . ((is_array($efile) && count($efile) > 1) ? $efile[1] : $smsgw['class']);
if(class_exists($classname)) {
$class = new $classname();
$class->parameters = dunserialize($smsgw['parameters']);
$result = $class->send($uid, $smstype, $svctype, $secmobicc, $secmobile, array('content' => $content));
} else {
$result = self::DISCUZ_CLASS_SMS_ERROR_CTFGWCLS;
}
} else {
$result = self::DISCUZ_CLASS_SMS_ERROR_CTFGWNME;
}
if($result < 0 && ($result == self::DISCUZ_CLASS_SMS_ERROR_CTFGWCLS || $result == self::DISCUZ_CLASS_SMS_ERROR_CTFGWNME)) {
$data = array('available' => '0');
C::t('common_smsgw')->update($smsgw['smsgwid'], $data);
}
return $result;
}
protected static function log($smstype, $svctype, $smsgw, $status, $uid, $secmobicc, $secmobile, $time, $ip, $port, $content = '') {
return C::t('common_smslog')->insert(array('smstype' => $smstype, 'svctype' => $svctype, 'smsgw' => $smsgw, 'status' => $status, 'uid' => $uid, 'secmobicc' => $secmobicc, 'secmobile' => $secmobile, 'dateline' => $time, 'ip' => $ip, 'port' => $port, 'content' => $content));
}
}