%PDF- %PDF-
Mini Shell

Mini Shell

Direktori : /data/www_bck/varak.net_bck/ampache.varak.net/lib/class/
Upload File :
Create Path :
Current File : //data/www_bck/varak.net_bck/ampache.varak.net/lib/class/share.class.php

<?php
/* vim:set softtabstop=4 shiftwidth=4 expandtab: */
/**
 *
 * LICENSE: GNU General Public License, version 2 (GPLv2)
 * Copyright 2001 - 2014 Ampache.org
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License v2
 * as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 *
 */

class Share extends database_object
{
    public $id;
    public $user;
    public $object_type;
    public $object_id;
    public $allow_stream;
    public $allow_download;
    public $creation_date;
    public $lastvisit_date;
    public $expire_days;
    public $max_counter;
    public $counter;
    public $secret;
    public $public_url;

    public $f_object_link;
    public $f_user;
    public $f_allow_stream;
    public $f_allow_download;
    public $f_creation_date;
    public $f_lastvisit_date;

    /**
     * Constructor
     */
    public function __construct($id=0)
    {
        if (!$id) { return true; }

        /* Get the information from the db */
        $info = $this->get_info($id);

        // Foreach what we've got
        foreach ($info as $key=>$value) {
            $this->$key = $value;
        }

        return true;
    } //constructor

    public static function delete_share($id)
    {
        $sql = "DELETE FROM `share` WHERE `id` = ?";
        $params = array( $id );
        if (!$GLOBALS['user']->has_access('75')) {
            $sql .= " AND `user` = ?";
            $params[] = $GLOBALS['user']->id;
        }

        return Dba::write($sql, $params);
    }

    public static function delete_shares($object_type, $object_id)
    {
        $sql = "DELETE FROM `share` WHERE `object_type` = ? AND `object_id` = ?";

        Dba::write($sql, array($object_type, $object_id));
    }

    public static function generate_secret($length = 8)
    {
        $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
        $secret = '';
        for ($i = 0; $i < $length; $i++) {
            $secret .= $characters[rand(0, strlen($characters) - 1)];
        }

        return $secret;
    }

    public static function format_type($type)
    {
        switch ($type) {
            case 'album':
            case 'song':
            case 'playlist':
                return $type;
            default:
                return '';
        }
    }

    public static function create_share($object_type, $object_id, $allow_stream=true, $allow_download=true, $expire=0, $secret='', $max_counter=0, $description='')
    {
        $object_type = self::format_type($object_type);
        if (empty($object_type)) return '';

        if (!$allow_stream && !$allow_download) return '';

        $sql = "INSERT INTO `share` (`user`, `object_type`, `object_id`, `creation_date`, `allow_stream`, `allow_download`, `expire_days`, `secret`, `counter`, `max_counter`, `description`) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
        $params = array($GLOBALS['user']->id, $object_type, $object_id, time(), $allow_stream ?: 0, $allow_download ?: 0, $expire, $secret, 0, $max_counter, $description);
        Dba::write($sql, $params);

        $id = Dba::insert_id();

        $url = self::get_url($id, $secret);
        // Get a shortener url if any available
        foreach (Plugin::get_plugins('shortener') as $plugin_name) {
            try {
                $plugin = new Plugin($plugin_name);
                if ($plugin->load($GLOBALS['user'])) {
                    $short_url = $plugin->_plugin->shortener($url);
                    if (!empty($short_url)) {
                        $url = $short_url;
                        break;
                    }
                }
            } catch (Exception $e) {
                debug_event('share', 'Share plugin error: ' . $e->getMessage(), '1');
            }
        }
        $sql = "UPDATE `share` SET `public_url` = ? WHERE `id` = ?";
        Dba::write($sql, array($url, $id));

        return $id;
    }

    public static function get_url($id, $secret)
    {
        $url = AmpConfig::get('web_path') . '/share.php?id=' . $id;
        if (!empty($secret)) {
            $url .= '&secret=' . $secret;
        }

        return $url;
    }

    public static function get_share_list_sql()
    {
        $sql = "SELECT `id` FROM `share` ";

        if (!$GLOBALS['user']->has_access('75')) {
            $sql .= "WHERE `user` = '" . scrub_in($GLOBALS['user']->id) . "'";
        }

        return $sql;
    }

