/** * Intercept on before-process stage for incoming SMS * * @param $sms_datetime incoming * SMS date/time * @param $sms_sender incoming * SMS sender * @param $message incoming * SMS message before interepted * @param $sms_receiver receiver * number that is receiving incoming SMS * @param $reference_id reference_id * data * @return array $ret */ function incoming_hook_recvsms_intercept($sms_datetime, $sms_sender, $message, $sms_receiver, $reference_id) { $ret = array(); $found_bc = FALSE; $found_pv = FALSE; // continue only when keyword does not exists $m = explode(' ', $message); if (!keyword_isavail($m[0])) { return $ret; } // get settings $settings = incoming_settings_get(); // get post rules $pre_rules = incoming_pre_rules_get(); // scan for #<sender's phonebook group code> and @<username> according to pre rules $msg = explode(' ', $message); if (count($msg) > 0) { $bc = array(); $pv = array(); for ($i = 0; $i < count($msg); $i++) { $c_text = trim($msg[$i]); // scan message for @username if ($pre_rules['match_username']) { if (substr($c_text, 0, 1) === '@') { $pv[] = strtolower(substr($c_text, 1)); $found_pv = TRUE; } } // scan message for #groupcode if ($pre_rules['match_groupcode']) { if (substr($c_text, 0, 1) === '#') { $bc[] = strtoupper(substr($c_text, 1)); $found_bc = TRUE; } } } } if ($found_bc || $found_pv) { _log("recvsms_intercept dt:" . $sms_datetime . " s:" . $sms_sender . " r:" . $sms_receiver . " m:" . $message, 3, 'incoming recvsms_intercept'); } if ($found_bc) { $groups = array_unique($bc); foreach ($groups as $key => $c_group_code) { $c_uid = user_mobile2uid($sms_sender); $list = phonebook_search_group($c_uid, $c_group_code, '', TRUE); $c_gpid = $list[0]['gpid']; if ($c_uid && $c_gpid) { $c_username = user_uid2username($c_uid); _log("bc g:" . phonebook_code_clean($c_group_code) . " gpid:" . $c_gpid . " uid:" . $c_uid . " dt:" . $sms_datetime . " s:" . $sms_sender . " r:" . $sms_receiver . " m:" . $message, 3, 'incoming recvsms_intercept'); sendsms_bc($c_username, $c_gpid, $message); _log("bc end", 3, 'incoming recvsms_intercept'); $ret['uid'] = $c_uid; $ret['hooked'] = true; } } } if ($found_pv) { $users = array_unique($pv); foreach ($users as $key => $c_username) { $c_username = core_sanitize_username($c_username); if ($c_uid = user_username2uid($c_username)) { _log("pv u:" . $c_username . " uid:" . $c_uid . " dt:" . $sms_datetime . " s:" . $sms_sender . " r:" . $sms_receiver . " m:[" . $message . "] reference_id:" . $reference_id, 3, 'incoming recvsms_intercept'); recvsms_inbox_add($sms_datetime, $sms_sender, $c_username, $message, $sms_receiver, $reference_id); _log("pv end", 3, 'incoming recvsms_intercept'); $ret['uid'] = $c_uid; $ret['hooked'] = true; } } } return $ret; }
/** * Add new user * * @param array $data * User data * @param boolean $forced * Forced addition * @param boolean $send_email * Send email after successful user addition * @return array $ret['error_string', 'status', 'uid', 'data'] */ function user_add($data = array(), $forced = FALSE, $send_email = TRUE) { global $core_config, $user_config; // default return values $ret['error_string'] = _('Unknown error has occurred'); $ret['status'] = FALSE; $ret['uid'] = 0; $ret['data'] = array(); $data = trim($data['username']) ? $data : $_REQUEST; if ($forced || auth_isadmin() || $user_config['status'] == 3 || !auth_isvalid() && $core_config['main']['enable_register']) { foreach ($data as $key => $val) { $data[$key] = trim($val); } // set valid status $data['status'] = (int) $data['status']; if (!($data['status'] == 2 || $data['status'] == 3)) { $data['status'] = 4; } // ACL exception for admins $data['acl_id'] = (int) $data['acl_id'] ? (int) $data['acl_id'] : $core_config['main']['default_acl']; if ($data['status'] == 2) { $data['acl_id'] = 0; } // default parent_id $data['parent_uid'] = (int) $data['parent_uid'] ? (int) $data['parent_uid'] : $core_config['main']['default_parent']; if ($parent_status = user_getfieldbyuid($data['parent_uid'], 'status')) { // logic for parent_uid, parent uid by default is 0 if ($data['status'] == 4) { if (!($parent_status == 2 || $parent_status == 3)) { $data['parent_uid'] = $core_config['main']['default_parent']; } } else { $data['parent_uid'] = $core_config['main']['default_parent']; } } else { $data['parent_uid'] = $core_config['main']['default_parent']; } $data['username'] = core_sanitize_username($data['username']); $data['password'] = trim($data['password']) ? trim($data['password']) : core_get_random_string(10); $register_password = $data['password']; $data['password'] = md5($register_password); $data['token'] = md5(uniqid($data['username'] . $data['password'], true)); // default credit $supplied_credit = (double) $data['credit']; $data['credit'] = 0; // sender set to empty by default // $data['sender'] = ($data['sender'] ? core_sanitize_sender($data['sender']) : ''); $data['sender'] = ''; $dt = core_get_datetime(); $data['register_datetime'] = $dt; $data['lastupdate_datetime'] = $dt; // fixme anton - these should be configurable on main config $data['footer'] = '@' . $data['username']; $data['enable_webservices'] = 1; // $data['webservices_ip'] = (trim($data['webservices_ip']) ? trim($data['webservices_ip']) : '127.0.0.1, 192.168.*.*'); $data['webservices_ip'] = '*.*.*.*'; $v = user_add_validate($data); if ($v['status']) { _log('attempt to register status:' . $data['status'] . ' u:' . $data['username'] . ' email:' . $data['email'], 3, 'user_add'); if ($data['username'] && $data['email'] && $data['name']) { if ($new_uid = dba_add(_DB_PREF_ . '_tblUser', $data)) { $ret['status'] = TRUE; $ret['uid'] = $new_uid; // set credit upon registration $default_credit = $supplied_credit ? $supplied_credit : (double) $core_config['main']['default_credit']; rate_addusercredit($ret['uid'], $default_credit); } else { $ret['error_string'] = _('Fail to register an account'); } if ($ret['status']) { $data['credit'] = user_getfieldbyuid($new_uid, 'credit'); $data['register_password'] = $register_password; _log('registered status:' . $data['status'] . ' u:' . $data['username'] . ' uid:' . $ret['uid'] . ' email:' . $data['email'] . ' ip:' . $_SERVER['REMOTE_ADDR'] . ' mobile:' . $data['mobile'] . ' credit:' . $data['credit'], 2, 'user_add'); // save $data on returns $ret['data'] = $data; // default is TRUE, always send email from this function if ($send_email) { // injected variables must be global, need to work on this later global $reg_data; $reg_data = $ret['data']; // send email $tpl = array('name' => 'user_add_email', 'vars' => array('Name' => _('Name'), 'Username' => _('Username'), 'Password' => _('Password'), 'Mobile' => _('Mobile'), 'Credit' => _('Credit'), 'Email' => _('Email')), 'injects' => array('core_config', 'reg_data')); $email_body = tpl_apply($tpl); $email_subject = _('New account registration'); $mail_data = array('mail_from_name' => $core_config['main']['web_title'], 'mail_from' => $core_config['main']['email_service'], 'mail_to' => $data['email'], 'mail_subject' => $email_subject, 'mail_body' => $email_body); if (sendmail($mail_data)) { $ret['error_string'] = _('Account has been added and password has been emailed') . " (" . _('username') . ": " . $data['username'] . ")"; } else { $ret['error_string'] = _('Account has been added but failed to send email') . " (" . _('username') . ": " . $data['username'] . ")"; } } } } else { $ret['error_string'] = _('You must fill all required fields'); } } else { $ret['error_string'] = $v['error_string']; } } else { $ret['error_string'] = _('Account registration is not available'); } return $ret; }
/** * Resolve sender number or name to contact name or account's name * * @param integer $uid * @param string $sender * @return string */ function report_resolve_sender($uid, $sender) { $final_sender = "<div class='report_sender'>" . $sender . "</div>"; if (substr($sender, 0, 1) == '@') { $sender = core_sanitize_username($sender); $desc = user_getfieldbyusername($sender, 'name'); } else { $desc = phonebook_number2name($uid, $sender); } if ($desc) { $final_sender .= "<div class='report_sender_description'>" . $desc . "</div>"; } return $final_sender; }
/** * Add new user * * @param array $data * User data * @param boolean $forced * Forced addition * @return array $ret('error_string', 'status', 'uid') */ function user_add($data = array(), $forced = FALSE) { global $core_config, $user_config; $ret['error_string'] = _('Unknown error has occurred'); $ret['status'] = FALSE; $ret['uid'] = 0; $data = trim($data['username']) ? $data : $_REQUEST; if ($forced || auth_isadmin() || $user_config['status'] == 3 || !auth_isvalid() && $core_config['main']['enable_register']) { foreach ($data as $key => $val) { $data[$key] = trim($val); } // set valid status $data['status'] = (int) $data['status']; if (!($data['status'] == 2 || $data['status'] == 3)) { $data['status'] = 4; } // logic for parent_uid, parent uid by default is 0 if ($data['status'] == 4) { $parent_status = user_getfieldbyuid($data['parent_uid'], 'status'); if (!($parent_status == 2 || $parent_status == 3)) { $data['parent_uid'] = 0; } } else { $data['parent_uid'] = 0; } $data['username'] = core_sanitize_username($data['username']); $data['password'] = $data['password'] ? $data['password'] : core_get_random_string(10); $new_password = $data['password']; $data['password'] = md5($new_password); $data['token'] = md5(uniqid($data['username'] . $data['password'], true)); // credit set to 0 by default // $data['credit'] = ( $data['credit'] ? $data['credit'] : $core_config['main']['default_credit'] ); $data['credit'] = 0; // sender set to empty by default // $data['sender'] = ($data['sender'] ? core_sanitize_sender($data['sender']) : ''); $data['sender'] = ''; $dt = core_get_datetime(); $data['register_datetime'] = $dt; $data['lastupdate_datetime'] = $dt; $data['webservices_ip'] = trim($data['webservices_ip']) ? trim($data['webservices_ip']) : '127.0.0.1, 192.168.*.*'; $v = user_add_validate($data); if ($v['status']) { _log('attempt to register status:' . $data['status'] . ' u:' . $data['username'] . ' email:' . $data['email'], 3, 'user_add'); if ($data['username'] && $data['email'] && $data['name']) { if ($new_uid = dba_add(_DB_PREF_ . '_tblUser', $data)) { $ret['status'] = TRUE; $ret['uid'] = $new_uid; } else { $ret['error_string'] = _('Fail to register an account'); } if ($ret['status']) { _log('registered status:' . $data['status'] . ' u:' . $data['username'] . ' uid:' . $ret['uid'] . ' email:' . $data['email'] . ' ip:' . $_SERVER['REMOTE_ADDR'] . ' mobile:' . $data['mobile'] . ' credit:' . $data['credit'], 2, 'user_add'); $subject = _('New account registration'); $body = $core_config['main']['web_title'] . "\n"; $body .= $core_config['http_path']['base'] . "\n\n"; $body .= _('Username') . ": " . $data['username'] . "\n"; $body .= _('Password') . ": " . $new_password . "\n"; $body .= _('Mobile') . ": " . $data['mobile'] . "\n"; $body .= _('Credit') . ": " . $data['credit'] . "\n\n"; $body .= $core_config['main']['email_footer'] . "\n\n"; $ret['error_string'] = _('Account has been added and password has been emailed') . " (" . _('username') . ": " . $data['username'] . ")"; $mail_data = array('mail_from_name' => $core_config['main']['web_title'], 'mail_from' => $core_config['main']['email_service'], 'mail_to' => $data['email'], 'mail_subject' => $subject, 'mail_body' => $body); if (!sendmail($mail_data)) { $ret['error_string'] = _('Account has been added but failed to send email') . " (" . _('username') . ": " . $data['username'] . ")"; } } } else { $ret['error_string'] = _('You must fill all required fields'); } } else { $ret['error_string'] = $v['error_string']; } } else { $ret['error_string'] = _('Account registration is not available'); } return $ret; }
/** * Intercept on before-process stage for incoming SMS * * @param $sms_datetime incoming * SMS date/time * @param $sms_sender incoming * SMS sender * @param $message incoming * SMS message before interepted * @param $sms_receiver receiver * number that is receiving incoming SMS * @param $reference_id reference_id * data * @return array $ret */ function incoming_hook_recvsms_intercept($sms_datetime, $sms_sender, $message, $sms_receiver, $reference_id) { $ret = array(); $found_bc = FALSE; $found_pv = FALSE; // continue only when keyword does not exists $m = explode(' ', $message); if (!checkavailablekeyword($m[0])) { return $ret; } // get settings $settings = incoming_settings_get(); // get post rules $pre_rules = incoming_pre_rules_get(); // scan for #<sender's phonebook group code> and @<username> according to pre rules $msg = explode(' ', $message); if (count($msg) > 0) { $bc = array(); $pv = array(); for ($i = 0; $i < count($msg); $i++) { $c_text = trim($msg[$i]); // scan message for @username if ($pre_rules['match_username']) { if (substr($c_text, 0, 1) === '@') { $pv[] = strtolower(substr($c_text, 1)); $found_pv = TRUE; } } // scan message for #groupcode if ($pre_rules['match_groupcode']) { if (substr($c_text, 0, 1) === '#') { $bc[] = strtoupper(substr($c_text, 1)); $found_bc = TRUE; } } } } if ($found_bc || $found_pv) { _log("recvsms_intercept dt:" . $sms_datetime . " s:" . $sms_sender . " r:" . $sms_receiver . " m:" . $message, 3, 'incoming recvsms_intercept'); } if ($found_bc) { $groups = array_unique($bc); foreach ($groups as $key => $c_group_code) { $c_group_code = strtoupper($c_group_code); $c_group_code = core_sanitize_alphanumeric($c_group_code); $c_uid = user_mobile2uid($sms_sender); if ($c_uid && ($c_gpid = phonebook_groupcode2id($c_uid, $c_group_code))) { $c_username = user_uid2username($c_uid); _log("bc g:" . $c_group_code . " gpid:" . $c_gpid . " uid:" . $c_uid . " dt:" . $sms_datetime . " s:" . $sms_sender . " r:" . $sms_receiver . " m:" . $message, 3, 'incoming recvsms_intercept'); sendsms_bc($c_username, $c_gpid, $message); _log("bc end", 3, 'incoming recvsms_intercept'); $ret['uid'] = $c_uid; $ret['hooked'] = true; } else { // check the group_code for flag_sender<>0 $db_query = "SELECT id,uid,flag_sender FROM " . _DB_PREF_ . "_featurePhonebook_group WHERE code='{$c_group_code}' AND flag_sender<>0"; $db_result = dba_query($db_query); if ($db_row = dba_fetch_array($db_result)) { $c_gpid = $db_row['id']; $c_uid = $db_row['uid']; $c_flag_sender = $db_row['flag_sender']; if ($c_flag_sender == 2) { $c_username = user_uid2username($c_uid); _log("bc mobile flag_sender:" . $c_flag_sender . " username:"******" uid:" . $c_uid . " g:" . $c_group_code . " gpid:" . $c_gpid . " uid:" . $c_uid . " dt:" . $sms_datetime . " s:" . $sms_sender . " r:" . $sms_receiver . " m:" . $message, 3, 'incoming recvsms_intercept'); $sender = trim(phonebook_number2name($sms_sender, $c_username)); $sender = $sender ? $sender : $sms_sender; sendsms_bc($c_username, $c_gpid, $sender . ":" . $message); _log("bc mobile end", 3, 'incoming recvsms_intercept'); $ret['uid'] = $c_uid; $ret['hooked'] = true; } else { if ($c_flag_sender == 1) { // check whether sms_sender belongs to c_group_code $db_query = "SELECT B.id AS id FROM " . _DB_PREF_ . "_featurePhonebook AS A\n\t\t\t\t\t\t\t\tLEFT JOIN playsms.playsms_featurePhonebook_group_contacts AS C ON A.id=C.pid\n\t\t\t\t\t\t\t\tLEFT JOIN playsms.playsms_featurePhonebook_group AS B ON B.id=C.gpid\n\t\t\t\t\t\t\t\tWHERE A.mobile LIKE '%" . substr($sms_sender, 3) . "' AND B.code='" . $c_group_code . "'"; $db_result = dba_query($db_query); if ($db_row = dba_fetch_array($db_result)) { $c_username = user_uid2username($c_uid); _log("bc mobile flag_sender:" . $c_flag_sender . " username:"******" uid:" . $c_uid . " g:" . $c_group_code . " gpid:" . $c_gpid . " uid:" . $c_uid . " dt:" . $sms_datetime . " s:" . $sms_sender . " r:" . $sms_receiver . " m:" . $message, 3, 'incoming recvsms_intercept'); $sender = trim(phonebook_number2name($sms_sender, $c_username)); $sender = $sender ? $sender : $sms_sender; sendsms_bc($c_username, $c_gpid, $sender . ":" . $message); _log("bc mobile end", 3, 'incoming recvsms_intercept'); $ret['uid'] = $c_uid; $ret['hooked'] = true; } } } } } } } if ($found_pv) { $users = array_unique($pv); foreach ($users as $key => $c_username) { $c_username = core_sanitize_username($c_username); if ($c_uid = user_username2uid($c_username)) { _log("pv u:" . $c_username . " uid:" . $c_uid . " dt:" . $sms_datetime . " s:" . $sms_sender . " r:" . $sms_receiver . " m:[" . $message . "] reference_id:" . $reference_id, 3, 'incoming recvsms_intercept'); recvsms_inbox_add($sms_datetime, $sms_sender, $c_username, $message, $sms_receiver, $reference_id); _log("pv end", 3, 'incoming recvsms_intercept'); $ret['uid'] = $c_uid; $ret['hooked'] = true; } } } return $ret; }