Файл: adultscript-2.0.3-pro/files/modules/video/components/upload.php
Строк: 121
<?php
defined('_VALID') or die('Restricted Access!');
class VComponent_video_upload extends VModule_video
{
private $errors = array();
private $vcfg;
public function __construct()
{
parent::__construct();
$this->vcfg = VF::cfg('module.video');
}
public function render()
{
VLanguage::load('frontend.upload');
VLanguage::load('frontend.video');
if (!$this->vcfg['upload_enabled']) {
$_SESSION['error'] = __('upload-disabled');
VModule::load('error', TRUE);
}
if ($this->vcfg['upload_perm'] != 'anonymous') {
VAuth::check(ucfirst($this->vcfg['upload_perm']), NULL, __('upload-perm', array($this->vcfg['upload_perm'])));
$user_id = (int) $_SESSION['user_id'];
} else {
$user_id = (VAuth::loggedin()) ? (int) $_SESSION['user_id'] : $this->get_anonymous_id();
}
$errors = array();
$messages = array();
$allow = TRUE;
if (!empty($this->vcfg['upload_limit'])) {
$add_time = strtotime(date('Y-m-d').' 00:00:00');
$this->db->query("SELECT COUNT(*) AS total_videos
FROM #__video
WHERE add_time > ".$add_time."
AND user_id = ".$user_id);
if ($this->db->affected_rows()) {
$total_videos = (int) $this->db->fetch_field('total_videos');
$upload_limit = (int) $this->vcfg['upload_limit'];
if ($total_videos >= $upload_limit) {
$errors[] = __('upload-limit', array($upload_limit));
}
}
}
$categories = $this->get_video_categories();
$unique = time().'0'.mt_rand();
$video = array(
'title' => '', 'description' => '', 'tags' => '', 'category' => array(),
'url' => '', 'code' => ''
);
if (isset($_POST['cancel-upload'])) {
$allow = FALSE;
}
if (isset($_POST['upload-submitted']) && $allow === TRUE) {
$filter = VF::factory('filter');
$title = $filter->get('title');
$description = $filter->get('description');
$category = (isset($_POST['category'])) ? (array) $_POST['category'] : array();
$pornstars = (isset($_POST['pornstars'])) ? (array) $_POST['pornstars'] : array();
$tags = $filter->get('tags');
$upload_id = $filter->get('unique_id');
if ($title == '') {
$errors[] = __('title-empty');
} elseif (!VValid::length($title, 1, 100)) {
$errors[] = __('title-length');
} else {
$video['title'] = $title;
}
if ($description != '') {
$video['description'] = $description;
}
if (!$category) {
$errors[] = __('category-empty', array($this->vcfg['max_categories']));
} elseif (count($category) > $this->vcfg['max_categories']) {
$errors[] = __('category-max', array($this->vcfg['max_categories']));
} else {
$video['category'] = $category;
}
if ($tags == '') {
$errors[] = __('tags-empty');
} else {
$tags = prepare_tags($tags);
if ($tags == '') {
$errors[] = __('tags-invalid');
} else {
$arr = explode(',', $tags);
foreach ($arr as $tag) {
if (strlen($tag) > $this->vcfg['tag_max_length']) {
$errors[] = __('tag-length', array('"'.$tag.'"', $this->vcfg['tag_max_length']));
}
if (str_word_count($tag) > $this->vcfg['tag_max_words']) {
$errors[] = __('tag-words', array('"'.$tag.'"', $this->vcfg['tag_max_words']));
}
}
$video['tags'] = $tags;
}
}
if (!ctype_digit($upload_id)) {
$errors[] = 'Invalid upload identifier!';
}
if (!$errors) {
if (!$file = $this->process_file($upload_id, $this->vcfg['video_max_size'], $this->vcfg['video_allowed_ext'])) {
$errors = array_merge($errors, $this->errors);
}
}
if (!$errors) {
$vmodel = VModel::load('video', 'video', true);
if ($video_id = $vmodel->add(array(
'user_id' => $user_id,
'title' => $title,
'slug' => prepare_string($title, true, $this->vcfg['slug_max_length']),
'description' => $description,
'type' => 'public',
'premium' => '0',
'status' => 3))) {
$dst = MEDIA_DIR.'/videos/vid/'.$video_id.'.'.$file['ext'];
$status = ($this->vcfg['approve']) ? 2 : 1;
if (rename($file['path'], $dst)) {
@chmod($dst, 0777);
if ($this->vcfg['queue']) {
$status = 6;
} else {
$cmd = VF::cfg_core_item('php_cli_path').' '.MODULES_DIR.'/video/scripts/convert.php '.$video_id.' '.$file['ext'].' '.$status;
exec(escapeshellcmd($cmd). ' >/dev/null &');
}
if ($status !== 6) {
$status = 4;
}
foreach ($category as $cat_id) {
$vmodel->add_category($video_id, $cat_id);
}
$tags = explode(',', $tags);
foreach ($tags as $tag) {
$vmodel->add_tag($video_id, trim($tag));
}
$vmodel->add_orig(array(
'video_id' => $video_id,
'user_id' => $user_id,
'filename' => $file['name'],
'ext' => $file['ext'],
'size' => $file['size'],
'method' => 'upload'
));
$vmodel->add_activity($user_id);
if ($status === 6) {
$vmodel->add_queue($video_id, $status);
}
foreach ($pornstars as $model_id) {
$vmodel->add_model($video_id, (int) $model_id);
}
$vmodel->update($video_id, array(
'status' => $status
));
$video['title'] = '';
$video['description'] = '';
$video['tags'] = '';
$video['category'] = array();
if ($status === 1 OR $status === 4) {
$messages[] = __('upload-success');
} elseif ($status === 2 OR $status === 0) {
$messages[] = __('upload-approve');
} elseif ($status == 6) {
$messages[] = __('upload-queue');
}
} else {
$errors[] = __('file-error');
}
} else {
throw new VException(__('database-error'));
}
}
}
$tpl = VF::factory('template');
$tpl->menu = 'video';
$tpl->meta_title = __('upload-video');
$tpl->canonical = BASE_URL.'/upload/';
$tpl->canonicalm = MOBILE_URL.'/upload/';
$tpl->errors = $errors;
$tpl->messages = $messages;
$tpl->video = $video;
$tpl->categories = $categories;
$tpl->tag_max_length = $this->vcfg['tag_max_length'];
$tpl->tag_max_words = $this->vcfg['tag_max_words'];
$tpl->max_categories = $this->vcfg['max_categories'];
$tpl->unique = $unique;
$tpl->pornstars = (VModule::enabled('pornstar')) ? $this->get_pornstars('a') : NULL;
$tpl->load(array('header', 'video_upload', 'footer'));
$tpl->display();
}
private function get_anonymous_id()
{
$this->db->query("SELECT user_id FROM #__user WHERE username = 'anonymous' LIMIT 1");
if ($this->db->affected_rows()) {
return (int) $this->db->fetch_field('user_id');
}
throw new Exception('Failed to get anonymous id! Application error!?');
}
private function get_pornstars($letter='a')
{
$this->db->query("SELECT model_id, name
FROM #__model
WHERE slug LIKE '".$letter."%'
AND status = '1'");
return $this->db->fetch_rows();
}
private function process_file($upload_id, $max_size, $allowed_ext)
{
VLanguage::load('frontend.upload');
$sec = substr(md5(VF::cfg_item('secret')), -5);
$info = TMP_DIR.'/uploads/'.$upload_id.'_'.$sec;
if (file_exists($info) && is_file($info)) {
$info = file($info);
$name = trim($info['0']);
$ext = trim($info['1']);
$path = TMP_DIR.'/uploads/'.$upload_id.'_'.$sec.'.'.$ext;
if (file_exists($path) && is_file($path)) {
$size = filesize($path);
if ($max_size !== 0 && $size > ($max_size*1024*1024)) {
$this->errors[] = __('file-limit', array($max_size));
} else {
if (in_array($ext, $allowed_ext)) {
@unlink($info);
return array(
'path' => $path,
'name' => $name,
'size' => $size,
'ext' => $ext
);
} else {
$this->errors[] = __('file-invalid', array(implode(', ', $allowed_ext)));
}
}
} else {
$this->errors[] = __('file-select');
}
} else {
$this->errors[] = __('file-select').'*';
}
return FALSE;
}
}