    public static function get_share_list()
    {
        $sql = self::get_share_list_sql();
        $db_results = Dba::read($sql);
        $results = array();

        while ($row = Dba::fetch_assoc($db_results)) {
            $results[] = $row['id'];
        }

        return $results;
    }

    public static function get_shares($object_type, $object_id)
    {
        $sql = "SELECT `id` FROM `share` WHERE `object_type` = ? AND `object_id` = ?";
        $db_results = Dba::read($sql, array($object_type, $object_id));
        $results = array();
        while ($row = Dba::fetch_assoc($db_results)) {
            $results[] = $row['id'];
        }

        return $results;
    }

    public function show_action_buttons()
    {
        if ($this->id) {
            if ($GLOBALS['user']->has_access('75') || $this->user == $GLOBALS['user']->id) {
                echo "<a href=\"" . AmpConfig::get('web_path') . "/share.php?action=show_delete&id=" . $this->id ."\">" . UI::get_icon('delete', T_('Delete')) . "</a>";
            }
        }
    }

    public function format()
    {
        $object = new $this->object_type($this->object_id);
        $object->format();
        $this->f_object_link = $object->f_link;
        $user = new User($this->user);
        $this->f_user = $user->fullname;
        $this->f_allow_stream = $this->allow_stream;
        $this->f_allow_download = $this->allow_download;
        $this->f_creation_date = date("Y-m-d H:i:s", $this->creation_date);
        $this->f_lastvisit_date = ($this->lastvisit_date > 0) ? date("Y-m-d H:i:s", $this->creation_date) : '';
    }

    public function save_access()
    {
        $sql = "UPDATE `share` SET `counter` = (`counter` + 1), lastvisit_date = ? WHERE `id` = ?";
        return Dba::write($sql, array(time(), $this->id));
    }

    public function is_valid($secret, $action)
    {
        if (!$this->id) {
            debug_event('share', 'Access Denied: Invalid share.', '3');
            return false;
        }

        if (!AmpConfig::get('share')) {
            debug_event('share', 'Access Denied: share feature disabled.', '3');
            return false;
        }

        if ($this->expire_days > 0 && ($this->creation_date + ($this->expire_days * 86400)) < time()) {
            debug_event('share', 'Access Denied: share expired.', '3');
            return false;
        }

        if ($this->max_counter > 0 && $this->counter >= $this->max_counter) {
            debug_event('share', 'Access Denied: max counter reached.', '3');
            return false;
        }

        if (!empty($this->secret) && $secret != $this->secret) {
            debug_event('share', 'Access Denied: secret requires to access share ' . $this->id . '.', '3');
            return false;
        }

        if ($action == 'download' && (!AmpConfig::get('download') || !$this->allow_download)) {
            debug_event('share', 'Access Denied: download unauthorized.', '3');
            return false;
        }

        if ($action == 'stream' && !$this->allow_stream) {
            debug_event('share', 'Access Denied: stream unauthorized.', '3');
            return false;
        }

        return true;
    }

    public function create_fake_playlist()
    {
        $playlist = new Stream_Playlist(-1);
        $medias = array();

        switch ($this->object_type) {
            case 'album':
            case 'playlist':
                $object = new $this->object_type($this->object_id);
                $songs = $object->get_songs();
                foreach ($songs as $id) {
                    $medias[] = array(
                        'object_type' => 'song',
                        'object_id' => $id,
                    );
                }
            break;
            default:
                $medias[] = array(
                    'object_type' => $this->object_type,
                    'object_id' => $this->object_id,
                );
            break;
        }

        $playlist->add($medias, '&share_id=' . $this->id . '&share_secret=' . $this->secret);
        return $playlist;
    }

    public function is_shared_song($song_id)
    {
        $is_shared = false;
        switch ($this->object_type) {
            case 'album':
            case 'playlist':
                $object = new $this->object_type($this->object_id);
                $songs = $object->get_songs();
                foreach ($songs as $id) {
                    $is_shared = ($song_id == $id);
                    if ($is_shared) { break; }
                }
            break;
            default:
                $is_shared = ($this->object_type == 'song' && $this->object_id == $song_id);
            break;
        }

        return $is_shared;
    }

} // end of recommendation class

Zerion Mini Shell 1.0