+
@@ -0,0 +1,9 @@
|
||||
AddDefaultCharset utf-8
|
||||
|
||||
RewriteEngine on
|
||||
RewriteBase /
|
||||
|
||||
RewriteCond %{REQUEST_FILENAME} !-f
|
||||
RewriteCond %{REQUEST_FILENAME} !-d
|
||||
|
||||
RewriteRule ^(.*)$ index.php
|
||||
@@ -0,0 +1,199 @@
|
||||
$print:
|
||||
array(16) {
|
||||
["id"]=>
|
||||
string(1) "4"
|
||||
["name"]=>
|
||||
string(14) "MININT-15MK94U"
|
||||
["model"]=>
|
||||
string(10) "HP LJ 3030"
|
||||
["unit"]=>
|
||||
string(9) "0000-0445"
|
||||
["inventar"]=>
|
||||
string(7) "3-21333"
|
||||
["sn"]=>
|
||||
string(10) "CNBF033770"
|
||||
["floor"]=>
|
||||
string(10) "9 этаж"
|
||||
["id_fl"]=>
|
||||
string(1) "5"
|
||||
["department"]=>
|
||||
string(18) "Аналитики"
|
||||
["id_dep"]=>
|
||||
string(1) "9"
|
||||
["status"]=>
|
||||
string(15) "В работе"
|
||||
["id_st"]=>
|
||||
string(1) "1"
|
||||
["cartrige"]=>
|
||||
string(3) "12a"
|
||||
["id_cart"]=>
|
||||
string(1) "2"
|
||||
["img"]=>
|
||||
string(0) ""
|
||||
["functions"]=>
|
||||
array(4) {
|
||||
[0]=>
|
||||
array(3) {
|
||||
["id"]=>
|
||||
string(1) "1"
|
||||
["name"]=>
|
||||
string(12) "Печать"
|
||||
["description"]=>
|
||||
NULL
|
||||
}
|
||||
[1]=>
|
||||
array(3) {
|
||||
["id"]=>
|
||||
string(1) "3"
|
||||
["name"]=>
|
||||
string(34) "Сканирование на ПК"
|
||||
["description"]=>
|
||||
NULL
|
||||
}
|
||||
[2]=>
|
||||
array(3) {
|
||||
["id"]=>
|
||||
string(1) "4"
|
||||
["name"]=>
|
||||
string(40) "Сканирование на почту"
|
||||
["description"]=>
|
||||
NULL
|
||||
}
|
||||
[3]=>
|
||||
array(3) {
|
||||
["id"]=>
|
||||
string(1) "5"
|
||||
["name"]=>
|
||||
string(49) "Двустороннее сканирование"
|
||||
["description"]=>
|
||||
NULL
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
$_POST:
|
||||
array(11) {
|
||||
["name"]=>
|
||||
string(15) "MININT-15MK94U1"
|
||||
["unit"]=>
|
||||
string(10) "0000-04452"
|
||||
["model"]=>
|
||||
string(11) "HP LJ 30303"
|
||||
["sn"]=>
|
||||
string(11) "CNBF0337704"
|
||||
["inventar"]=>
|
||||
string(8) "3-213335"
|
||||
["id_floor"]=>
|
||||
string(1) "1"
|
||||
["id_department"]=>
|
||||
string(1) "1"
|
||||
["id_cartrige"]=>
|
||||
string(1) "1"
|
||||
["id_status"]=>
|
||||
string(1) "2"
|
||||
["id_functions"]=>
|
||||
array(3) {
|
||||
[0]=>
|
||||
string(1) "1"
|
||||
[1]=>
|
||||
string(1) "3"
|
||||
[2]=>
|
||||
string(1) "4"
|
||||
}
|
||||
["submit"]=>
|
||||
string(0) ""
|
||||
}
|
||||
|
||||
checking
|
||||
$up:
|
||||
array(10) {
|
||||
[1]=>
|
||||
array(3) {
|
||||
["object"]=>
|
||||
string(23) "Имя принтера"
|
||||
["old_data"]=>
|
||||
string(14) "MININT-15MK94U"
|
||||
["new_data"]=>
|
||||
string(15) "MININT-15MK94U1"
|
||||
}
|
||||
[2]=>
|
||||
array(3) {
|
||||
["object"]=>
|
||||
string(29) "Модель принтера"
|
||||
["old_data"]=>
|
||||
string(10) "HP LJ 3030"
|
||||
["new_data"]=>
|
||||
string(11) "HP LJ 30303"
|
||||
}
|
||||
[3]=>
|
||||
array(3) {
|
||||
["object"]=>
|
||||
string(32) "Номер UNIT принтера"
|
||||
["old_data"]=>
|
||||
string(9) "0000-0445"
|
||||
["new_data"]=>
|
||||
string(10) "0000-04452"
|
||||
}
|
||||
[4]=>
|
||||
array(3) {
|
||||
["object"]=>
|
||||
string(50) "Инвентарный номер принтера"
|
||||
["old_data"]=>
|
||||
string(7) "3-21333"
|
||||
["new_data"]=>
|
||||
string(8) "3-213335"
|
||||
}
|
||||
[5]=>
|
||||
array(3) {
|
||||
["object"]=>
|
||||
string(44) "Серийный номер принтера"
|
||||
["old_data"]=>
|
||||
string(10) "CNBF033770"
|
||||
["new_data"]=>
|
||||
string(11) "CNBF0337704"
|
||||
}
|
||||
[6]=>
|
||||
array(3) {
|
||||
["object"]=>
|
||||
string(8) "Этаж"
|
||||
["old_data"]=>
|
||||
string(1) "5"
|
||||
["new_data"]=>
|
||||
string(1) "1"
|
||||
}
|
||||
[7]=>
|
||||
array(3) {
|
||||
["object"]=>
|
||||
string(10) "Отдел"
|
||||
["old_data"]=>
|
||||
string(1) "9"
|
||||
["new_data"]=>
|
||||
string(1) "1"
|
||||
}
|
||||
[8]=>
|
||||
array(3) {
|
||||
["object"]=>
|
||||
string(16) "Картридж"
|
||||
["old_data"]=>
|
||||
string(1) "2"
|
||||
["new_data"]=>
|
||||
string(1) "1"
|
||||
}
|
||||
[9]=>
|
||||
array(3) {
|
||||
["object"]=>
|
||||
string(12) "Статус"
|
||||
["old_data"]=>
|
||||
string(1) "1"
|
||||
["new_data"]=>
|
||||
string(1) "2"
|
||||
}
|
||||
[10]=>
|
||||
array(2) {
|
||||
["object"]=>
|
||||
string(29) "Функции удалили"
|
||||
["old_data"]=>
|
||||
string(1) "5"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
*
|
||||
*/
|
||||
|
||||
function __autoload($class_name){
|
||||
|
||||
$array_path = array(
|
||||
'/models/',
|
||||
'/controllers/',
|
||||
'/components/'
|
||||
);
|
||||
|
||||
foreach ($array_path as $path){
|
||||
$path = ROOT . $path . $class_name . '.php';
|
||||
if (is_file($path)){
|
||||
include_once $path;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,80 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* To change this license header, choose License Headers in Project Properties.
|
||||
* To change this template file, choose Tools | Templates
|
||||
* and open the template in the editor.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Description of Date
|
||||
*
|
||||
* @author adm_azashchepkin
|
||||
*/
|
||||
class Date {
|
||||
//put your code here
|
||||
public static function changeDateToUnix($date){
|
||||
|
||||
$arr_date = explode("-", $date);
|
||||
$U_date = mktime(0,0,0,$arr_date[0],$arr_date[1],$arr_date[2]);
|
||||
|
||||
return $U_date;
|
||||
}
|
||||
|
||||
public static function changeLocaleDate($date){
|
||||
|
||||
$translate = array(
|
||||
"am" => "дп",
|
||||
"pm" => "пп",
|
||||
"AM" => "ДП",
|
||||
"PM" => "ПП",
|
||||
"Monday" => "Понедельник",
|
||||
"Mon" => "Пн",
|
||||
"Tuesday" => "Вторник",
|
||||
"Tue" => "Вт",
|
||||
"Wednesday" => "Среда",
|
||||
"Wed" => "Ср",
|
||||
"Thursday" => "Четверг",
|
||||
"Thu" => "Чт",
|
||||
"Friday" => "Пятница",
|
||||
"Fri" => "Пт",
|
||||
"Saturday" => "Суббота",
|
||||
"Sat" => "Сб",
|
||||
"Sunday" => "Воскресенье",
|
||||
"Sun" => "Вс",
|
||||
"January" => "Января",
|
||||
"Jan" => "Янв",
|
||||
"February" => "Февраля",
|
||||
"Feb" => "Фев",
|
||||
"March" => "Марта",
|
||||
"Mar" => "Мар",
|
||||
"April" => "Апреля",
|
||||
"Apr" => "Апр",
|
||||
"May" => "Мая",
|
||||
"May" => "Мая",
|
||||
"June" => "Июня",
|
||||
"Jun" => "Июн",
|
||||
"July" => "Июля",
|
||||
"Jul" => "Июл",
|
||||
"August" => "Августа",
|
||||
"Aug" => "Авг",
|
||||
"September" => "Сентября",
|
||||
"Sep" => "Сен",
|
||||
"October" => "Октября",
|
||||
"Oct" => "Окт",
|
||||
"November" => "Ноября",
|
||||
"Nov" => "Ноя",
|
||||
"December" => "Декабря",
|
||||
"Dec" => "Дек",
|
||||
"st" => "ое",
|
||||
"nd" => "ое",
|
||||
"rd" => "е",
|
||||
"th" => "ое"
|
||||
);
|
||||
|
||||
|
||||
return strtr($date, $translate);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Created by PhpStorm.
|
||||
* User: andrey
|
||||
* Date: 14.04.16
|
||||
* Time: 18:33
|
||||
*/
|
||||
class Db{
|
||||
|
||||
public static function getConnection(){
|
||||
|
||||
$paramsPath = ROOT.'/config/db_params.php';
|
||||
$params = include($paramsPath);
|
||||
|
||||
$dsn = "mysql:host={$params['host']};dbname={$params['dbname']}";
|
||||
$db = new PDO($dsn, $params['user'], $params['password']);
|
||||
|
||||
$db->exec('SET NAMES utf8'); //задаём кодировку ввода/вывода БД
|
||||
|
||||
return $db;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
||||
@@ -0,0 +1,28 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* To change this license header, choose License Headers in Project Properties.
|
||||
* To change this template file, choose Tools | Templates
|
||||
* and open the template in the editor.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Description of Icecast
|
||||
*
|
||||
* @author adm_azashchepkin
|
||||
*/
|
||||
class Icecast {
|
||||
|
||||
public static function getConnection(){
|
||||
|
||||
$paramsPath = ROOT.'/config/icecast.php';
|
||||
$params = include($paramsPath);
|
||||
$radio = [];
|
||||
$radio['host'] = $params['icecast_host']; // Сервер, на котором висит Icecast
|
||||
$radio['ip'] = $params['icecast_ip']; // Сервер, на котором висит Icecast
|
||||
$radio['port'] = $params['icecast_port']; // Порт
|
||||
|
||||
return $radio;
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* To change this license header, choose License Headers in Project Properties.
|
||||
* To change this template file, choose Tools | Templates
|
||||
* and open the template in the editor.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Description of Images
|
||||
*
|
||||
* @author adm_azashchepkin
|
||||
*/
|
||||
class Images {
|
||||
//put your code here
|
||||
public static function uploadImg(){
|
||||
|
||||
if (!copy($_FILES['img']['tmp_name'], ROOT.IMG_PRN.$_FILES['img']['name']))
|
||||
echo 'Error upload image';
|
||||
else
|
||||
return IMG_PRN.$_FILES['img']['name'];
|
||||
|
||||
}
|
||||
|
||||
public static function updatePrintImg($id_prn, $link_img){
|
||||
//формирование запроса и обновление данных в базе
|
||||
$db = Db::getConnection();
|
||||
//внесение денных об изменениях принтера в бд
|
||||
$stmt = $db->prepare("UPDATE print set img=:img WHERE id = :id");
|
||||
$stmt->bindParam(':id', $id_prn, PDO::PARAM_INT);
|
||||
$stmt->bindParam(':img', $link_img);
|
||||
|
||||
return $stmt->execute();
|
||||
}
|
||||
|
||||
public static function checkAndDeleteImg($id_prn){
|
||||
|
||||
$info_prn = Printer::getPrintByIDFullData($id_prn);
|
||||
if(!$info_prn['img'] == ""){
|
||||
$filename = $info_prn['img'];
|
||||
rename(ROOT.$filename, ROOT.$filename."_old"); //переименование старого изображения
|
||||
//unlink(ROOT.$filename); //удаление старого изображения
|
||||
//echo $info_prn['img'];
|
||||
//echo ROOT.$filename."old";
|
||||
//var_dump($info_prn['img']);
|
||||
return true;
|
||||
}else return true;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,88 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* To change this license header, choose License Headers in Project Properties.
|
||||
* To change this template file, choose Tools | Templates
|
||||
* and open the template in the editor.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Description of Ldap
|
||||
*
|
||||
* @author azashchepkin
|
||||
*/
|
||||
class Ldap {
|
||||
|
||||
/*
|
||||
public function __construct() {
|
||||
$this->ldaphost = LDAP_HOST;
|
||||
$this->ldapport = LDAP_PORT;
|
||||
$this->base = LDAP_BASE;
|
||||
$this->filter = LDAP_FILTER;
|
||||
$this->domain = LDAP_DOMAIN;
|
||||
}*/
|
||||
//put your code here
|
||||
public static function LdapAuth($username, $pass){
|
||||
|
||||
$paramsPath = ROOT.'/config/ldap_config.php';
|
||||
$params = include($paramsPath);
|
||||
|
||||
$login = $username.$params['ldap_domain'];
|
||||
$password = $pass;
|
||||
//подсоединяемся к LDAP серверу
|
||||
$ldap = ldap_connect($params['ldap_host'], $params['ldap_port']) or die("Cant connect to LDAP Server");
|
||||
//Включаем LDAP протокол версии 3
|
||||
ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3);
|
||||
if ($ldap){
|
||||
// Пытаемся войти в LDAP при помощи введенных логина и пароля
|
||||
$bind = ldap_bind($ldap,$login,$password);
|
||||
if ($bind)
|
||||
{
|
||||
// Проверим, является ли пользователь членом указанной группы.
|
||||
$result = ldap_search($ldap,$params['ldap_base'],$params['ldap_filter'].$username);//"(||(memberOf=".$memberof.")(".$filter.$username."))"
|
||||
// Получаем количество результатов предыдущей проверки
|
||||
$result_ent = ldap_get_entries($ldap,$result);
|
||||
//return $result_ent;
|
||||
}
|
||||
else
|
||||
{
|
||||
return ('Вы ввели неправильный логин или пароль. попробуйте еще раз<br /> <a href="index.php">Вернуться назад</a>');
|
||||
}
|
||||
}
|
||||
|
||||
// Если пользователь найден, то пропускаем его дальше и перебрасываем на main.php
|
||||
if ($result_ent['count'] != 0)
|
||||
{
|
||||
$_SESSION['user_id'] = $username;
|
||||
$_SESSION['name_en'] = $result_ent[0]['cn'][0];
|
||||
$_SESSION['name'] = $result_ent[0]['extensionattribute1'][0];
|
||||
$_SESSION['surname'] = $result_ent[0]['extensionattribute2'][0];
|
||||
$_SESSION['middle_name'] = $result_ent[0]['extensionattribute3'][0];
|
||||
$_SESSION['full_name'] = $result_ent[0]['extensionattribute4'][0];
|
||||
$_SESSION['city'] = $result_ent[0]['l'][0];
|
||||
$_SESSION['position'] = $result_ent[0]['title'][0];
|
||||
$_SESSION['department'] = $result_ent[0]['extensionattribute7'][0];
|
||||
$_SESSION['mail'] = $result_ent[0]['mail'][0];
|
||||
$_SESSION['phone'] = $result_ent[0]['telephonenumber'][0];
|
||||
$_SESSION['georol'] = $result_ent[0]['renaissancegeorole'][0];
|
||||
$_SESSION['photo'] = $result_ent[0]['jpegphoto'][0];
|
||||
/*Фото из ad
|
||||
$photo = $result_ent[0]['jpegphoto'][0];
|
||||
$img = imagecreatefromstring($photo);
|
||||
header("Content-type: image/jpeg");
|
||||
imagejpeg($img,NULL,100);
|
||||
echo "<img src=/index.php />";
|
||||
|
||||
echo "<pre>";
|
||||
var_dump($result_ent);
|
||||
echo "</pre>";*/
|
||||
//header('Location: main.php');
|
||||
//exit;
|
||||
}
|
||||
else
|
||||
{
|
||||
die('К сожалению, вам доступ закрыт<br /> <a href="index.php">Вернуться назад</a>');
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,170 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* To change this license header, choose License Headers in Project Properties.
|
||||
* To change this template file, choose Tools | Templates
|
||||
* and open the template in the editor.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Description of Mail
|
||||
*
|
||||
* @author adm_azashchepkin
|
||||
*/
|
||||
class Mail {
|
||||
//put your code here
|
||||
public static function getOrderCartriges($list_print, $from){
|
||||
//
|
||||
$message = '<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
<title>Заказ картриджей</title>
|
||||
</head>
|
||||
<body>
|
||||
<p>Добрый день.<br />
|
||||
КБ «Ренессанс Кредит» (ООО)<br />
|
||||
Адрес: г. Курск, ул. Радищева 5.<br />
|
||||
Необходимы картриджи для: </p>
|
||||
<p>';
|
||||
for($i=0; $i < count($list_print); $i++){
|
||||
if($list_print[$i]['is_color'] == 1){
|
||||
$message .= "".$list_print[$i]['model']." ".$list_print[$i]['unit']." (black) (2 шт.)<br />";
|
||||
$message .= "".$list_print[$i]['model']." ".$list_print[$i]['unit']." (blue) (2 шт.)<br />";
|
||||
$message .= "".$list_print[$i]['model']." ".$list_print[$i]['unit']." (yellow) (2 шт.)<br />";
|
||||
$message .= "".$list_print[$i]['model']." ".$list_print[$i]['unit']." (magenta) (2 шт.)<br />";
|
||||
}else $message .= "".$list_print[$i]['model']." ".$list_print[$i]['unit']." (2 шт.)<br />";
|
||||
}
|
||||
|
||||
$message .= '</p><p>График работы: Пн-Пт. 9:00 - 18:00. <br />
|
||||
Контактные номера: <br />
|
||||
Захаренко Евгений <br />
|
||||
+7 (495) 783-46-00 доб. 15015 <br />
|
||||
Защепкин Андрей <br />
|
||||
+7 (495) 783-46-00 доб. 15000 <br />
|
||||
Галин Владислав <br />
|
||||
+7 (495) 783-46-00 доб. 15025 </p>
|
||||
';
|
||||
$ord = self::getMail('Заказ картриджей', $message, $from);
|
||||
(!$ord) ? $mess = "don't geting" : $mess = "OK";
|
||||
return $mess;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
private static function getMail($subject, $message, $from){
|
||||
|
||||
$paramsPath = ROOT.'/config/unit_information.php';
|
||||
$params = include($paramsPath);
|
||||
|
||||
// отправка нескольким адресатам
|
||||
$to = $params['email_support'] . ', '; // кому отправляем
|
||||
//$to .= 'friend2@yourmail.ru' . ', '; // Внимание! Так пишем второй и тд адреса
|
||||
// не забываем запятую. Даже в последнем контакте лишней не будет
|
||||
// Для начинающих! $to .= точка в этом случае для Дописывания в переменную
|
||||
|
||||
// содержание письма
|
||||
/*$subject = "Тема сообщения";
|
||||
$message = '
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
<title>Тема страницы</title>
|
||||
</head>
|
||||
<body>
|
||||
<p>А здесь ваше сообщение</p>
|
||||
</body>
|
||||
</html>';*/
|
||||
|
||||
// устанавливаем тип сообщения Content-type, если хотим
|
||||
$headers = 'MIME-Version: 1.0' . "\r\n";
|
||||
$headers .= "Content-type: text/html; charset=utf-8 \r\n";
|
||||
|
||||
// дополнительные данные
|
||||
$headers .= "From: ".$from['name']." <".$from['email'].">\r\n"; // от кого
|
||||
$headers .= "Cc: #ITKursk@rencredit.ru" . "\r\n"; // копия сообщения на этот адрес
|
||||
//$headers .= "Bcc: yournick-archive@yourmail.ru\r\n"; // скрытая копия сообщения на этот
|
||||
mail($to, $subject, $message, $headers);
|
||||
|
||||
}
|
||||
|
||||
public static function getLinkOrd($list_print){
|
||||
|
||||
$paramsPath = ROOT.'/config/unit_information.php';
|
||||
$params = include($paramsPath);
|
||||
|
||||
// отправка нескольким адресатам
|
||||
$to = $params['email_support']; // кому отправляем
|
||||
$message = "КБ «Ренессанс Кредит» (ООО)%0aАдрес: г. Курск, ул. Радищева 5.%0aНеобходимы картриджи для:%0a%0a";
|
||||
for($i=0; $i < count($list_print); $i++){
|
||||
if($list_print[$i]['is_color'] == 1){
|
||||
$message .= "".$list_print[$i]['model']." ".$list_print[$i]['unit']." (black) (2 шт.)%0a";
|
||||
$message .= "".$list_print[$i]['model']." ".$list_print[$i]['unit']." (blue) (2 шт.)%0a";
|
||||
$message .= "".$list_print[$i]['model']." ".$list_print[$i]['unit']." (yellow) (2 шт.)%0a";
|
||||
$message .= "".$list_print[$i]['model']." ".$list_print[$i]['unit']." (magenta) (2 шт.)%0a";
|
||||
}else $message .= "".$list_print[$i]['model']." ".$list_print[$i]['unit']." (2 шт.)%0a";
|
||||
}
|
||||
$message .= "%0aГрафик работы: Пн-Пт. 9:00 - 18:00.%0aКонтактные номера:%0aЗахаренко Евгений%0a+7 (495) 783-46-00 доб. 15015%0aЗащепкин Андрей%0a+7 (495) 783-46-00 доб. 15000%0aГалин Владислав%0a+7 (495) 783-46-00 доб. 15025";
|
||||
|
||||
$ord = self::getLinkMail("Заказ картриджей", $message, $to);
|
||||
//(!$ord) ? $mess = "don't geting" : $mess = "OK";
|
||||
return $ord;
|
||||
|
||||
}
|
||||
|
||||
public static function getRequests($print_id, $description){
|
||||
|
||||
$paramsPath = ROOT.'/config/unit_information.php';
|
||||
$params = include($paramsPath);
|
||||
$print = Printer::getPrintByID($print_id);
|
||||
// отправка нескольким адресатам
|
||||
$to = $params['email_support']; // кому отправляем
|
||||
$message = "КБ «Ренессанс Кредит» (ООО)%0aАдрес: г. Курск, ул. Радищева 5.%0a%0a";
|
||||
$message .= "Проблемы с принтером ".$print['model']." ".$print['unit'].". ".$description."%0a";
|
||||
$message .= "%0aГрафик работы: Пн-Пт. 9:00 - 18:00.%0aКонтактные номера:%0aЗахаренко Евгений%0a+7 (495) 783-46-00 доб. 15015%0aЗащепкин Андрей%0a+7 (495) 783-46-00 доб. 15000%0aГалин Владислав%0a+7 (495) 783-46-00 доб. 15025";
|
||||
|
||||
$request = self::getLinkMail("Проблемы с принтером ".$print['model']." ".$print['unit'], $message, $to);
|
||||
//(!$ord) ? $mess = "don't geting" : $mess = "OK";
|
||||
return $request;
|
||||
}
|
||||
|
||||
|
||||
private static function getLinkMail($subject, $body, $to){
|
||||
|
||||
$subject = "?subject=".$subject;
|
||||
$body = "&body=".$body;
|
||||
$cc = "&cc=%23ITKursk%40rencredit.ru";
|
||||
|
||||
$link = "<a href='mailto:".$to.$subject.$body.$cc."'>Link</a>";
|
||||
|
||||
return $link;
|
||||
}
|
||||
}
|
||||
/*array(13) {
|
||||
["link"]=>
|
||||
string(30) "http://prints.local/cartriges/"
|
||||
["user_id"]=>
|
||||
string(12) "azashchepkin"
|
||||
["name_en"]=>
|
||||
string(19) "Zashchepkin, Andrey"
|
||||
["name"]=>
|
||||
string(16) "Защепкин"
|
||||
["surname"]=>
|
||||
string(12) "Андрей"
|
||||
["middle_name"]=>
|
||||
string(26) "Александрович"
|
||||
["full_name"]=>
|
||||
string(56) "Защепкин Андрей Александрович"
|
||||
["city"]=>
|
||||
string(10) "Курск"
|
||||
["position"]=>
|
||||
string(62) "Специалист технической поддержки"
|
||||
["department"]=>
|
||||
string(60) "Отдел информационных технологий"
|
||||
["mail"]=>
|
||||
string(25) "azashchepkin@rencredit.ru"
|
||||
["phone"]=>
|
||||
string(5) "15000"
|
||||
["georol"]=>
|
||||
string(16) "GR.RC.Курск"
|
||||
}*/
|
||||
@@ -0,0 +1,196 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* Класс для генерации постраничной навигации
|
||||
*/
|
||||
|
||||
class Pagination
|
||||
{
|
||||
|
||||
/**
|
||||
*
|
||||
* @var Ссылок навигации на страницу
|
||||
*
|
||||
*/
|
||||
private $max = 10;
|
||||
|
||||
/**
|
||||
*
|
||||
* @var Ключ для GET, в который пишется номер страницы
|
||||
*
|
||||
*/
|
||||
private $index = 'page';
|
||||
|
||||
/**
|
||||
*
|
||||
* @var Текущая страница
|
||||
*
|
||||
*/
|
||||
private $current_page;
|
||||
|
||||
/**
|
||||
*
|
||||
* @var Общее количество записей
|
||||
*
|
||||
*/
|
||||
private $total;
|
||||
|
||||
/**
|
||||
*
|
||||
* @var Записей на страницу
|
||||
*
|
||||
*/
|
||||
private $limit;
|
||||
|
||||
/**
|
||||
* Запуск необходимых данных для навигации
|
||||
* @param integer $total - общее количество записей
|
||||
* @param integer $limit - количество записей на страницу
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
public function __construct($total, $currentPage, $limit, $index)
|
||||
{
|
||||
# Устанавливаем общее количество записей
|
||||
$this->total = $total;
|
||||
|
||||
# Устанавливаем количество записей на страницу
|
||||
$this->limit = $limit;
|
||||
|
||||
# Устанавливаем ключ в url
|
||||
$this->index = $index;
|
||||
|
||||
# Устанавливаем количество страниц
|
||||
$this->amount = $this->amount();
|
||||
|
||||
# Устанавливаем номер текущей страницы
|
||||
$this->setCurrentPage($currentPage);
|
||||
}
|
||||
|
||||
/**
|
||||
* Для вывода ссылок
|
||||
*
|
||||
* @return HTML-код со ссылками навигации
|
||||
*/
|
||||
public function get()
|
||||
{
|
||||
# Для записи ссылок
|
||||
$links = null;
|
||||
|
||||
# Получаем ограничения для цикла
|
||||
$limits = $this->limits();
|
||||
|
||||
$html = '<ul class="pagination">';
|
||||
# Генерируем ссылки
|
||||
for ($page = $limits[0]; $page <= $limits[1]; $page++) {
|
||||
# Если текущая это текущая страница, ссылки нет и добавляется класс active
|
||||
if ($page == $this->current_page) {
|
||||
$links .= '<li class="active"><a href="#">' . $page . '</a></li>';
|
||||
} else {
|
||||
# Иначе генерируем ссылку
|
||||
$links .= $this->generateHtml($page);
|
||||
}
|
||||
}
|
||||
|
||||
# Если ссылки создались
|
||||
if (!is_null($links)) {
|
||||
# Если текущая страница не первая
|
||||
if ($this->current_page > 1)
|
||||
# Создаём ссылку "На первую"
|
||||
$links = $this->generateHtml(1, '<') . $links;
|
||||
|
||||
# Если текущая страница не первая
|
||||
if ($this->current_page < $this->amount)
|
||||
# Создаём ссылку "На последнюю"
|
||||
$links .= $this->generateHtml($this->amount, '>');
|
||||
}
|
||||
|
||||
$html .= $links . '</ul>';
|
||||
|
||||
# Возвращаем html
|
||||
return $html;
|
||||
}
|
||||
|
||||
/**
|
||||
* Для генерации HTML-кода ссылки
|
||||
* @param integer $page - номер страницы
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
private function generateHtml($page, $text = null)
|
||||
{
|
||||
# Если текст ссылки не указан
|
||||
if (!$text)
|
||||
# Указываем, что текст - цифра страницы
|
||||
$text = $page;
|
||||
|
||||
$currentURI = rtrim($_SERVER['REQUEST_URI'], '/') . '/';
|
||||
$currentURI = preg_replace('~/page-[0-9]+~', '', $currentURI);
|
||||
# Формируем HTML код ссылки и возвращаем
|
||||
return
|
||||
'<li><a href="' . $currentURI . $this->index . $page . '">' . $text . '</a></li>';
|
||||
}
|
||||
|
||||
/**
|
||||
* Для получения, откуда стартовать
|
||||
*
|
||||
* @return массив с началом и концом отсчёта
|
||||
*/
|
||||
private function limits()
|
||||
{
|
||||
# Вычисляем ссылки слева (чтобы активная ссылка была посередине)
|
||||
$left = $this->current_page - round($this->max / 2);
|
||||
|
||||
# Вычисляем начало отсчёта
|
||||
$start = $left > 0 ? $left : 1;
|
||||
|
||||
# Если впереди есть как минимум $this->max страниц
|
||||
if ($start + $this->max <= $this->amount)
|
||||
# Назначаем конец цикла вперёд на $this->max страниц или просто на минимум
|
||||
$end = $start > 1 ? $start + $this->max : $this->max;
|
||||
else {
|
||||
# Конец - общее количество страниц
|
||||
$end = $this->amount;
|
||||
|
||||
# Начало - минус $this->max от конца
|
||||
$start = $this->amount - $this->max > 0 ? $this->amount - $this->max : 1;
|
||||
}
|
||||
|
||||
# Возвращаем
|
||||
return
|
||||
array($start, $end);
|
||||
}
|
||||
|
||||
/**
|
||||
* Для установки текущей страницы
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
private function setCurrentPage($currentPage)
|
||||
{
|
||||
# Получаем номер страницы
|
||||
$this->current_page = $currentPage;
|
||||
|
||||
# Если текущая страница боле нуля
|
||||
if ($this->current_page > 0) {
|
||||
# Если текунщая страница меньше общего количества страниц
|
||||
if ($this->current_page > $this->amount)
|
||||
# Устанавливаем страницу на последнюю
|
||||
$this->current_page = $this->amount;
|
||||
} else
|
||||
# Устанавливаем страницу на первую
|
||||
$this->current_page = 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Для получеия общего числа страниц
|
||||
*
|
||||
* @return число страниц
|
||||
*/
|
||||
private function amount()
|
||||
{
|
||||
# Делим и возвращаем
|
||||
return round($this->total / $this->limit);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,70 @@
|
||||
<?php
|
||||
|
||||
class Router{
|
||||
|
||||
private $routes;
|
||||
|
||||
public function __construct(){
|
||||
$routerPath = ROOT.'/config/routes.php';
|
||||
$this->routes = require($routerPath);
|
||||
}
|
||||
|
||||
/*
|
||||
* return request string
|
||||
*/
|
||||
private function getURI(){
|
||||
if(!empty($_SERVER['REQUEST_URI'])){
|
||||
return trim($_SERVER['REQUEST_URI'], '/');
|
||||
}
|
||||
}
|
||||
|
||||
public function run(){
|
||||
//получить строку запроса
|
||||
$uri = $this->getURI();
|
||||
|
||||
//проверить наличие запроса в routes.php
|
||||
|
||||
foreach($this->routes as $uriPattern => $path){
|
||||
|
||||
//сравниваем $urlPattern и $url
|
||||
if(preg_match("~$uriPattern~", $uri)){
|
||||
|
||||
//получаем внутренний путь из внешнего согласно правилу
|
||||
$internalRoute = preg_replace("~$uriPattern~", $path, $uri);
|
||||
|
||||
//определить контлоллер, экшен и параметры
|
||||
$segments = explode('/', $internalRoute);
|
||||
|
||||
$controllerName = array_shift($segments).'Controller';
|
||||
$controllerName = ucfirst($controllerName);
|
||||
|
||||
$actionName = 'action'.ucfirst(array_shift($segments));
|
||||
|
||||
$parameters = $segments;
|
||||
|
||||
//подключить файл класса контроллера
|
||||
|
||||
$controllerFile = ROOT.'/controllers/'.$controllerName.'.php';
|
||||
|
||||
if(file_exists($controllerFile)){
|
||||
include_once ($controllerFile);
|
||||
}
|
||||
|
||||
$controllerObject = new $controllerName;
|
||||
|
||||
if(!method_exists($controllerObject,$actionName)) {
|
||||
$er = $uri;
|
||||
require_once (ROOT . TMPL . 'error.php');
|
||||
return true;
|
||||
};
|
||||
|
||||
$result = call_user_func_array(array($controllerObject, $actionName),$parameters);
|
||||
|
||||
if($result != null){
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* To change this license header, choose License Headers in Project Properties.
|
||||
* To change this template file, choose Tools | Templates
|
||||
* and open the template in the editor.
|
||||
*/
|
||||
return array(
|
||||
|
||||
'name'=>'Unit',
|
||||
'email_support'=>'support@unit-org.ru', //support@unit-org.ru
|
||||
'number'=>'8800'
|
||||
);
|
||||
@@ -0,0 +1,17 @@
|
||||
<?php
|
||||
/**
|
||||
* Created by PhpStorm.
|
||||
* User: andrey
|
||||
* Date: 14.04.16
|
||||
* Time: 18:57
|
||||
*/
|
||||
|
||||
return array(
|
||||
'host' => 'localhost',
|
||||
'dbname' => 'db_prints',
|
||||
'user' => 'mysql',
|
||||
'password' => 'mysql',
|
||||
);
|
||||
|
||||
// $db->exec('SET NAMES utf8'); //задаём кодировку ввода/вывода БД*/
|
||||
?>
|
||||
@@ -0,0 +1,12 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* To change this license header, choose License Headers in Project Properties.
|
||||
* To change this template file, choose Tools | Templates
|
||||
* and open the template in the editor.
|
||||
*/
|
||||
return array(
|
||||
'icecast_host' => 'dsk7681',
|
||||
'icecast_ip' => '10.20.4.219',
|
||||
'icecast_port' => '8000',
|
||||
);
|
||||
@@ -0,0 +1,15 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* To change this license header, choose License Headers in Project Properties.
|
||||
* To change this template file, choose Tools | Templates
|
||||
* and open the template in the editor.
|
||||
*/
|
||||
|
||||
return array(
|
||||
'ldap_host' => 'LDAP_B7.RCCF.RU', //, LDAP_M1.RCCF.RU',
|
||||
'ldap_port' => '389',
|
||||
'ldap_base' => 'OU=Accounts, DC=rccf, DC=ru',
|
||||
'ldap_filter' => 'sAMAccountName=',
|
||||
'ldap_domain' => '@rccf.ru',
|
||||
);
|
||||
@@ -0,0 +1,70 @@
|
||||
<?php
|
||||
/**
|
||||
* Created by PhpStorm.
|
||||
* User: Andrey
|
||||
* Date: 01.04.2016
|
||||
* Time: 18:04
|
||||
*/
|
||||
|
||||
return array(
|
||||
'imgupload' => 'images/upload',
|
||||
'user/login' => 'user/login',
|
||||
'user/logout' => 'user/logout',
|
||||
'printers' => 'printers/index',
|
||||
'printer/add' => 'printers/add',
|
||||
'printer/([0-9]+)' => 'printers/view/$1',
|
||||
'printer/edit/([0-9]+)' => 'printers/edit/$1',
|
||||
'cartriges/action' => 'cartriges/actions',
|
||||
'cartriges/orders' => 'cartriges/orders',
|
||||
'cartriges/reaction/([0-9]+)' => 'cartriges/reaction/$1',
|
||||
'cartriges/add/public/([0-9]+)' => 'cartriges/public/$1',
|
||||
'cartriges/add' => 'cartriges/add',
|
||||
'cartriges/Zeroning' => 'cartriges/Zeroning',
|
||||
'cartriges' => 'cartriges/index',
|
||||
'phonebook/admactiv/([0-9]+)' => 'phonebook/activ/$1',
|
||||
'phonebook/admsearch' => 'phonebook/admsearch',
|
||||
'phonebook/admedit' => 'phonebook/edit',
|
||||
'phonebook/admedit/([0-9]+)' => 'phonebook/edit/$1',
|
||||
'phonebook/admdelete/([0-9]+)' => 'phonebook/delete/$1',
|
||||
'phonebook/save' => 'phonebook/save',
|
||||
'phonebook/update' => 'phonebook/update',
|
||||
'phonebook/search' => 'phonebook/search',
|
||||
'phonebook' => 'phonebook/index',
|
||||
'unit/newactionrequest' => 'unit/newactionrequest',
|
||||
'unit/actionrequest/([0-9]+)' => 'unit/actionrequest/$1',
|
||||
'unit/actionrequest' => 'unit/actionrequest',
|
||||
'unit/createrequest' => 'unit/createrequest',
|
||||
'unit/requesttobase' => 'unit/requesttobase',
|
||||
'unit/requests/page-([0-9]+)' => 'unit/index/$1',
|
||||
'unit/requests' => 'unit/index',
|
||||
'unit' => 'unit/index',
|
||||
|
||||
|
||||
//'radio/statistics/([=0-9]+)' => 'radio/statistics',
|
||||
//'radio/statistics/?_=([0-9]+)' => 'radio/statistics',
|
||||
'radio/statistics' => 'radio/statistics',
|
||||
'radio' => 'radio/index',
|
||||
|
||||
'' => 'site/index',
|
||||
/*'product/([0-9]+)' => 'product/view/$1',
|
||||
'catalog' => 'catalog/index',
|
||||
'category/([0-9]+)/page-([0-9]+)' => 'catalog/category/$1/$2',
|
||||
'category/([0-9]+)' => 'catalog/category/$1',
|
||||
'cart/add/([0-9]+)' => 'cart/add/$1',
|
||||
'cart/addAjax/([0-9]+)' => 'cart/addAjax/$1',
|
||||
'cart' => 'cart/index',
|
||||
'user/register' => 'user/register',
|
||||
'user/login' => 'user/login',
|
||||
'user/logout' => 'user/logout',
|
||||
'cabinet/edit' => 'cabinet/edit',
|
||||
'cabinet' => 'cabinet/index',
|
||||
'contacts' => 'site/contact',
|
||||
|
||||
'news/([0-9]*)' => 'news/view',
|
||||
'news' => 'news/index',
|
||||
'articles' => 'articles/list',
|
||||
'news/archive' => 'news/archive',
|
||||
|
||||
* 'news/([0-9]+)' => 'news/view/$1',
|
||||
'news' => 'news/index', */
|
||||
);
|
||||
@@ -0,0 +1,144 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* To change this license header, choose License Headers in Project Properties.
|
||||
* To change this template file, choose Tools | Templates
|
||||
* and open the template in the editor.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Description of cartriges
|
||||
*
|
||||
* @author adm_azashchepkin
|
||||
*/
|
||||
class CartrigesController {
|
||||
//put your code here
|
||||
public static $title = " Картриджи";
|
||||
|
||||
public function actionIndex(){ //главная страница раздела картриджей
|
||||
|
||||
$title = self::$title;
|
||||
|
||||
$summ_cart = Cartriges::getSumAllCarteiges();
|
||||
|
||||
if(isset($_POST['submit'])){
|
||||
|
||||
$messages = Cartriges::ActionCartriges($_POST, $_SESSION);
|
||||
/*echo "<pre>";
|
||||
print_r ($_POST);
|
||||
print_r ($_SESSION['user_id']);
|
||||
echo "</pre>";*/
|
||||
|
||||
}
|
||||
|
||||
require_once (ROOT . TMPL . 'cartriges.php');
|
||||
return true;
|
||||
}
|
||||
|
||||
public function actionActions(){ //действия с картриджами (доставка\замена)
|
||||
|
||||
if(!isset($_POST['submit'])) @$_SESSION['link'] = $_SERVER['HTTP_REFERER'];
|
||||
|
||||
$act_error = 0;
|
||||
|
||||
$action = $_GET['act'];
|
||||
|
||||
if(empty($action)) $act_error = 1;
|
||||
|
||||
$title = self::$title."| Действия";
|
||||
|
||||
//echo "hello user ".$action."-action";
|
||||
|
||||
$cartriges = Cartriges::getActivCartriges();
|
||||
require_once (ROOT . TMPL . 'action_cartriges.php');
|
||||
return true;
|
||||
}
|
||||
|
||||
public static function actionAdd(){ //добавление картриджа
|
||||
|
||||
$title = self::$title."| Добавление";
|
||||
|
||||
|
||||
if(isset($_POST['addcartrige'])){
|
||||
|
||||
echo "get add new cartrige in base";
|
||||
(!Cartriges::addCartriges($_POST)) ? $messages = "Картридж добавлен" : $messages = "error";
|
||||
$cartriges = Cartriges::getAllCartriges();
|
||||
}
|
||||
else{
|
||||
$cartriges = Cartriges::getAllCartriges();
|
||||
}
|
||||
$cartrridges_history = Cartriges::getHistoryCartridges(9);
|
||||
require_once (ROOT . TMPL . 'addcartrige.php');
|
||||
return true;
|
||||
}
|
||||
|
||||
public function actionPublic($id){
|
||||
|
||||
//self::checkAdmin();
|
||||
|
||||
$pub = Cartriges::changeIsPublic($id);
|
||||
//var_dump($_SESSION);
|
||||
//var_dump($_POST);
|
||||
//var_dump($_FILES);
|
||||
//var_dump($id);
|
||||
if($pub){
|
||||
header ('Location: '.DOMEN .'/cartriges/add');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static function actionReaction($id){ //активация\деактивация картриджа
|
||||
|
||||
Cartriges::reactivCartriges($id);
|
||||
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
public static function actionOrders(){ //заказ картриджей
|
||||
|
||||
$title = self::$title."| Заказ";
|
||||
if(user::checkAdmin() == true){
|
||||
$summ_cart = Cartriges::getSumAllCarteiges();
|
||||
$cartriges = Cartriges::getActivCartriges();
|
||||
|
||||
if(isset($_POST['submit'])){
|
||||
//show and running code for order
|
||||
$list = Cartriges::orderCartriges($_POST);
|
||||
$data_ord = json_encode($_POST);
|
||||
/*$from = array(
|
||||
'name'=>''.$_SESSION["full_name"].'',
|
||||
'email'=>''.$_SESSION["mail"].'',
|
||||
);*/
|
||||
$a = Mail::getLinkOrd($list);
|
||||
//echo $a;
|
||||
/*echo "<pre>";
|
||||
var_dump($_SESSION);
|
||||
echo "</pre>";*/
|
||||
}
|
||||
$save = filter_input(INPUT_POST, 'save_order');
|
||||
if(isset($save)){
|
||||
$data = json_decode(filter_input(INPUT_POST, 'data'), true);
|
||||
|
||||
$saving = Unit::saveOrder($_SESSION["user_id"], $data);//добавить в базу заявок
|
||||
//var_dump($create_action);
|
||||
if(!$saving){
|
||||
$message = "error";
|
||||
}else {
|
||||
$message = "ok";
|
||||
//header("Location: ".$_SERVER['HTTP_REFERER']."");
|
||||
}
|
||||
}
|
||||
}else{
|
||||
$access = "Ошибка доступа";
|
||||
}
|
||||
require_once (ROOT . TMPL . 'cartriges_order.php');
|
||||
return true;
|
||||
}
|
||||
|
||||
public static function actionZeroning(){
|
||||
Cartriges::resetToZero();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,101 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* To change this license header, choose License Headers in Project Properties.
|
||||
* To change this template file, choose Tools | Templates
|
||||
* and open the template in the editor.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Description of ImagesController
|
||||
*
|
||||
* @author adm_azashchepkin
|
||||
*/
|
||||
class ImagesController {
|
||||
//put your code here
|
||||
public function actionUpload(){
|
||||
|
||||
$_SESSION['link'] = $_SERVER['HTTP_REFERER'];
|
||||
|
||||
if(isset($_POST['upload'])) {
|
||||
$id_prn = $_POST['print_id'];
|
||||
if(!Images::checkAndDeleteImg($id_prn)) echo "Ошибка загрузки изображения";// проверка наличия изображения у принтера и удаление из файловой системы
|
||||
else{
|
||||
$link_img = Images::uploadImg($_POST);
|
||||
|
||||
if($link_img == "Error upload image") echo "Ошибка загрузки изображения";
|
||||
else{
|
||||
if(!Images::updatePrintImg($id_prn, $link_img)) echo "Ошибка загрузки изображения";
|
||||
else header("Location: ".$_SESSION['link']);
|
||||
}
|
||||
}
|
||||
/*
|
||||
echo "<pre>";
|
||||
var_dump($_SESSION);
|
||||
echo "<br />----------------------<br />";
|
||||
var_dump($_POST);
|
||||
echo "<br />----------------------<br />";
|
||||
var_dump($_FILES);
|
||||
echo "</pre>";
|
||||
*
|
||||
*
|
||||
* array(13) {
|
||||
["link"]=>
|
||||
string(35) "http://prints.local/printer/edit/49"
|
||||
["user_id"]=>
|
||||
string(12) "azashchepkin"
|
||||
["name_en"]=>
|
||||
string(19) "Zashchepkin, Andrey"
|
||||
["name"]=>
|
||||
string(16) "Защепкин"
|
||||
["surname"]=>
|
||||
string(12) "Андрей"
|
||||
["middle_name"]=>
|
||||
string(26) "Александрович"
|
||||
["full_name"]=>
|
||||
string(56) "Защепкин Андрей Александрович"
|
||||
["city"]=>
|
||||
string(10) "Курск"
|
||||
["position"]=>
|
||||
string(62) "Специалист технической поддержки"
|
||||
["department"]=>
|
||||
string(60) "Отдел информационных технологий"
|
||||
["mail"]=>
|
||||
string(25) "azashchepkin@rencredit.ru"
|
||||
["phone"]=>
|
||||
string(5) "15000"
|
||||
["georol"]=>
|
||||
string(16) "GR.RC.Курск"
|
||||
}
|
||||
|
||||
----------------------
|
||||
array(2) {
|
||||
["print_id"]=>
|
||||
string(2) "49"
|
||||
["upload"]=>
|
||||
string(0) ""
|
||||
}
|
||||
|
||||
----------------------
|
||||
array(1) {
|
||||
["img"]=>
|
||||
array(5) {
|
||||
["name"]=>
|
||||
string(13) "error wfm.png"
|
||||
["type"]=>
|
||||
string(9) "image/png"
|
||||
["tmp_name"]=>
|
||||
string(39) "C:\OpenServer\userdata\temp\php5D63.tmp"
|
||||
["error"]=>
|
||||
int(0)
|
||||
["size"]=>
|
||||
int(50663)
|
||||
}
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
return true;
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,155 @@
|
||||
<?php
|
||||
|
||||
class PhonebookController{
|
||||
|
||||
public static $title = " Телефонный справочник";
|
||||
|
||||
public function actionIndex(){
|
||||
|
||||
$title = self::$title;
|
||||
|
||||
$list = Phonebook::gelAllPhoneList();
|
||||
|
||||
/*echo "<pre>";
|
||||
var_dump($list);
|
||||
echo "</pre>";*/
|
||||
|
||||
require_once (ROOT. TMPL. 'phonebook.php');
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public function actionSearch(){
|
||||
|
||||
$title = self::$title . " | Поиск";
|
||||
|
||||
if(!empty($_POST)){
|
||||
$searching = $_POST['searching'];
|
||||
}
|
||||
if(!empty($searching)){
|
||||
$value = Phonebook::gerResultSearch($searching);
|
||||
}
|
||||
/*echo "<pre>";
|
||||
var_dump($list);
|
||||
echo "</pre>";*/
|
||||
|
||||
require_once (ROOT. TMPL. 'phonebook_search.php');
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public function actionSave(){
|
||||
|
||||
Phonebook::getExcelList();
|
||||
|
||||
header("Location: ".$_SERVER['HTTP_REFERER']."");
|
||||
|
||||
}
|
||||
|
||||
public function actionUpdate(){
|
||||
|
||||
$data = $_POST;
|
||||
|
||||
$upd = Phonebook::save($data);
|
||||
if(!empty($upd) || isset($upd['save'])){
|
||||
|
||||
if($upd){
|
||||
header("Location: ".$_SERVER['HTTP_REFERER']."");
|
||||
}else return false;
|
||||
}
|
||||
}
|
||||
|
||||
public function actionAdmsearch(){
|
||||
|
||||
$title = self::$title . " | Поиск adm";
|
||||
|
||||
$error = false;
|
||||
if(user::checkAdmin() == true){
|
||||
|
||||
if(isset($_POST['submit']) || !empty($_POST['searching'])){
|
||||
$searching = $_POST['searching'];
|
||||
$list = Phonebook::gerResultSearch($searching, 1);
|
||||
}else{
|
||||
$list = Phonebook::gelAllPhoneList(0);
|
||||
}
|
||||
}else{
|
||||
$error = "access denied";
|
||||
}
|
||||
|
||||
$subardination = Phonebook::getSubordination();
|
||||
$parents = Phonebook::getParents();
|
||||
$departments = Phonebook::getDepatmnents();
|
||||
|
||||
require_once (ROOT. TMPL. 'phonebook_admsearch.php');
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public function actionActiv($id){
|
||||
|
||||
if(user::checkAdmin() == true){
|
||||
$pub = Phonebook::changeIsActiv($id);
|
||||
//var_dump($_SESSION);
|
||||
//var_dump($_POST);
|
||||
//var_dump($_FILES);
|
||||
//var_dump($id);
|
||||
if($pub){
|
||||
header ('Location: http://'.DOMEN .'/phonebook/admsearch');
|
||||
}
|
||||
}else $error = "access denied";
|
||||
|
||||
require_once (ROOT. TMPL. 'phonebook_admsearch.php');
|
||||
return true;
|
||||
}
|
||||
|
||||
public function actionAdd(){
|
||||
|
||||
if(user::checkAdmin() == true){
|
||||
|
||||
}else{
|
||||
$error = "access denied";
|
||||
}
|
||||
|
||||
require_once (ROOT. TMPL. 'phonebook_add.php');
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public function actionEdit($id){
|
||||
|
||||
$title = self::$title . " | Редактирование";
|
||||
$message = false;
|
||||
|
||||
if(user::checkAdmin() == true){
|
||||
if(isset($_POST['save'])){
|
||||
$update = Phonebook::save($_POST);
|
||||
(!$update) ? $message = "Error" : $message = "Good";
|
||||
}
|
||||
$info = Phonebook::getElementByID($id);
|
||||
$subardination = Phonebook::getSubordination();
|
||||
$parents = Phonebook::getParents();
|
||||
$departments = Phonebook::getDepatmnents();
|
||||
}else{
|
||||
$error = "access denied";
|
||||
}
|
||||
|
||||
require_once (ROOT. TMPL. 'phonebook_edit.php');
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public function actionDelete($id){
|
||||
|
||||
if(user::checkAdmin() == true){
|
||||
|
||||
}else{
|
||||
$error = "access denied";
|
||||
}
|
||||
|
||||
require_once (ROOT. TMPL. 'phonebook_del.php');
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,159 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Created on 03.10.2016
|
||||
* By NetBeans IDE 8.1
|
||||
* Author: Andrey Zashchepkin
|
||||
*
|
||||
*
|
||||
* ******** Contacts:*********
|
||||
* my e-mails - yaslonane@yandex.ru
|
||||
* - andrey@zashchepkin.ru
|
||||
* - info@zashchepkin.ru
|
||||
* my site zashchepkin.ru
|
||||
* ******** end contacts *********
|
||||
*
|
||||
*
|
||||
* Copyright zashchepkin.ru © 2016. All Rights Reserved.
|
||||
* License https://opensource.org/licenses/mit-license.php MIT License (MIT)
|
||||
*
|
||||
*
|
||||
* Description of PrintersController
|
||||
*
|
||||
* @author andrey
|
||||
* */
|
||||
class PrintersController {
|
||||
//put your code here
|
||||
|
||||
public static $title = " Принтеры";
|
||||
|
||||
public function actionIndex(){
|
||||
|
||||
$title = self::$title;
|
||||
|
||||
$printList = Printer::getListPrinters();
|
||||
|
||||
if($printList == 0) $error = 1;
|
||||
|
||||
$floor = Printer::getAllFloors();
|
||||
$department = Printer::getAllDepartments();
|
||||
$cartrige = Printer::getAllCartriges();
|
||||
$status = Printer::getAllStatuses();
|
||||
|
||||
require_once (ROOT. TMPL. 'printers.php');
|
||||
|
||||
/*echo "<pre>";
|
||||
var_dump($status);
|
||||
echo "</pre>";*/
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
public function actionAdd(){
|
||||
|
||||
$title = self::$title;
|
||||
|
||||
if(isset($_POST['submit'])){
|
||||
|
||||
//echo "save!!!";
|
||||
|
||||
//insert in base new printer and geting her id
|
||||
//forvard in page edit/[id]
|
||||
$id = Printer::insertPrint($_POST, true);
|
||||
//echo $id;
|
||||
header("Location: /printer/edit/".$id);
|
||||
/*$upbd = printer::updatePrint($print['id'], $_POST);
|
||||
|
||||
$save = Printer::setHistoryChange($up, $print['id'], $_SESSION['user_id']);
|
||||
if(!$upbd) $_SESSION['message'] = "Error";
|
||||
else $_SESSION['message'] = "good";*/
|
||||
}else{
|
||||
$title = self::$title." | Добавление";
|
||||
|
||||
//$printList = Printer::getListPrinters();
|
||||
|
||||
//if($printList == 0) $error = 1;
|
||||
|
||||
$floor = Printer::getAllFloors();
|
||||
$department = Printer::getAllDepartments();
|
||||
$cartrige = Printer::getAllCartriges();
|
||||
$status = Printer::getAllStatuses();
|
||||
$functions = Printer::getAllFunctions();
|
||||
|
||||
require_once (ROOT. TMPL. 'add_prn.php');
|
||||
|
||||
|
||||
/*echo "<pre>";
|
||||
var_dump($status);
|
||||
echo "</pre>";*/
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
public static function actionView($id){
|
||||
|
||||
$print = Printer::getPrintByID($id);
|
||||
|
||||
$title = self::$title." | ".$print['name'];
|
||||
|
||||
$history = Printer::getHistoryChangeByID($id);
|
||||
|
||||
require_once (ROOT. TMPL. 'info.php');
|
||||
/*echo "<pre>";
|
||||
var_dump($histiry);
|
||||
echo "</pre>";*/
|
||||
return true;
|
||||
}
|
||||
|
||||
public static function actionEdit($id){
|
||||
|
||||
if(user::checkAdmin() == true){
|
||||
$floor = Printer::getAllFloors();
|
||||
$department = Printer::getAllDepartments();
|
||||
$cartrige = Printer::getAllCartriges();
|
||||
$status = Printer::getAllStatuses();
|
||||
$functions = Printer::getAllFunctions();
|
||||
$print = Printer::getPrintByIDFullData($id);
|
||||
|
||||
$title = self::$title." | Редактирование | ".$print['name'];
|
||||
|
||||
if(isset($_POST['submit'])){
|
||||
|
||||
/*echo "<pre>";
|
||||
var_dump($print);
|
||||
echo "</pre>";
|
||||
echo "kek";
|
||||
echo "<pre>";
|
||||
var_dump($_POST);
|
||||
echo "</pre>";*/
|
||||
|
||||
$up = printer::checkDataUpdatePrint($print, $_POST);
|
||||
|
||||
$upbd = printer::updatePrint($print['id'], $_POST);
|
||||
|
||||
$save = Printer::setHistoryChange($up, $print['id'], $_SESSION['user_id']);
|
||||
if(!$upbd) $_SESSION['message'] = "Error";
|
||||
else $_SESSION['message'] = "good";
|
||||
}
|
||||
|
||||
/*if(isset($_POST['submitimg'])){
|
||||
echo "<pre>";
|
||||
var_dump($_SESSION);
|
||||
echo "<br />----------------------<br />";
|
||||
var_dump($_POST);
|
||||
echo "</pre>";
|
||||
}*/
|
||||
$print = Printer::getPrintByIDFullData($id);
|
||||
}else{
|
||||
$access = "Ошибка доступа";
|
||||
}
|
||||
require_once (ROOT. TMPL. 'edit_print.php');
|
||||
|
||||
unset($_SESSION['message']);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,59 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* To change this license header, choose License Headers in Project Properties.
|
||||
* To change this template file, choose Tools | Templates
|
||||
* and open the template in the editor.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Description of RadioController
|
||||
*
|
||||
* @author adm_azashchepkin
|
||||
*/
|
||||
class RadioController {
|
||||
//put your code here
|
||||
public static $title = " Радио";
|
||||
|
||||
public function actionIndex(){ //главная страница раздела картриджей
|
||||
|
||||
$title = self::$title;
|
||||
|
||||
$radioList = Radio::radioList();
|
||||
$statistic = Radio::getStatistic();
|
||||
|
||||
|
||||
/*echo "<pre>";
|
||||
var_dump($statistic);
|
||||
echo "</pre>";*/
|
||||
//echo $this->host_ice .":". $this->port_ice;
|
||||
|
||||
require_once (ROOT . TMPL . 'radio.php');
|
||||
return true;
|
||||
}
|
||||
|
||||
public function actionStatistics(){
|
||||
|
||||
$statistic = Radio::getStatistic();
|
||||
$string = "<table class='table'>
|
||||
<tr>
|
||||
<th>Название</th>
|
||||
<th> Слушать </td>
|
||||
<th>Слушателей<br>сейчас</th>
|
||||
<th>Композиция</th>
|
||||
</tr>";
|
||||
for($i=0; count($statistic)>$i; $i++){
|
||||
$string .= "<tr>";
|
||||
$string .= "<td>".$statistic[$i]['stream']."</td>";
|
||||
$string .="<td><a target=_blanc href='http://dsk7681:8000".$statistic[$i]['stream'].".m3u'><img border='0' width='24' src='http://dsk7681/frame/images/radio1.gif'></a></td>";
|
||||
$string .="<td>".$statistic[$i]['quantity_listens']."</td>";
|
||||
$string .="<td>".$statistic[$i]['title']."</td>";
|
||||
$string .="</tr>";
|
||||
}
|
||||
|
||||
$string .="</table>";
|
||||
echo $string;
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,85 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
*
|
||||
*/
|
||||
|
||||
class SiteController{
|
||||
/*
|
||||
*
|
||||
* вывод главной страницы
|
||||
*
|
||||
*/
|
||||
public static $title = " Главная";
|
||||
|
||||
public function actionIndex(){
|
||||
|
||||
//$categories = array(); //инициализируем переменную для вывода списка категорий
|
||||
//$categories = Category::getCategoriesList(); // вызываем метод получения массива категорий из модели категории
|
||||
/* выводим дерево категорий
|
||||
$x = new Category(); // вызываем класс
|
||||
$a = $x->treeCategory(); // выбираем из базы список категорий и подкатегорий
|
||||
$categories2 = category::create_tree($a, 0); // вызываем функцию и строим дерево
|
||||
*
|
||||
*/
|
||||
|
||||
//$latestProduct = array();
|
||||
//$latestProduct = Product::getLatestProducts();
|
||||
$title = self::$title;
|
||||
|
||||
$summ_cart = Cartriges::getSumAllCarteiges();
|
||||
|
||||
$printList = Printer::getRandPrint(3);
|
||||
|
||||
require_once(ROOT . TMPL .'index.php');
|
||||
/*echo "Home<br>";
|
||||
|
||||
if(user::checkAuth() == false){
|
||||
echo "Авторизуйтесь!!!";
|
||||
}else{
|
||||
echo "<img src='https://intranet.rencredit.ru/my/User%20Photos/Profile%20Pictures/".$_SESSION['user_id']."_LThumb.jpg' class='img-circle'/>";
|
||||
|
||||
|
||||
echo "<pre>";
|
||||
var_dump($_SESSION);
|
||||
echo "</pre>";
|
||||
echo "<a href='/user/logout'>Exit</a>";
|
||||
}*/
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public function actionContact(){
|
||||
|
||||
$userEmail = '';
|
||||
$userText = '';
|
||||
$result = false;
|
||||
|
||||
if(isset($_POST['submit'])){
|
||||
|
||||
$userEmail = $_POST['userEmail'];
|
||||
$userText = $_POST['userText'];
|
||||
|
||||
$errors = false;
|
||||
|
||||
if(!user::checkEmail($userEmail)){
|
||||
$errors[] = 'Not valid E-mail';
|
||||
}
|
||||
|
||||
if($errors == false){
|
||||
$adminEmail = 'yaslonane@yandex.ru';
|
||||
$message = "Текст: {$userText}. От {$userEmail}";
|
||||
$subject = 'subject mail TEST';
|
||||
$result = mail($adminEmail, $subject, $message, "From: System message from zaa46.xyz <info@zaa46.xyz>"); /* {$userEmail} */
|
||||
$result = true;
|
||||
}
|
||||
}
|
||||
|
||||
require (ROOT . TMPL . 'contact.php');
|
||||
|
||||
return true;
|
||||
}
|
||||
/*
|
||||
* конец вывода главной страницы
|
||||
*/
|
||||
}
|
||||
@@ -0,0 +1,139 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* To change this license header, choose License Headers in Project Properties.
|
||||
* To change this template file, choose Tools | Templates
|
||||
* and open the template in the editor.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Description of UnitController
|
||||
*
|
||||
* @author adm_azashchepkin
|
||||
*/
|
||||
class UnitController {
|
||||
//put your code here
|
||||
public static $title = " Unit";
|
||||
|
||||
public function actionIndex($page = 1){
|
||||
|
||||
$title = self::$title . " | Список обращений";
|
||||
|
||||
$requests = Unit::getRequests($page);
|
||||
$total = Unit::getTotalRequests();
|
||||
|
||||
$pagination = new Pagination($total, $page, Product::SHOW_BY_DEFAULT, 'page-');
|
||||
|
||||
/*echo "<pre>";
|
||||
var_dump($requests);
|
||||
echo "</pre>";*/
|
||||
|
||||
require_once (ROOT. TMPL. 'requests.php');
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public function actionCreaterequest(){
|
||||
|
||||
$title = self::$title . " | Создание запроса";
|
||||
|
||||
$error = false;
|
||||
$message = false;
|
||||
|
||||
if(user::checkAdmin() == true){
|
||||
|
||||
$printers = Printer::getListPrinters('all');
|
||||
$create = filter_input(INPUT_POST,'create');
|
||||
if(isset($create)){
|
||||
$user_id = filter_input(INPUT_POST,'username');
|
||||
$print_id = filter_input(INPUT_POST,'print_id');
|
||||
$description = filter_input(INPUT_POST,'text');
|
||||
|
||||
$lnk = Mail::getRequests($print_id, $description);
|
||||
|
||||
|
||||
}
|
||||
$save = filter_input(INPUT_POST, 'save_request');
|
||||
if(isset($save)){
|
||||
$user = filter_input(INPUT_POST,'user_id');
|
||||
$print = filter_input(INPUT_POST,'print_id');
|
||||
$desc = filter_input(INPUT_POST,'description');
|
||||
$saving = Unit::setRequest($user, $print, $desc);//добавить в базу заявок
|
||||
$create_action = Unit::createNewAction($saving, 0, $user);
|
||||
//var_dump($create_action);
|
||||
if(!$saving){
|
||||
$message = "error";
|
||||
}else {
|
||||
$message = "ok";
|
||||
//header("Location: ".$_SERVER['HTTP_REFERER']."");
|
||||
}
|
||||
}
|
||||
}else{
|
||||
$error = "access denied";
|
||||
}
|
||||
require_once (ROOT. TMPL. 'create_request.php');
|
||||
|
||||
/*echo "<pre>";
|
||||
var_dump($status);
|
||||
echo "</pre>";*/
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public function actionRequesttobase(){
|
||||
//$printers = Printer::getListPrinters('all');
|
||||
$save = filter_input(INPUT_POST, 'save_request');
|
||||
if(isset($save)){
|
||||
$user_id = filter_input(INPUT_POST,'user_id');
|
||||
$print_id = filter_input(INPUT_POST,'print_id');
|
||||
$description = filter_input(INPUT_POST,'description');
|
||||
$saving = Unit::setRequest($user_id, $print_id, $description);//добавить в базу заявок
|
||||
if(!$saving){
|
||||
$message = "error";
|
||||
}else {
|
||||
$message = "ok";
|
||||
header("Location: ".$_SERVER['HTTP_REFERER']."");
|
||||
}
|
||||
}
|
||||
echo $message;
|
||||
return true;
|
||||
/*echo "<pre>";
|
||||
var_dump($status);
|
||||
echo "</pre>";*/
|
||||
|
||||
}
|
||||
|
||||
public function actionActionrequest($id = NULL){
|
||||
$title = self::$title . " | Действия по обращению";
|
||||
$error = "";
|
||||
if(user::checkAdmin() == true){
|
||||
//action if authorization is successful
|
||||
if($id === NULL){
|
||||
header("Location: http://".DOMEN."/unit/requests");
|
||||
}else{
|
||||
$list = Unit::getRequestByID($id);
|
||||
$act = Unit::getAllActionByIDRequest($id);
|
||||
}
|
||||
}else{
|
||||
$error = "access denied";
|
||||
}
|
||||
//require_once (ROOT. TMPL. 'create_request.php');
|
||||
require_once (ROOT. TMPL. 'action_request.php');
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public function actionNewactionrequest(){
|
||||
|
||||
$act = Unit::setNewActions();
|
||||
|
||||
$docs = filter_input(INPUT_POST, 'docs');
|
||||
$request_id = filter_input(INPUT_POST, 'request_id');
|
||||
|
||||
$indoc = Unit::setNewDocs($act, $request_id, $docs);
|
||||
|
||||
if($indoc == true) header("Location: http://".DOMEN."/unit/actionrequest/".$request_id."");
|
||||
|
||||
//return true;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,97 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* To change this license header, choose License Headers in Project Properties.
|
||||
* To change this template file, choose Tools | Templates
|
||||
* and open the template in the editor.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Description of UserController
|
||||
*
|
||||
* @author andrey
|
||||
*/
|
||||
class UserController {
|
||||
//put your code here
|
||||
|
||||
//public static function actionIndex{
|
||||
|
||||
|
||||
// }
|
||||
|
||||
/* public function actionRegister(){
|
||||
|
||||
$name = '';
|
||||
$email = '';
|
||||
$password = '';
|
||||
$result = false;
|
||||
|
||||
if(isset($_POST['submit'])){
|
||||
|
||||
$name = $_POST['name'];
|
||||
$email = $_POST['email'];
|
||||
$password = $_POST['password'];
|
||||
|
||||
$errors = false;
|
||||
|
||||
if(!user::checkName($name)){
|
||||
$errors[] = 'Warning!!! It\'s name short 2 elements';
|
||||
}
|
||||
|
||||
if(!User::checkPassword($password)){
|
||||
$errors[] = 'Warning!!! It\'s password short 6 elements';
|
||||
}
|
||||
|
||||
if(!User::checkEmail($email)){
|
||||
$errors[] = 'Warning!!! It\'s e-mail dont valid';
|
||||
}
|
||||
|
||||
if(user::checkEmailExists($email)){
|
||||
$errors[] = 'Sorry, this is e-mail is using';
|
||||
}
|
||||
|
||||
if($errors == false){
|
||||
$result = (user::register($name, $password, $email));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
require_once (ROOT. TMPL. 'register.php');
|
||||
|
||||
return true;
|
||||
}*/
|
||||
|
||||
public function actionLogin(){
|
||||
if(!isset($_POST['submit'])) $_SESSION['link'] = $_SERVER['HTTP_REFERER'];
|
||||
$username = '';
|
||||
$password = '';
|
||||
|
||||
$errors = false;
|
||||
|
||||
if(isset($_POST['submit'])){
|
||||
$username = $_POST['login'];
|
||||
$password = $_POST['password'];
|
||||
|
||||
$errors = false;
|
||||
|
||||
$auth = Ldap::LdapAuth($username, $password);
|
||||
header("location: ".$_SESSION['link']."");
|
||||
}
|
||||
|
||||
require_once (ROOT . TMPL . 'login.php');
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
public function actionLogout(){
|
||||
|
||||
@session_start();
|
||||
unset($_SESSION['user_id']);
|
||||
unset($_SESSION['name']);
|
||||
header("Location: ".$_SERVER['HTTP_REFERER']."");
|
||||
session_destroy();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
<IfModule mod_php4.c>
|
||||
php_flag engine Off
|
||||
</IfModule>
|
||||
<IfModule mod_php5.c>
|
||||
php_flag engine Off
|
||||
</IfModule>
|
||||
<IfModule mod_php6.c>
|
||||
php_flag engine Off
|
||||
</IfModule>
|
||||
<IfModule mod_cgi.c>
|
||||
Options -ExecCGI
|
||||
</IfModule>
|
||||
|
||||
RemoveHandler .cgi .pl .py .pyc .pyo .phtml .php .php3 .php4 .php5 .php6 .pcgi .pcgi3 .pcgi4 .pcgi5 .pchi6 .inc
|
||||
RemoveType .cgi .pl .py .pyc .pyo .phtml .php .php3 .php4 .php5 .php6 .pcgi .pcgi3 .pcgi4 .pcgi5 .pchi6 .inc
|
||||
SetHandler None
|
||||
SetHandler default-handler
|
||||
|
||||
# Remove both lines below if you want to render HTML files from the upload folder
|
||||
AddType text/plain .html
|
||||
AddType text/plain .htm
|
||||
|
After Width: | Height: | Size: 2.8 KiB |
@@ -0,0 +1,575 @@
|
||||
"11973";"Àáäðÿøèòîâà, Ãóëèÿ";"50857";"Presell+Outsource";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11901";"Àáðàøêèíà, Òàòüÿíà";"50887";"Presell+Out+Outsource";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"11983";"Àáðîñèìîâà, Îëüãà";"50308";"Loans";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11922";"Àáðîñèìîâà, Òàòüÿíà";"50817";"Loans";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"25167";"Àãååâà, Àíàñòàñèÿ";"50017";"Activation";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11979";"Àêæèãèòîâà, Èëüâèðà";"50030";"Presell+Outsource";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11321";"Àêìàëîâà, Íàâáàõîð";"50417";"Loans+Presell+Outsource";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"10857";"Àëåêñåâíèíà, Àííà";"50138";"Expert Calls";"1013 CS Expert Platform";"1 Avaya CMS";
|
||||
"11808";"Àëåêñååâà, Àë¸íà";"50483";"Loans+Card";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11265";"Àëåêñååíêî, Àëåêñåé";"50223";"Loans+Presell+Outsource";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11742";"Àëìàìåòîâà, Àëüáèíà";"50213";"Loans+Presell+Outsource";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"10322";"Àëôåðîâà, Ëþäìèëà";"50252";"Loans+Presell+Outsource";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11281";"Àëÿáüåâà, Êèðà";"50387";"Loans+Card";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"10011";"Àëÿáüåâà, Íàòàëüÿ";"50191";"Loans+Card+Presell+Outsource";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11270";"Àë¸íêèíà, Åëåíà";"50051";"Loans+Card+Deposit+Clever";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"128";"Àíäðååâà, Þëèÿ";"50636";"Presell+Out+Outsource";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"11874";"Àíîñîâà, Þëèÿ";"50870";"Loans";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11787";"Àíîõèíà, Ëþáîâü";"50833";"Loans+Card";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11891";"Àíòîíåö, Àëèíà";"50570";"Loans+Activation";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11734";"Àíòîíîâà, Èðèíà";"50753";"Loans+Presell";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11238";"Àíòîíîâà, Íàòàëüÿ";"50185";"Loans+Presell+Outsource";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"10367";"Àíòîíîâà, Òàòüÿíà";"50289";"Expert Calls";"1013 CS Expert Platform";"1 Avaya CMS";
|
||||
"11438";"Àïàåâà, Äèàíà";"50500";"Loans+Presell+Outsource";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11730";"Àïîíàñåíêî, Åêàòåðèíà";"50295";"Loans+Card+Activation+Metlife";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"10922";"Àðõèïîâà, Àëåíà";"50668";"Expert Calls";"1013 CS Expert Platform";"1 Avaya CMS";
|
||||
"11610";"Àñëàìîâà, Íàòàëüÿ";"50739";"Loans+Card";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11040";"Àôàíàñüåâà, Îëüãà";"50591";"Reception";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11918";"Àôèøèíà, Ìàðèíà";"50863";"Presell+Out+Outsource";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"11348";"Áàáèíà, Åêàòåðèíà";"50441";"Loans+Card+Activation+Metlife";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"10968";"Áàáóðèíà, Êñåíèÿ";"50550";"Expert Calls";"1013 CS Expert Platform";"1 Avaya CMS";
|
||||
"10924";"Áàêóíèíà, Ñâåòëàíà";"50666";"Expert Calls";"1013 CS Expert Platform";"1 Avaya CMS";
|
||||
"11649";"Áàëäèíà, Èðèíà";"50413";"Loans+Card+Activation+Metl.+Cl.";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11027";"Áàðàíîâñêàÿ, Àííà";"50341";"Expert Written";"1013 CS Expert Platform";"1 Avaya CMS";
|
||||
"10892";"Áàðûøåâà, Àííà";"50421";"Loans+Card+Deposit+Clever";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"195";"Áàòêàåâà, Ðåãèíà";"50610";"Presell+Out+Outsource";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"10183";"Áàõëû÷¸âà, Åêàòåðèíà";"50182";"Loans+Card+Activation+Metl.+Cl.";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11433";"Áåãëàðÿí, Íðàíå";"50371";"Loans+Card+Activation+Metl.+Cl.";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11819";"Áåçãèíà, Ñâåòëàíà";"50321";"Loans+Card";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11708";"Áåçúÿçûêàÿ, Èðèíà";"50055";"Loans+Card";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11690";"Áåêåòîâà, ßíà";"50127";"Loans+Card+Activation+Clever";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11801";"Áåêÿí, Èííà";"50357";"Presell+Out";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"2091";"Áåëèê, Äàðüÿ";"50627";"Presell+Out+Outsource";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"11875";"Áåëûõ, Âàñèëèñà 0.5";"50571";"Loans";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11842";"Áåëÿåâà, Àíæåëèêà";"50838";"Loans+Activation";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11944";"Áåëÿêîâà, Åêàòåðèíà";"50782";"Loans";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11907";"Áåëÿíèíà, Íàòàëüÿ";"50892";"Presell+Out";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"11613";"Áåðèäçå, Èâàí";"50683";"Loans+Card";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11867";"Áèðþêîâà, Èðèíà";"50871";"Loans";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"10697";"Áîáðåøîâà, Ýëëà";"50053";"Loans+Presell+Outsource";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"10913";"Áîáðîâñêàÿ, Ìàðèíà";"50615";"Loans+Card+Presell+Outsource";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"122";"Áîãàòûðåâ, Âèòàëèé";"50544";"Presell+Out+Outsource";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"25225";"Áîãàòûðåâà, Åëåíà";"50354";"Loans+Card (Easy)";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11989";"Áîãà÷åâà, Îëüãà";"50194";"Loans";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11854";"Áîäóð, Àëèíà 0.5";"50635";"Loans+Card";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11658";"Áîëäûðåâà, Ìàðèÿ";"50755";"Loans+Card+Activation+Metlife";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11966";"Áîíäàðåâà, Ñâåòëàíà";"50432";"Presell+Outsource";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11773";"Áîðèñîâà, Åëåíà";"50079";"Loans+Card+Presell+Outsour.Easy";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11004";"Áîðèñîâà, Ìàðãàðèòà";"50715";"Expert Calls";"1013 CS Expert Platform";"";
|
||||
"10";"Áîðîíèíà, Îëüãà";"50584";"Loans";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"10114";"Áîñîëàåâà, Ñâåòëàíà";"50042";"Loans+Card+Deposit+Clever";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"25222";"Áîÿðêèíà, Ìàðèíà";"50367";"Loans+Card (Easy)";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11442";"Áðîäÿãèíà, Âèêòîðèÿ 0.75";"50429";"Presell+Out";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"25229";"Áóçåíêîâà, Ìàðèíà";"50362";"Loans+Card (Easy)";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11920";"Áóêðååâà, Åëåíà 0.75";"50804";"Loans";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"10057";"Áóêðååâà, Þëèÿ";"50109";"Loans+Card+Presell+Outsource";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11876";"Áóëãàêîâ, Âèòàëèé";"50869";"Loans+Card";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"10993";"Áóòóñîâ, Íèêîëàé";"50527";"Presell+Out+Outsource";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"8014";"Áûêîâà, Íàòàëüÿ";"54037";"Loans CA Help CC";"8001 CA Penza";"1 Avaya CMS";
|
||||
"11148";"Âàâèëîâà, Òàòüÿíà";"50199";"Loans+Card+Activation+Clever";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11294";"Âàëèóëèíà, Ìàðèÿ";"50397";"Expert Calls";"1013 CS Expert Platform";"1 Avaya CMS";
|
||||
"11393";"Âàëü÷óê, Âèêòîðèÿ";"50065";"Loans+Card+Presell+Outsource";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"10300";"Âàñèíà, Îëüãà";"50166";"Loans+Presell+Outsource";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"2108";"Âàñÿêèíà, Îëüãà";"50533";"Presell+Out+Outsource";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"11933";"Âàõðóøåâà, Àëåíà";"50279";"Presell+Outsource";"";"1 Avaya CMS";
|
||||
"10751";"Âåíþêîâà, Ñâåòëàíà";"50257";"Loans+Card+Presell+Outsource";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11955";"Âèíîãðàäîâà, Åëèçàâåòà";"50153";"Loans";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"14";"Âèðÿñîâà, Àíàñòàñèÿ";"50608";"Presell+Out+Outsource";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"11976";"Âèøíÿêîâà, Ëþáîâü";"50038";"Presell+Outsource";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"10252";"Âëàñîâà, Òàòüÿíà";"50003";"Loans+Card+Deposit+Activ.+Cl.";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"10075";"Âîëêîâà, Òàòüÿíà Exp.";"50130";"Expert Calls";"1013 CS Expert Platform";"1 Avaya CMS";
|
||||
"11910";"Âîëêîâà, Òàòüÿíà";"50549";"Presell+Out";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"11080";"Âîëîáóåâ, Àðñåíèé";"50270";"Expert Written";"1013 CS Expert Platform";"1 Avaya CMS";
|
||||
"10337";"Âîëîáóåâà, Àííà";"50091";"Loans+Card+Activation+Metl.+Cl.";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11288";"Âîëîâèêîâà, Âåðà";"50395";"Loans+Card+Activation+Metl.+Cl.";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"10241";"Âîëîøèíà, Êàðèíý";"50176";"Expert Calls";"1013 CS Expert Platform";"1 Avaya CMS";
|
||||
"11464";"Âîëüíèêîâà, Ìàðèíà";"50360";"Loans+Card+Activation+Metl.+Cl.";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11864";"Âîðîíîâà, Àëåíà";"50864";"Loans+Card";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"25228";"Âûäðèí, Âëàäèñëàâ";"50391";"Loans+Card (Easy)";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11930";"Âûõðèñòþê, Ìàðèÿ";"50747";"Presell+Outsource";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"10994";"Ãàáåäàâà, Ìàéÿ";"50556";"Loans+Card+Activation+Metlife";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"10316";"Ãàëóøêà, Îëåñÿ";"50243";"Loans+Card+Activation+Metl.+Cl.";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"25212";"Ãàëóøêèíà, Ñâåòëàíà";"50425";"Loans";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11219";"Ãàíèíà, Òàòüÿíà";"50312";"Loans+Card+Activation+Metl.+Cl.";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"10049";"Ãåéêî, Òàòüÿíà";"50867";"Loans+Card+Deposit+Clever";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11400";"Ãåðàñåâà, Åêàòåðèíà";"50073";"Loans+Card+Presell (Easy)";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"25199";"Ãëàçêîâà, Ìàðèÿ";"50349";"Loans";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"10325";"Ãëåáîâà, Àëåíà";"50256";"Loans+Card+Activation+Metlife";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"10973";"Ãëåáîâñêîâ, Àíäðåé";"50602";"Loans+Presell+Outsource";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11857";"Ãëóõîâà, Âèêòîðèÿ";"50849";"Loans+Card";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11082";"Ãëóùåíêî, Äìèòðèé";"50035";"Expert Calls";"1013 CS Expert Platform";"1 Avaya CMS";
|
||||
"10215";"Ãîëîâà, Ïîëèíà";"50152";"Expert Calls";"1013 CS Expert Platform";"1 Avaya CMS";
|
||||
"11399";"Ãîëîâàíîâà, Ôåðóçà";"50224";"Expert Calls";"1013 CS Expert Platform";"1 Avaya CMS";
|
||||
"18";"Ãîëîâèíà, Òàòüÿíà";"50537";"Presell+Out+Outsource";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"11347";"Ãîëîëîáîâà, Þëèÿ";"50439";"Loans+Presell+Outsource";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11844";"Ãîëîïÿòîâà, Èðèíà";"50805";"Loans+Activation";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11418";"Ãðàíêèíà, Îëüãà";"50254";"Loans+Card+Presell+Outsource";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"10297";"Ãðèäèíà, Íàòàëèÿ";"50209";"Loans+Card+Activation+Metl.+Cl.";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11605";"Ãðîìîâ, Íèêîëàé 0.75";"50642";"Loans";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"10699";"Ãðóäèíêèí, Äìèòðèé";"50498";"Expert Written";"1013 CS Expert Platform";"1 Avaya CMS";
|
||||
"10261";"Ãðóäêèíà, Òàòüÿíà";"50234";"Loans+Presell+Outsource";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11623";"Ãðóøèíà, Êàðèíà";"50119";"Presell+Out";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"11481";"Ãðûçóíêîâà, Ñâåòëàíà";"50649";"Expert Calls";"1013 CS Expert Platform";"1 Avaya CMS";
|
||||
"10978";"Ãóäàíîâà, Ðèììà";"50286";"Loans+Card+Deposit+Clever";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"10303";"Ãóëåâñêàÿ, Âèêòîðèÿ";"50136";"Expert Public";"1013 CS Expert Platform";"1 Avaya CMS";
|
||||
"11932";"Ãóíäîðîâà, Èðèíà";"50446";"Presell+Outsource";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"164";"Ãóñàðîâà, Åëåíà";"50542";"Presell+Out+Outsource";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"11429";"Ãóñüêîâà, Íàòàëüÿ";"50244";"Presell+Out";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"20";"Äàö, Èðèíà";"50613";"Presell+Out+Outsource";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"10347";"Äàøêèíà, Àëñó";"50272";"Expert Calls";"1013 CS Expert Platform";"1 Avaya CMS";
|
||||
"11940";"Äåáåðäååâà, Âàñèëÿ";"50227";"Presell+Outsource";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"20256";"Äåáåðäååâà, Ãóçåëü";"50573";"Presell+Out+Outsource";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"11688";"Äåâÿòêèíà, Íàòàëüÿ";"50779";"Loans+Card+Clever";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11670";"Äåì÷åíêî, Êðèñòèíà";"50764";"Loans+Presell+Outsource";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"10988";"Äåíèñîâà, Èíãà";"50488";"Presell+Out";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"23";"Äåíèñîâà, Ìàðèÿ";"50545";"Presell+Out";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"11816";"Äæîðàåâà, Ìàðèíà";"50302";"Presell+Out";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"10014";"Äèâàâèíà, Àíæåëà";"50010";"Loans+Card+Deposit+Activ.+Cl.";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11614";"Äìèòðåíêî, Åëåíà";"50671";"Loans+Card+Activation+Metlife";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11330";"Äìèòðèåâà, Þëèÿ";"50430";"Expert Calls";"1013 CS Expert Platform";"1 Avaya CMS";
|
||||
"10692";"Äîáðûíèíà, Äàðüÿ";"50048";"Loans+Card+Deposit+Activ.+Cl.";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11958";"Äîêàøåíêî, Íàòàëüÿ";"50365";"Loans";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11783";"Äîëãàíîâà, Äàðüÿ";"50823";"Loans+Card+Presell+Outsour.Easy";"1012 CS Penza Platform";"";
|
||||
"11413";"Äîëãàøîâà, Îëüãà";"50496";"Presell+Out";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"11701";"Äîëæåíêî, Åêàòåðèíà";"50788";"Loans+Presell+Outsource";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11807";"Äîëæåíêîâà, Íàòàëüÿ";"50465";"Loans+Card";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11631";"Äîðîôååâ, Âëàäèìèð";"50008";"Expert Calls";"1013 CS Expert Platform";"1 Avaya CMS";
|
||||
"10053";"Äðîáûøåâà, Åâãåíèÿ";"50067";"Loans+Presell+Outsource";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"25227";"Äðóæèíèí, Äìèòðèé";"50386";"Loans+Card (Easy)";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11676";"Äðóæèíèíà, Ìàðèÿ";"50767";"Loans";"1012 CS Penza Platform";"";
|
||||
"25181";"Äðóæèíèíà, Ñâåòëàíà";"50251";"Presell";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11405";"Äóáèíà, Èëüìèðà";"50331";"Presell+Out";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"11401";"Äóâàëêèíà, Îëüãà";"50122";"Loans+Presell+Outsource";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"10223";"Äóäàíîâà, Ñâåòëàíà";"50049";"Loans+Card+Deposit+Activ.+Cl.";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11525";"Äóäíèêîâà, Ñâåòëàíà";"50020";"Loans+Card+Presell+Outsource";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"26";"Äóí÷åâà, Îêñàíà";"50625";"Presell+Out+Outsource";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"11988";"Äóðíåâà, Íàòàëüÿ";"50114";"Loans";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11709";"Äûìóðà, Àííà";"50478";"Loans+Card+Activation+Metlife";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"2041";"Äÿòëîâà, Îëüãà";"50009";"Presell+Out+Outsource";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"11902";"Åãîðîâ, Ñòàíèñëàâ";"50738";"Presell+Out+Outsource";"1015 CS Cross Out";"";
|
||||
"27";"Åãîðîâà, Ìàðãàðèòà";"50581";"Presell+Out+Outsource";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"10025";"Åëàãèíà, Êðèñòèíà";"50029";"Expert Written";"1013 CS Expert Platform";"1 Avaya CMS";
|
||||
"11878";"Åëüíèêîâà, Êðèñòèíà";"50879";"Loans+Card";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"68";"Åíèêååâà, Àíòîíèíà";"50621";"Presell+Out+Outsource";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"11993";"Åíèêååâà, Þëèÿ";"50477";"Presell+Outsource";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"29";"Åðåìèíà, Þëèÿ";"50543";"Presell+Out+Outsource";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"11941";"Åðìîøèí, Ìèõàèë";"50359";"Loans";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"10026";"Åôàíîâà, Êñåíèÿ";"50898";"Expert Public";"1013 CS Expert Platform";"1 Avaya CMS";
|
||||
"30";"Åôðåìîâà, Èííà";"50603";"Presell+Out+Outsource";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"11176";"Åùèíà, Ýëèíà";"50041";"Loans+Card+Activation+Metl.+Cl.";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11444";"Æàðêîâà, Ýëüâèðà";"50477";"Presell+Outsource";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"10820";"Æàòêèíà, Íàäåæäà";"50617";"Expert Calls";"1013 CS Expert Platform";"1 Avaya CMS";
|
||||
"10017";"Æåëåçíÿêîâà, Âàðâàðà";"50189";"Expert Written";"1013 CS Expert Platform";"1 Avaya CMS";
|
||||
"11782";"Æåëóäêîâà, Àíàñòàñèÿ";"50487";"Loans+Card+Presell+Outsour.Easy";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11950";"Æèãà÷åâ, Àíòîí";"50021";"Loans";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11889";"Æèäêîâà, Îêñàíà";"50389";"Loans+Activation";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11753";"Æèíêî, Åëåíà";"50812";"Loans+Card+Presell+Outsour.Easy";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11840";"Æèðîâà, Àííà";"50131";"Loans";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11663";"Æìàêèíà, Ñîôüÿ";"50763";"Loans+Card+Activation+Metlife";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11616";"Æóêîâà, Àíàñòàñèÿ";"50454";"Loans+Card+Activation+Metlife";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"32";"Æóêîâà, Îëüãà";"50623";"Presell+Out+Outsource";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"11625";"Æóëèíà, Íàòàëüÿ";"50052";"Presell+Out";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"11866";"Æóðàâëåâà, Êðèñòèíà";"50862";"Loans+Card";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11407";"Çàáêîâà, Äàðüÿ";"50085";"Presell+Out";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"11776";"Çàâîä÷èêîâà, Àíàñòàñèÿ";"50348";"Loans+Card+Presell+Outsour.Easy";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11722";"Çàâîëîêà, Äàðüÿ";"50792";"Loans+Card+Presell+Outsour.Easy";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11904";"Çàãðåáèíà, Àëåêñàíäðà";"50748";"Presell+Out";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"11936";"Çàéöåâà, Ëèäèÿ";"50785";"Presell+Outsource";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"10877";"Çàéöåâà, Îëüãà";"50237";"Expert Calls";"1013 CS Expert Platform";"1 Avaya CMS";
|
||||
"2053";"Çàëÿëóòäèíîâà, Ìàðãàðèòà";"50096";"Loans";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"10894";"Çàõàðîâà, Òàòüÿíà";"50654";"Loans+Presell+Outsource";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11828";"Çâÿãèíà, Îëüãà";"50340";"Loans+Card";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11899";"Çâÿãèíöåâà, Àíàñòàñèÿ";"50381";"Loans+Card";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11345";"Çäåñåâ, Àëåêñàíäð";"50436";"Loans+Card+Activation+Metl.+Cl.";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11355";"Çèíîâüåâà, Ìàðèíà";"50247";"Loans+Card+Activation+Metl.+Cl.";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"10878";"Çëîáèíà, Èðèíà";"50356";"Loans+Presell+Outsource";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11013";"Çîëîòóõèíà, Èðèíà";"50710";"Expert Written";"1013 CS Expert Platform";"1 Avaya CMS";
|
||||
"11923";"Çóáêîâà, Àíàñòàñèÿ 0.5";"50241";"Loans";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11364";"Çóåâà, Àëèíà";"50464";"Loans+Card+Presell+Outsource";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11772";"Çÿáëèêîâ, Äìèòðèé";"50319";"Loans+Card+Presell (Easy)";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11952";"Çÿáëèöåâà, Ìàðèÿ";"50416";"Loans";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"10029";"Èâàíîâà, Àíàñòàñèÿ 0.5";"50378";"Loans";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11916";"Èâàíîâà, Íàäåæäà";"50890";"Presell+Out";"1015 CS Cross Out";"";
|
||||
"11954";"Èâàí÷èõèíà, Àíàñòàñèÿ";"50339";"Loans";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11823";"Èçîòîâà, Àëåêñàíäðà";"50780";"Loans+Card";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"10919";"Èçîòîâà, Òàòüÿíà";"50672";"Loans+Card+Deposit+Clever";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"2044";"Èçþìèí, Íèêîëàé";"50555";"Presell+Out";"1015 CS Cross Out";"";
|
||||
"11596";"Èçþìèíà, Êñåíèÿ";"50512";"Expert Calls";"1013 CS Expert Platform";"1 Avaya CMS";
|
||||
"11555";"Èëüåíêî, Àíàñòàñèÿ";"50698";"Loans+Card+Presell+Outsource";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11617";"Èñàåâà, Þëèÿ";"50643";"Loans+Card";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11762";"Êàáàíîâà, Êðèñòèíà";"50712";"Loans+Card+Presell+Outsour.Easy";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11648";"Êàáîñêèíà, Ãàëèíà";"50390";"Loans+Card";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11759";"Êàäêèíà, Íàäåæäà";"50802";"Loans+Card+Presell+Outsour.Easy";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11978";"Êàëèíèíà, Þëèÿ";"50326";"Presell+Outsource";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11880";"Êàëèíè÷åíêî, Âëàäèñëàâ";"50868";"Loans";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11725";"Êàëèòóðèíà, Åëåíà";"50490";"Loans+Card+Presell+Outsour.Easy";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11956";"Êàëìûêîâà, Åâãåíèÿ";"50410";"Loans";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"25165";"Êàëóãèíà, Îëüãà";"50162";"Activation";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11635";"Êàëü÷åíêî, Åêàòåðèíà";"50742";"Expert Calls";"1013 CS Expert Platform";"1 Avaya CMS";
|
||||
"179";"Êàëÿêèíà, Âàëåðèÿ";"50565";"Loans";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11590";"Êàìåíåâà, Êñåíèÿ";"50076";"Loans+Card+Activation+Metlife";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"38";"Êàïóñòèíà, Ñâåòëàíà";"50592";"Presell+Out+Outsource";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"11313";"Êàðà÷åâöåâà, Àëåêñàíäðà";"50174";"Loans+Card+Activation+Metl.+Cl.";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11850";"Êàñüÿíîâà, Åâãåíèÿ";"50850";"Loans+Card";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"20630";"Êà÷íîâà, Îëüãà";"50601";"Presell+Out+Outsource";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"25226";"Êà÷óðèíà, Ñâåòëàíà";"50383";"Loans+Card (Easy)";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11656";"Êàùååâà, Ìàðèíà";"50681";"Loans+Card+Activation+Metl.+Cl.";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"10982";"Êåðæåíîâà, Ãàëèÿ";"50756";"Loans+Card+Activation+Clever";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"10189";"Êèïóðîâà, Èðèíà";"50201";"Expert Calls";"1013 CS Expert Platform";"1 Avaya CMS";
|
||||
"10100";"Êèðååâà, Åêàòåðèíà";"50039";"Expert Calls";"1013 CS Expert Platform";"1 Avaya CMS";
|
||||
"11626";"Êèñåëåâà, Âåðîíèêà";"50447";"Presell+Out";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"11490";"Êèñåëåâà, Íàòàëèÿ";"50140";"Loans+Card+Activation+Metl.+Cl.";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11892";"Êèñåëåâà, Þëèÿ";"50467";"Loans+Activation";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11799";"Êèñòèíà, Åëèçàâåòà";"50342";"Presell+Out";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"11049";"Êëèìîâà, Èðèíà";"50123";"Presell+Out+Outsource";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"8028";"Êëþ÷íèêîâà, Òàòüÿíà";"54050";"Loans CA Help CC";"8001 CA Penza";"1 Avaya CMS";
|
||||
"11445";"Êëþøèíà, Ìàðèíà 0.75";"50379";"Presell+Out";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"10781";"Êíÿçåâ, Äìèòðèé";"50472";"Expert Calls";"1013 CS Expert Platform";"1 Avaya CMS";
|
||||
"11505";"Êîáû÷åâà, Åëåíà";"50656";"Loans+Card+Activation+Metl.+Cl.";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11789";"Êîâòóí, Îêñàíà 0.75";"50831";"Loans+Card+Activation+Metlife";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11912";"Êîâøîâà, Åêàòåðèíà";"50679";"Presell+Out";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"11491";"Êîãóò, Íàòàëüÿ";"50143";"Loans+Card+Activation+Metl.+Cl.";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"2140";"Êîäîðêèíà, Þëèÿ";"50648";"Presell+Out+Outsource";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"11604";"Êîäîðîâà, Âèêòîðèÿ 0.5";"50735";"Loans";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11746";"Êîæèí, Àíäðåé";"50664";"Loans+Card+Activation+Metlife";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11034";"Êîçëîâ, Àëåêñàíäð";"50154";"Expert Written";"1013 CS Expert Platform";"1 Avaya CMS";
|
||||
"11217";"Êîçëîâ, Ñåðãåé";"50299";"Loans+Card";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"2055";"Êîçëîâà, Àëåñÿ";"50547";"Loans";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"10971";"Êîçëîâöåâà, Åëåíà";"50538";"Loans+Presell+Outsource";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11446";"Êîçíîâà, Ëþáîâü";"";"";"1012 CS Penza Platform";"";
|
||||
"11898";"Êîçüìåíêî, Âàëåðèÿ 0.5";"50327";"Loans";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"44";"Êîêîðåâà, Þëèÿ";"50588";"Presell+Out+Outsource";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"11577";"Êîëåñíèêîâà, Åëåíà";"50734";"Expert Calls";"1013 CS Expert Platform";"1 Avaya CMS";
|
||||
"11547";"Êîëåñíèêîâà, Êñåíèÿ";"50523";"Loans+Card+Activation+Metl.+Cl.";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"2006";"Êîëîòèëîâà, Ìàðèÿ";"50535";"Presell+Out+Outsource";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"11609";"Êîìàðèöêèõ, Òàòüÿíà";"50737";"Expert Calls";"1013 CS Expert Platform";"1 Avaya CMS";
|
||||
"11964";"Êîíäðàòüåâà, Ñâåòëàíà";"50514";"Presell+Outsource";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11846";"Êîííîâà, Êðèñòèíà 0.5";"50661";"Loans";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11414";"Êîíîâàëîâà, Íàòàëèÿ";"50236";"Loans+Card+Activation+Metl.+Cl.";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"46";"Êîíîâàëîâà, Ýëüçèðà";"50536";"Presell+Out+Outsource";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"11924";"Êîíüêîâà, Òàòüÿíà";"50276";"Loans+Card";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11990";"Êîðæåíåâñêàÿ, Ìàðèÿ";"50139";"Loans";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11685";"Êîðíàóõîâà, Íàäåæäà";"50774";"Loans+Card";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"25162";"Êîðíåâ, Àëåêñåé";"50229";"Presell";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11939";"Êîðíåé÷óê, Àëåêñåé";"50240";"Presell+Outsource";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11081";"Êîðîëåâà, Þëèÿ";"50207";"Expert Calls";"1013 CS Expert Platform";"1 Avaya CMS";
|
||||
"11619";"Êîðîñòåëåâà, Îêñàíà";"50693";"Loans+Card+Activation+Metlife";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11314";"Êîðîòååâà, Þëèÿ";"50214";"Loans+Card+Activation+Metl.+Cl.";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"10033";"Êîð÷àãèíà, Êðèñòèíà";"50278";"Loans";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11126";"Êîñèíîâà, Èðèíà";"50026";"Reception";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"10995";"Êîñòèíà, Àëåâòèíà";"50557";"Expert Calls";"1013 CS Expert Platform";"1 Avaya CMS";
|
||||
"11913";"Êîñòèíà, Ñâåòëàíà";"50882";"Presell+Out+Outsource";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"11447";"Êîñûðåâà, Íàäåæäà";"50499";"Loans+Card+Presell+Outsour.Easy";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11362";"Êîòåíêî, Èííà";"50455";"Loans+Card+Presell+Outsource";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"10070";"Êðàéíîâà, Îëüãà";"50077";"Loans+Card+Deposit+Clever";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11906";"Êðàìèí, Êîíñòàíòèí";"50883";"Presell+Out";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"25178";"Êðàñíèêîâà, Àíàñòàñèÿ";"50232";"Activation";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11879";"Êðàñíèêîâà, Åëåíà";"50459";"Loans+Card";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11162";"Êðåòóøåâà, Àííà";"50197";"Loans+Card+Activation+Metl.+Cl.";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11298";"Êðèâîøåèíà, Åëåíà";"50407";"Loans+Card+Activation+Metl.+Cl.";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"25065";"Êóâàéöåâà, Èðèíà";"50539";"Presell+Out+Outsource";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"10885";"Êóäèíîâà, Þëèÿ";"50576";"Loans+Presell+Outsource";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11607";"Êóäðÿøîâ, Ìàêñèì 0.5";"50680";"Loans";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11957";"Êóçèíà, Èðèíà";"50440";"Loans";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"244";"Êóçíåöîâ, Àëåêñàíäð";"50106";"Presell+Out+Outsource";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"10357";"Êóçíåöîâà, Àííà";"50281";"Loans+Presell+Outsource";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"49";"Êóçíåöîâà, Ãàëèíà";"50566";"Presell+Out+Outsource";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"11540";"Êóçíåöîâà, Åëåíà";"50685";"Loans+Card+Clever";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"10983";"Êóçíåöîâà, Æàííà";"50701";"Loans+Presell+Outsource";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11371";"Êóçíåöîâà, Ëþáîâü";"50363";"Presell+Out+Outsource";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"11017";"Êóçíåöîâà, Îëüãà";"50720";"Expert Written";"1013 CS Expert Platform";"1 Avaya CMS";
|
||||
"11747";"Êóçíåöîâà, ßíà 0.9";"50796";"Loans+Presell+Outsource";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"10292";"Êóçüìèíà, Åêàòåðèíà";"50186";"Loans+Presell+Outsource";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"25148";"Êóçüìè÷åâà, Íàòàëüÿ";"50815";"Presell+Out";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"10608";"Êóëèêîâà, Åêàòåðèíà";"50444";"Expert Calls";"1013 CS Expert Platform";"1 Avaya CMS";
|
||||
"25166";"Êóðêîâà, Ãàëèíà";"50148";"Activation";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"10445";"Êóðÿåâà, Ãóçåëü";"50382";"Loans+Presell+Outsource";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11818";"Ëàïåíêîâà, Ëþäìèëà";"50696";"Loans+Card";"1011 CS Kursk Platform";"";
|
||||
"11271";"Ëàñòóðèíà, Åêàòåðèíà 0.75";"50101";"Loans+Presell+Outsource";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11986";"Ëåáåäåâà, Àíãåëèíà";"50203";"Loans";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11822";"Ëåîíîâà, Þëèÿ";"50765";"Loans+Card";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"10779";"Ëåïèíà, Îëüãà";"50206";"Loans+Presell+Outsource";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"10018";"Ëèòâèíîâà, Ìàðèíà";"50121";"Loans";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"10027";"Ëèòâèíîâà, Íàòàëèÿ";"50309";"Loans+Card";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11244";"Ëîçîâñêàÿ, Òàòüÿíà";"50061";"Expert Calls";"1013 CS Expert Platform";"1 Avaya CMS";
|
||||
"11960";"Ëîìàíîâè÷, Îëüãà";"50163";"Presell+Outsource";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"54";"Ëîìà÷åâà, Àëåíà";"50604";"Presell+Out+Outsource";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"11718";"Ëóáèíåö, Ýëüâèðà";"50217";"Loans+Card";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"2033";"Ëóêüÿíîâà, Íàòàëüÿ";"50525";"Presell+Out+Outsource";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"2048";"Ëóêüÿíîâà, Îëüãà";"50634";"Presell+Out+Outsource";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"11127";"Ëóíåâà, Êñåíèÿ";"50033";"Loans+Card+Presell+Outsource";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"2045";"Ëóòêîâà, Íàòàëüÿ";"50013";"Loans";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11761";"Ëþáàâèíà, Îëüãà";"50358";"Loans+Card+Presell+Outsour.Easy";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11628";"Ëÿãèíà, Ìàðèÿ";"50088";"Presell+Out";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"11863";"Ìàçèíà, Íàòàëüÿ";"50861";"Loans+Card";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"8043";"Ìàçûêèíà, Àëåíà";"54064";"Loans CA Help CC";"8001 CA Penza";"1 Avaya CMS";
|
||||
"11909";"Ìàêàéäà, Äàðüÿ";"50777";"Presell+Out+Outsource";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"11689";"Ìàêàðîâà, Ëþäìèëà";"50486";"Expert Calls";"1013 CS Expert Platform";"1 Avaya CMS";
|
||||
"25152";"Ìàëàøåâè÷, Îêñàíà";"50196";"Presell";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"57";"Ìàëèíèíà, Êðèñòèíà";"50574";"Presell+Out+Outsource";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"25232";"Ìàëêîâà, Äàðüÿ";"50370";"Loans+Card (Easy)";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"10305";"Ìàëüêîâà, Åëåíà";"50031";"Loans+Presell+Outsource";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11404";"Ìàëü÷èêîâà, Îëüãà";"50159";"Expert Written";"1013 CS Expert Platform";"1 Avaya CMS";
|
||||
"59";"Ìàðêîâà, Þëèÿ";"50593";"Presell+Out+Outsource";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"2037";"Ìàðòûíîâà, Èííà";"50025";"Presell+Out+Outsource";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"176";"Ìàñëîâà, Ãàëèíà";"50630";"Presell+Out+Outsource";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"11791";"Ìàñòÿíèíà, Îëüãà";"50485";"Loans+Card+Activation+Clever";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"10343";"Ìàòåóø, Ìàðãàðèòà";"50268";"Loans+Presell+Outsource";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11853";"Ìàòêóðáàíîâà, Çîÿ";"50855";"Loans+Card";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11068";"Ìàòîðèíà, Åëåíà";"50142";"Loans+Card+Presell+Outsource";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11078";"Ìàòðîñîâà, Ìàðèÿ";"50195";"Expert Calls";"1013 CS Expert Platform";"1 Avaya CMS";
|
||||
"2035";"Ìà÷àëîâà, Ëþáîâü";"50628";"Presell+Out+Outsource";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"25169";"Ìàøêèí, Ìàêñèì";"50248";"Activation";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"10193";"Ìàþðîâà, Åêàòåðèíà";"50205";"Loans+Presell+Outsource";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11974";"Ìàþðîâà, Êðèñòèíà";"50027";"Presell+Outsource";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"25186";"Ìåäâåäåâà, Äàðüÿ";"50293";"Presell";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"42";"Ìåäâåäåâà, Åêàòåðèíà";"50521";"Presell+Out";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"11949";"Ìåçåíöåâà, Þëèÿ";"50806";"Loans";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11726";"Ìåëüíèêîâà, Åëåíà";"50730";"Loans+Card+Presell+Outsour.Easy";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"10705";"Ìåíüøîâà, Ëþäìèëà";"50516";"Expert Calls";"1013 CS Expert Platform";"1 Avaya CMS";
|
||||
"11729";"Ìåðçëÿêîâ, Àëåêñàíäð";"50629";"Loans+Card+Activation+Metlife";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11745";"Ìåðêóëîâà, Äèàíà";"50726";"Loans+Card";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11926";"Ìåùåðÿêîâà, Åëåíà";"50893";"Presell+Outsource";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11790";"Ìåùåðÿêîâà, Íàòàëüÿ";"50834";"Loans+Card";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11012";"Ìèëîñòíàÿ, Èðèíà";"50709";"Expert Written";"1013 CS Expert Platform";"1 Avaya CMS";
|
||||
"61";"Ìèëÿéêèíà, Åêàòåðèíà";"50579";"Presell+Out+Outsource";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"11652";"Ìèíàñÿí, Êðèñòèíà";"50517";"Loans+Card+Clever";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"152";"Ìèíååâà, Îëüãà";"50564";"Presell+Out+Outsource";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"11826";"Ìèðîíîâ, Èãîðü 0.5";"50423";"Loans+Card";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11291";"Ìèðîíîâà, Îëüãà";"50393";"Loans+Presell";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"10006";"Ìèõàéëîâà, Íàòàëüÿ";"50754";"Expert Written";"1013 CS Expert Platform";"1 Avaya CMS";
|
||||
"10032";"Ìèõàéëîâà, Îëåñÿ";"50037";"Loans+Card";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"25188";"Ìèøèíà, Îëüãà";"50322";"Loans+Card (Easy)";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11128";"Ìîâñóìîâà, Âèêòîðèÿ";"50068";"Loans+Card+Deposit+Clever";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11496";"Ìîèñååâà, Þëèÿ";"50366";"Loans+Card+Deposit+Clever";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11502";"Ìîêøàíîâ, Èëüÿ";"50374";"Loans+Card";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11862";"Ìîðîçîâà, Åêàòåðèíà";"50427";"Loans+Card";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11764";"Ìîðîçîâà, Èðèíà";"50700";"Loans+Card+Presell+Outsour.Easy";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11512";"Ìîðîçîâà, Þëèÿ";"50510";"Loans+Card+Clever";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11678";"Ìóõàìåòäæàíîâà, Òàòüÿíà";"50647";"Loans+Card+Clever";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11965";"Ìÿñíèêîâà, Êñåíèÿ";"50814";"Presell+Outsource";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11385";"Íàçàðîâà, Âèêòîðèÿ";"50258";"Loans+Card+Activation+Clever";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11784";"Íàìàêîíîâà, Ìàðèÿ";"50827";"Loans+Card+Presell (Easy)";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11308";"Íàñîíîâà, Åëåíà";"50411";"Loans+Presell+Outsource";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11039";"Íàóìêèíà, Òàòüÿíà";"50294";"Expert Calls";"1013 CS Expert Platform";"1 Avaya CMS";
|
||||
"11971";"Íåâëþòîâà, Èëüìèðà";"50046";"Presell+Outsource";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"25231";"Íåñÿåâà, Àííà";"50392";"Loans+Card (Easy)";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"2142";"Íèêèòèí, Àíòîí";"50600";"Loans+Presell+Outsource";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11591";"Íèêèôîðîâà, Îêñàíà";"50094";"Expert Calls";"1013 CS Expert Platform";"1 Avaya CMS";
|
||||
"25185";"Íèêîëàåâà, Åâãåíèÿ";"50125";"Presell";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11280";"Íèêîëàåâà, Ñâåòëàíà";"50385";"Loans+Presell+Outsource";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11970";"Íèêóëèíà, Þëèÿ";"50851";"Loans";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11315";"Íîñîâà, Çîÿ";"50415";"Expert Calls";"1013 CS Expert Platform";"1 Avaya CMS";
|
||||
"11682";"Íîñîâà, Íàòàëüÿ";"50776";"Loans+Card+Activation+Metlife";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"10970";"Íîõðèíà, Þëèÿ";"50519";"Loans+Presell+Outsource";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11881";"Îáîæàåâà, Ìàðèÿ";"50865";"Loans";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"10675";"Îâñÿííèêîâà, Åêàòåðèíà";"50481";"Expert Public";"1013 CS Expert Platform";"1 Avaya CMS";
|
||||
"11184";"Îëåéíèê, Èðèíà";"50178";"Loans+Presell+Outsource";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11406";"Îðåøêèíà, Åêàòåðèíà";"50494";"Presell+Out";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"73";"Îñèíà, Òàòüÿíà";"50546";"Presell+Out+Outsource";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"11474";"Ïàðàìîíîâà, Ìàðèÿ";"50598";"Loans";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"2147";"Ïàòêèí, Äàíèëà";"50158";"Presell+Out+Outsource";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"11201";"Ïàùåíêî, Àíäðåé";"50280";"Expert Calls";"1013 CS Expert Platform";"1 Avaya CMS";
|
||||
"11116";"Ïàùåíêî, Åâãåíèé";"50301";"Expert Calls";"1013 CS Expert Platform";"1 Avaya CMS";
|
||||
"11972";"Ïåðåêîñîâà, Åêàòåðèíà";"50854";"Presell+Outsource";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11293";"Ïåòåëèí, Êîíñòàíòèí";"50401";"Loans+Card+Activation+Metl.+Cl.";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"10760";"Ïåòðîâà, Èðèíà";"50561";"Loans+Presell+Outsource";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11684";"Ïåøêîâ, Èëüÿ";"50736";"Loans+Card";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"20623";"Ïèâêèíà, Åëåíà";"50614";"Presell+Out";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"2004";"Ïèãëîâà, Þëèÿ";"50554";"Presell+Out+Outsource";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"25200";"Ïèëèïåö, ßíà";"50338";"Loans";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"20608";"Ïîäúÿ÷åâà, ßíà 0.75";"50522";"Presell+Out+Outsource";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"25220";"Ïîäûáàéëî, Äàðüÿ";"50456";"Loans";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"25214";"Ïîæèäàåâà, Ñâåòëàíà";"50451";"Loans";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11882";"Ïîçäíÿêîâ, Äìèòðèé";"50877";"Loans";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11398";"Ïîçäíÿ÷êèíà, Ìàðèíà";"50002";"Expert Calls";"1013 CS Expert Platform";"1 Avaya CMS";
|
||||
"10028";"Ïîëåæàåâà, Êðèñòèíà";"50198";"Loans";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"25171";"Ïîëèâàíîâà, Åëåíà";"50269";"Activation";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11813";"Ïîëèîíîâà, Àëåíà";"50719";"Presell+Out";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"25172";"Ïîëóõèíà, Äèàíà";"50245";"Activation";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"174";"Ïîëÿêîâà, Êðèñòèíà";"50548";"Presell+Out+Outsource";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"11283";"Ïîëÿêîâà, Ñâåòëàíà";"50620";"Expert Public";"1013 CS Expert Platform";"1 Avaya CMS";
|
||||
"25216";"Ïîëÿêîâà, ßíà";"50424";"Loans";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"25221";"Ïîïåíêî, Åâãåíèÿ";"50722";"Loans";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11639";"Ïîïîâà, Ìàðèíà 0.75";"50260";"Loans+Card+Clever";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11943";"Ïîïîâà, Ìàðèÿ";"50722";"Loans";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11968";"Ïîïîâà, Òàòüÿíà";"50515";"Loans";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11070";"Ïîïîâà, Þëèÿ";"50155";"Loans+Card+Presell+Outsource";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"10034";"Ïîïóãàåâà, Îëüãà";"50768";"Loans+Card+Presell+Outsource";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11359";"Ïîðøíåâà, Íàòàëüÿ";"50250";"Loans+Card+Presell+Outsource";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11934";"Ïðåñíÿêîâà, Êðèñòèíà 0.75";"50056";"Presell+Outsource";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11424";"Ïðèãîäà, Íàäåæäà";"50263";"Loans+Presell";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"25198";"Ïðèëåïêî, Ìàðèíà";"50343";"Loans";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11323";"Ïðèñÿæíàÿ, Àíàñòàñèÿ";"50419";"Loans+Presell+Outsource";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"80";"Ïðîíèíà, Èðèíà";"50637";"Presell+Out+Outsource";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"11817";"Ïðîíèíà, Ìàðèÿ";"50528";"Loans+Card";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"10021";"Ïðîíèíà, Íèíà";"50445";"Loans";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"10702";"Ïðîíñêàÿ, Þëèÿ";"50502";"Loans+Card+Deposit+Activ.+Cl.";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11975";"Ïðîíüêèíà, Ëþäìèëà";"50511";"Presell+Outsource";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"163";"Ïóñòîâàëîâà, Àëåíà";"50640";"Presell+Out+Outsource";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"81";"Ïóñòûãèíà, Ñâåòëàíà";"50618";"Presell+Out+Outsource";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"25223";"Ïó÷êèíà, Åêàòåðèíà";"";"";"1012 CS Penza Platform";"";
|
||||
"25187";"Ðàåâñêàÿ, Ëèëèÿ";"50320";"Loans+Card (Easy)";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11071";"Ðàçèíüêîâà, Îëüãà";"50164";"Loans+Card+Deposit+Clever";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"25147";"Ðåâèíà, Àííà";"50769";"Presell+Out";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"11420";"Ðîãà÷êîâà, Âåðà";"50120";"Presell+Out";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"11977";"Ðîæêîâ, Åâãåíèé";"50860";"Presell+Outsource";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11468";"Ðîìàêèíà, Òàòüÿíà";"50388";"Loans+Card";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"25215";"Ðòèùåâà, Âèêòîðèÿ";"50437";"Loans";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"25230";"Ðóñõàíîâà, Àëèÿ";"50373";"Loans+Card (Easy)";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11317";"Ðÿáöåâà, Íèíà 0.5";"50422";"Loans+Card+Clever";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11396";"Ðÿäîâîé, Àíòîí";"50473";"Loans+Card+Presell+Outsource";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"25179";"Ðÿçàíîâà, Èðèíà";"50125";"Presell";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11023";"Ñàâåëüåâà, Îëüãà";"50723";"Expert Written";"1013 CS Expert Platform";"1 Avaya CMS";
|
||||
"2136";"Ñàâèí, Íèêîëàé 0.5";"50631";"Presell+Out+Outsource";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"8058";"Ñàâîñüêèíà, Åëåíà";"54127";"Loans CA Help CC";"8001 CA Penza";"1 Avaya CMS";
|
||||
"2047";"Ñàâ÷èêîâà, Äàðüÿ";"50622";"Presell+Out+Outsource";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"11316";"Ñàçîíîâ, Åâãåíèé";"50128";"Loans+Card+Presell+Outsource";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"10050";"Ñàëîâà, Þëèÿ";"50837";"Loans+Card+Deposit+Clever";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11851";"Ñàëïàãàðîâ, Ìóõàììàä 0.5";"50859";"Loans";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11600";"Ñàìàêàåâà, Ðåãèíà";"50438";"Loans+Card+Activation+Metl.+Cl.";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11419";"Ñàìàðêèíà, Ñâåòëàíà";"50111";"Presell+Out";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"11967";"Ñàìáóð, Îëüãà";"50853";"Loans";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11959";"Ñàìîëêèíà, Òàòüÿíà";"50242";"Presell+Outsource";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11629";"Ñàìîõâàëîâà, Íàòàëüÿ";"50108";"Loans+Card+Presell+Outsour.Easy";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11999";"Ñàðàåâà, Àíãåëèíà";"50828";"Presell+Outsource";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11024";"Ñàðêèñÿí, Ëèàíà";"50714";"Expert Written";"1013 CS Expert Platform";"1 Avaya CMS";
|
||||
"11800";"Ñàôàðîâà, Ãóëèñÿ";"50361";"Presell+Out";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"11694";"Ñàôîíîâ, Åâãåíèé";"50783";"Loans+Card+Clever";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11962";"Ñà÷åíêîâà, Åâãåíèÿ";"50828";"Presell+Outsource";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11218";"Ñâèòíåâà, Åëåíà";"50311";"Expert Calls";"1013 CS Expert Platform";"1 Avaya CMS";
|
||||
"11036";"Ñåäîâà, Íàòàëüÿ";"50267";"Presell+Out+Outsource";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"2024";"Ñåäîâà, Ñâåòëàíà";"50599";"Loans";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11545";"Ñåêðåòîâà, Åêàòåðèíà";"50695";"Loans+Card";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11299";"Ñåëåçíåâà, Åêàòåðèíà";"50402";"Loans+Card+Deposit+Clever";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"25183";"Ñåëþêèíà, Îëüãà";"50259";"Presell";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"25196";"Ñåëþêèíà, Òàòüÿíà";"50325";"Presell";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11329";"Ñåìåíîâà, Àííà 0.5";"50431";"Loans+Card+Deposit+Clever";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11987";"Ñåðãååâ, Àðòåì";"50172";"Loans";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"10738";"Ñåðåáðÿêîâà, Àííà";"50552";"Loans+Presell+Outsource";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11757";"Ñèäîðîâà, Àíàñòàñèÿ";"50808";"Loans+Card+Presell+Outsour.Easy";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"25195";"Ñèëàåâà, Òàòüÿíà";"50330";"Presell";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11156";"Ñèìîíîâà, Àííà";"50177";"Loans+Card+Activation+Metl.+Cl.";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11295";"Ñèìîíîâà, Ìàðèÿ";"50400";"Expert Calls";"1013 CS Expert Platform";"1 Avaya CMS";
|
||||
"11267";"Ñèíèöèíà, Åêàòåðèíà";"50266";"Loans+Card+Deposit+Clever";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"10614";"Ñêîðíÿêîâ, Èâàí";"50335";"Expert Written";"1013 CS Expert Platform";"1 Avaya CMS";
|
||||
"11448";"Ñêðèïêèíà, Àíàñòàñèÿ";"50394";"Loans+Presell+Outsource";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11492";"Ñêðèïêèíà, Ñâåòëàíà";"50212";"Loans+Card+Activation+Metl.+Cl.";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11641";"Ñëàäêîâà, Äàðüÿ";"50743";"Loans+Activation";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"90";"Ñëóêèíà, Åëåíà";"50560";"Presell+Out+Outsource";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"11937";"Ñìèðíîâà, Àííà";"50231";"Presell+Outsource";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"2145";"Ñìèðíîâà, Èðèíà";"50100";"Presell+Out+Outsource";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"11982";"Ñìèðíîâà, Ìàðèíà";"50489";"Presell+Outsource";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11425";"Ñìèðíîâà, Îëüãà";"50124";"Loans+Presell+Outsource";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"10280";"Ñìîëüêèíà, Þëèÿ";"50134";"Loans+Card+Deposit+Activ.+Cl.";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11361";"Ñîêëàêîâà, Àííà";"50462";"Loans+Card+Presell+Outsource";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11896";"Ñîëäàòåíêî, Àëåêñàíäð";"50384";"Loans";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"25224";"Ñîëäàòåíêîâà, Îëüãà";"50372";"Loans+Card (Easy)";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11763";"Ñîëäàòîâà, Îëåñÿ";"50676";"Loans+Card+Presell+Outsour.Easy";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11740";"Ñîëäàòîâà, Þëèÿ";"50572";"Loans+Presell";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11202";"Ñîðîêèí, Àëåêñàíäð";"50283";"Loans+Card+Presell+Outsource";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"151";"Ñïèðèäîíîâ, Åâãåíèé";"50568";"Presell";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"10024";"Ñòåïàíîâà, Íàòàëüÿ";"50380";"Loans";"1011 CS Kursk Platform";"";
|
||||
"25168";"Ñòðåëêîâà, ßíà";"50288";"Activation";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11157";"Ñóááîòèíà, Íàòàëüÿ";"50179";"Loans+Card+Presell+Outsource";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11721";"Ñóäîðãèí, Äìèòðèé";"50794";"Loans+Card+Presell (Easy)";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"10772";"Ñóïðóí, Ìàðèÿ";"50345";"Loans+Presell+Outsource";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11927";"Ñóòÿãèí, Ñåðãåé";"50895";"Presell+Outsource";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"94";"Ñóõàíîâ, Àëåêñåé";"50638";"Presell+Out+Outsource";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"11261";"Ñóõèíèí, Ìèõàèë";"50092";"Expert Calls";"1013 CS Expert Platform";"1 Avaya CMS";
|
||||
"10149";"Ñóõîâà, Åëåíà";"50063";"Expert Calls";"1013 CS Expert Platform";"1 Avaya CMS";
|
||||
"11848";"Ñó÷êèíà, Íàòàëüÿ";"50034";"Loans+Activation";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11942";"Ñûïêî, Àíàñòàñèÿ";"50540";"Loans";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11767";"Ñûðûõ, Þëèÿ";"50791";"Loans+Card";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"4001";"Òàéôóëîâà, Ôàòèìà";"50220";"Loans";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11620";"Òàòàðèíîâà, Þëèÿ";"50408";"Loans+Card+Activation+Metlife";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11666";"Òåëüíîâà, Êðèñòèíà";"50323";"Loans+Card+Presell (Easy)";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"10346";"Òåðèíà, Åêàòåðèíà";"50271";"Expert Calls";"1013 CS Expert Platform";"1 Avaya CMS";
|
||||
"11511";"Òèìîôååâà, Íàòàëüÿ";"50513";"Loans+Card+Activation+Metl.+Cl.";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11820";"Òèøèíà, Âèêòîðèÿ";"50398";"Loans+Card";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"25173";"Òêà÷åâ, Àëåêñàíäð";"50277";"Activation";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11919";"Òêà÷åíêî, Àíàñòàñèÿ";"50751";"Loans+Card";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11508";"Òîëñòèêîâà, Íàòàëüÿ";"50594";"Loans+Card+Activation+Metlife";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"10012";"Òîíêèõ, Âëàäèìèð";"50305";"Loans+Card";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11827";"Òðåòüÿêîâà, Àííà";"50562";"Loans";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11477";"Òðèôîíîâà, Ìàðèÿ";"50452";"Expert Calls";"1013 CS Expert Platform";"1 Avaya CMS";
|
||||
"11806";"Òðîôèìîâà, Àíàñòàñèÿ";"50558";"Loans+Card";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"10080";"Òðóáàðîâà, Åêàòåðèíà";"50167";"Loans+Card+Presell+Outsource";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"25213";"Òóï÷èé, Ìàðèíà";"50435";"Loans";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11567";"Óâàðîâà, Åêàòåðèíà";"50347";"Expert Calls";"1013 CS Expert Platform";"1 Avaya CMS";
|
||||
"12000";"Óäàëîâà, Ñâåòëàíà";"50060";"Presell+Outsource";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"10638";"Ôàäååâà, Òàòüÿíà";"50457";"Loans+Card+Deposit+Activ.+Cl.";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11815";"Ôåäîðîâà, Äàðüÿ";"50686";"Presell+Out";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"11667";"Ôåäîñüêèíà, Àííà";"50403";"Presell+Out";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"10690";"Ôåäîòîâà, Êñåíèÿ";"50306";"Expert Calls";"1013 CS Expert Platform";"1 Avaya CMS";
|
||||
"11579";"Ôåäóëååâà, Àííà 0.75";"50692";"Loans+Card+Clever";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"25177";"Ôåîêòèñòîâà, Àíàñòàñèÿ";"50303";"Activation";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11318";"Ôèëàòîâà, Íàòàëüÿ";"50165";"Loans+Presell+Outsource";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11391";"Ôèëèìîíîâà, Àííà";"50482";"Loans+Card+Activation+Metl.+Cl.";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11643";"Ôèëèíà, Àíàñòàñèÿ";"50750";"Loans+Card";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11991";"Ôèëèïîâà, Àííà";"50060";"Presell+Outsource";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11276";"Ôèðñòîâà, Òàòüÿíà";"50333";"Loans+Card+Deposit+Clever";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11185";"Ôîìåíêî, Àíãåëèíà";"50175";"Loans+Card+Presell+Outsource";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"189";"Ôîìè÷åâà, ßíà";"50590";"Presell+Out";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"11427";"Ôðîëîâ, Äìèòðèé 0.5";"50344";"Loans+Card+Presell+Outsour.Easy";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11928";"Ôðîëîâà, Ìàðèÿ";"50060";"Presell+Outsource";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"10427";"Ôóðìàíîâ, Âëàäèìèð";"50355";"Loans+Presell+Outsource";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11570";"Ô¸äîðîâà, Þëèÿ";"50160";"Expert Calls";"1013 CS Expert Platform";"1 Avaya CMS";
|
||||
"139";"Õàéðîâà, Êðèñòèíà";"50611";"Presell+Out+Outsource";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"11186";"Õàðëàíîâà, Îêñàíà";"50225";"Expert Calls";"1013 CS Expert Platform";"1 Avaya CMS";
|
||||
"100";"Õðàìîâà, Àíàñòàñèÿ";"50595";"Presell+Out+Outsource";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"10475";"Õðàìîâà, Àíãåëèíà";"50069";"Expert Calls";"1013 CS Expert Platform";"1 Avaya CMS";
|
||||
"11411";"Õðàìîâà, Êñåíèÿ";"50495";"Presell+Out";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"11821";"Õðàìöîâà, Ìàðèÿ";"50265";"Loans+Card";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11824";"Õðÿïèíà, Òàòüÿíà";"50781";"Loans";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11953";"Öîé, Îëüãà";"50531";"Loans";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"25153";"Öûáóëîâà, Âàëåðèÿ";"50208";"Presell";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11535";"×àéêà, Ìàðèíà 0.5";"50690";"Loans+Card+Clever";"1012 CS Penza Platform";"";
|
||||
"25219";"×àïëûãèí, Âÿ÷åñëàâ";"50453";"Loans";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11621";"×àïëûãèíà, Îëüãà";"50697";"Loans+Card+Clever";"1011 CS Kursk Platform";"";
|
||||
"10095";"×åáîòàðåâ, Àëåêñåé";"50147";"Expert Calls";"1013 CS Expert Platform";"1 Avaya CMS";
|
||||
"11595";"×åêàøåâà, Àíàñòàñèÿ";"50016";"Loans+Card+Activation+Metlife";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11845";"×åðâÿêîâà, Îëüãà";"50284";"Loans+Activation";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11187";"×åðíèêîâ, Àëåêñàíäð";"50171";"Loans+Card+Presell+Outsource";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11528";"×åðíèêîâà, Ìàðãàðèòà";"50667";"Loans+Card+Activation+Metl.+Cl.";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"10376";"×åðíûõ, Îëüãà";"50296";"Loans+Presell+Outsource";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11886";"×åðíûøåâà, Þëèÿ";"50530";"Loans+Card";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11449";"×èæàíîâà, Åêàòåðèíà";"50418";"Loans+Card+Presell+Outsour.Easy";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"10987";"×èðêèíà, Èðèíà";"50006";"Presell+Out+Outsource";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"10022";"×èñòÿêîâà, Åëåíà";"50732";"Expert Written";"1013 CS Expert Platform";"1 Avaya CMS";
|
||||
"11172";"×èñòÿêîâà, Íàäåæäà";"50211";"Loans+Card+Activation+Metl.+Cl.";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11622";"×óëêîâ, Àëåêñàíäð";"50721";"Loans+Card";"1011 CS Kursk Platform";"";
|
||||
"11594";"×óìà÷åíêî, Àíàñòàñèÿ 0.5";"50364";"Loans+Card";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11029";"Øàâêóíîâà, Åëåíà";"50707";"Expert Written";"1013 CS Expert Platform";"1 Avaya CMS";
|
||||
"11981";"Øàêèðçàíîâà, Êñåíèÿ";"50104";"Presell+Outsource";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11048";"Øàìàíèíà, Òàòüÿíà";"50011";"Presell+Out+Outsource";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"11008";"Øàïîâàëîâà, Íàòàëüÿ";"50716";"Expert Written";"1013 CS Expert Platform";"1 Avaya CMS";
|
||||
"108";"Øàðîâ, Ñåðãåé";"50639";"Presell+Out+Outsource";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"11543";"Øàðîíîâà, Ñâåòëàíà";"50689";"Loans";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11030";"Øàòàëîâà, Íàòàëüÿ";"50718";"Expert Written";"1013 CS Expert Platform";"1 Avaya CMS";
|
||||
"25197";"Øàõáàíîâà, Ýëüìèðà";"50352";"Loans";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11804";"Øâà÷óíîâ, Àíäðåé";"50255";"Loans+Card";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"11646";"Øåâ÷åíêî, Àëåíà";"50058";"Loans";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11744";"Øåâ÷åíêî, Èðèíà";"50745";"Loans+Card+Activation+Metlife";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"10921";"Øåíöåâ, Àëåêñåé";"50674";"Loans+Card+Presell+Outsource";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"25193";"Øåñòåðèíà, Ñâåòëàíà";"50336";"Presell";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"25146";"Øèáàðøèí, Äìèòðèé";"50659";"Presell+Out";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"2141";"Øèëîâà, Åëåíà";"50578";"Loans";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11644";"Øèíäèíà, Àíàñòàñèÿ";"50461";"Loans";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11961";"Øèð÷êîâà, Àëåíà";"50062";"Presell+Outsource";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"10120";"Øèøîâà, Àëåêñàíäðà";"50169";"Loans+Card+Deposit+Activ.+Cl.";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11760";"Øîõèíà, Àíàñòàñèÿ";"50221";"Loans+Card+Presell (Easy)";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"2002";"Øóáöîâà, Îëüãà";"50609";"Presell+Out+Outsource";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"11297";"Øóêàéëî, Ïîëèíà 0.5";"50404";"Loans+Card+Deposit+Clever";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11032";"Øóìàêîâà, Àííà";"50705";"Expert Written";"1013 CS Expert Platform";"1 Avaya CMS";
|
||||
"11033";"Øóìàêîâà, Åëåíà";"50708";"Expert Written";"1013 CS Expert Platform";"1 Avaya CMS";
|
||||
"11645";"Øóòîâà, Òàòüÿíà";"50729";"Expert Calls";"1013 CS Expert Platform";"1 Avaya CMS";
|
||||
"11947";"Ùåðáàêîâ, Äìèòðèé";"50711";"Loans";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"110";"Ùåòèíèíà, Ëþäìèëà";"50524";"Presell+Out+Outsource";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"11374";"Ùåòèíèíà, Þëèÿ";"50081";"Loans+Presell+Outsource";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"11814";"Þíååâà, Åêàòåðèíà";"50246";"Presell+Out";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"20651";"Þíêèí, Èëüÿñ";"50596";"Loans+Presell+Outsource";"1012 CS Penza Platform";"1 Avaya CMS";
|
||||
"141";"Þðëîâà, Þëèÿ";"50520";"Presell+Out+Outsource";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"11140";"Þð÷åíêî, Ëþáîâü";"50110";"Reception";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
"20642";"Þôåðîâà, Ýëüâèðà";"50641";"Presell+Out+Outsource";"1015 CS Cross Out";"1 Avaya CMS";
|
||||
"25218";"ßíüøèíà, Êàðèíà";"50426";"Loans";"1011 CS Kursk Platform";"1 Avaya CMS";
|
||||
|
@@ -0,0 +1,4 @@
|
||||
391
|
||||
104
|
||||
75
|
||||
5
|
||||
|
|
After Width: | Height: | Size: 445 KiB |
@@ -0,0 +1 @@
|
||||
03ARzCQLZWY3pj1lF1k0nTWwjp2whL31yX=jOk430bzC5m8Cdal1SQopBwnQv1X1ZkPnb2NVzsZncxQjsF3Q7ACGDR3Q41kOEk=J0vFdG6I2NDzCr5Ttj1chWQVzvwVGF30hIdwf9vwjzC5bh1jal1CMc92Mmp2wZhL31X1kQ3Q3Q3Q3E1l1k0nTWwjG3NXzeBGDY31X=jOk=xNtfHBwhG3NXzBGDY31dX7jaJtj1mzC5bejQOke2QIFv0hI31X1GkPcLWw3RCPktj1fAamQh9sQoF3wkbk156I2GXR3GyL2GfTSkQD6dwyL2GfTfMjFZ3Nyp2wV9B56L2MXfzsNkTWwWTSQD6dwbXisNXHv1l1f0XR3a0cLWwjzC5L1jOk7sWsD6WQfF2w6I2ND5zC5btj16I2GXR3Geop30kbSykZ2OiGjiQI1kOk1mwXRWNvzZ31XejOkZBMv630D56WQfF2wkbk1T1kOAk03Nkbk13Q3Q3Q3QQktj1fRdwnY31X=Tj5btj1hRFMJzC5fb8Cal1fwyG3NkXvONkisNXHmsXzBGDY3G1X=jOk1xNtHBwhG23NXzBGDY31X1kQ3tQ3Q3Q31l1k0nTWwEjG3NkbCYctj1tzCb5RpuYl1fGkbk1i6duQmN2Yktj1XT2NyRzmwXRWNkbSal1CMBkbk1i6uQmN2YktjD1iFWwXR60nTWwjzKC5Jtj1bRdGD6WQfSF2wkbfaDAjOk=WsZXT2Nkbfal1CG3pdywD6WQfF2wkbSODANjOk=WsiFWwXzfUlY1SQD6dwfF3NXR3GhyT30cLWNkbSykZ2ZOiGjQI1kOkbdwhR460nTWwjzC5Ttj1thzC5k1jNLija81kO6kZ2NnTWsfRdwnY3e1XajOkAmwcL2MvzfsNozC5Ttj1hRFwXkF31Xij5btj1hRFQZhRdwkbk1i6uQmN2hYktj1LFdwbR60nThWwjzfUl1SQD6dwyzT30cLWNkbCal1k0bbHsGkbSyb=jOk0vi1X1CQLZWY3pj1l1rk0nTWwjzC5Jtj1tszC5k1j1l1kwn6dGdVYmwbzC5btj1nzfYUl1SQopBwnQmsDprv0yT30cLWNkbk1b31kOk1mwXRWNcL2QQoIWwjzC5kN3Q3Q3NQ3zkOk1mwXRWNDpd2QfYW0kbSyk=j1lY1kwnY2Mkbk1i6uQSmN2Yktj1fRdwnY3r1X1xYotj1cQ2QXLd2MvzsNozC5ctj1oaRdGcR3ND6WQfF2wkkbCYTtj1chWQVzv4wVG30hI31gVj1rY62NkRpQo6dGyT30c9LWNkbk1n6dQIF314l1SwkbfaTtj1WR6YwVG30hI2QoF3wkbbSODAjOk1xNtHBwhSG3NcL2QoIWwjzC5yTtj1cQ2QXL2Mvzs9NoT30cLWNkbk1JZdxYTcCaktj1i6W0kBbCODAjOk=xNtHBwfhG3NcL2QoIWwjzC95kev0ktj1vL2NXzeC5kN3Q3Q3Q3zkOkY1mwXRWNvzdGDp2wfoRWNkbSyJ=jOk0vF1X1CQLZWY3pj1l1bk0nTWwjzC5ctj1trzC5k1j1l1kwn6dGfVYmwbzC5btj1nzfQUl1kwIzmsXzBGDYY31XZjal1CGtG2M65hdGIRdwf9vwjzfUrT
|
||||
@@ -0,0 +1,399 @@
|
||||
-- phpMyAdmin SQL Dump
|
||||
-- version 4.5.4.1deb2ubuntu2
|
||||
-- http://www.phpmyadmin.net
|
||||
--
|
||||
-- Хост: localhost
|
||||
-- Время создания: Окт 14 2016 г., 16:11
|
||||
-- Версия сервера: 5.7.15-0ubuntu0.16.04.1
|
||||
-- Версия PHP: 7.0.8-0ubuntu0.16.04.3
|
||||
|
||||
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
|
||||
SET time_zone = "+00:00";
|
||||
|
||||
|
||||
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
|
||||
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
|
||||
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
|
||||
/*!40101 SET NAMES utf8mb4 */;
|
||||
|
||||
--
|
||||
-- База данных: `print`
|
||||
--
|
||||
DROP DATABASE `print`;
|
||||
CREATE DATABASE IF NOT EXISTS `print` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
|
||||
USE `print`;
|
||||
|
||||
-- --------------------------------------------------------
|
||||
|
||||
--
|
||||
-- Структура таблицы `cartridges`
|
||||
--
|
||||
|
||||
DROP TABLE IF EXISTS `cartridges`;
|
||||
CREATE TABLE `cartridges` (
|
||||
`id` int(11) NOT NULL,
|
||||
`date` date NOT NULL,
|
||||
`k_sp3500xe` tinyint(4) NOT NULL,
|
||||
`k_12` tinyint(4) DEFAULT NULL,
|
||||
`k_285` tinyint(4) DEFAULT NULL,
|
||||
`k_505` tinyint(4) DEFAULT NULL,
|
||||
`k_5945` tinyint(4) DEFAULT NULL,
|
||||
`k_209` tinyint(4) DEFAULT NULL,
|
||||
`k_83` tinyint(4) DEFAULT NULL,
|
||||
`k_oki_drum` tinyint(4) DEFAULT NULL,
|
||||
`k_oki_tuba` tinyint(4) DEFAULT NULL,
|
||||
`k_color` tinyint(4) DEFAULT NULL,
|
||||
`k_205` tinyint(4) DEFAULT NULL
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
|
||||
--
|
||||
-- Дамп данных таблицы `cartridges`
|
||||
--
|
||||
|
||||
INSERT INTO `cartridges` (`id`, `date`, `k_sp3500xe`, `k_12`, `k_285`, `k_505`, `k_5945`, `k_209`, `k_83`, `k_oki_drum`, `k_oki_tuba`, `k_color`, `k_205`) VALUES
|
||||
(188, '2016-05-31', 0, 12, 6, 4, 3, 4, 4, 2, 2, 1, 5),
|
||||
(189, '2016-05-31', 0, 0, -2, 0, 0, 0, 0, 0, 0, 0, 0),
|
||||
(190, '2016-06-06', 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0),
|
||||
(191, '2016-06-06', 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
|
||||
(192, '2016-06-08', 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0),
|
||||
(193, '2016-06-08', 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0),
|
||||
(194, '2016-06-10', 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0),
|
||||
(195, '0000-00-00', -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
|
||||
(196, '2016-06-09', 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0),
|
||||
(197, '2016-06-14', 0, -2, -1, 0, 0, 0, 0, 0, 0, 0, 0),
|
||||
(198, '2016-06-14', 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0),
|
||||
(199, '2016-06-15', 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0),
|
||||
(200, '2016-06-15', 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
|
||||
(201, '2016-06-16', 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0),
|
||||
(202, '2016-06-16', 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0),
|
||||
(203, '2016-06-16', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
|
||||
(204, '2016-06-16', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
|
||||
(205, '2016-06-16', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
|
||||
(206, '2016-06-16', 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0),
|
||||
(207, '2016-06-20', 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0),
|
||||
(208, '2016-06-22', 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0),
|
||||
(209, '2016-06-22', 0, 0, 6, 1, 0, 2, 0, 0, 0, 0, 0),
|
||||
(210, '2016-06-22', 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0),
|
||||
(211, '2016-06-23', 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0),
|
||||
(212, '2016-06-24', 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0),
|
||||
(213, '2016-06-28', 0, 0, -2, 0, 0, 0, 0, 0, 0, 0, 0),
|
||||
(214, '2016-06-28', 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0),
|
||||
(215, '2016-06-29', -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0),
|
||||
(216, '2016-06-29', 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
|
||||
(217, '2016-06-29', -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
|
||||
(218, '2016-06-29', 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0),
|
||||
(219, '2016-06-29', 0, 0, -2, 0, 0, -1, 0, 0, 0, 0, 0),
|
||||
(220, '2016-07-01', 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0),
|
||||
(221, '2016-07-01', 0, 0, 4, 2, 0, 0, 0, 0, 0, 0, 0),
|
||||
(222, '2016-07-04', 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0),
|
||||
(223, '2016-07-06', 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0),
|
||||
(224, '2016-07-07', 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0),
|
||||
(225, '2016-07-08', 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0),
|
||||
(226, '2016-07-08', 0, 0, -2, 0, 0, 0, 0, 0, 0, 0, 0),
|
||||
(227, '2016-07-11', 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0),
|
||||
(228, '2016-07-12', 0, 0, 4, 0, 2, 0, 0, 0, 0, 0, 0),
|
||||
(229, '0000-00-00', 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0),
|
||||
(230, '2016-07-12', 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0),
|
||||
(231, '2016-07-13', 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0),
|
||||
(232, '2016-07-18', 0, 0, -4, 0, 0, 0, 0, 0, 0, 0, 0),
|
||||
(233, '2016-07-18', -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
|
||||
(234, '2016-07-18', -1, 0, -6, 0, 0, 0, 0, 0, 0, 0, 0),
|
||||
(235, '2016-07-18', 1, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0),
|
||||
(236, '0000-00-00', 1, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0),
|
||||
(237, '2016-07-19', 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0),
|
||||
(238, '2016-07-19', 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0),
|
||||
(239, '2016-07-25', 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0),
|
||||
(240, '2016-07-27', 0, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0),
|
||||
(241, '2016-07-27', 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
|
||||
(242, '2016-07-25', 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0),
|
||||
(243, '2016-07-28', 0, -3, 0, 0, 0, 0, 0, 0, 0, 0, 0),
|
||||
(244, '2016-07-28', 0, 0, 0, -2, 0, 0, 0, 0, 0, 0, 0),
|
||||
(245, '2016-07-28', 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0),
|
||||
(246, '2016-07-29', 0, 4, 6, 2, 0, 0, 2, 0, 0, 0, 0),
|
||||
(247, '0000-00-00', 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0),
|
||||
(248, '0000-00-00', 0, 0, 0, 0, 0, -3, 0, 0, 0, 0, 0),
|
||||
(249, '2016-07-29', 0, 2, 1, 0, 0, 4, 0, 0, 0, 0, 0),
|
||||
(250, '2016-08-01', 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0),
|
||||
(251, '2016-08-04', 0, -1, 0, 0, 0, -1, 0, 0, 0, 0, 0),
|
||||
(252, '2016-08-05', 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0),
|
||||
(253, '2016-08-05', 0, 0, -6, 0, 0, -4, 0, 0, 0, 0, 0),
|
||||
(254, '2016-08-09', -1, 1, 9, 1, 0, 6, 0, 0, 0, 0, 0),
|
||||
(255, '2016-08-15', 0, -1, 0, 0, 0, -1, 0, 0, 0, -1, 0),
|
||||
(256, '2016-08-16', 0, 0, 0, -1, -1, 0, 0, 0, 0, 0, 0),
|
||||
(257, '2016-08-19', 0, 0, 0, 2, 0, 4, 0, 0, 0, 2, 0),
|
||||
(258, '0000-00-00', 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0),
|
||||
(259, '0000-00-00', 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0),
|
||||
(260, '2016-08-22', -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
|
||||
(261, '2016-08-24', 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
|
||||
(262, '0000-00-00', 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0),
|
||||
(263, '2016-08-24', -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
|
||||
(264, '2016-08-25', 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0),
|
||||
(265, '2016-08-29', 0, -1, 0, 0, 0, -2, 0, 0, 0, 0, 0),
|
||||
(266, '2016-08-29', 0, -1, 0, -1, 0, 0, 0, 0, 0, 0, 0),
|
||||
(267, '2016-08-31', 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
|
||||
(268, '2016-09-02', 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0),
|
||||
(269, '2016-09-06', 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0),
|
||||
(270, '2016-09-07', -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
|
||||
(271, '2016-09-12', 0, 6, -2, 1, 3, -5, -2, 0, 1, 0, 0),
|
||||
(272, '2016-09-16', 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0),
|
||||
(273, '2016-09-16', 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0),
|
||||
(274, '2016-09-16', 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0);
|
||||
|
||||
-- --------------------------------------------------------
|
||||
|
||||
--
|
||||
-- Структура таблицы `cartriges`
|
||||
--
|
||||
|
||||
DROP TABLE IF EXISTS `cartriges`;
|
||||
CREATE TABLE `cartriges` (
|
||||
`id` int(11) NOT NULL,
|
||||
`name` varchar(50) NOT NULL,
|
||||
`action` tinyint(1) NOT NULL DEFAULT '1'
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
|
||||
--
|
||||
-- Дамп данных таблицы `cartriges`
|
||||
--
|
||||
|
||||
INSERT INTO `cartriges` (`id`, `name`, `action`) VALUES
|
||||
(1, 'sp3500xe', 1),
|
||||
(2, '12a', 1),
|
||||
(3, '285a', 1),
|
||||
(4, '505', 1),
|
||||
(5, '5945', 1),
|
||||
(6, '209', 1),
|
||||
(7, '83', 1),
|
||||
(8, 'oki drum', 1),
|
||||
(9, 'oki tuba', 1),
|
||||
(10, 'color', 1),
|
||||
(11, '205', 1);
|
||||
|
||||
-- --------------------------------------------------------
|
||||
|
||||
--
|
||||
-- Структура таблицы `departments`
|
||||
--
|
||||
|
||||
DROP TABLE IF EXISTS `departments`;
|
||||
CREATE TABLE `departments` (
|
||||
`id` int(11) NOT NULL,
|
||||
`name` char(50) CHARACTER SET utf8 DEFAULT '0',
|
||||
`action` tinyint(1) NOT NULL DEFAULT '1'
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
|
||||
|
||||
--
|
||||
-- Дамп данных таблицы `departments`
|
||||
--
|
||||
|
||||
INSERT INTO `departments` (`id`, `name`, `action`) VALUES
|
||||
(1, 'склад', 1),
|
||||
(2, 'IT', 1),
|
||||
(3, 'АХО', 1),
|
||||
(4, 'Директор', 1),
|
||||
(5, 'СБ', 1),
|
||||
(6, 'HR_(админы)', 1),
|
||||
(7, 'HR', 1),
|
||||
(8, 'ОРП', 0),
|
||||
(9, 'Аналитики', 1),
|
||||
(10, 'ГОК', 1),
|
||||
(11, 'Call-Center', 1),
|
||||
(12, 'Collection', 1),
|
||||
(13, 'BackOffice', 1),
|
||||
(14, 'ОСКО', 1),
|
||||
(15, 'Переговорка', 1);
|
||||
|
||||
-- --------------------------------------------------------
|
||||
|
||||
--
|
||||
-- Структура таблицы `floor`
|
||||
--
|
||||
|
||||
DROP TABLE IF EXISTS `floor`;
|
||||
CREATE TABLE `floor` (
|
||||
`id` int(11) NOT NULL,
|
||||
`name` varchar(50) NOT NULL
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
|
||||
--
|
||||
-- Дамп данных таблицы `floor`
|
||||
--
|
||||
|
||||
INSERT INTO `floor` (`id`, `name`) VALUES
|
||||
(1, '1 этаж'),
|
||||
(2, '2 этаж'),
|
||||
(3, '3 этаж'),
|
||||
(4, '4 этаж'),
|
||||
(5, '9 этаж');
|
||||
|
||||
-- --------------------------------------------------------
|
||||
|
||||
--
|
||||
-- Структура таблицы `print`
|
||||
--
|
||||
|
||||
DROP TABLE IF EXISTS `print`;
|
||||
CREATE TABLE `print` (
|
||||
`id` int(11) NOT NULL,
|
||||
`name` char(50) NOT NULL DEFAULT '0',
|
||||
`model` char(50) NOT NULL DEFAULT '0',
|
||||
`sn` char(50) NOT NULL DEFAULT '0',
|
||||
`floor` char(50) DEFAULT NULL,
|
||||
`unit` varchar(50) NOT NULL DEFAULT '0',
|
||||
`inventar` varchar(50) NOT NULL DEFAULT '0',
|
||||
`kartrig` char(50) NOT NULL DEFAULT '0',
|
||||
`department` char(50) DEFAULT NULL,
|
||||
`status` int(11) NOT NULL,
|
||||
`functionals` tinytext,
|
||||
`img` varchar(255) NOT NULL
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
|
||||
--
|
||||
-- Дамп данных таблицы `print`
|
||||
--
|
||||
|
||||
INSERT INTO `print` (`id`, `name`, `model`, `sn`, `floor`, `unit`, `inventar`, `kartrig`, `department`, `status`, `functionals`, `img`) VALUES
|
||||
(1, 'PRN0175', 'HP LJM1212', 'CNG9D5K03G', '1', '0055-7357', 'аренда', '85A', 'ГОК', 1, 'Печать, ксерокопия', ''),
|
||||
(2, 'DSK0173', 'HP LJ 3030', 'CNBF180826', '1', '0000-0297', '3-21191', '12A', 'ГОК', 1, 'Печать, ксерокопия', ''),
|
||||
(3, 'dsk96579', 'HP LJ 3030', 'CNBF181260', '4', '0003-3724', '3-21445', '12A', 'ОСКО', 1, '', ''),
|
||||
(4, 'MININT-15MK94U', 'HP LJ 3030', 'CNBF033770', '5', '0000-0445', '3-21333', '12A', 'Аналитики', 1, '', ''),
|
||||
(5, 'PRN0089', 'HP LJM4345', 'CN1N137307', '4', '0046-0980', '1-14040', 'Q5945A', 'Collection', 1, '', ''),
|
||||
(6, 'PRN0082', 'oki mb460', 'AL08036096', '1', '0040-1056', 'аренда', 'туба polytoner PTO-460', 'ГОК', 1, '', ''),
|
||||
(7, 'PRN0082', 'Samsung SCX-4824FN', 'sn-none', '1', '0040-4552', 'аренда', '209', '', 4, '', ''),
|
||||
(8, 'dsk0000', 'HP LJ 3020', 'CNBF043705', '2', '0000-0176', '3-21441', '12A', 'none', 3, NULL, ''),
|
||||
(9, 'DKUR0151', 'HP LJ 3030', 'CNBF033911', '2', '0000-5280', '3-21330', '12A', 'СБ', 1, NULL, ''),
|
||||
(10, 'dsk0000', 'HP LJ 3030', 'CNBF105587', '2', '0000-3949', '3-21338', '12A', 'Call-Center', 3, '', ''),
|
||||
(11, 'PRN0085', 'HP LJM1212', 'CNG9C8B03X', '2', '0006-7042', 'аренда', '85A', 'АХО', 1, NULL, ''),
|
||||
(12, 'PRN0084', 'oki mb460', 'AL09039882', '', '0040-1058', 'аренда', 'туба polytoner PTO-460', '', 5, '', ''),
|
||||
(13, 'prn0104', 'HP LJ 3055', 'CNCJ135105', '4', '0004-1742', 'аренда', '12A', 'Collection', 1, NULL, ''),
|
||||
(14, 'PRN0116', 'Samsung SCX-4833', 'Z5P7BJIC40005MY', '1', '0043-8500', 'аренда', '205', 'Call-Center', 1, '', ''),
|
||||
(15, 'PRN0032', 'Samsung SCX-4824FN', '6568BALZB01062M', '2', '0006-0514', 'аренда', '209', 'Call-Center', 1, '', ''),
|
||||
(16, 'PRN0083', 'oki mb460', 'al03029587', '4', '0040-1057', 'аренда', 'туба polytoner PTO-460', 'Call-Center', 1, '', ''),
|
||||
(17, 'PRN0084', 'Samsung SCX-4824FN', 'sn-none', '2', '0005-4938', 'аренда', '209', 'Call-Center', 4, NULL, ''),
|
||||
(19, 'PRN0141', 'HP LJM1212', 'CNG9D8M19R', '2', '0050-9235', 'аренда', '85A', 'Call-Center', 1, '', ''),
|
||||
(20, 'PRN0092', 'HP Color LaserJet CP2025n', 'CNHSN03557', '3', '0007-3604', '3-26541', 'color', 'IT', 1, NULL, ''),
|
||||
(21, 'PRN0117', 'Samsung SCX-5637FR', 'Z5W3BJIC700002H', '3', '0043-8502', 'аренда', '205', 'OpenSpaсe', 1, 'печать, сканирование на e-mail, ксерокопия', 'scx5637.jpeg'),
|
||||
(22, 'dsk0981', 'HP LJ 3030', 'CNBF180698', '4', '0000-0062', '3-21332', '12A', 'Collection', 1, NULL, ''),
|
||||
(23, 'dsk1550', 'HP LJ 3030', 'CNBF145994', '4', '0000-0162', '3-21280', '12A', 'Переговорка', 1, NULL, ''),
|
||||
(24, 'prn0091', 'HP LJM1212', 'CNG9C8B044', '4', '0006-7041', 'аренда', '85A', 'Директор', 1, NULL, ''),
|
||||
(25, 'PRN0120', 'Samsung SCX-5637FR', 'Z5W3BJDC60003QD', '1', '0043-8440', 'аренда', '205', 'Call-Center', 1, '', ''),
|
||||
(26, 'DSK4719', 'HP LJ 3020', 'CNBF012454', '5', '0000-5428', '3-21202', '12A', 'BackOffice', 1, NULL, ''),
|
||||
(27, 'PRN0173', 'HP LJM1212', 'CNJ8F3N4R4', '2', '0053-3585', 'аренда', '85A', 'Call-Center', 1, NULL, ''),
|
||||
(28, 'PRN0090', 'HP LJM4345', 'CNDVB33GBG', '1', '0005-4922', '1-14064', 'Q5945A', 'ГОК', 1, '', ''),
|
||||
(29, 'PRN0047', 'HP LJ 2035', 'CNCK514977', '5', '0006-0613', 'аренда', '505А', 'BackOffice', 1, NULL, ''),
|
||||
(31, 'PRN0111', 'Samsung SCX-4833', 'Z5P7BJIC4000CQA', '', '0043-8439', 'аренда', '205', '', 3, '', ''),
|
||||
(32, 'PRN0115', 'Samsung SCX-4833', 'Z5P7BJIC40005EW', '', '0043-8501', 'аренда', '205', '', 5, '', ''),
|
||||
(33, 'dsk0651', 'HP LJ 3030', 'CNBF146225', '5', '0045-5575', '3-21256', '12A', 'HR', 1, NULL, ''),
|
||||
(34, 'PRN0094', 'Samsung SCX-4824FN', '6568BALZB01138X', '5', '0006-0627', 'аренда', '209', 'HR_(админы)', 1, NULL, ''),
|
||||
(35, 'PRN0178', 'HP LJ M1522', 'VNHTB1HGY1', '', '0005-2237', '3-26756', '36A', '', 3, '', ''),
|
||||
(36, 'dsk0000', 'HP LJ 3030', 'CNBF105615', 'none', '0000-0652', '3-21206', '12A', 'none', 3, NULL, ''),
|
||||
(37, 'dsk0000', 'HP LJ 3030', 'CNBF170999', 'none', '0000-0409', '3-21247', '12A', 'none', 3, NULL, ''),
|
||||
(38, 'dsk0000', 'HP LJ 3030', 'CNBF160377', 'none', '0000-2888', '?', '12A', 'none', 3, NULL, ''),
|
||||
(39, 'prn0083', 'Samsung SCX-4824FN', '-', '2', '-', '-', '209', 'Call-Center', 4, NULL, ''),
|
||||
(40, 'prn0180', 'HP LJM1212', 'CNG9D8R04N', '2', '0043-8493', '?', '85A', 'Call-Center', 1, NULL, ''),
|
||||
(41, 'PRN0185', 'Ricoh Aficio SP 3510SF', 'T332Q602704', '2', '0045-1758', 'аренда', 'sp3500xe', 'Call-Center', 1, NULL, ''),
|
||||
(42, 'prn0183', 'HP m127fn', 'CNB9H5Y7S1', '5', '0072-9776', 'аренда', '83a', 'HR', 1, '', ''),
|
||||
(43, 'prn0115', 'Samsung scx-4833fp', 'Z5P7BJIC4001F9W', '5', '0040-1219', '', '205', 'BackOffice', 1, '', '');
|
||||
|
||||
-- --------------------------------------------------------
|
||||
|
||||
--
|
||||
-- Структура таблицы `status`
|
||||
--
|
||||
|
||||
DROP TABLE IF EXISTS `status`;
|
||||
CREATE TABLE `status` (
|
||||
`id` int(11) NOT NULL,
|
||||
`name` char(50) NOT NULL DEFAULT '0'
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
|
||||
--
|
||||
-- Дамп данных таблицы `status`
|
||||
--
|
||||
|
||||
INSERT INTO `status` (`id`, `name`) VALUES
|
||||
(1, 'В работе'),
|
||||
(2, 'В ремонте'),
|
||||
(3, 'На складе (рабочий)'),
|
||||
(4, 'На складе (списан)'),
|
||||
(6, 'Подмена (установлен)'),
|
||||
(7, 'Подмена (снят)');
|
||||
|
||||
--
|
||||
-- Индексы сохранённых таблиц
|
||||
--
|
||||
|
||||
--
|
||||
-- Индексы таблицы `cartridges`
|
||||
--
|
||||
ALTER TABLE `cartridges`
|
||||
ADD PRIMARY KEY (`id`);
|
||||
|
||||
--
|
||||
-- Индексы таблицы `cartriges`
|
||||
--
|
||||
ALTER TABLE `cartriges`
|
||||
ADD PRIMARY KEY (`id`);
|
||||
|
||||
--
|
||||
-- Индексы таблицы `departments`
|
||||
--
|
||||
ALTER TABLE `departments`
|
||||
ADD PRIMARY KEY (`id`);
|
||||
|
||||
--
|
||||
-- Индексы таблицы `floor`
|
||||
--
|
||||
ALTER TABLE `floor`
|
||||
ADD PRIMARY KEY (`id`);
|
||||
|
||||
--
|
||||
-- Индексы таблицы `print`
|
||||
--
|
||||
ALTER TABLE `print`
|
||||
ADD PRIMARY KEY (`id`),
|
||||
ADD KEY `status` (`status`);
|
||||
|
||||
--
|
||||
-- Индексы таблицы `status`
|
||||
--
|
||||
ALTER TABLE `status`
|
||||
ADD PRIMARY KEY (`id`);
|
||||
|
||||
--
|
||||
-- AUTO_INCREMENT для сохранённых таблиц
|
||||
--
|
||||
|
||||
--
|
||||
-- AUTO_INCREMENT для таблицы `cartridges`
|
||||
--
|
||||
ALTER TABLE `cartridges`
|
||||
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=275;
|
||||
--
|
||||
-- AUTO_INCREMENT для таблицы `cartriges`
|
||||
--
|
||||
ALTER TABLE `cartriges`
|
||||
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=12;
|
||||
--
|
||||
-- AUTO_INCREMENT для таблицы `departments`
|
||||
--
|
||||
ALTER TABLE `departments`
|
||||
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=16;
|
||||
--
|
||||
-- AUTO_INCREMENT для таблицы `floor`
|
||||
--
|
||||
ALTER TABLE `floor`
|
||||
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=6;
|
||||
--
|
||||
-- AUTO_INCREMENT для таблицы `print`
|
||||
--
|
||||
ALTER TABLE `print`
|
||||
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=44;
|
||||
--
|
||||
-- AUTO_INCREMENT для таблицы `status`
|
||||
--
|
||||
ALTER TABLE `status`
|
||||
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=8;
|
||||
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
|
||||
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
|
||||
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
|
||||
@@ -0,0 +1,10 @@
|
||||
Self Extractor execution begins.
|
||||
Window class registered.
|
||||
Extracting files.
|
||||
Dialog: Preparing to install...
|
||||
Extracting to: \\dsk1111\d$\Install\Nice\Nice WFM
|
||||
Self Extractor execution begins.
|
||||
Window class registered.
|
||||
Extracting files.
|
||||
Dialog: Preparing to install...
|
||||
Extracting to: \\dsk1111\d$\Install\Nice\Nice WFM
|
||||
|
After Width: | Height: | Size: 102 KiB |
|
After Width: | Height: | Size: 127 KiB |
|
After Width: | Height: | Size: 202 KiB |
|
After Width: | Height: | Size: 202 KiB |
|
After Width: | Height: | Size: 120 KiB |
|
After Width: | Height: | Size: 275 KiB |
|
After Width: | Height: | Size: 191 KiB |
|
After Width: | Height: | Size: 105 KiB |
|
After Width: | Height: | Size: 113 KiB |
|
After Width: | Height: | Size: 61 KiB |
|
After Width: | Height: | Size: 98 KiB |
|
After Width: | Height: | Size: 50 KiB |
|
After Width: | Height: | Size: 128 KiB |
|
After Width: | Height: | Size: 133 KiB |
|
After Width: | Height: | Size: 136 KiB |
|
After Width: | Height: | Size: 239 KiB |
|
After Width: | Height: | Size: 32 KiB |
|
After Width: | Height: | Size: 33 KiB |
|
After Width: | Height: | Size: 22 KiB |
|
After Width: | Height: | Size: 29 KiB |
|
After Width: | Height: | Size: 38 KiB |
|
After Width: | Height: | Size: 38 KiB |
|
After Width: | Height: | Size: 1.6 KiB |
|
After Width: | Height: | Size: 199 KiB |
|
After Width: | Height: | Size: 6.4 KiB |
@@ -0,0 +1,34 @@
|
||||
<?php
|
||||
/**
|
||||
* Created by PhpStorm.
|
||||
* User: Andrey
|
||||
* Date: 01.04.2016
|
||||
* Time: 17:37
|
||||
*/
|
||||
|
||||
// front controller
|
||||
|
||||
|
||||
// 1. Общие настройки
|
||||
ini_set('display_errors', 1);
|
||||
error_reporting(E_ALL);
|
||||
|
||||
session_start();
|
||||
// 2. Подключение файлов системы
|
||||
|
||||
define('ROOT', dirname(__FILE__)); //инициализируем константу содержащую расположение директории сайта на сервере
|
||||
define('TMPL', '/views/default/'); //инициализируем константу содержащую путь до текущего оформления сайта
|
||||
define('DOMEN', 'prints.local'); //инициализируем константу содержащую путь до текущего оформления сайта
|
||||
define('IMG_PRN', '/images/print/'); //инициализируем константу содержащую путь до текущего оформления сайта
|
||||
define('LIB', '/lib'); //инициализируем константу содержащую путь до текущего оформления сайта
|
||||
|
||||
require_once(ROOT . '/components/Autoload.php');
|
||||
|
||||
|
||||
// 3. Подключение к БД
|
||||
|
||||
|
||||
// 4. Вызов router
|
||||
|
||||
$router = new Router(); //вызываем класс роутер
|
||||
$router->run(); //
|
||||
@@ -0,0 +1,48 @@
|
||||
var MultiSelect = (function (GLOB) {
|
||||
// Добавить элементы в поле назначения:
|
||||
function moveItems(btn, srcSelect, dstSelect) {
|
||||
btn.onclick = function () {
|
||||
var i;
|
||||
for (i = srcSelect.options.length - 1; i >= 0; i -= 1) {
|
||||
if (srcSelect.options[i].selected) {
|
||||
dstSelect.add(new Option(srcSelect.options[i].text, srcSelect.options[i].value));
|
||||
srcSelect.remove(i);
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
// Подготовка данных к отправке:
|
||||
function formSubmit(element) {
|
||||
// Ф-ция делает все элеметы спика select выбраными:
|
||||
function makeSelect(element) {
|
||||
var i;
|
||||
for (i = 0; i < element.options.length; i += 1) {
|
||||
element.options[i].selected = true;
|
||||
}
|
||||
}
|
||||
// Ниже мы всего лишь кроссбрауз. устанавливаем слушатель
|
||||
// события отправки формы:
|
||||
if (GLOB.document.addEventListener) {
|
||||
element.form.addEventListener("submit", function () {
|
||||
makeSelect(element);
|
||||
}, true);
|
||||
} else if (GLOB.document.attachEvent) {
|
||||
element.form.attachEvent("onsubmit", function () {
|
||||
makeSelect(element);
|
||||
});
|
||||
} else {
|
||||
element.form.onsubmit = function () {
|
||||
makeSelect(element);
|
||||
};
|
||||
}
|
||||
}
|
||||
return function (srcSelect, dstSelect, takeBtn, dropBtn) {
|
||||
return {
|
||||
init : function (srcSelect, dstSelect, takeBtn, dropBtn) {
|
||||
moveItems(takeBtn, srcSelect, dstSelect);
|
||||
moveItems(dropBtn, dstSelect, srcSelect);
|
||||
formSubmit(dstSelect);
|
||||
}
|
||||
}.init(srcSelect, dstSelect, takeBtn, dropBtn);
|
||||
};
|
||||
}(this));
|
||||
@@ -0,0 +1,30 @@
|
||||
$(function(){
|
||||
|
||||
//Живой поиск
|
||||
$('.searching').bind("change keyup input click", function() {
|
||||
if(this.value.length >= 2){
|
||||
$.ajax({
|
||||
type: 'post',
|
||||
url: "phonebook/search", //Путь к обработчику
|
||||
data: {'searching':this.value},
|
||||
response: 'text',
|
||||
success: function(data){
|
||||
$(".search_result").html(data).fadeIn(); //Выводим полученые данные в списке
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
/*$(".search_result").hover(function(){
|
||||
$(".who").blur(); //Убираем фокус с input
|
||||
})
|
||||
|
||||
//При выборе результата поиска, прячем список и заносим выбранный результат в input
|
||||
$(".search_result").on("click", "li", function(){
|
||||
s_user = $(this).text();
|
||||
//$(".who").val(s_user).attr('disabled', 'disabled'); //деактивируем input, если нужно
|
||||
$(".search_result").fadeOut();
|
||||
})*/
|
||||
|
||||
})
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
<IfModule mod_php4.c>
|
||||
php_flag engine Off
|
||||
</IfModule>
|
||||
<IfModule mod_php5.c>
|
||||
php_flag engine Off
|
||||
</IfModule>
|
||||
<IfModule mod_php6.c>
|
||||
php_flag engine Off
|
||||
</IfModule>
|
||||
<IfModule mod_cgi.c>
|
||||
Options -ExecCGI
|
||||
</IfModule>
|
||||
|
||||
RemoveHandler .cgi .pl .py .pyc .pyo .phtml .php .php3 .php4 .php5 .php6 .pcgi .pcgi3 .pcgi4 .pcgi5 .pchi6 .inc
|
||||
RemoveType .cgi .pl .py .pyc .pyo .phtml .php .php3 .php4 .php5 .php6 .pcgi .pcgi3 .pcgi4 .pcgi5 .pchi6 .inc
|
||||
SetHandler None
|
||||
SetHandler default-handler
|
||||
|
||||
# Remove both lines below if you want to render HTML files from the upload folder
|
||||
AddType text/plain .html
|
||||
AddType text/plain .htm
|
||||
@@ -0,0 +1,85 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>CKFinder Changelog</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1 id="ckfinder-changelog">CKFinder Changelog</h1>
|
||||
<p><a href="http://cksource.com/ckfinder">CKFinder</a></p>
|
||||
<p>Copyright (c) 2007-2016, CKSource - Frederico Knabben. All rights reserved.</p>
|
||||
<h2 id="version-3-4-1">Version 3.4.1</h2>
|
||||
<h3 id="new-features">New Features</h3>
|
||||
<ul>
|
||||
<li class="net">Added support for FTP storage.</li></ul>
|
||||
<h3 id="fixed-issues">Fixed Issues</h3>
|
||||
<ul>
|
||||
<li class="net">Improved Thumbnail command performance.</li></ul>
|
||||
<h3 id="localization-updates">Localization Updates</h3>
|
||||
<ul>
|
||||
<li>Updated: Greek and Turkish.</li></ul>
|
||||
<h2 id="version-3-4">Version 3.4</h2>
|
||||
<h3 id="new-features">New Features</h3>
|
||||
<ul>
|
||||
<li>The <a href="http://docs.cksource.com/ckfinder3/#!/api/CKFinder.Application-event-settings_change_GROUP_NAME"><code>settings:change:GROUP:NAME</code></a> event has a new parameter: <code>previousValue</code>.</li><li>Added the <a href="https://cksource.com/ckfinder/demo#compact-ui">Compact View</a> for displaying files in columns (not supported in IE9).</li><li>The <a href="http://docs.cksource.com/ckfinder3/#!/api/CKFinder.Config-cfg-defaultViewType"><code>defaultViewType</code></a> configuration option accepts a new value: <code>compact</code>.</li><li>Added the <code>width</code> parameter for columns defined for List View in the <a href="http://docs.cksource.com/ckfinder3/#!/api/CKFinder.Application-event-listView_columns"><code>listView:columns</code></a> event.</li><li>Added the "OK" button to information dialogs (those created using the <code>dialog:info</code> request).</li><li class="net">Improved configuration validation.</li><li class="net">Added progress tracking for time-consuming operations.</li><li class="net">Added support for IIS virtual directories in the local storage adapter.</li></ul>
|
||||
<h3 id="fixed-issues">Fixed Issues</h3>
|
||||
<ul>
|
||||
<li>Added the missing <code>command:before:FileUpload</code>, <code>command:ok:FileUpload</code> and <code>command:error:FileUpload</code> events for uploading files.</li><li>Fixed focus in the settings panel when changing the view type.</li><li>Fixed double <code>toolbar:reset:Main:folder</code> event in compact mode when the user selects a folder in the files pane.</li><li>Fixed keyboard navigation for disabled context menu items.</li><li>Removed the possibility to invoke the Delete File command by keyboard inside a folder with <code>ACL FILE_DELETE</code> set to <code>false</code>.</li><li>Removed the possibility to invoke the Rename File command by keyboard inside a folder with <code>ACL FILE_RENAME</code> set to <code>false</code>.</li><li>Fixed drag&drop uploads in List View.</li><li>Updated Javascript code prettifier for samples.</li><li class="php">Fixed file permission issue occurring during file upload on some IIS server configurations.</li><li class="net">Fixed HTML file extension matching.</li><li class="net">Fixed URL generation for resized images in backends that use the Proxy command.</li><li class="net">Added missing file size field to the SaveImage command response.</li><li class="net">Improved thumbnail caching.</li></ul>
|
||||
<h3 id="localization-updates">Localization Updates</h3>
|
||||
<ul>
|
||||
<li>Added: Swiss German (thanks to <a href="https://twitter.com/mirogrenda">Miro Grenda</a>!) and Ukrainian (thanks to Holovin Yevhen Nikolayevich!).</li><li>Updated: Chinese, Czech, Esperanto, French, German, Kurdish, Latvian, Polish, Russian, Slovakian, Spanish and Turkish.</li></ul>
|
||||
<h2 id="version-3-3-1">Version 3.3.1</h2>
|
||||
<h3 id="fixed-issues">Fixed Issues</h3>
|
||||
<ul>
|
||||
<li class="net">Fixed performance issue in folders with more than 1000 files.</li></ul>
|
||||
<h2 id="version-3-3">Version 3.3</h2>
|
||||
<h3 id="new-features">New Features</h3>
|
||||
<ul>
|
||||
<li class="php">Added support for Microsoft Azure Storage.</li><li class="net">Added a stable version of the ASP.NET connector.</li><li class="net">Added support for Microsoft Azure Storage.</li><li class="net">Added support for Amazon S3 Storage.</li></ul>
|
||||
<h3 id="backward-incompatible-changes">Backward Incompatible Changes</h3>
|
||||
<ul>
|
||||
<li>Language files have undergone a major reorganization. Obsolete keys were removed.</li><li>Events related to rendering columns in the files pane were changed: <code>listView:file:column:NAME</code>, <code>listView:folder:column:NAME</code>.</li></ul>
|
||||
<h3 id="fixed-issues">Fixed Issues</h3>
|
||||
<ul>
|
||||
<li>Performance improvements for rendering the files pane with thousands of items.</li><li>Thumbnail slider enabled in list view when loading CKFinder.</li><li>Choosing files with double click does not fetch the file URL for some remote backends.</li><li>Invalid time when parsing time in the 12-hour clock system.</li><li class="php">Image Edit: Saving an image that exceeds <code>maxWidth</code>/<code>maxHeight</code> throws an error.</li></ul>
|
||||
<h3 id="localization-updates">Localization Updates</h3>
|
||||
<ul>
|
||||
<li>Added: Bosnian.</li><li>Updated: Brazilian Portuguese, Czech, Esperanto, French, German, Italian, Kurdish, Latvian, Persian, Polish, Russian, Spanish and Swedish.</li></ul>
|
||||
<h2 id="version-3-2-1">Version 3.2.1</h2>
|
||||
<h3 id="fixed-issues">Fixed Issues</h3>
|
||||
<ul>
|
||||
<li>In widget mode (in Internet Explorer/Edge only) the CSRF protection was too strict and did not allow for actions that should be allowed.</li></ul>
|
||||
<h2 id="version-3-2">Version 3.2</h2>
|
||||
<h3 id="new-features">New Features</h3>
|
||||
<ul>
|
||||
<li>Added new view for files pane: a list view with file details.</li><li>Added sorting of files in files pane by name, date and size.</li><li>Added the <a href="http://docs.cksource.com/ckfinder3/#!/api/CKFinder.Config-cfg-listViewIconSize"><code>listViewIconSize</code></a> configuration option.</li><li>Added the <a href="http://docs.cksource.com/ckfinder3/#!/api/CKFinder.Config-cfg-defaultSortBy"><code>defaultSortBy</code></a> configuration option.</li><li>Added the <a href="http://docs.cksource.com/ckfinder3/#!/api/CKFinder.Config-cfg-defaultSortByOrder"><code>defaultSortByOrder</code></a> configuration option.</li><li>Added the <a href="http://docs.cksource.com/ckfinder3/#!/api/CKFinder.Config-cfg-defaultViewType"><code>defaultViewType</code></a> configuration option.</li><li>Added the <a href="http://docs.cksource.com/ckfinder3/#!/api/CKFinder.Application-event-listView_columns"><code>listView:columns</code></a> event.</li><li>Added the <a href="http://docs.cksource.com/ckfinder3/#!/api/CKFinder.Application-event-listView_file_column_NAME"><code>listView:file:column:NAME</code></a> event.</li><li>Added the <a href="http://docs.cksource.com/ckfinder3/#!/api/CKFinder.Application-event-listView_folder_column_NAME"><code>listView:folder:column:NAME</code></a> event.</li><li>Added the <a href="http://docs.cksource.com/ckfinder3/#!/api/CKFinder.Application-event-resources_show_before"><code>resources:show:before</code></a> event.</li><li>Added the <a href="http://docs.cksource.com/ckfinder3/#!/api/CKFinder.Application-event-dialog_close_NAME"><code>dialog:close:NAME</code></a> event.</li><li>Added the <a href="http://docs.cksource.com/ckfinder3/#!/api/CKFinder.Application-request-file_getActive"><code>file:getActive</code></a> request.</li><li>Added the <a href="http://docs.cksource.com/ckfinder3/#!/api/CKFinder.Application-request-csrf_getToken"><code>csrf:getToken</code></a> request.</li><li>Added the <code>sendPostAsJson</code> parameter to the <a href="http://docs.cksource.com/ckfinder3/#!/api/CKFinder.Application-request-command_send"><code>command:send</code></a> request</li><li>The <code>view</code> parameter for the <a href="http://docs.cksource.com/ckfinder3/#!/api/CKFinder.Application-request-page_create"><code>page:create</code></a> request is now optional.</li></ul>
|
||||
<h3 id="fixed-issues">Fixed Issues</h3>
|
||||
<ul>
|
||||
<li>Individual settings views have a proper name in the <a href="http://docs.cksource.com/ckfinder3/#!/api/CKFinder.Application-event-view_NAME"><code>view:NAME</code></a> event instead of a single <code>Setting</code>.</li><li>Compact mode: Keyboard navigation in breadcrumbs is inverted for RTL languages.</li><li>Fixed an issue that prevented to move or copy over 250 files on a default PHP installation.</li><li>Fixed wrong error message for an empty file name.</li><li>Fixed detection of swipe direction when opening panels on touch screen devices.</li><li>Compact mode: Focus on filter box is lost when typing.</li><li>Thumbnails are not refreshed after editing an image.</li><li>Files filter is not refreshed after clicking a folder.</li><li>Focus is lost after moving files.</li><li>The toolbar is unnecessarily rendered when lazy loading of a folder finishes and a file was selected.</li></ul>
|
||||
<h3 id="localization-updates">Localization Updates</h3>
|
||||
<ul>
|
||||
<li>Added: Esperanto.</li></ul>
|
||||
<h2 id="version-3-1">Version 3.1</h2>
|
||||
<h3 id="security-updates">Security Updates</h3>
|
||||
<p>As a result of security testing and hacking that we did on CKFinder 3 we discovered some potential security concerns in the server-side part of the application.
|
||||
These issues affected actions that only authenticated users could perform solely in locations specified in your CKFinder backends configuration, but since
|
||||
in some cases it was possible to skip ACL checks or file extension checks, <strong>an upgrade is highly recommended</strong>.</p>
|
||||
<h3 id="new-features">New Features</h3>
|
||||
<ul>
|
||||
<li>Improved accessibility. Added compatibility with screen readers.</li><li>Reworked keyboard navigation in the entire application. Implemented custom <kbd>Tab</kbd> key support to resolve inconsistency between browsers.</li><li>Added the Keyboard Shortcuts dialog window — press <kbd>?</kbd> to open it.</li><li>Greatly improved application performance when loading files from remote locations (e.g. Amazon S3).</li><li>Improved performance by reducing the number of situations when the entire files pane is reloaded.</li><li>Improved performance by caching files on subsequent clicks of the folder.</li><li>Added Microsoft Edge compatibility.</li><li>Added preview of PDF files in the gallery.</li><li>Added drag and drop support for files onto folders and breadcrumbs in compact mode.</li><li>Added busy dialog and progress tracking for time-consuming operations.</li><li>Added Proxy command support. It is now possible to view files stored outside the document root or in remote backends in the gallery.</li><li class="php">Added the <a href="http://docs.cksource.com/ckfinder3-php/commands.html#command_proxy"><code>Proxy</code></a> command and the corresponding <a href="http://docs.cksource.com/ckfinder3-php/configuration.html#backend_option_useProxyCommand"><code>useProxyCommand</code></a> backend configuration option.</li><li>Reworked the Choose Scaled dialog window.</li><li>Edit Image feature now warns against closing without saving changes.</li><li>Added the <a href="http://docs.cksource.com/ckfinder3/#!/api/CKFinder.Application-request-folder_getIcon"><code>folder:getIcon</code></a> request.</li><li>Removed Maximize/Minimize buttons in popup mode as the browser provides native controls for it.</li><li class="php">Improved performance by caching file previews.</li><li class="php">Added the <a href="http://docs.cksource.com/ckfinder3-php/configuration.html#configuration_options_cache"><code>cache</code></a> option that configures cache lifetime for various CKFinder components.</li><li class="php">Added the <a href="http://docs.cksource.com/ckfinder3-php/configuration.html#configuration_options_tempDirectory"><code>tempDirectory</code></a> option that configures the path to the temporary files folder used by CKFinder.</li><li class="php">Added the <a href="http://docs.cksource.com/ckfinder3-php/configuration.html#configuration_options_sessionWriteClose"><code>sessionWriteClose</code></a> option that configures whether the connector should close write access to the session to avoid performance issues.</li><li class="php">Added the <a href="http://docs.cksource.com/ckfinder3-php/commands.html#command_operation"><code>Operation</code></a> command that tracks the progress of operation in time-consuming connector commands.</li></ul>
|
||||
<h3 id="backward-incompatible-changes">Backward Incompatible Changes</h3>
|
||||
<ul>
|
||||
<li>Context menu API has undergone major changes. See the updated <a href="http://docs.cksource.com/ckfinder3/#!/guide/dev_contextmenu-section-ckfinder-3.1%2B">context menu documentation</a>.</li><li>Toolbar API events <a href="http://docs.cksource.com/ckfinder3/#!/api/CKFinder.Application-event-toolbar_reset_NAME"><code>toolbar:reset:NAME</code></a> and <a href="http://docs.cksource.com/ckfinder3/#!/api/CKFinder.Application-event-toolbar_reset_NAME_EVENT"><code>toolbar:reset:NAME:EVENT</code></a> - <code>data.toolbar</code> is now a <code>Backbone.Collection</code>, not an array.</li><li>The <a href="http://docs.cksource.com/ckfinder3/#!/api/CKFinder.Application-request-file_getIcon"><code>file:getIcon</code></a> request no longer has the <code>extension</code> parameter. Pass the <code>file</code> parameter instead.</li></ul>
|
||||
<h3 id="fixed-issues">Fixed Issues</h3>
|
||||
<ul>
|
||||
<li>Compact mode: Breadcrumb was hidden when entering a folder with many files.</li><li>Compact mode: There was no way to enter a folder on Android.</li><li>Compact mode: Broken border around CKFinder when viewing the top level folder with resource types.</li><li>Edit Image: Loading an image was not working when the domain name contained a dash character.</li><li>Edit Image: Context menu item was enabled when the user had no permissions to edit the file.</li><li>Edit Image: Resize option was not available in compact mode.</li><li>Edit Image: Reset button should have been disabled if there was nothing to reset.</li><li>Edit Image: Fixed validation of provided values in the edit image controls.</li><li>Edit Image: There was no information about failing to save a file.</li><li>Edit Image: It was possible to crop an area bigger than the edited image.</li><li>Edit Image: Fixed progress bar behavior.</li><li>Filter input: Clearing filter input did not result in showing all files in IE9.</li><li>Filter input: Filter should remember its state if it is still active.</li><li>Focusing elements: Focus in context menu and toolbar did not cycle.</li><li>Focusing elements: Focus was lost after resizing an image.</li><li>Focusing elements: Focus was not remembered when returning to the files pane.</li><li>Focusing elements: Pressing <kbd>Tab</kbd> should focus the first item in a component (file, folder, toolbar button), not the container.</li><li>Focusing elements: Lock focus chain within the settings panel.</li><li>Scrolling files: Scrolling on mobile devices was troublesome and sometimes did not work at all.</li><li>Scrolling files: Files were unnecessarily selected on scroll on mobile devices.</li><li>Thumbnails: Problem with thumbnails in widgets/popups when <a href="http://docs.cksource.com/ckfinder3/#!/api/CKFinder.Config-cfg-connectorPath"><code>connectorPath</code></a> did not include the domain.</li><li>Thumbnails: Thumbnails loaded with a significant delay for a larger number of files.</li><li>Thumbnails: Thumbnails were not refreshed in certain scenarios.</li><li>iOS/Safari: Thumbnails were not shown.</li><li>iOS/Safari: Popup sample did not work.</li><li>iOS/Safari: The configured height of the widget was ignored, instead CKFinder height depended on the number of files inside.</li><li>iOS/Safari: Downloading files did not work.</li><li>Setting global configuration did not work for widgets and popups.</li><li>There was no Close button available after file upload.</li><li>It should not be possible to move dialog windows.</li><li>Fixed various UI glitches in the RTL interface.</li><li>Video or image sometimes overlapped file preview controls in file preview.</li><li>Delete files confirmation dialog did not appear when the files pane was scrolled.</li><li>Changed the confusing empty folder message in the read-only mode.</li><li>Removed the notification about correctly uploaded file in IE9.</li><li>Resolved an issue with validating license names that started with <code>www[0-9]</code> or that contained upper case letters.</li><li>In certain scenarios not all available toolbar buttons were shown in CKFinder.</li><li>Fixed the look of the "More" drop-down in the toolbar.</li><li class="php">Empty <code>directory</code> key in the backend definition resulted in a double slash in the file URL.</li></ul>
|
||||
<h3 id="localization-updates">Localization Updates</h3>
|
||||
<ul>
|
||||
<li>Added: Basque, Kurdish.</li><li>Updated: Brazilian Portuguese, Chinese, Croatian, Czech, Danish, Esperanto, Estonian, French, German, Greek, Hungarian, Italian, Korean, Norwegian, Persian, Polish and Russian.</li></ul>
|
||||
<h2 id="version-3-0">Version 3.0</h2>
|
||||
<p>A brand new version of CKFinder, currently available only for PHP. For an overview of new features, see the <a href="http://cksource.com/blog/CKFinder-3.0-for-PHP-Released">announcement about CKFinder 3.0 for PHP</a>.</p>
|
||||
<ul>
|
||||
<li>New architecture based on jQuery, jQuery Mobile, Backbone, Marionette, and RequireJS.</li><li>Built-in image editor.</li><li>Customizable skins compatible with jQuery UI Themeroller.</li><li>Full responsiveness, great mobile support.</li><li>Cloud storage support (Amazon S3, Dropbox) and FTP connector.</li></ul>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,295 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>CKFinder License</title>
|
||||
</head>
|
||||
<body>
|
||||
<h2>CKFinder License Agreement, Version 3.1</h2>
|
||||
|
||||
<p>This document (“Agreement”) is a legal agreement between You, either an individual or a Legal Entity, and
|
||||
CKSource sp. z o.o. sp.k., with its registered office in Warsaw, at ul. Zygmunta Słomińskiego 15 lok. 508, 00-195
|
||||
Warsaw, Poland, NIP number 5252621537, REGON: 361766395 (“CKSource”), covering Your permissions to
|
||||
reproduce and distribute the Software under the License terms defined hereby.</p>
|
||||
|
||||
<h3>1. Definitions</h3>
|
||||
|
||||
<p>“Agreement Name” shall mean the name used to reference this Agreement in any context, which
|
||||
is “CKFinder License Agreement 3.1” or “CKFinder License 3.1”.</p>
|
||||
|
||||
<p>“Software” or “CKFinder” shall mean the copyrighted material owned by CKSource,
|
||||
subject to the terms of this License. The Software is publicly, uniquely, and in its entirety recognizable
|
||||
by the “CKFinder” name (“Software Name”).</p>
|
||||
|
||||
<p>“Software Release” or “Release” shall mean a set of files distributed by CKSource, or
|
||||
anyone authorized to distribute it, that represents the Software. A Release is uniquely identified by the
|
||||
Software Name and a code. Such code is generally referenced as the Software version or revision number, or a
|
||||
combination of both.</p>
|
||||
|
||||
<p>“Release Date” shall mean the day that CKSource started distributing a Release.</p>
|
||||
|
||||
<p>“Product” shall mean a single computer program or one or more websites (“Program”)
|
||||
(i) owned by You, or (ii) to which the owner grants You the permission to act in behalf of the owner for the
|
||||
purposes of this Agreement. A Program family or a group of Programs does not constitute a Product for the
|
||||
scope of this Agreement. A Program that goes in competition with the Software in the marketplace does not
|
||||
constitute a valid Product for the scope of this Agreement.</p>
|
||||
|
||||
<p>“Development Server” shall mean a computer with one or more computer central processing units
|
||||
(CPU’s) that operates for the exclusive purpose of software development or software testing.</p>
|
||||
|
||||
<p>“Development Activity” shall mean the act of interacting with the Software or one of its
|
||||
Releases, in any number of Products owned or produced by You, with the intent of installation,
|
||||
customization, configuration, testing, documentation, or any other software development activity related to
|
||||
the Software.</p>
|
||||
|
||||
<p>“Developer” shall mean an authorized person designated by You to perform Development
|
||||
Activities.</p>
|
||||
|
||||
<p>“Production Website” shall mean a Product with the Software installed, which already had
|
||||
Development Activities performed, and that has been delivered to end-users for production usage. Maintenance
|
||||
activities performed on Production Websites, excluding software development activities related to the
|
||||
Software, are not considered Development Activities.</p>
|
||||
|
||||
<p>“Hostname” shall mean a unique name by which a website is reachable in a network. This includes,
|
||||
but is not limited to, a website IP address. (For example, if a website is reachable by the Internet
|
||||
address “<a href="http://www.example.com/">http://www.example.com/</a>”, the Hostname
|
||||
is “<a href="http://www.example.com/">www.example.com</a>”.)</p>
|
||||
|
||||
<p>“Legal Entity” shall mean the union of the acting entity and all other entities that control, are
|
||||
controlled by, or are under common control of that entity. For the purposes of this definition, "control"
|
||||
means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by
|
||||
contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii)
|
||||
beneficial ownership of such entity.</p>
|
||||
|
||||
<p>“Effective Date” means the date on which the Legal Evidence is made effective.</p>
|
||||
|
||||
<p>“You” (or “Your”) shall mean an individual or a Legal Entity exercising permissions
|
||||
granted by the License and accepting this Agreement.</p>
|
||||
|
||||
<h3>2. Grant of License</h3>
|
||||
|
||||
<p>Subject to the terms of this Agreement, CKSource hereby grants You, in one of the License Models described in
|
||||
Section 4, a non-exclusive, perpetual, irrevocable, royalty free, worldwide license (“License”)
|
||||
to use, reproduce, modify, and distribute a Software Release in a collective work assembled with the
|
||||
Product.</p>
|
||||
|
||||
<p>You should carefully read the following terms and conditions before using, installing, copying, or
|
||||
distributing the Software. Unless otherwise agreed in writing by CKSource, your use, installation, copying,
|
||||
or distribution of the Software indicates your acceptance of this License.</p>
|
||||
|
||||
<h3>3. Scope of License</h3>
|
||||
|
||||
<p>All rights of any kind to the Software, which are not expressly granted in this Agreement, are entirely and
|
||||
exclusively reserved to and by CKSource. The Software is protected by applicable national and international
|
||||
laws and treaties.</p>
|
||||
|
||||
<p>You may use, install, copy, and distribute the Software solely as provided in this Agreement. You may not
|
||||
rent, lease, loan, sublicense, reverse engineer, decompile, disassemble, or create derivative works based on
|
||||
the Software, in whole or in part, nor permit anyone else to do so.</p>
|
||||
|
||||
<p>It is agreed that in exchange for the license set forth herein, you will pay a license fee (“License
|
||||
Fee”). The fee value will be specified by CKSource at the moment of the purchase.</p>
|
||||
|
||||
<h3>4. License Models</h3>
|
||||
|
||||
<p>The Software may be assembled with the Product and redistributed in respect of one, and only one, of the
|
||||
following models (“License Models”) of Your choice:</p>
|
||||
|
||||
<ul>
|
||||
<li>a) (“Basic”) Assembling the Software into a Product distributed as a single website (“Site”).
|
||||
The Site URL (“URL”) must be specified at the moment of purchase. The license will not be
|
||||
valid for sub-domains of the specified URL. This license includes 2 Developer licenses that cover
|
||||
Development Activities exclusively related to the Site.
|
||||
</li>
|
||||
<li>b) (“Professional”) Assembling the Software with a maximum of 3 websites (“Professional
|
||||
Sites”) owned or produced by You. Sites produced by third-parties with Software produced by You
|
||||
are not included in this License Model. This license includes 5 Developer licenses that cover
|
||||
Development Activities exclusively related to Professional Sites.
|
||||
</li>
|
||||
<li>c) (“Developer”) License granting Development Activities to a single Developer
|
||||
Person.
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<p>A valid Developer license is required for every single Developer Person. Developer licenses cannot be shared
|
||||
among different Developer Persons. Non-Development Activities on Production Websites do not require
|
||||
Developer licenses.</p>
|
||||
|
||||
<p>License Fee values may differ depending on the license model.</p>
|
||||
|
||||
<h3>5. Unlicensed Copies</h3>
|
||||
|
||||
<p>If You did not pay License Fee, You may use unlicensed copies of CKFinder for the exclusive purpose of
|
||||
demonstration. In this case You will be using CKFinder in "demo mode". Without derogating from the
|
||||
forgoing, You may not use CKFinder in "demo mode" for commercial purposes. CKFinder shall only be
|
||||
used for evaluation purposes and may not be used or disclosed for any other purposes, including, without
|
||||
limitation, for external distribution. You may not remove the demo notices from the interface nor disable
|
||||
the ability to display such notices or otherwise modify CKFinder. Product support, if any, is not offered
|
||||
for CKFinder in "demo mode".</p>
|
||||
|
||||
<h3>6. Agreement Acceptance</h3>
|
||||
|
||||
<p>This Agreement is automatically accepted by both parties as long as You are in possession of legal evidence (“Legal
|
||||
Evidence”) that the acceptance has taken place. The Legal Evidence can be represented by (i) a copy of
|
||||
this Agreement signed by You and CKSource or (ii) a valid Certificate of License Ownership, provided by
|
||||
CKSource and addressed to You. The Legal Evidence must precisely indicate this Agreement Name, the Software
|
||||
Name, the License Model You have chosen, and the following restrictive information, if applicable:</p>
|
||||
|
||||
<ul>
|
||||
<li>a) If You have chosen the Basic License Model, the Site Hostname must be indicated in the Legal
|
||||
Evidence. This Agreement will be valid for the Software assembled with the Site publicized under the
|
||||
Site Hostname only. Other Sites are excluded from this Agreement as long as a Legal Evidence is not
|
||||
produced for each of these Sites.
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<p>Legal Evidences for different combinations of License Models, Sites, and Products will not restrict each
|
||||
other and will not interfere in the rights granted to You by each of them.</p>
|
||||
|
||||
<p>Legal Evidences are not transferable to different Sites and Products.</p>
|
||||
|
||||
<h3>7. Limitation on Releases</h3>
|
||||
|
||||
<p>This agreement is valid for all Releases of the Software with Release Dates within or before the 365 days
|
||||
that follow the Effective Date (“Upgrade Period”). CKSource has no obligation to provide you any
|
||||
Release that is not released for general distribution to other CKSource licensees. Nothing in this Agreement
|
||||
shall be construed to obligate CKSource to provide additional Releases to You under any circumstances.</p>
|
||||
|
||||
<h3>8. Support</h3>
|
||||
|
||||
<p>CKSource shall provide support for Developers covered by valid Developer licenses for the period of 365 days
|
||||
following the Effective Date (“Support Period”). Support shall be limited to electronic
|
||||
messaging access. CKSource shall keep You informed, either per CKSource readiness or by following your
|
||||
request, including changes to it, about the rules and procedures that You must perform to enjoy support
|
||||
under the terms of this Agreement. Support topics shall be limited to the following (each a “Support
|
||||
Request”):</p>
|
||||
|
||||
<ul>
|
||||
<li>a) problem solving,</li>
|
||||
<li>b) bug reporting,</li>
|
||||
<li>c) and documentation clarification.</li>
|
||||
</ul>
|
||||
|
||||
<p>The number of Support Requests that CKSource is entitled to accept from You is limited to 2 per month if You
|
||||
have chosen the Basic license model, or 5 per month if You have chosen the Professional license model.
|
||||
CKSource may refuse Support Requests that exceed these limits.</p>
|
||||
|
||||
<p>CKSource is not in any way obliged to perform bug fixing or custom development activities as a result of a
|
||||
Support Request.</p>
|
||||
|
||||
<h3>9. License Key</h3>
|
||||
|
||||
<p>Following a valid License purchase, a unique license key (the "License Key") may be provided to
|
||||
You, which allows Software activation. The License Key is subject to the restrictions set forth in this
|
||||
License and may not be disclosed or distributed in any way. The disclosure or distribution of the License
|
||||
Key shall constitute a breach of this License, the effect of which shall be the automatic termination and
|
||||
revocation of any and all rights granted herein.</p>
|
||||
|
||||
<h3>10. Source Code</h3>
|
||||
|
||||
<p>The original source code ("Source Code") of the Software may be distributed by CKSource alongside
|
||||
its executable version, or as an integral part of it. You may modify and compile the Source Code. The Source
|
||||
Code or its modified version can be copied and distributed exclusively within the scope of this license, as
|
||||
defined in the "License Model" terms of this license, as long as a valid license has been
|
||||
purchased for the distribution target. CKSource retains all rights over the Source Code and all its modified
|
||||
versions. Redistributions of the Source Code and modified versions of it must contain the original headers
|
||||
and copyright notices. Modifications to the Source Code must be explicitly and entirely identified in the
|
||||
Source Code files. This section of the license supersedes all modification restrictions imposed by other
|
||||
sections. You are not allowed to remove copyright notices nor make changes to the license validation code
|
||||
present in the Source Code.</p>
|
||||
|
||||
<h3>11. License Fee</h3>
|
||||
|
||||
<p>In consideration for the License granted in this Agreement during the term of this Agreement, You agreed to
|
||||
pay to CKSource a one time fee (“License Fee”).</p>
|
||||
|
||||
<p>In consideration for the Software upgrades access and support services provided during the Upgrade Period and
|
||||
Support Period, You shall pay a yearly fee (“Annual Support and Upgrade Fee”).</p>
|
||||
|
||||
<p>The License Fee and the Annual Support and Upgrade Fee amount shall be specified by CKSource at the moment of
|
||||
the purchase as a single unified price.</p>
|
||||
|
||||
<p>The fees listed in this Agreement do not include taxes. If CKSource is required to pay any sales, use,
|
||||
property, excise, value added, gross receipts, withholding or other taxes levied on the Software or support
|
||||
under this Agreement or on Your use thereof, then such taxes shall be billed to and paid by You. This
|
||||
Section does not apply to taxes based on CKSource net income, franchise taxes or CKSource’s employer
|
||||
contributions and taxes.</p>
|
||||
|
||||
<p>You understand that CKSource uses third-party paying agents to process selected payments. You understand that
|
||||
until payments are not received and verified by the paying agent, this Agreement is not valid.</p>
|
||||
|
||||
<p>All payments made hereunder are nonrefundable. You may not withhold or set off any amounts due under this
|
||||
Agreement. Failure to pay any fee when due shall constitute a material breach of this Agreement. In
|
||||
addition, if You fail to make any payments when due for support, upon written notice to You, CKSource shall
|
||||
cease providing support.</p>
|
||||
|
||||
<h3>12. Automatic Renewal</h3>
|
||||
|
||||
<p>You may opt to automatically extend the expiration date for both the Upgrade Period and Support Period by
|
||||
successive cycles of 365 days (each one a “Renewal”). In such case, you agree to pay a fee for
|
||||
each Renewal at the beginning of each cycle. The annual Renewal fee shall be informed by CKSource at the
|
||||
moment of the purchase and optionally agreed by you.</p>
|
||||
|
||||
<p>If you opted to have automatic Renewals, CKSource shall send you a payment request for the Renewal fee at any
|
||||
moment following the first day of each Renewal period. You shall perform the full payment in 30 calendar
|
||||
days following the payment request.</p>
|
||||
|
||||
<p>Both parties can discontinue the automatic Renewals by written notification to the other party before the
|
||||
beginning of extension cycles.</p>
|
||||
|
||||
<h3>13. Reservation of Rights and Ownership</h3>
|
||||
|
||||
<p>CKSource reserves all rights not expressly granted to You in this Agreement. The Software is protected by
|
||||
copyright and other intellectual property laws and treaties. CKSource owns the title, copyright, and other
|
||||
intellectual property rights in the Software. The Software is licensed, not sold. This Agreement does not
|
||||
grant you any rights to the Software's trademarks or services.</p>
|
||||
|
||||
<h3>14. Termination</h3>
|
||||
|
||||
<p>Without prejudice to any other rights, this Agreement automatically terminates if You fail to comply with the
|
||||
terms and conditions of this Agreement. You may terminate this Agreement at any time without cause. In case
|
||||
of termination, in any circumstance, payments issued by You will not be reimbursed.</p>
|
||||
|
||||
<p>You shall immediately discontinue distribution of Product, assembled with the Software, upon expiration or
|
||||
termination of this Agreement.</p>
|
||||
|
||||
<h3>15. Warranty</h3>
|
||||
|
||||
<p>CKSource warrants that it has full title and ownership to the Software and has the authority to grant the
|
||||
license hereunder. To the best of CKSource's knowledge the Software does not infringe upon the
|
||||
intellectual property rights of any third party and that CKSource did not receive any notice regarding any
|
||||
alleged infringement thereof.</p>
|
||||
|
||||
<h3>16. Disclaimer of Warranties</h3>
|
||||
|
||||
<p>With the exclusion of warranties explicitly mentioned in Section 15, the Software and its related material
|
||||
are provided “AS IS” and without warranty of any kind. CKSource expressly disclaims all other
|
||||
warranties, expressed or implied, including, but not limited to, the implied warranties of merchantability
|
||||
and fitness for a particular purpose.</p>
|
||||
|
||||
<h3>17. Exclusion of Incidental, Consequential and Certain Other Damages</h3>
|
||||
|
||||
<p>TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, IN NO EVENT SHALL CKSOURCE BE LIABLE FOR ANY SPECIAL,
|
||||
INCIDENTAL, PUNITIVE, INDIRECT, OR CONSEQUENTIAL DAMAGES WHATSOEVER (INCLUDING, BUT NOT LIMITED TO, DAMAGES
|
||||
FOR LOSS OF PROFITS OR CONFIDENTIAL OR OTHER INFORMATION, FOR BUSINESS INTERRUPTION, FOR PERSONAL INJURY,
|
||||
FOR LOSS OF PRIVACY, FOR FAILURE TO MEET ANY DUTY INCLUDING OF GOOD FAITH OR OF REASONABLE CARE, FOR
|
||||
NEGLIGENCE, AND FOR ANY OTHER PECUNIARY OR OTHER LOSS WHATSOEVER) ARISING OUT OF OR IN ANY WAY RELATED TO
|
||||
THE USE OF OR INABILITY TO USE THE SOFTWARE, THE PROVISION OF OR FAILURE TO PROVIDE SUPPORT OR OTHER
|
||||
SERVICES, INFORMATON, SOFTWARE, AND RELATED CONTENT THROUGH THE SOFTWARE OR OTHERWISE ARISING OUT OF THE USE
|
||||
OF THE SOFTWARE, OR OTHERWISE UNDER OR IN CONNECTION WITH ANY PROVISION OF THIS AGREEMENT, EVEN IN THE EVENT
|
||||
OF THE FAULT, TORT (INCLUDING NEGLIGENCE), MISREPRESENTATION, STRICT LIABILITY, BREACH OF CONTRACT, AND EVEN
|
||||
IF THE OWNER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</p>
|
||||
|
||||
<h3>18. Limitation of Liability</h3>
|
||||
|
||||
<p>In no event shall CKSource’s liability exceed the license fee paid, if any.</p>
|
||||
|
||||
<h3>19. Governing Law and Venue</h3>
|
||||
|
||||
<p>This Agreement shall be construed and controlled by the laws of Poland, and You and CKSource further consent
|
||||
to exclusive jurisdiction by the courts of Poland.</p>
|
||||
|
||||
<p>END OF AGREEMENT TERMS</p>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,42 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>CKFinder Readme</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1 id="ckfinder-3-for-php">CKFinder 3 for PHP</h1>
|
||||
<p>Thank you for choosing CKFinder.</p>
|
||||
<h2 id="feedback">Feedback</h2>
|
||||
<p>Use <a href="https://github.com/ckfinder/ckfinder/issues">https://github.com/ckfinder/ckfinder/issues</a> to report issues in CKFinder 3 (and its documentation) or submit
|
||||
feature requests.</p>
|
||||
<p>If you are unsure what information to provide when reporting a bug, check <a href="http://docs.cksource.com/ckfinder3/#!/guide/dev_issues_readme">http://docs.cksource.com/ckfinder3/#!/guide/dev_issues_readme</a></p>
|
||||
<h2 id="translations">Translations</h2>
|
||||
<p>In order to submit translations for CKFinder please visit <a href="https://github.com/ckfinder/ckfinder-translations">https://github.com/ckfinder/ckfinder-translations</a></p>
|
||||
<h2 id="documentation">Documentation</h2>
|
||||
<p>CKFinder is made from two parts: the client side part and the server side connector(s).</p>
|
||||
<p>The client side part is common across all distributions (PHP and ASP.NET, Java in the future), while
|
||||
the server side parts are different for each language, that's why there are multiple documentation websites available.</p>
|
||||
<h3 id="ckfinder-3-documentation-http-docs-cksource-com-ckfinder3-">CKFinder 3 Documentation - <a href="http://docs.cksource.com/ckfinder3/">http://docs.cksource.com/ckfinder3/</a></h3>
|
||||
<p>This website contains documentation about the client side part of CKFinder, common for all versions of CKFinder 3
|
||||
and includes information about:</p>
|
||||
<ul>
|
||||
<li>Integrating CKFinder with your website or with CKEditor.</li>
|
||||
<li>Client side configuration options.</li>
|
||||
<li>API documentation.</li>
|
||||
<li>Tutorials about creating JavaScript plugins.</li>
|
||||
<li>Tutorials about creating skins.</li>
|
||||
</ul>
|
||||
<h3 id="ckfinder-3-for-php-documentation-http-docs-cksource-com-ckfinder3-php-">CKFinder 3 for PHP Documentation - <a href="http://docs.cksource.com/ckfinder3-php/">http://docs.cksource.com/ckfinder3-php/</a></h3>
|
||||
<p>This website contains documentation about the PHP connector for CKFinder 3 and includes information about:</p>
|
||||
<ul>
|
||||
<li>Enabling the PHP connector.</li>
|
||||
<li>Configuring the PHP connector.</li>
|
||||
<li>Tutorials about creating PHP plugins.</li>
|
||||
</ul>
|
||||
<h2 id="license">License</h2>
|
||||
<p>Copyright (c) 2007-2016, CKSource - Frederico Knabben. All rights reserved.</p>
|
||||
<p>To purchase a license for CKFinder visit <a href="http://cksource.com/ckfinder">http://cksource.com/ckfinder</a></p>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,21 @@
|
||||
<!DOCTYPE html>
|
||||
<!--
|
||||
Copyright (c) 2007-2016, CKSource - Frederico Knabben. All rights reserved.
|
||||
For licensing, see LICENSE.html or http://cksource.com/ckfinder/license
|
||||
-->
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no">
|
||||
<title>CKFinder 3 - File Browser</title>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<script src="ckfinder.js"></script>
|
||||
<script>
|
||||
CKFinder.start();
|
||||
</script>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
/*
|
||||
Copyright (c) 2007-2016, CKSource - Frederico Knabben. All rights reserved.
|
||||
For licensing, see LICENSE.html or http://cksource.com/ckfinder/license
|
||||
*/
|
||||
|
||||
var config = {};
|
||||
|
||||
// Set your configuration options below.
|
||||
|
||||
// Examples:
|
||||
// config.language = 'pl';
|
||||
// config.skin = 'jquery-mobile';
|
||||
|
||||
CKFinder.define( config );
|
||||
@@ -0,0 +1,175 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* CKFinder Configuration File
|
||||
*
|
||||
* For the official documentation visit http://docs.cksource.com/ckfinder3-php/
|
||||
*/
|
||||
|
||||
/*============================ PHP Error Reporting ====================================*/
|
||||
// http://docs.cksource.com/ckfinder3-php/debugging.html
|
||||
|
||||
// Production
|
||||
error_reporting(E_ALL & ~E_DEPRECATED & ~E_STRICT);
|
||||
ini_set('display_errors', 0);
|
||||
|
||||
// Development
|
||||
// error_reporting(E_ALL);
|
||||
// ini_set('display_errors', 1);
|
||||
|
||||
/*============================ General Settings =======================================*/
|
||||
// http://docs.cksource.com/ckfinder3-php/configuration.html
|
||||
|
||||
$config = array();
|
||||
|
||||
/*============================ Enable PHP Connector HERE ==============================*/
|
||||
// http://docs.cksource.com/ckfinder3-php/configuration.html#configuration_options_authentication
|
||||
|
||||
$config['authentication'] = function () {
|
||||
return false;
|
||||
};
|
||||
|
||||
/*============================ License Key ============================================*/
|
||||
// http://docs.cksource.com/ckfinder3-php/configuration.html#configuration_options_licenseKey
|
||||
|
||||
$config['licenseName'] = '';
|
||||
$config['licenseKey'] = '';
|
||||
|
||||
/*============================ CKFinder Internal Directory ============================*/
|
||||
// http://docs.cksource.com/ckfinder3-php/configuration.html#configuration_options_privateDir
|
||||
|
||||
$config['privateDir'] = array(
|
||||
'backend' => 'default',
|
||||
'tags' => '.ckfinder/tags',
|
||||
'logs' => '.ckfinder/logs',
|
||||
'cache' => '.ckfinder/cache',
|
||||
'thumbs' => '.ckfinder/cache/thumbs',
|
||||
);
|
||||
|
||||
/*============================ Images and Thumbnails ==================================*/
|
||||
// http://docs.cksource.com/ckfinder3-php/configuration.html#configuration_options_images
|
||||
|
||||
$config['images'] = array(
|
||||
'maxWidth' => 1600,
|
||||
'maxHeight' => 1200,
|
||||
'quality' => 80,
|
||||
'sizes' => array(
|
||||
'small' => array('width' => 480, 'height' => 320, 'quality' => 80),
|
||||
'medium' => array('width' => 600, 'height' => 480, 'quality' => 80),
|
||||
'large' => array('width' => 800, 'height' => 600, 'quality' => 80)
|
||||
)
|
||||
);
|
||||
|
||||
/*=================================== Backends ========================================*/
|
||||
// http://docs.cksource.com/ckfinder3-php/configuration.html#configuration_options_backends
|
||||
|
||||
$config['backends'][] = array(
|
||||
'name' => 'default',
|
||||
'adapter' => 'local',
|
||||
'baseUrl' => '/ckfinder/userfiles/',
|
||||
// 'root' => '', // Can be used to explicitly set the CKFinder user files directory.
|
||||
'chmodFiles' => 0777,
|
||||
'chmodFolders' => 0755,
|
||||
'filesystemEncoding' => 'UTF-8',
|
||||
);
|
||||
|
||||
/*================================ Resource Types =====================================*/
|
||||
// http://docs.cksource.com/ckfinder3-php/configuration.html#configuration_options_resourceTypes
|
||||
|
||||
$config['defaultResourceTypes'] = '';
|
||||
|
||||
$config['resourceTypes'][] = array(
|
||||
'name' => 'Files', // Single quotes not allowed.
|
||||
'directory' => 'files',
|
||||
'maxSize' => 0,
|
||||
'allowedExtensions' => '7z,aiff,asf,avi,bmp,csv,doc,docx,fla,flv,gif,gz,gzip,jpeg,jpg,mid,mov,mp3,mp4,mpc,mpeg,mpg,ods,odt,pdf,png,ppt,pptx,pxd,qt,ram,rar,rm,rmi,rmvb,rtf,sdc,sitd,swf,sxc,sxw,tar,tgz,tif,tiff,txt,vsd,wav,wma,wmv,xls,xlsx,zip',
|
||||
'deniedExtensions' => '',
|
||||
'backend' => 'default'
|
||||
);
|
||||
|
||||
$config['resourceTypes'][] = array(
|
||||
'name' => 'Images',
|
||||
'directory' => 'images',
|
||||
'maxSize' => 0,
|
||||
'allowedExtensions' => 'bmp,gif,jpeg,jpg,png',
|
||||
'deniedExtensions' => '',
|
||||
'backend' => 'default'
|
||||
);
|
||||
|
||||
/*================================ Access Control =====================================*/
|
||||
// http://docs.cksource.com/ckfinder3-php/configuration.html#configuration_options_roleSessionVar
|
||||
|
||||
$config['roleSessionVar'] = 'CKFinder_UserRole';
|
||||
|
||||
// http://docs.cksource.com/ckfinder3-php/configuration.html#configuration_options_accessControl
|
||||
$config['accessControl'][] = array(
|
||||
'role' => '*',
|
||||
'resourceType' => '*',
|
||||
'folder' => '/',
|
||||
|
||||
'FOLDER_VIEW' => true,
|
||||
'FOLDER_CREATE' => true,
|
||||
'FOLDER_RENAME' => true,
|
||||
'FOLDER_DELETE' => true,
|
||||
|
||||
'FILE_VIEW' => true,
|
||||
'FILE_CREATE' => true,
|
||||
'FILE_RENAME' => true,
|
||||
'FILE_DELETE' => true,
|
||||
|
||||
'IMAGE_RESIZE' => true,
|
||||
'IMAGE_RESIZE_CUSTOM' => true
|
||||
);
|
||||
|
||||
|
||||
/*================================ Other Settings =====================================*/
|
||||
// http://docs.cksource.com/ckfinder3-php/configuration.html
|
||||
|
||||
$config['overwriteOnUpload'] = false;
|
||||
$config['checkDoubleExtension'] = true;
|
||||
$config['disallowUnsafeCharacters'] = false;
|
||||
$config['secureImageUploads'] = true;
|
||||
$config['checkSizeAfterScaling'] = true;
|
||||
$config['htmlExtensions'] = array('html', 'htm', 'xml', 'js');
|
||||
$config['hideFolders'] = array('.*', 'CVS', '__thumbs');
|
||||
$config['hideFiles'] = array('.*');
|
||||
$config['forceAscii'] = false;
|
||||
$config['xSendfile'] = false;
|
||||
|
||||
// http://docs.cksource.com/ckfinder3-php/configuration.html#configuration_options_debug
|
||||
$config['debug'] = false;
|
||||
|
||||
/*==================================== Plugins ========================================*/
|
||||
// http://docs.cksource.com/ckfinder3-php/configuration.html#configuration_options_plugins
|
||||
|
||||
$config['pluginsDirectory'] = __DIR__ . '/plugins';
|
||||
$config['plugins'] = array();
|
||||
|
||||
/*================================ Cache settings =====================================*/
|
||||
// http://docs.cksource.com/ckfinder3-php/configuration.html#configuration_options_cache
|
||||
|
||||
$config['cache'] = array(
|
||||
'imagePreview' => 24 * 3600,
|
||||
'thumbnails' => 24 * 3600 * 365,
|
||||
'proxyCommand' => 0
|
||||
);
|
||||
|
||||
/*============================ Temp Directory settings ================================*/
|
||||
// http://docs.cksource.com/ckfinder3-php/configuration.html#configuration_options_tempDirectory
|
||||
|
||||
$config['tempDirectory'] = sys_get_temp_dir();
|
||||
|
||||
/*============================ Session Cause Performance Issues =======================*/
|
||||
// http://docs.cksource.com/ckfinder3-php/configuration.html#configuration_options_sessionWriteClose
|
||||
|
||||
$config['sessionWriteClose'] = true;
|
||||
|
||||
/*================================= CSRF protection ===================================*/
|
||||
// http://docs.cksource.com/ckfinder3-php/configuration.html#configuration_options_csrfProtection
|
||||
|
||||
$config['csrfProtection'] = true;
|
||||
|
||||
/*============================== End of Configuration =================================*/
|
||||
|
||||
// Config must be returned - do not change it.
|
||||
return $config;
|
||||
@@ -0,0 +1,20 @@
|
||||
<?php
|
||||
/*
|
||||
* CKFinder
|
||||
* ========
|
||||
* http://cksource.com/ckfinder
|
||||
* Copyright (c) 2007-2016, CKSource - Frederico Knabben. All rights reserved.
|
||||
*
|
||||
* The software, this file and its contents are subject to the CKFinder
|
||||
* License. Please read the license.txt file before using, installing, copying,
|
||||
* modifying or distribute this file or part of its contents. The contents of
|
||||
* this file is part of the Source Code of CKFinder.
|
||||
*/
|
||||
|
||||
require_once __DIR__ . '/vendor/autoload.php';
|
||||
|
||||
use CKSource\CKFinder\CKFinder;
|
||||
|
||||
$ckfinder = new CKFinder(__DIR__ . '/../../../config.php');
|
||||
|
||||
$ckfinder->run();
|
||||
@@ -0,0 +1,7 @@
|
||||
<?php
|
||||
|
||||
// autoload.php @generated by Composer
|
||||
|
||||
require_once __DIR__ . '/composer' . '/autoload_real.php';
|
||||
|
||||
return ComposerAutoloaderInitc8ccb46a47efb4379a7eebb3f851e19d::getLoader();
|
||||
@@ -0,0 +1,106 @@
|
||||
<?php
|
||||
/**
|
||||
* Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License").
|
||||
* You may not use this file except in compliance with the License.
|
||||
* A copy of the License is located at
|
||||
*
|
||||
* http://aws.amazon.com/apache2.0
|
||||
*
|
||||
* or in the "license" file accompanying this file. This file is distributed
|
||||
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
|
||||
* express or implied. See the License for the specific language governing
|
||||
* permissions and limitations under the License.
|
||||
*/
|
||||
|
||||
namespace Aws\Common;
|
||||
|
||||
use Aws\Common\Facade\Facade;
|
||||
use Guzzle\Service\Builder\ServiceBuilder;
|
||||
use Guzzle\Service\Builder\ServiceBuilderLoader;
|
||||
|
||||
/**
|
||||
* Base class for interacting with web service clients
|
||||
*/
|
||||
class Aws extends ServiceBuilder
|
||||
{
|
||||
/**
|
||||
* @var string Current version of the SDK
|
||||
*/
|
||||
const VERSION = '2.8.31';
|
||||
|
||||
/**
|
||||
* Create a new service locator for the AWS SDK
|
||||
*
|
||||
* You can configure the service locator is four different ways:
|
||||
*
|
||||
* 1. Use the default configuration file shipped with the SDK that wires class names with service short names and
|
||||
* specify global parameters to add to every definition (e.g. key, secret, credentials, etc)
|
||||
*
|
||||
* 2. Use a custom configuration file that extends the default config and supplies credentials for each service.
|
||||
*
|
||||
* 3. Use a custom config file that wires services to custom short names for services.
|
||||
*
|
||||
* 4. If you are on Amazon EC2, you can use the default configuration file and not provide any credentials so that
|
||||
* you are using InstanceProfile credentials.
|
||||
*
|
||||
* @param array|string $config The full path to a .php or .js|.json file, or an associative array of data
|
||||
* to use as global parameters to pass to each service.
|
||||
* @param array $globalParameters Global parameters to pass to every service as it is instantiated.
|
||||
*
|
||||
* @return Aws
|
||||
*/
|
||||
public static function factory($config = null, array $globalParameters = array())
|
||||
{
|
||||
if (!$config) {
|
||||
// If nothing is passed in, then use the default configuration file with credentials from the environment
|
||||
$config = self::getDefaultServiceDefinition();
|
||||
} elseif (is_array($config)) {
|
||||
// If an array was passed, then use the default configuration file with parameter overrides
|
||||
$globalParameters = $config;
|
||||
$config = self::getDefaultServiceDefinition();
|
||||
}
|
||||
|
||||
$loader = new ServiceBuilderLoader();
|
||||
$loader->addAlias('_aws', self::getDefaultServiceDefinition())
|
||||
->addAlias('_sdk1', __DIR__ . '/Resources/sdk1-config.php');
|
||||
|
||||
return $loader->load($config, $globalParameters);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the full path to the default service builder definition file
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function getDefaultServiceDefinition()
|
||||
{
|
||||
return __DIR__ . '/Resources/aws-config.php';
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the configuration for the service builder
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getConfig()
|
||||
{
|
||||
return $this->builderConfig;
|
||||
}
|
||||
|
||||
/**
|
||||
* Enables the facades for the clients defined in the service builder
|
||||
*
|
||||
* @param string|null $namespace The namespace that the facades should be mounted to. Defaults to global namespace
|
||||
*
|
||||
* @return Aws
|
||||
* @deprecated "Facades" are being removed in version 3.0 of the SDK.
|
||||
*/
|
||||
public function enableFacades($namespace = null)
|
||||
{
|
||||
Facade::mountFacades($this, $namespace);
|
||||
|
||||
return $this;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,283 @@
|
||||
<?php
|
||||
/**
|
||||
* Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License").
|
||||
* You may not use this file except in compliance with the License.
|
||||
* A copy of the License is located at
|
||||
*
|
||||
* http://aws.amazon.com/apache2.0
|
||||
*
|
||||
* or in the "license" file accompanying this file. This file is distributed
|
||||
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
|
||||
* express or implied. See the License for the specific language governing
|
||||
* permissions and limitations under the License.
|
||||
*/
|
||||
|
||||
namespace Aws\Common\Client;
|
||||
|
||||
use Aws\Common\Aws;
|
||||
use Aws\Common\Credentials\CredentialsInterface;
|
||||
use Aws\Common\Enum\ClientOptions as Options;
|
||||
use Aws\Common\Exception\InvalidArgumentException;
|
||||
use Aws\Common\Exception\TransferException;
|
||||
use Aws\Common\RulesEndpointProvider;
|
||||
use Aws\Common\Signature\EndpointSignatureInterface;
|
||||
use Aws\Common\Signature\SignatureInterface;
|
||||
use Aws\Common\Signature\SignatureListener;
|
||||
use Aws\Common\Waiter\WaiterClassFactory;
|
||||
use Aws\Common\Waiter\CompositeWaiterFactory;
|
||||
use Aws\Common\Waiter\WaiterFactoryInterface;
|
||||
use Aws\Common\Waiter\WaiterConfigFactory;
|
||||
use Guzzle\Common\Collection;
|
||||
use Guzzle\Http\Exception\CurlException;
|
||||
use Guzzle\Http\QueryAggregator\DuplicateAggregator;
|
||||
use Guzzle\Service\Client;
|
||||
use Guzzle\Service\Description\ServiceDescriptionInterface;
|
||||
|
||||
/**
|
||||
* Abstract AWS client
|
||||
*/
|
||||
abstract class AbstractClient extends Client implements AwsClientInterface
|
||||
{
|
||||
/** @var CredentialsInterface AWS credentials */
|
||||
protected $credentials;
|
||||
|
||||
/** @var SignatureInterface Signature implementation of the service */
|
||||
protected $signature;
|
||||
|
||||
/** @var WaiterFactoryInterface Factory used to create waiter classes */
|
||||
protected $waiterFactory;
|
||||
|
||||
/** @var DuplicateAggregator Cached query aggregator*/
|
||||
protected $aggregator;
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public static function getAllEvents()
|
||||
{
|
||||
return array_merge(Client::getAllEvents(), array(
|
||||
'client.region_changed',
|
||||
'client.credentials_changed',
|
||||
));
|
||||
}
|
||||
|
||||
/**
|
||||
* @param CredentialsInterface $credentials AWS credentials
|
||||
* @param SignatureInterface $signature Signature implementation
|
||||
* @param Collection $config Configuration options
|
||||
*
|
||||
* @throws InvalidArgumentException if an endpoint provider isn't provided
|
||||
*/
|
||||
public function __construct(CredentialsInterface $credentials, SignatureInterface $signature, Collection $config)
|
||||
{
|
||||
// Bootstrap with Guzzle
|
||||
parent::__construct($config->get(Options::BASE_URL), $config);
|
||||
$this->credentials = $credentials;
|
||||
$this->signature = $signature;
|
||||
$this->aggregator = new DuplicateAggregator();
|
||||
|
||||
// Make sure the user agent is prefixed by the SDK version
|
||||
$this->setUserAgent('aws-sdk-php2/' . Aws::VERSION, true);
|
||||
|
||||
// Add the event listener so that requests are signed before they are sent
|
||||
$dispatcher = $this->getEventDispatcher();
|
||||
$dispatcher->addSubscriber(new SignatureListener($credentials, $signature));
|
||||
|
||||
if ($backoff = $config->get(Options::BACKOFF)) {
|
||||
$dispatcher->addSubscriber($backoff, -255);
|
||||
}
|
||||
}
|
||||
|
||||
public function __call($method, $args)
|
||||
{
|
||||
if (substr($method, 0, 3) === 'get' && substr($method, -8) === 'Iterator') {
|
||||
// Allow magic method calls for iterators (e.g. $client->get<CommandName>Iterator($params))
|
||||
$commandOptions = isset($args[0]) ? $args[0] : null;
|
||||
$iteratorOptions = isset($args[1]) ? $args[1] : array();
|
||||
return $this->getIterator(substr($method, 3, -8), $commandOptions, $iteratorOptions);
|
||||
} elseif (substr($method, 0, 9) == 'waitUntil') {
|
||||
// Allow magic method calls for waiters (e.g. $client->waitUntil<WaiterName>($params))
|
||||
return $this->waitUntil(substr($method, 9), isset($args[0]) ? $args[0]: array());
|
||||
} else {
|
||||
return parent::__call(ucfirst($method), $args);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get an endpoint for a specific region from a service description
|
||||
* @deprecated This function will no longer be updated to work with new regions.
|
||||
*/
|
||||
public static function getEndpoint(ServiceDescriptionInterface $description, $region, $scheme)
|
||||
{
|
||||
try {
|
||||
$service = $description->getData('endpointPrefix');
|
||||
$provider = RulesEndpointProvider::fromDefaults();
|
||||
$result = $provider(array(
|
||||
'service' => $service,
|
||||
'region' => $region,
|
||||
'scheme' => $scheme
|
||||
));
|
||||
return $result['endpoint'];
|
||||
} catch (\InvalidArgumentException $e) {
|
||||
throw new InvalidArgumentException($e->getMessage(), 0, $e);
|
||||
}
|
||||
}
|
||||
|
||||
public function getCredentials()
|
||||
{
|
||||
return $this->credentials;
|
||||
}
|
||||
|
||||
public function setCredentials(CredentialsInterface $credentials)
|
||||
{
|
||||
$formerCredentials = $this->credentials;
|
||||
$this->credentials = $credentials;
|
||||
|
||||
// Dispatch an event that the credentials have been changed
|
||||
$this->dispatch('client.credentials_changed', array(
|
||||
'credentials' => $credentials,
|
||||
'former_credentials' => $formerCredentials,
|
||||
));
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getSignature()
|
||||
{
|
||||
return $this->signature;
|
||||
}
|
||||
|
||||
public function getRegions()
|
||||
{
|
||||
return $this->serviceDescription->getData('regions');
|
||||
}
|
||||
|
||||
public function getRegion()
|
||||
{
|
||||
return $this->getConfig(Options::REGION);
|
||||
}
|
||||
|
||||
public function setRegion($region)
|
||||
{
|
||||
$config = $this->getConfig();
|
||||
$formerRegion = $config->get(Options::REGION);
|
||||
$global = $this->serviceDescription->getData('globalEndpoint');
|
||||
$provider = $config->get('endpoint_provider');
|
||||
|
||||
if (!$provider) {
|
||||
throw new \RuntimeException('No endpoint provider configured');
|
||||
}
|
||||
|
||||
// Only change the region if the service does not have a global endpoint
|
||||
if (!$global || $this->serviceDescription->getData('namespace') === 'S3') {
|
||||
|
||||
$endpoint = call_user_func(
|
||||
$provider,
|
||||
array(
|
||||
'scheme' => $config->get(Options::SCHEME),
|
||||
'region' => $region,
|
||||
'service' => $config->get(Options::SERVICE)
|
||||
)
|
||||
);
|
||||
|
||||
$this->setBaseUrl($endpoint['endpoint']);
|
||||
$config->set(Options::BASE_URL, $endpoint['endpoint']);
|
||||
$config->set(Options::REGION, $region);
|
||||
|
||||
// Update the signature if necessary
|
||||
$signature = $this->getSignature();
|
||||
if ($signature instanceof EndpointSignatureInterface) {
|
||||
/** @var EndpointSignatureInterface $signature */
|
||||
$signature->setRegionName($region);
|
||||
}
|
||||
|
||||
// Dispatch an event that the region has been changed
|
||||
$this->dispatch('client.region_changed', array(
|
||||
'region' => $region,
|
||||
'former_region' => $formerRegion,
|
||||
));
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function waitUntil($waiter, array $input = array())
|
||||
{
|
||||
$this->getWaiter($waiter, $input)->wait();
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getWaiter($waiter, array $input = array())
|
||||
{
|
||||
return $this->getWaiterFactory()->build($waiter)
|
||||
->setClient($this)
|
||||
->setConfig($input);
|
||||
}
|
||||
|
||||
public function setWaiterFactory(WaiterFactoryInterface $waiterFactory)
|
||||
{
|
||||
$this->waiterFactory = $waiterFactory;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getWaiterFactory()
|
||||
{
|
||||
if (!$this->waiterFactory) {
|
||||
$clientClass = get_class($this);
|
||||
// Use a composite factory that checks for classes first, then config waiters
|
||||
$this->waiterFactory = new CompositeWaiterFactory(array(
|
||||
new WaiterClassFactory(substr($clientClass, 0, strrpos($clientClass, '\\')) . '\\Waiter')
|
||||
));
|
||||
if ($this->getDescription()) {
|
||||
$waiterConfig = $this->getDescription()->getData('waiters') ?: array();
|
||||
$this->waiterFactory->addFactory(new WaiterConfigFactory($waiterConfig));
|
||||
}
|
||||
}
|
||||
|
||||
return $this->waiterFactory;
|
||||
}
|
||||
|
||||
public function getApiVersion()
|
||||
{
|
||||
return $this->serviceDescription->getApiVersion();
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
* @throws \Aws\Common\Exception\TransferException
|
||||
*/
|
||||
public function send($requests)
|
||||
{
|
||||
try {
|
||||
return parent::send($requests);
|
||||
} catch (CurlException $e) {
|
||||
$wrapped = new TransferException($e->getMessage(), null, $e);
|
||||
$wrapped->setCurlHandle($e->getCurlHandle())
|
||||
->setCurlInfo($e->getCurlInfo())
|
||||
->setError($e->getError(), $e->getErrorNo())
|
||||
->setRequest($e->getRequest());
|
||||
throw $wrapped;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Ensures that the duplicate query string aggregator is used so that
|
||||
* query string values are sent over the wire as foo=bar&foo=baz.
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function createRequest(
|
||||
$method = 'GET',
|
||||
$uri = null,
|
||||
$headers = null,
|
||||
$body = null,
|
||||
array $options = array()
|
||||
) {
|
||||
$request = parent::createRequest($method, $uri, $headers, $body, $options);
|
||||
$request->getQuery()->setAggregator($this->aggregator);
|
||||
return $request;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,118 @@
|
||||
<?php
|
||||
/**
|
||||
* Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License").
|
||||
* You may not use this file except in compliance with the License.
|
||||
* A copy of the License is located at
|
||||
*
|
||||
* http://aws.amazon.com/apache2.0
|
||||
*
|
||||
* or in the "license" file accompanying this file. This file is distributed
|
||||
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
|
||||
* express or implied. See the License for the specific language governing
|
||||
* permissions and limitations under the License.
|
||||
*/
|
||||
|
||||
namespace Aws\Common\Client;
|
||||
|
||||
use Aws\Common\Credentials\CredentialsInterface;
|
||||
use Aws\Common\Signature\SignatureInterface;
|
||||
use Aws\Common\Waiter\WaiterFactoryInterface;
|
||||
use Aws\Common\Waiter\WaiterInterface;
|
||||
use Guzzle\Service\ClientInterface;
|
||||
|
||||
/**
|
||||
* Interface that all AWS clients implement
|
||||
*/
|
||||
interface AwsClientInterface extends ClientInterface
|
||||
{
|
||||
/**
|
||||
* Returns the AWS credentials associated with the client
|
||||
*
|
||||
* @return CredentialsInterface
|
||||
*/
|
||||
public function getCredentials();
|
||||
|
||||
/**
|
||||
* Sets the credentials object associated with the client
|
||||
*
|
||||
* @param CredentialsInterface $credentials Credentials object to use
|
||||
*
|
||||
* @return self
|
||||
*/
|
||||
public function setCredentials(CredentialsInterface $credentials);
|
||||
|
||||
/**
|
||||
* Returns the signature implementation used with the client
|
||||
*
|
||||
* @return SignatureInterface
|
||||
*/
|
||||
public function getSignature();
|
||||
|
||||
/**
|
||||
* Get a list of available regions and region data
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getRegions();
|
||||
|
||||
/**
|
||||
* Get the name of the region to which the client is configured to send requests
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getRegion();
|
||||
|
||||
/**
|
||||
* Change the region to which the client is configured to send requests
|
||||
*
|
||||
* @param string $region Name of the region
|
||||
*
|
||||
* @return self
|
||||
*/
|
||||
public function setRegion($region);
|
||||
|
||||
/**
|
||||
* Get the waiter factory being used by the client
|
||||
*
|
||||
* @return WaiterFactoryInterface
|
||||
*/
|
||||
public function getWaiterFactory();
|
||||
|
||||
/**
|
||||
* Set the waiter factory to use with the client
|
||||
*
|
||||
* @param WaiterFactoryInterface $waiterFactory Factory used to create waiters
|
||||
*
|
||||
* @return self
|
||||
*/
|
||||
public function setWaiterFactory(WaiterFactoryInterface $waiterFactory);
|
||||
|
||||
/**
|
||||
* Wait until a resource is available or an associated waiter returns true
|
||||
*
|
||||
* @param string $waiter Name of the waiter
|
||||
* @param array $input Values used as input for the underlying operation and to control the waiter
|
||||
*
|
||||
* @return self
|
||||
*/
|
||||
public function waitUntil($waiter, array $input = array());
|
||||
|
||||
/**
|
||||
* Get a named waiter object
|
||||
*
|
||||
* @param string $waiter Name of the waiter
|
||||
* @param array $input Values used as input for the underlying operation and to control the waiter
|
||||
*
|
||||
* @return WaiterInterface
|
||||
*/
|
||||
public function getWaiter($waiter, array $input = array());
|
||||
|
||||
/**
|
||||
* Get the API version of the client (e.g. 2006-03-01)
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getApiVersion();
|
||||
}
|
||||
@@ -0,0 +1,527 @@
|
||||
<?php
|
||||
/**
|
||||
* Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License").
|
||||
* You may not use this file except in compliance with the License.
|
||||
* A copy of the License is located at
|
||||
*
|
||||
* http://aws.amazon.com/apache2.0
|
||||
*
|
||||
* or in the "license" file accompanying this file. This file is distributed
|
||||
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
|
||||
* express or implied. See the License for the specific language governing
|
||||
* permissions and limitations under the License.
|
||||
*/
|
||||
|
||||
namespace Aws\Common\Client;
|
||||
|
||||
use Aws\Common\Credentials\Credentials;
|
||||
use Aws\Common\Credentials\CredentialsInterface;
|
||||
use Aws\Common\Credentials\NullCredentials;
|
||||
use Aws\Common\Enum\ClientOptions as Options;
|
||||
use Aws\Common\Exception\ExceptionListener;
|
||||
use Aws\Common\Exception\InvalidArgumentException;
|
||||
use Aws\Common\Exception\NamespaceExceptionFactory;
|
||||
use Aws\Common\Exception\Parser\DefaultXmlExceptionParser;
|
||||
use Aws\Common\Exception\Parser\ExceptionParserInterface;
|
||||
use Aws\Common\Iterator\AwsResourceIteratorFactory;
|
||||
use Aws\Common\RulesEndpointProvider;
|
||||
use Aws\Common\Signature\EndpointSignatureInterface;
|
||||
use Aws\Common\Signature\SignatureInterface;
|
||||
use Aws\Common\Signature\SignatureV2;
|
||||
use Aws\Common\Signature\SignatureV3Https;
|
||||
use Aws\Common\Signature\SignatureV4;
|
||||
use Guzzle\Common\Collection;
|
||||
use Guzzle\Plugin\Backoff\BackoffPlugin;
|
||||
use Guzzle\Plugin\Backoff\CurlBackoffStrategy;
|
||||
use Guzzle\Plugin\Backoff\ExponentialBackoffStrategy;
|
||||
use Guzzle\Plugin\Backoff\HttpBackoffStrategy;
|
||||
use Guzzle\Plugin\Backoff\TruncatedBackoffStrategy;
|
||||
use Guzzle\Service\Description\ServiceDescription;
|
||||
use Guzzle\Service\Resource\ResourceIteratorClassFactory;
|
||||
use Guzzle\Log\LogAdapterInterface;
|
||||
use Guzzle\Log\ClosureLogAdapter;
|
||||
use Guzzle\Plugin\Backoff\BackoffLogger;
|
||||
|
||||
/**
|
||||
* Builder for creating AWS service clients
|
||||
*/
|
||||
class ClientBuilder
|
||||
{
|
||||
/**
|
||||
* @var array Default client config
|
||||
*/
|
||||
protected static $commonConfigDefaults = array('scheme' => 'https');
|
||||
|
||||
/**
|
||||
* @var array Default client requirements
|
||||
*/
|
||||
protected static $commonConfigRequirements = array(Options::SERVICE_DESCRIPTION);
|
||||
|
||||
/**
|
||||
* @var string The namespace of the client
|
||||
*/
|
||||
protected $clientNamespace;
|
||||
|
||||
/**
|
||||
* @var array The config options
|
||||
*/
|
||||
protected $config = array();
|
||||
|
||||
/**
|
||||
* @var array The config defaults
|
||||
*/
|
||||
protected $configDefaults = array();
|
||||
|
||||
/**
|
||||
* @var array The config requirements
|
||||
*/
|
||||
protected $configRequirements = array();
|
||||
|
||||
/**
|
||||
* @var ExceptionParserInterface The Parser interface for the client
|
||||
*/
|
||||
protected $exceptionParser;
|
||||
|
||||
/**
|
||||
* @var array Array of configuration data for iterators available for the client
|
||||
*/
|
||||
protected $iteratorsConfig = array();
|
||||
|
||||
/** @var string */
|
||||
private $clientClass;
|
||||
|
||||
/** @var string */
|
||||
private $serviceName;
|
||||
|
||||
/**
|
||||
* Factory method for creating the client builder
|
||||
*
|
||||
* @param string $namespace The namespace of the client
|
||||
*
|
||||
* @return ClientBuilder
|
||||
*/
|
||||
public static function factory($namespace = null)
|
||||
{
|
||||
return new static($namespace);
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructs a client builder
|
||||
*
|
||||
* @param string $namespace The namespace of the client
|
||||
*/
|
||||
public function __construct($namespace = null)
|
||||
{
|
||||
$this->clientNamespace = $namespace;
|
||||
|
||||
// Determine service and class name
|
||||
$this->clientClass = 'Aws\Common\Client\DefaultClient';
|
||||
|
||||
if ($this->clientNamespace) {
|
||||
$this->serviceName = substr($this->clientNamespace, strrpos($this->clientNamespace, '\\') + 1);
|
||||
$this->clientClass = $this->clientNamespace . '\\' . $this->serviceName . 'Client';
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the config options
|
||||
*
|
||||
* @param array|Collection $config The config options
|
||||
*
|
||||
* @return ClientBuilder
|
||||
*/
|
||||
public function setConfig($config)
|
||||
{
|
||||
$this->config = $this->processArray($config);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the config options' defaults
|
||||
*
|
||||
* @param array|Collection $defaults The default values
|
||||
*
|
||||
* @return ClientBuilder
|
||||
*/
|
||||
public function setConfigDefaults($defaults)
|
||||
{
|
||||
$this->configDefaults = $this->processArray($defaults);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the required config options
|
||||
*
|
||||
* @param array|Collection $required The required config options
|
||||
*
|
||||
* @return ClientBuilder
|
||||
*/
|
||||
public function setConfigRequirements($required)
|
||||
{
|
||||
$this->configRequirements = $this->processArray($required);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the exception parser. If one is not provided the builder will use
|
||||
* the default XML exception parser.
|
||||
*
|
||||
* @param ExceptionParserInterface $parser The exception parser
|
||||
*
|
||||
* @return ClientBuilder
|
||||
*/
|
||||
public function setExceptionParser(ExceptionParserInterface $parser)
|
||||
{
|
||||
$this->exceptionParser = $parser;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the configuration for the client's iterators
|
||||
*
|
||||
* @param array $config Configuration data for client's iterators
|
||||
*
|
||||
* @return ClientBuilder
|
||||
*/
|
||||
public function setIteratorsConfig(array $config)
|
||||
{
|
||||
$this->iteratorsConfig = $config;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Performs the building logic using all of the parameters that have been
|
||||
* set and falling back to default values. Returns an instantiate service
|
||||
* client with credentials prepared and plugins attached.
|
||||
*
|
||||
* @return AwsClientInterface
|
||||
* @throws InvalidArgumentException
|
||||
*/
|
||||
public function build()
|
||||
{
|
||||
// Resolve configuration
|
||||
$config = Collection::fromConfig(
|
||||
$this->config,
|
||||
array_merge(self::$commonConfigDefaults, $this->configDefaults),
|
||||
(self::$commonConfigRequirements + $this->configRequirements)
|
||||
);
|
||||
|
||||
if ($config[Options::VERSION] === 'latest') {
|
||||
$config[Options::VERSION] = constant("{$this->clientClass}::LATEST_API_VERSION");
|
||||
}
|
||||
|
||||
if (!isset($config['endpoint_provider'])) {
|
||||
$config['endpoint_provider'] = RulesEndpointProvider::fromDefaults();
|
||||
}
|
||||
|
||||
// Resolve the endpoint, signature, and credentials
|
||||
$description = $this->updateConfigFromDescription($config);
|
||||
$signature = $this->getSignature($description, $config);
|
||||
$credentials = $this->getCredentials($config);
|
||||
$this->extractHttpConfig($config);
|
||||
|
||||
// Resolve exception parser
|
||||
if (!$this->exceptionParser) {
|
||||
$this->exceptionParser = new DefaultXmlExceptionParser();
|
||||
}
|
||||
|
||||
// Resolve backoff strategy
|
||||
$backoff = $config->get(Options::BACKOFF);
|
||||
if ($backoff === null) {
|
||||
$retries = isset($config[Options::BACKOFF_RETRIES]) ? $config[Options::BACKOFF_RETRIES] : 3;
|
||||
$backoff = $this->createDefaultBackoff($retries);
|
||||
$config->set(Options::BACKOFF, $backoff);
|
||||
}
|
||||
|
||||
if ($backoff) {
|
||||
$this->addBackoffLogger($backoff, $config);
|
||||
}
|
||||
|
||||
/** @var AwsClientInterface $client */
|
||||
$client = new $this->clientClass($credentials, $signature, $config);
|
||||
$client->setDescription($description);
|
||||
|
||||
// Add exception marshaling so that more descriptive exception are thrown
|
||||
if ($this->clientNamespace) {
|
||||
$exceptionFactory = new NamespaceExceptionFactory(
|
||||
$this->exceptionParser,
|
||||
"{$this->clientNamespace}\\Exception",
|
||||
"{$this->clientNamespace}\\Exception\\{$this->serviceName}Exception"
|
||||
);
|
||||
$client->addSubscriber(new ExceptionListener($exceptionFactory));
|
||||
}
|
||||
|
||||
// Add the UserAgentPlugin to append to the User-Agent header of requests
|
||||
$client->addSubscriber(new UserAgentListener());
|
||||
|
||||
// Filters used for the cache plugin
|
||||
$client->getConfig()->set(
|
||||
'params.cache.key_filter',
|
||||
'header=date,x-amz-date,x-amz-security-token,x-amzn-authorization'
|
||||
);
|
||||
|
||||
// Set the iterator resource factory based on the provided iterators config
|
||||
$client->setResourceIteratorFactory(new AwsResourceIteratorFactory(
|
||||
$this->iteratorsConfig,
|
||||
new ResourceIteratorClassFactory($this->clientNamespace . '\\Iterator')
|
||||
));
|
||||
|
||||
// Disable parameter validation if needed
|
||||
if ($config->get(Options::VALIDATION) === false) {
|
||||
$params = $config->get('command.params') ?: array();
|
||||
$params['command.disable_validation'] = true;
|
||||
$config->set('command.params', $params);
|
||||
}
|
||||
|
||||
return $client;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add backoff logging to the backoff plugin if needed
|
||||
*
|
||||
* @param BackoffPlugin $plugin Backoff plugin
|
||||
* @param Collection $config Configuration settings
|
||||
*
|
||||
* @throws InvalidArgumentException
|
||||
*/
|
||||
protected function addBackoffLogger(BackoffPlugin $plugin, Collection $config)
|
||||
{
|
||||
// The log option can be set to `debug` or an instance of a LogAdapterInterface
|
||||
if ($logger = $config->get(Options::BACKOFF_LOGGER)) {
|
||||
$format = $config->get(Options::BACKOFF_LOGGER_TEMPLATE);
|
||||
if ($logger === 'debug') {
|
||||
$logger = new ClosureLogAdapter(function ($message) {
|
||||
trigger_error($message . "\n");
|
||||
});
|
||||
} elseif (!($logger instanceof LogAdapterInterface)) {
|
||||
throw new InvalidArgumentException(
|
||||
Options::BACKOFF_LOGGER . ' must be set to `debug` or an instance of '
|
||||
. 'Guzzle\\Common\\Log\\LogAdapterInterface'
|
||||
);
|
||||
}
|
||||
// Create the plugin responsible for logging exponential backoff retries
|
||||
$logPlugin = new BackoffLogger($logger);
|
||||
// You can specify a custom format or use the default
|
||||
if ($format) {
|
||||
$logPlugin->setTemplate($format);
|
||||
}
|
||||
$plugin->addSubscriber($logPlugin);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Ensures that an array (e.g. for config data) is actually in array form
|
||||
*
|
||||
* @param array|Collection $array The array data
|
||||
*
|
||||
* @return array
|
||||
* @throws InvalidArgumentException if the arg is not an array or Collection
|
||||
*/
|
||||
protected function processArray($array)
|
||||
{
|
||||
if ($array instanceof Collection) {
|
||||
$array = $array->getAll();
|
||||
}
|
||||
|
||||
if (!is_array($array)) {
|
||||
throw new InvalidArgumentException('The config must be provided as an array or Collection.');
|
||||
}
|
||||
|
||||
return $array;
|
||||
}
|
||||
|
||||
/**
|
||||
* Update a configuration object from a service description
|
||||
*
|
||||
* @param Collection $config Config to update
|
||||
*
|
||||
* @return ServiceDescription
|
||||
* @throws InvalidArgumentException
|
||||
*/
|
||||
protected function updateConfigFromDescription(Collection $config)
|
||||
{
|
||||
$description = $config->get(Options::SERVICE_DESCRIPTION);
|
||||
if (!($description instanceof ServiceDescription)) {
|
||||
// Inject the version into the sprintf template if it is a string
|
||||
if (is_string($description)) {
|
||||
$description = sprintf($description, $config->get(Options::VERSION));
|
||||
}
|
||||
$description = ServiceDescription::factory($description);
|
||||
$config->set(Options::SERVICE_DESCRIPTION, $description);
|
||||
}
|
||||
|
||||
if (!$config->get(Options::SERVICE)) {
|
||||
$config->set(Options::SERVICE, $description->getData('endpointPrefix'));
|
||||
}
|
||||
|
||||
if ($iterators = $description->getData('iterators')) {
|
||||
$this->setIteratorsConfig($iterators);
|
||||
}
|
||||
|
||||
$this->handleRegion($config);
|
||||
$this->handleEndpoint($config);
|
||||
|
||||
return $description;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return an appropriate signature object for a a client based on the
|
||||
* "signature" configuration setting, or the default signature specified in
|
||||
* a service description. The signature can be set to a valid signature
|
||||
* version identifier string or an instance of Aws\Common\Signature\SignatureInterface.
|
||||
*
|
||||
* @param ServiceDescription $description Description that holds a signature option
|
||||
* @param Collection $config Configuration options
|
||||
*
|
||||
* @return SignatureInterface
|
||||
* @throws InvalidArgumentException
|
||||
*/
|
||||
protected function getSignature(ServiceDescription $description, Collection $config)
|
||||
{
|
||||
// If a custom signature has not been provided, then use the default
|
||||
// signature setting specified in the service description.
|
||||
$signature = $config->get(Options::SIGNATURE) ?: $description->getData('signatureVersion');
|
||||
|
||||
if (is_string($signature)) {
|
||||
if ($signature == 'v4') {
|
||||
$signature = new SignatureV4();
|
||||
} elseif ($signature == 'v2') {
|
||||
$signature = new SignatureV2();
|
||||
} elseif ($signature == 'v3https') {
|
||||
$signature = new SignatureV3Https();
|
||||
} else {
|
||||
throw new InvalidArgumentException("Invalid signature type: {$signature}");
|
||||
}
|
||||
} elseif (!($signature instanceof SignatureInterface)) {
|
||||
throw new InvalidArgumentException('The provided signature is not '
|
||||
. 'a signature version string or an instance of '
|
||||
. 'Aws\\Common\\Signature\\SignatureInterface');
|
||||
}
|
||||
|
||||
// Allow a custom service name or region value to be provided
|
||||
if ($signature instanceof EndpointSignatureInterface) {
|
||||
|
||||
// Determine the service name to use when signing
|
||||
$signature->setServiceName($config->get(Options::SIGNATURE_SERVICE)
|
||||
?: $description->getData('signingName')
|
||||
?: $description->getData('endpointPrefix'));
|
||||
|
||||
// Determine the region to use when signing requests
|
||||
$signature->setRegionName($config->get(Options::SIGNATURE_REGION) ?: $config->get(Options::REGION));
|
||||
}
|
||||
|
||||
return $signature;
|
||||
}
|
||||
|
||||
protected function getCredentials(Collection $config)
|
||||
{
|
||||
$credentials = $config->get(Options::CREDENTIALS);
|
||||
|
||||
if (is_array($credentials)) {
|
||||
$credentials = Credentials::factory($credentials);
|
||||
} elseif ($credentials === false) {
|
||||
$credentials = new NullCredentials();
|
||||
} elseif (!$credentials instanceof CredentialsInterface) {
|
||||
$credentials = Credentials::factory($config);
|
||||
}
|
||||
|
||||
return $credentials;
|
||||
}
|
||||
|
||||
private function handleRegion(Collection $config)
|
||||
{
|
||||
// Make sure a valid region is set
|
||||
$region = $config[Options::REGION];
|
||||
$description = $config[Options::SERVICE_DESCRIPTION];
|
||||
$global = $description->getData('globalEndpoint');
|
||||
|
||||
if (!$global && !$region) {
|
||||
throw new InvalidArgumentException(
|
||||
'A region is required when using ' . $description->getData('serviceFullName')
|
||||
);
|
||||
} elseif ($global && !$region) {
|
||||
$config[Options::REGION] = 'us-east-1';
|
||||
}
|
||||
}
|
||||
|
||||
private function handleEndpoint(Collection $config)
|
||||
{
|
||||
// Alias "endpoint" with "base_url" for forwards compatibility.
|
||||
if ($config['endpoint']) {
|
||||
$config[Options::BASE_URL] = $config['endpoint'];
|
||||
return;
|
||||
}
|
||||
|
||||
if ($config[Options::BASE_URL]) {
|
||||
return;
|
||||
}
|
||||
|
||||
$endpoint = call_user_func(
|
||||
$config['endpoint_provider'],
|
||||
array(
|
||||
'scheme' => $config[Options::SCHEME],
|
||||
'region' => $config[Options::REGION],
|
||||
'service' => $config[Options::SERVICE]
|
||||
)
|
||||
);
|
||||
|
||||
$config[Options::BASE_URL] = $endpoint['endpoint'];
|
||||
|
||||
// Set a signature if one was not explicitly provided.
|
||||
if (!$config->hasKey(Options::SIGNATURE)
|
||||
&& isset($endpoint['signatureVersion'])
|
||||
) {
|
||||
$config->set(Options::SIGNATURE, $endpoint['signatureVersion']);
|
||||
}
|
||||
|
||||
// The the signing region if endpoint rule specifies one.
|
||||
if (isset($endpoint['credentialScope'])) {
|
||||
$scope = $endpoint['credentialScope'];
|
||||
if (isset($scope['region'])) {
|
||||
$config->set(Options::SIGNATURE_REGION, $scope['region']);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private function createDefaultBackoff($retries = 3)
|
||||
{
|
||||
return new BackoffPlugin(
|
||||
// Retry failed requests up to 3 times if it is determined that the request can be retried
|
||||
new TruncatedBackoffStrategy($retries,
|
||||
// Retry failed requests with 400-level responses due to throttling
|
||||
new ThrottlingErrorChecker($this->exceptionParser,
|
||||
// Retry failed requests due to transient network or cURL problems
|
||||
new CurlBackoffStrategy(null,
|
||||
// Retry failed requests with 500-level responses
|
||||
new HttpBackoffStrategy(array(500, 503, 509),
|
||||
// Retry requests that failed due to expired credentials
|
||||
new ExpiredCredentialsChecker($this->exceptionParser,
|
||||
new ExponentialBackoffStrategy()
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
private function extractHttpConfig(Collection $config)
|
||||
{
|
||||
$http = $config['http'];
|
||||
|
||||
if (!is_array($http)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (isset($http['verify'])) {
|
||||
$config[Options::SSL_CERT] = $http['verify'];
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,67 @@
|
||||
<?php
|
||||
/**
|
||||
* Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License").
|
||||
* You may not use this file except in compliance with the License.
|
||||
* A copy of the License is located at
|
||||
*
|
||||
* http://aws.amazon.com/apache2.0
|
||||
*
|
||||
* or in the "license" file accompanying this file. This file is distributed
|
||||
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
|
||||
* express or implied. See the License for the specific language governing
|
||||
* permissions and limitations under the License.
|
||||
*/
|
||||
|
||||
namespace Aws\Common\Client;
|
||||
|
||||
use Aws\Common\Enum\ClientOptions as Options;
|
||||
use Guzzle\Common\Collection;
|
||||
|
||||
/**
|
||||
* Generic client for interacting with an AWS service
|
||||
*/
|
||||
class DefaultClient extends AbstractClient
|
||||
{
|
||||
/**
|
||||
* Factory method to create a default client using an array of configuration options.
|
||||
*
|
||||
* The following array keys and values are available options:
|
||||
*
|
||||
* Credential options ((`key`, `secret`, and optional `token`) OR `credentials` is required):
|
||||
*
|
||||
* - key: AWS Access Key ID
|
||||
* - secret: AWS secret access key
|
||||
* - credentials: You can optionally provide a custom `Aws\Common\Credentials\CredentialsInterface` object
|
||||
* - token: Custom AWS security token to use with request authentication. Please note that not all services accept temporary credentials. See http://docs.aws.amazon.com/STS/latest/UsingSTS/UsingTokens.html
|
||||
* - token.ttd: UNIX timestamp for when the custom credentials expire
|
||||
* - credentials.cache.key: Optional custom cache key to use with the credentials
|
||||
* - credentials.client: Pass this option to specify a custom `Guzzle\Http\ClientInterface` to use if your credentials require a HTTP request (e.g. RefreshableInstanceProfileCredentials)
|
||||
*
|
||||
* Region and endpoint options (Some services do not require a region while others do. Check the service specific user guide documentation for details):
|
||||
*
|
||||
* - region: Region name (e.g. 'us-east-1', 'us-west-1', 'us-west-2', 'eu-west-1', etc...)
|
||||
* - scheme: URI Scheme of the base URL (e.g. 'https', 'http') used when endpoint is not supplied
|
||||
* - endpoint: Allows you to specify a custom endpoint instead of building one from the region and scheme
|
||||
*
|
||||
* Generic client options:
|
||||
*
|
||||
* - signature: Overrides the signature used by the client. Clients will always choose an appropriate default signature. However, it can be useful to override this with a custom setting. This can be set to "v4", "v3https", "v2" or an instance of Aws\Common\Signature\SignatureInterface.
|
||||
* - ssl.certificate_authority: Set to true to use the bundled CA cert or pass the full path to an SSL certificate bundle
|
||||
* - curl.options: Associative of CURLOPT_* cURL options to add to each request
|
||||
* - client.backoff.logger: `Guzzle\Log\LogAdapterInterface` object used to log backoff retries. Use 'debug' to emit PHP warnings when a retry is issued.
|
||||
* - client.backoff.logger.template: Optional template to use for exponential backoff log messages. See `Guzzle\Plugin\Backoff\BackoffLogger` for formatting information.
|
||||
*
|
||||
* @param array|Collection $config Client configuration data
|
||||
*
|
||||
* @return self
|
||||
*/
|
||||
public static function factory($config = array())
|
||||
{
|
||||
return ClientBuilder::factory()
|
||||
->setConfig($config)
|
||||
->setConfigDefaults(array(Options::SCHEME => 'https'))
|
||||
->build();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,80 @@
|
||||
<?php
|
||||
/**
|
||||
* Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License").
|
||||
* You may not use this file except in compliance with the License.
|
||||
* A copy of the License is located at
|
||||
*
|
||||
* http://aws.amazon.com/apache2.0
|
||||
*
|
||||
* or in the "license" file accompanying this file. This file is distributed
|
||||
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
|
||||
* express or implied. See the License for the specific language governing
|
||||
* permissions and limitations under the License.
|
||||
*/
|
||||
|
||||
namespace Aws\Common\Client;
|
||||
|
||||
use Aws\Common\Credentials\AbstractRefreshableCredentials;
|
||||
use Aws\Common\Client\AwsClientInterface;
|
||||
use Aws\Common\Exception\Parser\ExceptionParserInterface;
|
||||
use Guzzle\Http\Exception\HttpException;
|
||||
use Guzzle\Http\Message\RequestInterface;
|
||||
use Guzzle\Http\Message\Response;
|
||||
use Guzzle\Plugin\Backoff\BackoffStrategyInterface;
|
||||
use Guzzle\Plugin\Backoff\AbstractBackoffStrategy;
|
||||
|
||||
/**
|
||||
* Backoff logic that handles retrying requests when credentials expire
|
||||
*/
|
||||
class ExpiredCredentialsChecker extends AbstractBackoffStrategy
|
||||
{
|
||||
/**
|
||||
* @var array Array of known retrying exception codes
|
||||
*/
|
||||
protected $retryable = array(
|
||||
'RequestExpired' => true,
|
||||
'ExpiredTokenException' => true,
|
||||
'ExpiredToken' => true
|
||||
);
|
||||
|
||||
/**
|
||||
* @var ExceptionParserInterface Exception parser used to parse exception responses
|
||||
*/
|
||||
protected $exceptionParser;
|
||||
|
||||
public function __construct(ExceptionParserInterface $exceptionParser, BackoffStrategyInterface $next = null) {
|
||||
$this->exceptionParser = $exceptionParser;
|
||||
$this->next = $next;
|
||||
}
|
||||
|
||||
public function makesDecision()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
protected function getDelay($retries, RequestInterface $request, Response $response = null, HttpException $e = null)
|
||||
{
|
||||
if ($response && $response->isClientError()) {
|
||||
|
||||
$parts = $this->exceptionParser->parse($request, $response);
|
||||
if (!isset($this->retryable[$parts['code']]) || !$request->getClient()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
/** @var AwsClientInterface $client */
|
||||
$client = $request->getClient();
|
||||
// Only retry if the credentials can be refreshed
|
||||
if (!($client->getCredentials() instanceof AbstractRefreshableCredentials)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// Resign the request using new credentials
|
||||
$client->getSignature()->signRequest($request, $client->getCredentials()->setExpiration(-1));
|
||||
|
||||
// Retry immediately with no delay
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,75 @@
|
||||
<?php
|
||||
/**
|
||||
* Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License").
|
||||
* You may not use this file except in compliance with the License.
|
||||
* A copy of the License is located at
|
||||
*
|
||||
* http://aws.amazon.com/apache2.0
|
||||
*
|
||||
* or in the "license" file accompanying this file. This file is distributed
|
||||
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
|
||||
* express or implied. See the License for the specific language governing
|
||||
* permissions and limitations under the License.
|
||||
*/
|
||||
|
||||
namespace Aws\Common\Client;
|
||||
|
||||
use Aws\Common\Exception\Parser\ExceptionParserInterface;
|
||||
use Guzzle\Http\Exception\HttpException;
|
||||
use Guzzle\Http\Message\RequestInterface;
|
||||
use Guzzle\Http\Message\Response;
|
||||
use Guzzle\Plugin\Backoff\BackoffStrategyInterface;
|
||||
use Guzzle\Plugin\Backoff\AbstractBackoffStrategy;
|
||||
|
||||
/**
|
||||
* Backoff logic that handles throttling exceptions from services
|
||||
*/
|
||||
class ThrottlingErrorChecker extends AbstractBackoffStrategy
|
||||
{
|
||||
/** @var array Whitelist of exception codes (as indexes) that indicate throttling */
|
||||
protected static $throttlingExceptions = array(
|
||||
'RequestLimitExceeded' => true,
|
||||
'Throttling' => true,
|
||||
'ThrottlingException' => true,
|
||||
'ProvisionedThroughputExceededException' => true,
|
||||
'RequestThrottled' => true,
|
||||
);
|
||||
|
||||
/**
|
||||
* @var ExceptionParserInterface Exception parser used to parse exception responses
|
||||
*/
|
||||
protected $exceptionParser;
|
||||
|
||||
public function __construct(ExceptionParserInterface $exceptionParser, BackoffStrategyInterface $next = null)
|
||||
{
|
||||
$this->exceptionParser = $exceptionParser;
|
||||
if ($next) {
|
||||
$this->setNext($next);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function makesDecision()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function getDelay(
|
||||
$retries,
|
||||
RequestInterface $request,
|
||||
Response $response = null,
|
||||
HttpException $e = null
|
||||
) {
|
||||
if ($response && $response->isClientError()) {
|
||||
$parts = $this->exceptionParser->parse($request, $response);
|
||||
return isset(self::$throttlingExceptions[$parts['code']]) ? true : null;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,95 @@
|
||||
<?php
|
||||
/**
|
||||
* Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License").
|
||||
* You may not use this file except in compliance with the License.
|
||||
* A copy of the License is located at
|
||||
*
|
||||
* http://aws.amazon.com/apache2.0
|
||||
*
|
||||
* or in the "license" file accompanying this file. This file is distributed
|
||||
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
|
||||
* express or implied. See the License for the specific language governing
|
||||
* permissions and limitations under the License.
|
||||
*/
|
||||
|
||||
namespace Aws\Common\Client;
|
||||
|
||||
use Aws\Common\Exception\InvalidArgumentException;
|
||||
use Guzzle\Common\Event;
|
||||
use Guzzle\Http\EntityBody;
|
||||
use Guzzle\Service\Command\AbstractCommand as Command;
|
||||
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
|
||||
|
||||
/**
|
||||
* Prepares the body parameter of a command such that the parameter is more flexible (e.g. accepts file handles) with
|
||||
* the value it accepts but converts it to the correct format for the command. Also looks for a "Filename" parameter.
|
||||
*/
|
||||
class UploadBodyListener implements EventSubscriberInterface
|
||||
{
|
||||
/**
|
||||
* @var array The names of the commands of which to modify the body parameter
|
||||
*/
|
||||
protected $commands;
|
||||
|
||||
/**
|
||||
* @var string The key for the upload body parameter
|
||||
*/
|
||||
protected $bodyParameter;
|
||||
|
||||
/**
|
||||
* @var string The key for the source file parameter
|
||||
*/
|
||||
protected $sourceParameter;
|
||||
|
||||
/**
|
||||
* @param array $commands The commands to modify
|
||||
* @param string $bodyParameter The key for the body parameter
|
||||
* @param string $sourceParameter The key for the source file parameter
|
||||
*/
|
||||
public function __construct(array $commands, $bodyParameter = 'Body', $sourceParameter = 'SourceFile')
|
||||
{
|
||||
$this->commands = $commands;
|
||||
$this->bodyParameter = (string) $bodyParameter;
|
||||
$this->sourceParameter = (string) $sourceParameter;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public static function getSubscribedEvents()
|
||||
{
|
||||
return array('command.before_prepare' => array('onCommandBeforePrepare'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts filenames and file handles into EntityBody objects before the command is validated
|
||||
*
|
||||
* @param Event $event Event emitted
|
||||
* @throws InvalidArgumentException
|
||||
*/
|
||||
public function onCommandBeforePrepare(Event $event)
|
||||
{
|
||||
/** @var Command $command */
|
||||
$command = $event['command'];
|
||||
if (in_array($command->getName(), $this->commands)) {
|
||||
// Get the interesting parameters
|
||||
$source = $command->get($this->sourceParameter);
|
||||
$body = $command->get($this->bodyParameter);
|
||||
|
||||
// If a file path is passed in then get the file handle
|
||||
if (is_string($source) && file_exists($source)) {
|
||||
$body = fopen($source, 'r');
|
||||
}
|
||||
|
||||
// Prepare the body parameter and remove the source file parameter
|
||||
if (null !== $body) {
|
||||
$command->remove($this->sourceParameter);
|
||||
$command->set($this->bodyParameter, EntityBody::factory($body));
|
||||
} else {
|
||||
throw new InvalidArgumentException("You must specify a non-null value for the {$this->bodyParameter} or {$this->sourceParameter} parameters.");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,61 @@
|
||||
<?php
|
||||
/**
|
||||
* Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License").
|
||||
* You may not use this file except in compliance with the License.
|
||||
* A copy of the License is located at
|
||||
*
|
||||
* http://aws.amazon.com/apache2.0
|
||||
*
|
||||
* or in the "license" file accompanying this file. This file is distributed
|
||||
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
|
||||
* express or implied. See the License for the specific language governing
|
||||
* permissions and limitations under the License.
|
||||
*/
|
||||
|
||||
namespace Aws\Common\Client;
|
||||
|
||||
use Guzzle\Common\Event;
|
||||
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
|
||||
|
||||
/**
|
||||
* Listener used to append strings to the User-Agent header of a request based
|
||||
* on the `ua.append` option. `ua.append` can contain a string or array of values.
|
||||
*/
|
||||
class UserAgentListener implements EventSubscriberInterface
|
||||
{
|
||||
/**
|
||||
* @var string Option used to store User-Agent modifiers
|
||||
*/
|
||||
const OPTION = 'ua.append';
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public static function getSubscribedEvents()
|
||||
{
|
||||
return array('command.before_send' => 'onBeforeSend');
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds strings to the User-Agent header using the `ua.append` parameter of a command
|
||||
*
|
||||
* @param Event $event Event emitted
|
||||
*/
|
||||
public function onBeforeSend(Event $event)
|
||||
{
|
||||
$command = $event['command'];
|
||||
if ($userAgentAppends = $command->get(self::OPTION)) {
|
||||
$request = $command->getRequest();
|
||||
$userAgent = (string) $request->getHeader('User-Agent');
|
||||
foreach ((array) $userAgentAppends as $append) {
|
||||
$append = ' ' . $append;
|
||||
if (strpos($userAgent, $append) === false) {
|
||||
$userAgent .= $append;
|
||||
}
|
||||
}
|
||||
$request->setHeader('User-Agent', $userAgent);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,120 @@
|
||||
<?php
|
||||
|
||||
namespace Aws\Common\Command;
|
||||
|
||||
use Guzzle\Http\Message\RequestInterface;
|
||||
use Guzzle\Service\Description\Parameter;
|
||||
use Guzzle\Service\Command\CommandInterface;
|
||||
use Guzzle\Service\Command\LocationVisitor\Request\AbstractRequestVisitor;
|
||||
|
||||
/**
|
||||
* Location visitor used to serialize AWS query parameters (e.g. EC2, SES, SNS, SQS, etc) as POST fields
|
||||
*/
|
||||
class AwsQueryVisitor extends AbstractRequestVisitor
|
||||
{
|
||||
private $fqname;
|
||||
|
||||
public function visit(CommandInterface $command, RequestInterface $request, Parameter $param, $value)
|
||||
{
|
||||
$this->fqname = $command->getName();
|
||||
$query = array();
|
||||
$this->customResolver($value, $param, $query, $param->getWireName());
|
||||
$request->addPostFields($query);
|
||||
}
|
||||
|
||||
/**
|
||||
* Map nested parameters into the location_key based parameters
|
||||
*
|
||||
* @param array $value Value to map
|
||||
* @param Parameter $param Parameter that holds information about the current key
|
||||
* @param array $query Built up query string values
|
||||
* @param string $prefix String to prepend to sub query values
|
||||
*/
|
||||
protected function customResolver($value, Parameter $param, array &$query, $prefix = '')
|
||||
{
|
||||
switch ($param->getType()) {
|
||||
case 'object':
|
||||
$this->resolveObject($param, $value, $prefix, $query);
|
||||
break;
|
||||
case 'array':
|
||||
$this->resolveArray($param, $value, $prefix, $query);
|
||||
break;
|
||||
default:
|
||||
$query[$prefix] = $param->filter($value);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Custom handling for objects
|
||||
*
|
||||
* @param Parameter $param Parameter for the object
|
||||
* @param array $value Value that is set for this parameter
|
||||
* @param string $prefix Prefix for the resulting key
|
||||
* @param array $query Query string array passed by reference
|
||||
*/
|
||||
protected function resolveObject(Parameter $param, array $value, $prefix, array &$query)
|
||||
{
|
||||
// Maps are implemented using additional properties
|
||||
$hasAdditionalProperties = ($param->getAdditionalProperties() instanceof Parameter);
|
||||
$additionalPropertyCount = 0;
|
||||
|
||||
foreach ($value as $name => $v) {
|
||||
if ($subParam = $param->getProperty($name)) {
|
||||
// if the parameter was found by name as a regular property
|
||||
$key = $prefix . '.' . $subParam->getWireName();
|
||||
$this->customResolver($v, $subParam, $query, $key);
|
||||
} elseif ($hasAdditionalProperties) {
|
||||
// Handle map cases like &Attribute.1.Name=<name>&Attribute.1.Value=<value>
|
||||
$additionalPropertyCount++;
|
||||
$data = $param->getData();
|
||||
$keyName = isset($data['keyName']) ? $data['keyName'] : 'key';
|
||||
$valueName = isset($data['valueName']) ? $data['valueName'] : 'value';
|
||||
$query["{$prefix}.{$additionalPropertyCount}.{$keyName}"] = $name;
|
||||
$newPrefix = "{$prefix}.{$additionalPropertyCount}.{$valueName}";
|
||||
if (is_array($v)) {
|
||||
$this->customResolver($v, $param->getAdditionalProperties(), $query, $newPrefix);
|
||||
} else {
|
||||
$query[$newPrefix] = $param->filter($v);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Custom handling for arrays
|
||||
*
|
||||
* @param Parameter $param Parameter for the object
|
||||
* @param array $value Value that is set for this parameter
|
||||
* @param string $prefix Prefix for the resulting key
|
||||
* @param array $query Query string array passed by reference
|
||||
*/
|
||||
protected function resolveArray(Parameter $param, array $value, $prefix, array &$query)
|
||||
{
|
||||
static $serializeEmpty = array(
|
||||
'SetLoadBalancerPoliciesForBackendServer' => 1,
|
||||
'SetLoadBalancerPoliciesOfListener' => 1,
|
||||
'UpdateStack' => 1
|
||||
);
|
||||
|
||||
// For BC, serialize empty lists for specific operations
|
||||
if (!$value) {
|
||||
if (isset($serializeEmpty[$this->fqname])) {
|
||||
if (substr($prefix, -7) === '.member') {
|
||||
$prefix = substr($prefix, 0, -7);
|
||||
}
|
||||
$query[$prefix] = '';
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
$offset = $param->getData('offset') ?: 1;
|
||||
foreach ($value as $index => $v) {
|
||||
$index += $offset;
|
||||
if (is_array($v) && $items = $param->getItems()) {
|
||||
$this->customResolver($v, $items, $query, $prefix . '.' . $index);
|
||||
} else {
|
||||
$query[$prefix . '.' . $index] = $param->filter($v);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
<?php
|
||||
/**
|
||||
* Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License").
|
||||
* You may not use this file except in compliance with the License.
|
||||
* A copy of the License is located at
|
||||
*
|
||||
* http://aws.amazon.com/apache2.0
|
||||
*
|
||||
* or in the "license" file accompanying this file. This file is distributed
|
||||
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
|
||||
* express or implied. See the License for the specific language governing
|
||||
* permissions and limitations under the License.
|
||||
*/
|
||||
|
||||
namespace Aws\Common\Command;
|
||||
|
||||
use Guzzle\Service\Command\OperationCommand;
|
||||
use Guzzle\Http\Curl\CurlHandle;
|
||||
|
||||
/**
|
||||
* Adds AWS JSON body functionality to dynamically generated HTTP requests
|
||||
*/
|
||||
class JsonCommand extends OperationCommand
|
||||
{
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function build()
|
||||
{
|
||||
parent::build();
|
||||
|
||||
// Ensure that the body of the request ALWAYS includes some JSON. By default, this is an empty object.
|
||||
if (!$this->request->getBody()) {
|
||||
$this->request->setBody('{}');
|
||||
}
|
||||
|
||||
// Never send the Expect header when interacting with a JSON query service
|
||||
$this->request->removeHeader('Expect');
|
||||
|
||||
// Always send JSON requests as a raw string rather than using streams to avoid issues with
|
||||
// cURL error code 65: "necessary data rewind wasn't possible".
|
||||
// This could be removed after PHP addresses https://bugs.php.net/bug.php?id=47204
|
||||
$this->request->getCurlOptions()->set(CurlHandle::BODY_AS_STRING, true);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,53 @@
|
||||
<?php
|
||||
/**
|
||||
* Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License").
|
||||
* You may not use this file except in compliance with the License.
|
||||
* A copy of the License is located at
|
||||
*
|
||||
* http://aws.amazon.com/apache2.0
|
||||
*
|
||||
* or in the "license" file accompanying this file. This file is distributed
|
||||
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
|
||||
* express or implied. See the License for the specific language governing
|
||||
* permissions and limitations under the License.
|
||||
*/
|
||||
|
||||
namespace Aws\Common\Command;
|
||||
|
||||
use Guzzle\Service\Command\OperationCommand;
|
||||
|
||||
/**
|
||||
* Adds AWS Query service serialization
|
||||
*/
|
||||
class QueryCommand extends OperationCommand
|
||||
{
|
||||
/**
|
||||
* @var AwsQueryVisitor
|
||||
*/
|
||||
protected static $queryVisitor;
|
||||
|
||||
/**
|
||||
* @var XmlResponseLocationVisitor
|
||||
*/
|
||||
protected static $xmlVisitor;
|
||||
|
||||
/**
|
||||
* Register the aws.query visitor
|
||||
*/
|
||||
protected function init()
|
||||
{
|
||||
// @codeCoverageIgnoreStart
|
||||
if (!self::$queryVisitor) {
|
||||
self::$queryVisitor = new AwsQueryVisitor();
|
||||
}
|
||||
if (!self::$xmlVisitor) {
|
||||
self::$xmlVisitor = new XmlResponseLocationVisitor();
|
||||
}
|
||||
// @codeCoverageIgnoreEnd
|
||||
|
||||
$this->getRequestSerializer()->addVisitor('aws.query', self::$queryVisitor);
|
||||
$this->getResponseParser()->addVisitor('xml', self::$xmlVisitor);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,74 @@
|
||||
<?php
|
||||
|
||||
namespace Aws\Common\Command;
|
||||
|
||||
use Guzzle\Service\Description\Operation;
|
||||
use Guzzle\Service\Command\CommandInterface;
|
||||
use Guzzle\Http\Message\Response;
|
||||
use Guzzle\Service\Description\Parameter;
|
||||
use Guzzle\Service\Command\LocationVisitor\Response\XmlVisitor;
|
||||
|
||||
/**
|
||||
* Class used for custom AWS XML response parsing of query services
|
||||
*/
|
||||
class XmlResponseLocationVisitor extends XmlVisitor
|
||||
{
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function before(CommandInterface $command, array &$result)
|
||||
{
|
||||
parent::before($command, $result);
|
||||
|
||||
// Unwrapped wrapped responses
|
||||
$operation = $command->getOperation();
|
||||
if ($operation->getServiceDescription()->getData('resultWrapped')) {
|
||||
$wrappingNode = $operation->getName() . 'Result';
|
||||
if (isset($result[$wrappingNode])) {
|
||||
$result = $result[$wrappingNode] + $result;
|
||||
unset($result[$wrappingNode]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Accounts for wrapper nodes
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function visit(
|
||||
CommandInterface $command,
|
||||
Response $response,
|
||||
Parameter $param,
|
||||
&$value,
|
||||
$context = null
|
||||
) {
|
||||
parent::visit($command, $response, $param, $value, $context);
|
||||
|
||||
// Account for wrapper nodes (e.g. RDS, ElastiCache, etc)
|
||||
if ($param->getData('wrapper')) {
|
||||
$wireName = $param->getWireName();
|
||||
$value += $value[$wireName];
|
||||
unset($value[$wireName]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Filter used when converting XML maps into associative arrays in service descriptions
|
||||
*
|
||||
* @param array $value Value to filter
|
||||
* @param string $entryName Name of each entry
|
||||
* @param string $keyName Name of each key
|
||||
* @param string $valueName Name of each value
|
||||
*
|
||||
* @return array Returns the map of the XML data
|
||||
*/
|
||||
public static function xmlMap($value, $entryName, $keyName, $valueName)
|
||||
{
|
||||
$result = array();
|
||||
foreach ($value as $entry) {
|
||||
$result[$entry[$keyName]] = $entry[$valueName];
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,136 @@
|
||||
<?php
|
||||
/**
|
||||
* Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License").
|
||||
* You may not use this file except in compliance with the License.
|
||||
* A copy of the License is located at
|
||||
*
|
||||
* http://aws.amazon.com/apache2.0
|
||||
*
|
||||
* or in the "license" file accompanying this file. This file is distributed
|
||||
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
|
||||
* express or implied. See the License for the specific language governing
|
||||
* permissions and limitations under the License.
|
||||
*/
|
||||
|
||||
namespace Aws\Common\Credentials;
|
||||
|
||||
/**
|
||||
* Abstract credentials decorator
|
||||
*/
|
||||
class AbstractCredentialsDecorator implements CredentialsInterface
|
||||
{
|
||||
/**
|
||||
* @var CredentialsInterface Wrapped credentials object
|
||||
*/
|
||||
protected $credentials;
|
||||
|
||||
/**
|
||||
* Constructs a new BasicAWSCredentials object, with the specified AWS
|
||||
* access key and AWS secret key
|
||||
*
|
||||
* @param CredentialsInterface $credentials
|
||||
*/
|
||||
public function __construct(CredentialsInterface $credentials)
|
||||
{
|
||||
$this->credentials = $credentials;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function serialize()
|
||||
{
|
||||
return $this->credentials->serialize();
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function unserialize($serialized)
|
||||
{
|
||||
$this->credentials = new Credentials('', '');
|
||||
$this->credentials->unserialize($serialized);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getAccessKeyId()
|
||||
{
|
||||
return $this->credentials->getAccessKeyId();
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getSecretKey()
|
||||
{
|
||||
return $this->credentials->getSecretKey();
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getSecurityToken()
|
||||
{
|
||||
return $this->credentials->getSecurityToken();
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getExpiration()
|
||||
{
|
||||
return $this->credentials->getExpiration();
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function isExpired()
|
||||
{
|
||||
return $this->credentials->isExpired();
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function setAccessKeyId($key)
|
||||
{
|
||||
$this->credentials->setAccessKeyId($key);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function setSecretKey($secret)
|
||||
{
|
||||
$this->credentials->setSecretKey($secret);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function setSecurityToken($token)
|
||||
{
|
||||
$this->credentials->setSecurityToken($token);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function setExpiration($timestamp)
|
||||
{
|
||||
$this->credentials->setExpiration($timestamp);
|
||||
|
||||
return $this;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,95 @@
|
||||
<?php
|
||||
/**
|
||||
* Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License").
|
||||
* You may not use this file except in compliance with the License.
|
||||
* A copy of the License is located at
|
||||
*
|
||||
* http://aws.amazon.com/apache2.0
|
||||
*
|
||||
* or in the "license" file accompanying this file. This file is distributed
|
||||
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
|
||||
* express or implied. See the License for the specific language governing
|
||||
* permissions and limitations under the License.
|
||||
*/
|
||||
|
||||
namespace Aws\Common\Credentials;
|
||||
|
||||
/**
|
||||
* Abstract decorator to provide a foundation for refreshable credentials
|
||||
*/
|
||||
abstract class AbstractRefreshableCredentials extends AbstractCredentialsDecorator
|
||||
{
|
||||
/**
|
||||
* Get the underlying credentials, refreshing if necessary.
|
||||
*
|
||||
* @return Credentials
|
||||
*/
|
||||
public function getCredentials()
|
||||
{
|
||||
if ($this->credentials->isExpired()) {
|
||||
$this->refresh();
|
||||
}
|
||||
|
||||
return new Credentials(
|
||||
$this->credentials->getAccessKeyId(),
|
||||
$this->credentials->getSecretKey(),
|
||||
$this->credentials->getSecurityToken(),
|
||||
$this->credentials->getExpiration()
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getAccessKeyId()
|
||||
{
|
||||
if ($this->credentials->isExpired()) {
|
||||
$this->refresh();
|
||||
}
|
||||
|
||||
return $this->credentials->getAccessKeyId();
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getSecretKey()
|
||||
{
|
||||
if ($this->credentials->isExpired()) {
|
||||
$this->refresh();
|
||||
}
|
||||
|
||||
return $this->credentials->getSecretKey();
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getSecurityToken()
|
||||
{
|
||||
if ($this->credentials->isExpired()) {
|
||||
$this->refresh();
|
||||
}
|
||||
|
||||
return $this->credentials->getSecurityToken();
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function serialize()
|
||||
{
|
||||
if ($this->credentials->isExpired()) {
|
||||
$this->refresh();
|
||||
}
|
||||
|
||||
return $this->credentials->serialize();
|
||||
}
|
||||
|
||||
/**
|
||||
* Attempt to get new credentials
|
||||
*/
|
||||
abstract protected function refresh();
|
||||
}
|
||||
@@ -0,0 +1,74 @@
|
||||
<?php
|
||||
/**
|
||||
* Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License").
|
||||
* You may not use this file except in compliance with the License.
|
||||
* A copy of the License is located at
|
||||
*
|
||||
* http://aws.amazon.com/apache2.0
|
||||
*
|
||||
* or in the "license" file accompanying this file. This file is distributed
|
||||
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
|
||||
* express or implied. See the License for the specific language governing
|
||||
* permissions and limitations under the License.
|
||||
*/
|
||||
|
||||
namespace Aws\Common\Credentials;
|
||||
|
||||
use Guzzle\Cache\CacheAdapterInterface;
|
||||
|
||||
/**
|
||||
* Credentials decorator used to implement caching credentials
|
||||
*/
|
||||
class CacheableCredentials extends AbstractRefreshableCredentials
|
||||
{
|
||||
/**
|
||||
* @var CacheAdapterInterface Cache adapter used to store credentials
|
||||
*/
|
||||
protected $cache;
|
||||
|
||||
/**
|
||||
* @var string Cache key used to store the credentials
|
||||
*/
|
||||
protected $cacheKey;
|
||||
|
||||
/**
|
||||
* CacheableCredentials is a decorator that decorates other credentials
|
||||
*
|
||||
* @param CredentialsInterface $credentials Credentials to adapt
|
||||
* @param CacheAdapterInterface $cache Cache to use to store credentials
|
||||
* @param string $cacheKey Cache key of the credentials
|
||||
*/
|
||||
public function __construct(CredentialsInterface $credentials, CacheAdapterInterface $cache, $cacheKey)
|
||||
{
|
||||
$this->cache = $cache;
|
||||
$this->cacheKey = $cacheKey;
|
||||
|
||||
parent::__construct($credentials);
|
||||
}
|
||||
|
||||
/**
|
||||
* Attempt to get new credentials from cache or from the adapted object
|
||||
*/
|
||||
protected function refresh()
|
||||
{
|
||||
if (!$cache = $this->cache->fetch($this->cacheKey)) {
|
||||
// The credentials were not found, so try again and cache if new
|
||||
$this->credentials->getAccessKeyId();
|
||||
if (!$this->credentials->isExpired()) {
|
||||
// The credentials were updated, so cache them
|
||||
$this->cache->save($this->cacheKey, $this->credentials, $this->credentials->getExpiration() - time());
|
||||
}
|
||||
} else {
|
||||
// The credentials were found in cache, so update the adapter object
|
||||
// if the cached credentials are not expired
|
||||
if (!$cache->isExpired()) {
|
||||
$this->credentials->setAccessKeyId($cache->getAccessKeyId());
|
||||
$this->credentials->setSecretKey($cache->getSecretKey());
|
||||
$this->credentials->setSecurityToken($cache->getSecurityToken());
|
||||
$this->credentials->setExpiration($cache->getExpiration());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,352 @@
|
||||
<?php
|
||||
/**
|
||||
* Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License").
|
||||
* You may not use this file except in compliance with the License.
|
||||
* A copy of the License is located at
|
||||
*
|
||||
* http://aws.amazon.com/apache2.0
|
||||
*
|
||||
* or in the "license" file accompanying this file. This file is distributed
|
||||
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
|
||||
* express or implied. See the License for the specific language governing
|
||||
* permissions and limitations under the License.
|
||||
*/
|
||||
|
||||
namespace Aws\Common\Credentials;
|
||||
|
||||
use Aws\Common\Enum\ClientOptions as Options;
|
||||
use Aws\Common\Exception\InvalidArgumentException;
|
||||
use Aws\Common\Exception\RequiredExtensionNotLoadedException;
|
||||
use Aws\Common\Exception\RuntimeException;
|
||||
use Guzzle\Common\FromConfigInterface;
|
||||
use Guzzle\Cache\CacheAdapterInterface;
|
||||
use Guzzle\Cache\DoctrineCacheAdapter;
|
||||
use Guzzle\Common\Collection;
|
||||
|
||||
/**
|
||||
* Basic implementation of the AWSCredentials interface that allows callers to
|
||||
* pass in the AWS access key and secret access in the constructor.
|
||||
*/
|
||||
class Credentials implements CredentialsInterface, FromConfigInterface
|
||||
{
|
||||
const ENV_KEY = 'AWS_ACCESS_KEY_ID';
|
||||
const ENV_SECRET = 'AWS_SECRET_KEY';
|
||||
const ENV_SECRET_ACCESS_KEY = 'AWS_SECRET_ACCESS_KEY';
|
||||
const ENV_PROFILE = 'AWS_PROFILE';
|
||||
|
||||
/** @var string AWS Access Key ID */
|
||||
protected $key;
|
||||
|
||||
/** @var string AWS Secret Access Key */
|
||||
protected $secret;
|
||||
|
||||
/** @var string AWS Security Token */
|
||||
protected $token;
|
||||
|
||||
/** @var int Time to die of token */
|
||||
protected $ttd;
|
||||
|
||||
/**
|
||||
* Get the available keys for the factory method
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public static function getConfigDefaults()
|
||||
{
|
||||
return array(
|
||||
Options::KEY => null,
|
||||
Options::SECRET => null,
|
||||
Options::TOKEN => null,
|
||||
Options::TOKEN_TTD => null,
|
||||
Options::PROFILE => null,
|
||||
Options::CREDENTIALS_CACHE => null,
|
||||
Options::CREDENTIALS_CACHE_KEY => null,
|
||||
Options::CREDENTIALS_CLIENT => null
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Factory method for creating new credentials. This factory method will
|
||||
* create the appropriate credentials object with appropriate decorators
|
||||
* based on the passed configuration options.
|
||||
*
|
||||
* @param array $config Options to use when instantiating the credentials
|
||||
*
|
||||
* @return CredentialsInterface
|
||||
* @throws InvalidArgumentException If the caching options are invalid
|
||||
* @throws RuntimeException If using the default cache and APC is disabled
|
||||
*/
|
||||
public static function factory($config = array())
|
||||
{
|
||||
// Add default key values
|
||||
foreach (self::getConfigDefaults() as $key => $value) {
|
||||
if (!isset($config[$key])) {
|
||||
$config[$key] = $value;
|
||||
}
|
||||
}
|
||||
|
||||
// Set up the cache
|
||||
$cache = $config[Options::CREDENTIALS_CACHE];
|
||||
$cacheKey = $config[Options::CREDENTIALS_CACHE_KEY] ?:
|
||||
'credentials_' . ($config[Options::KEY] ?: crc32(gethostname()));
|
||||
|
||||
if (
|
||||
$cacheKey &&
|
||||
$cache instanceof CacheAdapterInterface &&
|
||||
$cached = self::createFromCache($cache, $cacheKey)
|
||||
) {
|
||||
return $cached;
|
||||
}
|
||||
|
||||
// Create the credentials object
|
||||
if (!$config[Options::KEY] || !$config[Options::SECRET]) {
|
||||
$credentials = self::createFromEnvironment($config);
|
||||
} else {
|
||||
// Instantiate using short or long term credentials
|
||||
$credentials = new static(
|
||||
$config[Options::KEY],
|
||||
$config[Options::SECRET],
|
||||
$config[Options::TOKEN],
|
||||
$config[Options::TOKEN_TTD]
|
||||
);
|
||||
}
|
||||
|
||||
// Check if the credentials are refreshable, and if so, configure caching
|
||||
$cache = $config[Options::CREDENTIALS_CACHE];
|
||||
if ($cacheKey && $cache) {
|
||||
$credentials = self::createCache($credentials, $cache, $cacheKey);
|
||||
}
|
||||
|
||||
return $credentials;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create credentials from the credentials ini file in the HOME directory.
|
||||
*
|
||||
* @param string|null $profile Pass a specific profile to use. If no
|
||||
* profile is specified we will attempt to use
|
||||
* the value specified in the AWS_PROFILE
|
||||
* environment variable. If AWS_PROFILE is not
|
||||
* set, the "default" profile is used.
|
||||
* @param string|null $filename Pass a string to specify the location of the
|
||||
* credentials files. If null is passed, the
|
||||
* SDK will attempt to find the configuration
|
||||
* file at in your HOME directory at
|
||||
* ~/.aws/credentials.
|
||||
* @return CredentialsInterface
|
||||
* @throws \RuntimeException if the file cannot be found, if the file is
|
||||
* invalid, or if the profile is invalid.
|
||||
*/
|
||||
public static function fromIni($profile = null, $filename = null)
|
||||
{
|
||||
if (!$filename) {
|
||||
$filename = self::getHomeDir() . '/.aws/credentials';
|
||||
}
|
||||
|
||||
if (!$profile) {
|
||||
$profile = self::getEnvVar(self::ENV_PROFILE) ?: 'default';
|
||||
}
|
||||
|
||||
if (!is_readable($filename) || ($data = parse_ini_file($filename, true)) === false) {
|
||||
throw new \RuntimeException("Invalid AWS credentials file: {$filename}.");
|
||||
}
|
||||
|
||||
if (!isset($data[$profile]['aws_access_key_id']) || !isset($data[$profile]['aws_secret_access_key'])) {
|
||||
throw new \RuntimeException("Invalid AWS credentials profile {$profile} in {$filename}.");
|
||||
}
|
||||
|
||||
return new self(
|
||||
$data[$profile]['aws_access_key_id'],
|
||||
$data[$profile]['aws_secret_access_key'],
|
||||
isset($data[$profile]['aws_security_token'])
|
||||
? $data[$profile]['aws_security_token']
|
||||
: null
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructs a new BasicAWSCredentials object, with the specified AWS
|
||||
* access key and AWS secret key
|
||||
*
|
||||
* @param string $accessKeyId AWS access key ID
|
||||
* @param string $secretAccessKey AWS secret access key
|
||||
* @param string $token Security token to use
|
||||
* @param int $expiration UNIX timestamp for when credentials expire
|
||||
*/
|
||||
public function __construct($accessKeyId, $secretAccessKey, $token = null, $expiration = null)
|
||||
{
|
||||
$this->key = trim($accessKeyId);
|
||||
$this->secret = trim($secretAccessKey);
|
||||
$this->token = $token;
|
||||
$this->ttd = $expiration;
|
||||
}
|
||||
|
||||
public function serialize()
|
||||
{
|
||||
return json_encode(array(
|
||||
Options::KEY => $this->key,
|
||||
Options::SECRET => $this->secret,
|
||||
Options::TOKEN => $this->token,
|
||||
Options::TOKEN_TTD => $this->ttd
|
||||
));
|
||||
}
|
||||
|
||||
public function unserialize($serialized)
|
||||
{
|
||||
$data = json_decode($serialized, true);
|
||||
$this->key = $data[Options::KEY];
|
||||
$this->secret = $data[Options::SECRET];
|
||||
$this->token = $data[Options::TOKEN];
|
||||
$this->ttd = $data[Options::TOKEN_TTD];
|
||||
}
|
||||
|
||||
public function getAccessKeyId()
|
||||
{
|
||||
return $this->key;
|
||||
}
|
||||
|
||||
public function getSecretKey()
|
||||
{
|
||||
return $this->secret;
|
||||
}
|
||||
|
||||
public function getSecurityToken()
|
||||
{
|
||||
return $this->token;
|
||||
}
|
||||
|
||||
public function getExpiration()
|
||||
{
|
||||
return $this->ttd;
|
||||
}
|
||||
|
||||
public function isExpired()
|
||||
{
|
||||
return $this->ttd !== null && time() >= $this->ttd;
|
||||
}
|
||||
|
||||
public function setAccessKeyId($key)
|
||||
{
|
||||
$this->key = $key;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function setSecretKey($secret)
|
||||
{
|
||||
$this->secret = $secret;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function setSecurityToken($token)
|
||||
{
|
||||
$this->token = $token;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function setExpiration($timestamp)
|
||||
{
|
||||
$this->ttd = $timestamp;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* When no keys are provided, attempt to create them based on the
|
||||
* environment or instance profile credentials.
|
||||
*
|
||||
* @param array|Collection $config
|
||||
*
|
||||
* @return CredentialsInterface
|
||||
*/
|
||||
private static function createFromEnvironment($config)
|
||||
{
|
||||
// Get key and secret from ENV variables
|
||||
$envKey = self::getEnvVar(self::ENV_KEY);
|
||||
if (!($envSecret = self::getEnvVar(self::ENV_SECRET))) {
|
||||
// Use AWS_SECRET_ACCESS_KEY if AWS_SECRET_KEY was not set
|
||||
$envSecret = self::getEnvVar(self::ENV_SECRET_ACCESS_KEY);
|
||||
}
|
||||
|
||||
// Use credentials from the environment variables if available
|
||||
if ($envKey && $envSecret) {
|
||||
return new static($envKey, $envSecret);
|
||||
}
|
||||
|
||||
try {
|
||||
// Use credentials from the INI file in HOME directory if available
|
||||
return self::fromIni($config[Options::PROFILE]);
|
||||
} catch (\RuntimeException $e) {
|
||||
// Otherwise, try using instance profile credentials (available on EC2 instances)
|
||||
return new RefreshableInstanceProfileCredentials(
|
||||
new static('', '', '', 1),
|
||||
$config[Options::CREDENTIALS_CLIENT]
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
private static function createFromCache(CacheAdapterInterface $cache, $cacheKey)
|
||||
{
|
||||
$cached = $cache->fetch($cacheKey);
|
||||
if ($cached instanceof CredentialsInterface && !$cached->isExpired()) {
|
||||
return new CacheableCredentials($cached, $cache, $cacheKey);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private static function createCache(CredentialsInterface $credentials, $cache, $cacheKey)
|
||||
{
|
||||
if ($cache === 'true' || $cache === true) {
|
||||
// If no cache adapter was provided, then create one for the user
|
||||
// @codeCoverageIgnoreStart
|
||||
if (!extension_loaded('apc')) {
|
||||
throw new RequiredExtensionNotLoadedException('PHP has not been compiled with APC. Unable to cache '
|
||||
. 'the credentials.');
|
||||
} elseif (!class_exists('Doctrine\Common\Cache\ApcCache')) {
|
||||
throw new RuntimeException(
|
||||
'Cannot set ' . Options::CREDENTIALS_CACHE . ' to true because the Doctrine cache component is '
|
||||
. 'not installed. Either install doctrine/cache or pass in an instantiated '
|
||||
. 'Guzzle\Cache\CacheAdapterInterface object'
|
||||
);
|
||||
}
|
||||
// @codeCoverageIgnoreEnd
|
||||
$cache = new DoctrineCacheAdapter(new \Doctrine\Common\Cache\ApcCache());
|
||||
} elseif (!($cache instanceof CacheAdapterInterface)) {
|
||||
throw new InvalidArgumentException('Unable to utilize caching with the specified options');
|
||||
}
|
||||
|
||||
// Decorate the credentials with a cache
|
||||
return new CacheableCredentials($credentials, $cache, $cacheKey);
|
||||
}
|
||||
|
||||
private static function getHomeDir()
|
||||
{
|
||||
// On Linux/Unix-like systems, use the HOME environment variable
|
||||
if ($homeDir = self::getEnvVar('HOME')) {
|
||||
return $homeDir;
|
||||
}
|
||||
|
||||
// Get the HOMEDRIVE and HOMEPATH values for Windows hosts
|
||||
$homeDrive = self::getEnvVar('HOMEDRIVE');
|
||||
$homePath = self::getEnvVar('HOMEPATH');
|
||||
|
||||
return ($homeDrive && $homePath) ? $homeDrive . $homePath : null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fetches the value of an environment variable by checking $_SERVER and getenv().
|
||||
*
|
||||
* @param string $var Name of the environment variable
|
||||
*
|
||||
* @return mixed|null
|
||||
*/
|
||||
private static function getEnvVar($var)
|
||||
{
|
||||
return isset($_SERVER[$var]) ? $_SERVER[$var] : getenv($var);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,96 @@
|
||||
<?php
|
||||
/**
|
||||
* Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License").
|
||||
* You may not use this file except in compliance with the License.
|
||||
* A copy of the License is located at
|
||||
*
|
||||
* http://aws.amazon.com/apache2.0
|
||||
*
|
||||
* or in the "license" file accompanying this file. This file is distributed
|
||||
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
|
||||
* express or implied. See the License for the specific language governing
|
||||
* permissions and limitations under the License.
|
||||
*/
|
||||
|
||||
namespace Aws\Common\Credentials;
|
||||
|
||||
/**
|
||||
* Provides access to the AWS credentials used for accessing AWS services: AWS
|
||||
* access key ID, secret access key, and security token. These credentials are
|
||||
* used to securely sign requests to AWS services.
|
||||
*/
|
||||
interface CredentialsInterface extends \Serializable
|
||||
{
|
||||
/**
|
||||
* Returns the AWS access key ID for this credentials object.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getAccessKeyId();
|
||||
|
||||
/**
|
||||
* Returns the AWS secret access key for this credentials object.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getSecretKey();
|
||||
|
||||
/**
|
||||
* Get the associated security token if available
|
||||
*
|
||||
* @return string|null
|
||||
*/
|
||||
public function getSecurityToken();
|
||||
|
||||
/**
|
||||
* Get the UNIX timestamp in which the credentials will expire
|
||||
*
|
||||
* @return int|null
|
||||
*/
|
||||
public function getExpiration();
|
||||
|
||||
/**
|
||||
* Set the AWS access key ID for this credentials object.
|
||||
*
|
||||
* @param string $key AWS access key ID
|
||||
*
|
||||
* @return self
|
||||
*/
|
||||
public function setAccessKeyId($key);
|
||||
|
||||
/**
|
||||
* Set the AWS secret access key for this credentials object.
|
||||
*
|
||||
* @param string $secret AWS secret access key
|
||||
*
|
||||
* @return CredentialsInterface
|
||||
*/
|
||||
public function setSecretKey($secret);
|
||||
|
||||
/**
|
||||
* Set the security token to use with this credentials object
|
||||
*
|
||||
* @param string $token Security token
|
||||
*
|
||||
* @return self
|
||||
*/
|
||||
public function setSecurityToken($token);
|
||||
|
||||
/**
|
||||
* Set the UNIX timestamp in which the credentials will expire
|
||||
*
|
||||
* @param int $timestamp UNIX timestamp expiration
|
||||
*
|
||||
* @return self
|
||||
*/
|
||||
public function setExpiration($timestamp);
|
||||
|
||||
/**
|
||||
* Check if the credentials are expired
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isExpired();
|
||||
}
|
||||