2009-05-11 13:45:00 -04:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								< ? php  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/*  
						 
					
						
							
								
									
										
										
										
											2009-08-25 18:14:12 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 *  StatusNet  -  the  distributed  open - source  microblogging  tool 
							 
						 
					
						
							
								
									
										
										
										
											2009-08-25 18:12:20 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 *  Copyright  ( C )  2008 ,  2009 ,  StatusNet ,  Inc . 
							 
						 
					
						
							
								
									
										
										
										
											2009-05-11 13:45:00 -04:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  This  program  is  free  software :  you  can  redistribute  it  and / or  modify 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  it  under  the  terms  of  the  GNU  Affero  General  Public  License  as  published  by 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  the  Free  Software  Foundation ,  either  version  3  of  the  License ,  or 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  ( at  your  option )  any  later  version . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  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  Affero  General  Public  License  for  more  details . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  You  should  have  received  a  copy  of  the  GNU  Affero  General  Public  License 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  along  with  this  program .      If  not ,  see  < http :// www . gnu . org / licenses />. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-11-10 14:33:45 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								if  ( ! defined ( 'GNUSOCIAL' ))  {  exit ( 1 );  }  
						 
					
						
							
								
									
										
										
										
											2009-05-11 13:45:00 -04:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/**  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  Table  Definition  for  file 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-22 17:52:02 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								class  File  extends  Managed_DataObject  
						 
					
						
							
								
									
										
										
										
											2009-05-11 13:45:00 -04:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    public  $__table  =  'file' ;                             // table name
 
							 
						 
					
						
							
								
									
										
										
										
											2009-06-22 14:19:41 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    public  $id ;                               // int(4)  primary_key not_null
 
							 
						 
					
						
							
								
									
										
										
										
											2009-05-11 13:45:00 -04:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    public  $url ;                              // varchar(255)  unique_key
 
							 
						 
					
						
							
								
									
										
										
										
											2009-06-22 22:48:31 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    public  $mimetype ;                         // varchar(50)
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    public  $size ;                             // int(4)
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    public  $title ;                            // varchar(255)
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    public  $date ;                             // int(4)
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    public  $protected ;                        // int(4)
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    public  $filename ;                         // varchar(255)
 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-07 09:51:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    public  $width ;                            // int(4)
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    public  $height ;                           // int(4)
 
							 
						 
					
						
							
								
									
										
										
										
											2009-06-22 14:19:41 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    public  $modified ;                         // timestamp()   not_null default_CURRENT_TIMESTAMP
 
							 
						 
					
						
							
								
									
										
										
										
											2009-05-11 13:45:00 -04:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-22 17:52:02 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    public  static  function  schemaDef () 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  array ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            'fields'  =>  array ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                'id'  =>  array ( 'type'  =>  'serial' ,  'not null'  =>  true ), 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                'url'  =>  array ( 'type'  =>  'varchar' ,  'length'  =>  255 ,  'description'  =>  'destination URL after following redirections' ), 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                'mimetype'  =>  array ( 'type'  =>  'varchar' ,  'length'  =>  50 ,  'description'  =>  'mime type of resource' ), 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                'size'  =>  array ( 'type'  =>  'int' ,  'description'  =>  'size of resource when available' ), 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                'title'  =>  array ( 'type'  =>  'varchar' ,  'length'  =>  255 ,  'description'  =>  'title of resource when available' ), 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                'date'  =>  array ( 'type'  =>  'int' ,  'description'  =>  'date of resource according to http query' ), 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                'protected'  =>  array ( 'type'  =>  'int' ,  'description'  =>  'true when URL is private (needs login)' ), 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                'filename'  =>  array ( 'type'  =>  'varchar' ,  'length'  =>  255 ,  'description'  =>  'if a local file, name of the file' ), 
							 
						 
					
						
							
								
									
										
										
										
											2014-04-21 20:39:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                'width'  =>  array ( 'type'  =>  'int' ,  'description'  =>  'width in pixels, if it can be described as such and data is available' ), 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                'height'  =>  array ( 'type'  =>  'int' ,  'description'  =>  'height in pixels, if it can be described as such and data is available' ), 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-22 17:52:02 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                'modified'  =>  array ( 'type'  =>  'timestamp' ,  'not null'  =>  true ,  'description'  =>  'date this record was modified' ), 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ), 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            'primary key'  =>  array ( 'id' ), 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            'unique keys'  =>  array ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                'file_url_key'  =>  array ( 'url' ), 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ), 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2009-05-13 14:27:32 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    function  isProtected ( $url )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  'http://www.facebook.com/login.php'  ===  $url ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-03-10 13:39:42 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    /** 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     *  Save  a  new  file  record . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     *  @ param  array  $redir_data  lookup  data  eg  from  File_redirection :: where () 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     *  @ param  string  $given_url 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     *  @ return  File 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     */ 
							 
						 
					
						
							
								
									
										
										
										
											2014-04-20 16:06:41 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    public  static  function  saveNew ( array  $redir_data ,  $given_url )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-30 13:03:42 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        // I don't know why we have to keep doing this but I'm adding this last check to avoid
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        // uniqueness bugs.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-05-06 23:00:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        $file  =  File :: getKV ( 'url' ,  $given_url ); 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-30 13:03:42 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        
							 
						 
					
						
							
								
									
										
										
										
											2014-05-06 23:00:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( ! $file  instanceof  File )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            $file  =  new  File ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            $file -> url  =  $given_url ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ( ! empty ( $redir_data [ 'protected' ]))  $file -> protected  =  $redir_data [ 'protected' ]; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ( ! empty ( $redir_data [ 'title' ]))  $file -> title  =  $redir_data [ 'title' ]; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ( ! empty ( $redir_data [ 'type' ]))  $file -> mimetype  =  $redir_data [ 'type' ]; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ( ! empty ( $redir_data [ 'size' ]))  $file -> size  =  intval ( $redir_data [ 'size' ]); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ( isset ( $redir_data [ 'time' ])  &&  $redir_data [ 'time' ]  >  0 )  $file -> date  =  intval ( $redir_data [ 'time' ]); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            $file_id  =  $file -> insert (); 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-30 13:03:42 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
									
										
										
										
											2009-05-13 14:27:32 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-05-06 23:00:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        Event :: handle ( 'EndFileSaveNew' ,  array ( $file ,  $redir_data ,  $given_url )); 
							 
						 
					
						
							
								
									
										
										
										
											2014-06-02 02:08:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        assert  ( $file  instanceof  File ); 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-06 23:00:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        return  $file ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-05-13 14:27:32 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-05-25 13:09:21 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    /** 
							 
						 
					
						
							
								
									
										
										
										
											2010-11-15 11:00:42 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								     *  Go  look  at  a  URL  and  possibly  save  data  about  it  if  it ' s  new : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     *  -  follow  redirect  chains  and  store  them  in  file_redirection 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     *  -  if  a  thumbnail  is  available ,  save  it  in  file_thumbnail 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     *  -  save  file  record  with  basic  info 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     *  -  optionally  save  a  file_to_post  record 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     *  -  return  the  File  object  with  the  full  reference 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     * 
							 
						 
					
						
							
								
									
										
										
										
											2010-05-25 13:09:21 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								     *  @ fixme  refactor  this  mess ,  it ' s  gotten  pretty  scary . 
							 
						 
					
						
							
								
									
										
										
										
											2010-11-15 11:00:42 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								     *  @ param  string  $given_url  the  URL  we ' re  looking  at 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     *  @ param  int  $notice_id  ( optional ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     *  @ param  bool  $followRedirects  defaults  to  true 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     *  @ return  mixed  File  on  success ,  - 1  on  some  errors 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     * 
							 
						 
					
						
							
								
									
										
										
										
											2014-06-02 02:08:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								     *  @ throws  ServerException  on  failure 
							 
						 
					
						
							
								
									
										
										
										
											2010-05-25 13:09:21 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								     */ 
							 
						 
					
						
							
								
									
										
										
										
											2014-06-02 02:08:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    public  static  function  processNew ( $given_url ,  $notice_id = null ,  $followRedirects = true )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( empty ( $given_url ))  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            throw  new  ServerException ( 'No given URL to process' ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2009-05-13 14:27:32 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        $given_url  =  File_redirection :: _canonUrl ( $given_url ); 
							 
						 
					
						
							
								
									
										
										
										
											2014-06-02 02:08:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( empty ( $given_url ))  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            throw  new  ServerException ( 'No canonical URL from given URL to process' ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-08-18 13:04:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        $file  =  File :: getKV ( 'url' ,  $given_url ); 
							 
						 
					
						
							
								
									
										
										
										
											2014-06-02 02:08:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( ! $file  instanceof  File )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            // First check if we have a lookup trace for this URL already
 
							 
						 
					
						
							
								
									
										
										
										
											2013-08-18 13:04:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            $file_redir  =  File_redirection :: getKV ( 'url' ,  $given_url ); 
							 
						 
					
						
							
								
									
										
										
										
											2014-06-02 02:08:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            if  ( $file_redir  instanceof  File_redirection )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                $file  =  File :: getKV ( 'id' ,  $file_redir -> file_id ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  ( ! $file  instanceof  File )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    // File did not exist, let's clean up the File_redirection entry
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    $file_redir -> delete (); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            // If we still don't have a File object, let's create one now!
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ( ! $file  instanceof  File )  { 
							 
						 
					
						
							
								
									
										
										
										
											2010-05-25 13:09:21 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                // @fixme for new URLs this also looks up non-redirect data
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                // such as target content type, size, etc, which we need
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                // for File::saveNew(); so we call it even if not following
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                // new redirects.
 
							 
						 
					
						
							
								
									
										
										
										
											2009-05-13 14:27:32 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                $redir_data  =  File_redirection :: where ( $given_url ); 
							 
						 
					
						
							
								
									
										
										
										
											2009-09-27 16:52:15 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                if  ( is_array ( $redir_data ))  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    $redir_url  =  $redir_data [ 'url' ]; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                }  elseif  ( is_string ( $redir_data ))  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    $redir_url  =  $redir_data ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-03-10 14:31:29 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    $redir_data  =  array (); 
							 
						 
					
						
							
								
									
										
										
										
											2009-09-27 16:52:15 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                }  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-29 13:01:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    // TRANS: Server exception thrown when a URL cannot be processed.
 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-30 19:25:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    throw  new  ServerException ( sprintf ( _ ( " Cannot process URL '%s' " ),  $given_url )); 
							 
						 
					
						
							
								
									
										
										
										
											2009-09-27 16:52:15 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
									
										
										
										
											2014-06-02 02:08:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2009-08-12 16:00:46 +12:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                // TODO: max field length
 
							 
						 
					
						
							
								
									
										
										
										
											2010-05-25 13:09:21 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                if  ( $redir_url  ===  $given_url  ||  strlen ( $redir_url )  >  255  ||  ! $followRedirects )  { 
							 
						 
					
						
							
								
									
										
										
										
											2014-06-02 02:08:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    // Save the File object based on our lookup trace
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    $file  =  File :: saveNew ( $redir_data ,  $given_url ); 
							 
						 
					
						
							
								
									
										
										
										
											2009-05-13 14:27:32 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                }  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2010-05-25 13:09:21 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    // This seems kind of messed up... for now skipping this part
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    // if we're already under a redirect, so we don't go into
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    // horrible infinite loops if we've been given an unstable
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    // redirect (where the final destination of the first request
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    // doesn't match what we get when we ask for it again).
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    //
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    // Seen in the wild with clojure.org, which redirects through
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    // wikispaces for auth and appends session data in the URL params.
 
							 
						 
					
						
							
								
									
										
										
										
											2014-06-02 02:08:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    $file  =  self :: processNew ( $redir_url ,  $notice_id ,  /*followRedirects*/ false ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    File_redirection :: saveNew ( $redir_data ,  $file -> id ,  $given_url ); 
							 
						 
					
						
							
								
									
										
										
										
											2009-05-13 14:27:32 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-06-02 02:08:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            if  ( ! $file  instanceof  File )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                // This should only happen if File::saveNew somehow did not return a File object,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                // though we have an assert for that in case the event there might've gone wrong.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                // If anything else goes wrong, there should've been an exception thrown.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                throw  new  ServerException ( 'URL processing failed without new File object' ); 
							 
						 
					
						
							
								
									
										
										
										
											2009-07-30 16:55:09 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
									
										
										
										
											2009-05-13 14:27:32 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
									
										
										
										
											2009-06-22 22:48:31 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2009-08-27 20:23:31 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( ! empty ( $notice_id ))  { 
							 
						 
					
						
							
								
									
										
										
										
											2014-06-02 02:08:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            File_to_post :: processNew ( $file -> id ,  $notice_id ); 
							 
						 
					
						
							
								
									
										
										
										
											2009-08-27 20:23:31 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
									
										
										
										
											2014-06-02 02:08:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        return  $file ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-05-13 14:27:32 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
									
										
										
										
											2009-05-31 21:03:55 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-10-05 18:43:41 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    public  static  function  respectsQuota ( Profile  $scoped ,  $fileSize )  { 
							 
						 
					
						
							
								
									
										
										
										
											2009-07-07 15:55:10 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( $fileSize  >  common_config ( 'attachments' ,  'file_quota' ))  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-28 12:44:42 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            // TRANS: Message used to be inserted as %2$s in  the text "No file may
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            // TRANS: be larger than %1$d byte and the file you sent was %2$s.".
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            // TRANS: %1$d is the number of bytes of an uploaded file.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            $fileSizeText  =  sprintf ( _m ( '%1$d byte' , '%1$d bytes' , $fileSize ), $fileSize ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            $fileQuota  =  common_config ( 'attachments' ,  'file_quota' ); 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-29 13:01:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            // TRANS: Message given if an upload is larger than the configured maximum.
 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-28 12:44:42 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            // TRANS: %1$d (used for plural) is the byte limit for uploads,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            // TRANS: %2$s is the proper form of "n bytes". This is the only ways to have
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            // TRANS: gettext support multiple plurals in the same message, unfortunately...
 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-05 18:43:41 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            throw  new  ClientException ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    sprintf ( _m ( 'No file may be larger than %1$d byte and the file you sent was %2$s. Try to upload a smaller version.' , 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-28 12:44:42 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                              'No file may be larger than %1$d bytes and the file you sent was %2$s. Try to upload a smaller version.' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                              $fileQuota ), 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-05 18:43:41 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    $fileQuota ,  $fileSizeText )); 
							 
						 
					
						
							
								
									
										
										
										
											2009-05-31 21:03:55 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-10-05 18:43:41 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        $file  =  new  File ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        $query  =  " select sum(size) as total from file join file_to_post on file_to_post.file_id = file.id join notice on file_to_post.post_id = notice.id where profile_id =  { $scoped -> id }  and file.url like '%/notice/%/file' " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        $file -> query ( $query ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        $file -> fetch (); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        $total  =  $file -> total  +  $fileSize ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-05-31 21:03:55 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( $total  >  common_config ( 'attachments' ,  'user_quota' ))  { 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-29 13:01:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            // TRANS: Message given if an upload would exceed user quota.
 
							 
						 
					
						
							
								
									
										
										
										
											2010-11-04 18:33:39 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            // TRANS: %d (number) is the user quota in bytes and is used for plural.
 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-05 18:43:41 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            throw  new  ClientException ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    sprintf ( _m ( 'A file this large would exceed your user quota of %d byte.' , 
							 
						 
					
						
							
								
									
										
										
										
											2010-11-04 18:33:39 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                              'A file this large would exceed your user quota of %d bytes.' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                              common_config ( 'attachments' ,  'user_quota' )), 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-05 18:43:41 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    common_config ( 'attachments' ,  'user_quota' ))); 
							 
						 
					
						
							
								
									
										
										
										
											2009-05-31 21:03:55 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
									
										
										
										
											2009-07-22 17:05:44 +12:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        $query  .=  ' AND EXTRACT(month FROM file.modified) = EXTRACT(month FROM now()) and EXTRACT(year FROM file.modified) = EXTRACT(year FROM now())' ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-05 18:43:41 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        $file -> query ( $query ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        $file -> fetch (); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        $total  =  $file -> total  +  $fileSize ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-05-31 21:03:55 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( $total  >  common_config ( 'attachments' ,  'monthly_quota' ))  { 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-29 13:01:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            // TRANS: Message given id an upload would exceed a user's monthly quota.
 
							 
						 
					
						
							
								
									
										
										
										
											2010-11-04 18:33:39 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            // TRANS: $d (number) is the monthly user quota in bytes and is used for plural.
 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-05 18:43:41 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            throw  new  ClientException ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    sprintf ( _m ( 'A file this large would exceed your monthly quota of %d byte.' , 
							 
						 
					
						
							
								
									
										
										
										
											2010-11-04 18:33:39 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                              'A file this large would exceed your monthly quota of %d bytes.' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                              common_config ( 'attachments' ,  'monthly_quota' )), 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-05 18:43:41 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    common_config ( 'attachments' ,  'monthly_quota' ))); 
							 
						 
					
						
							
								
									
										
										
										
											2009-05-31 21:03:55 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
									
										
										
										
											2009-06-22 22:48:31 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    // where should the file go?
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-04-16 23:17:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    static  function  filename ( Profile  $profile ,  $origname ,  $mimetype ) 
							 
						 
					
						
							
								
									
										
										
										
											2009-06-23 07:29:43 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-08 03:51:47 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        try  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            $ext  =  common_supported_mime_to_ext ( $mimetype ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        }  catch  ( Exception  $e )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            // We don't support this mimetype, but let's guess the extension
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            $ext  =  substr ( strrchr ( $mimetype ,  '/' ),  1 ); 
							 
						 
					
						
							
								
									
										
										
										
											2010-03-01 21:42:38 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
									
										
										
										
											2010-11-03 17:05:26 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-04-16 23:17:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        // Normalize and make the original filename more URL friendly.
 
							 
						 
					
						
							
								
									
										
										
										
											2014-06-22 17:03:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        $origname  =  basename ( $origname ,  " . $ext " ); 
							 
						 
					
						
							
								
									
										
										
										
											2014-04-16 23:17:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( class_exists ( 'Normalizer' ))  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            // http://php.net/manual/en/class.normalizer.php
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            // http://www.unicode.org/reports/tr15/
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            $origname  =  Normalizer :: normalize ( $origname ,  Normalizer :: FORM_KC ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        $origname  =  preg_replace ( '/[^A-Za-z0-9\.\_]/' ,  '_' ,  $origname ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-06-22 17:03:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        $nickname  =  $profile -> getNickname (); 
							 
						 
					
						
							
								
									
										
										
										
											2014-04-16 23:17:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        $datestamp  =  strftime ( '%Y%m%d' ,  time ()); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        do  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            // generate new random strings until we don't run into a filename collision.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            $random  =  strtolower ( common_confirmation_code ( 16 )); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            $filename  =  " $nickname - $datestamp - $origname - $random . $ext " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        }  while  ( file_exists ( self :: path ( $filename ))); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  $filename ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-06-23 07:29:43 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
									
										
										
										
											2009-06-22 22:48:31 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-02-01 08:48:31 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    /** 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     *  Validation  for  as - saved  base  filenames 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    static  function  validFilename ( $filename ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
									
										
										
										
											2010-02-02 09:30:15 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        return  preg_match ( '/^[A-Za-z0-9._-]+$/' ,  $filename ); 
							 
						 
					
						
							
								
									
										
										
										
											2010-02-01 08:48:31 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    /** 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     *  @ throws  ClientException  on  invalid  filename 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     */ 
							 
						 
					
						
							
								
									
										
										
										
											2009-06-23 07:29:43 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    static  function  path ( $filename ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
									
										
										
										
											2010-02-01 08:48:31 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( ! self :: validFilename ( $filename ))  { 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-29 13:01:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            // TRANS: Client exception thrown if a file upload does not have a valid name.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            throw  new  ClientException ( _ ( " Invalid filename. " )); 
							 
						 
					
						
							
								
									
										
										
										
											2010-02-01 08:48:31 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
									
										
										
										
											2009-06-23 07:29:43 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        $dir  =  common_config ( 'attachments' ,  'dir' ); 
							 
						 
					
						
							
								
									
										
										
										
											2009-06-22 22:48:31 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2009-06-23 07:29:43 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( $dir [ strlen ( $dir ) - 1 ]  !=  '/' )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            $dir  .=  '/' ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
									
										
										
										
											2009-06-22 22:48:31 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2009-06-23 07:29:43 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        return  $dir  .  $filename ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
									
										
										
										
											2009-06-22 22:48:31 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2009-06-23 07:29:43 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    static  function  url ( $filename ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
									
										
										
										
											2010-02-01 08:48:31 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( ! self :: validFilename ( $filename ))  { 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-29 13:01:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            // TRANS: Client exception thrown if a file upload does not have a valid name.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            throw  new  ClientException ( _ ( " Invalid filename. " )); 
							 
						 
					
						
							
								
									
										
										
										
											2010-02-01 08:48:31 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-14 14:22:17 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( common_config ( 'site' , 'private' ))  { 
							 
						 
					
						
							
								
									
										
										
										
											2009-06-22 22:48:31 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-01-05 17:47:37 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            return  common_local_url ( 'getfile' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                array ( 'filename'  =>  $filename )); 
							 
						 
					
						
							
								
									
										
										
										
											2009-06-22 22:48:31 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-10-14 14:22:17 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
									
										
										
										
											2009-06-22 22:48:31 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-01-12 18:56:19 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( StatusNet :: useHTTPS ())  { 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-14 14:22:17 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            $sslserver  =  common_config ( 'attachments' ,  'sslserver' ); 
							 
						 
					
						
							
								
									
										
										
										
											2009-06-22 22:48:31 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-10-14 14:22:17 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            if  ( empty ( $sslserver ))  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                // XXX: this assumes that background dir == site dir + /file/
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                // not true if there's another server
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  ( is_string ( common_config ( 'site' ,  'sslserver' ))  && 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    mb_strlen ( common_config ( 'site' ,  'sslserver' ))  >  0 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    $server  =  common_config ( 'site' ,  'sslserver' ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                }  else  if  ( common_config ( 'site' ,  'server' ))  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    $server  =  common_config ( 'site' ,  'server' ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                $path  =  common_config ( 'site' ,  'path' )  .  '/file/' ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            }  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                $server  =  $sslserver ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                $path    =  common_config ( 'attachments' ,  'sslpath' ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  ( empty ( $path ))  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    $path  =  common_config ( 'attachments' ,  'path' ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
									
										
										
										
											2010-01-05 17:47:37 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-10-14 14:22:17 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            $protocol  =  'https' ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        }  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            $path  =  common_config ( 'attachments' ,  'path' ); 
							 
						 
					
						
							
								
									
										
										
										
											2010-01-05 17:47:37 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            $server  =  common_config ( 'attachments' ,  'server' ); 
							 
						 
					
						
							
								
									
										
										
										
											2009-06-22 22:48:31 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-01-05 17:47:37 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            if  ( empty ( $server ))  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                $server  =  common_config ( 'site' ,  'server' ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
									
										
										
										
											2009-06-22 22:48:31 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-02-11 17:06:57 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            $ssl  =  common_config ( 'attachments' ,  'ssl' ); 
							 
						 
					
						
							
								
									
										
										
										
											2010-01-05 17:47:37 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-02-11 17:06:57 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            $protocol  =  ( $ssl )  ?  'https'  :  'http' ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-14 14:22:17 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
									
										
										
										
											2010-02-11 17:06:57 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-10-14 14:22:17 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( $path [ strlen ( $path ) - 1 ]  !=  '/' )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            $path  .=  '/' ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-01-05 17:47:37 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-14 14:22:17 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( $path [ 0 ]  !=  '/' )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            $path  =  '/' . $path ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  $protocol . '://' . $server . $path . $filename ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-06-23 07:29:43 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
									
										
										
										
											2009-07-14 13:33:40 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2009-08-26 15:40:51 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    function  getEnclosure (){ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        $enclosure  =  ( object )  array (); 
							 
						 
					
						
							
								
									
										
										
										
											2014-08-05 10:54:00 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        foreach  ( array ( 'title' ,  'url' ,  'date' ,  'modified' ,  'size' ,  'mimetype' )  as  $key )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            $enclosure -> $key  =  $this -> $key ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-10-20 16:21:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        $needMoreMetadataMimetypes  =  array ( null ,  'application/xhtml+xml' ); 
							 
						 
					
						
							
								
									
										
										
										
											2014-08-05 10:54:00 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( ! isset ( $this -> filename )  &&  in_array ( common_bare_mime ( $enclosure -> mimetype ),  $needMoreMetadataMimetypes ))  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            // This fetches enclosure metadata for non-local links with unset/HTML mimetypes,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            // which may be enriched through oEmbed or similar (implemented as plugins)
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            Event :: handle ( 'FileEnclosureMetadata' ,  array ( $this ,  & $enclosure )); 
							 
						 
					
						
							
								
									
										
										
										
											2009-07-14 13:33:40 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
									
										
										
										
											2014-08-05 10:54:00 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( empty ( $enclosure -> mimetype )  ||  in_array ( common_bare_mime ( $enclosure -> mimetype ),  $needMoreMetadataMimetypes ))  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            // This means we either don't know what it is, so it can't
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            // be shown as an enclosure, or it is an HTML link which
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            // does not link to a resource with further metadata.
 
							 
						 
					
						
							
								
									
										
										
										
											2014-06-02 01:26:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            throw  new  ServerException ( 'Unknown enclosure mimetype, not enough metadata' ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
									
										
										
										
											2009-08-26 21:51:54 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        return  $enclosure ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-07-14 13:33:40 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
									
										
										
										
											2010-03-02 16:30:09 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-11-08 17:22:01 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    /** 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     *  Get  the  attachment ' s  thumbnail  record ,  if  any . 
							 
						 
					
						
							
								
									
										
										
										
											2014-04-21 20:39:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								     *  Make  sure  you  supply  proper  'int'  typed  variables  ( or  null ) . 
							 
						 
					
						
							
								
									
										
										
										
											2010-11-08 17:22:01 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								     * 
							 
						 
					
						
							
								
									
										
										
										
											2014-04-21 20:39:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								     *  @ param  $width   int    Max  width  of  thumbnail  in  pixels .  ( if  null ,  use  common_config  values ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     *  @ param  $height  int    Max  height  of  thumbnail  in  pixels .  ( if  null ,  square - crop  to  $width ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     *  @ param  $crop    bool   Crop  to  the  max - values '  aspect  ratio 
							 
						 
					
						
							
								
									
										
										
										
											2014-04-21 11:35:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								     * 
							 
						 
					
						
							
								
									
										
										
										
											2010-11-08 17:22:01 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								     *  @ return  File_thumbnail 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     */ 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-26 16:33:39 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    public  function  getThumbnail ( $width = null ,  $height = null ,  $crop = false ,  $force_still = true ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-11-08 17:22:01 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-25 22:45:25 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        // Get some more information about this file through our ImageFile class
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        $image  =  ImageFile :: fromFileObject ( $this ); 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-26 16:33:39 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( $image -> animated  &&  ! common_config ( 'thumbnail' ,  'animated' ))  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            // null  means "always use file as thumbnail"
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            // false means you get choice between frozen frame or original when calling getThumbnail
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ( is_null ( common_config ( 'thumbnail' ,  'animated' ))  ||  ! $force_still )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                throw  new  UseFileAsThumbnailException ( $this -> id ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-25 22:45:25 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-04-21 11:35:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( $width  ===  null )  { 
							 
						 
					
						
							
								
									
										
										
										
											2014-04-21 20:39:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            $width  =  common_config ( 'thumbnail' ,  'width' ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            $height  =  common_config ( 'thumbnail' ,  'height' ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            $crop  =  common_config ( 'thumbnail' ,  'crop' ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( $height  ===  null )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            $height  =  $width ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            $crop  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-12 14:33:41 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-04-21 20:39:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        // Get proper aspect ratio width and height before lookup
 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-12 14:33:41 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        // We have to do it through an ImageFile object because of orientation etc.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        // Only other solution would've been to rotate + rewrite uploaded files.
 
							 
						 
					
						
							
								
									
										
										
										
											2014-06-17 11:50:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        list ( $width ,  $height ,  $x ,  $y ,  $w ,  $h )  = 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-12 14:33:41 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                                $image -> scaleToFit ( $width ,  $height ,  $crop ); 
							 
						 
					
						
							
								
									
										
										
										
											2014-04-21 20:39:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-04-21 11:35:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        $params  =  array ( 'file_id' =>  $this -> id , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        'width'   =>  $width , 
							 
						 
					
						
							
								
									
										
										
										
											2014-04-21 20:39:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                        'height'  =>  $height ); 
							 
						 
					
						
							
								
									
										
										
										
											2014-04-21 11:35:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        $thumb  =  File_thumbnail :: pkeyGet ( $params ); 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-12 14:33:41 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( $thumb  instanceof  File_thumbnail )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  $thumb ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-04-21 11:35:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
									
										
										
										
											2014-04-21 20:39:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-05-12 14:33:41 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        // throws exception on failure to generate thumbnail
 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-25 02:27:37 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        $outname  =  " thumb- { $width } x { $height } - "  .  $image -> filename ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-04-21 20:39:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        $outpath  =  self :: path ( $outname ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-06-17 11:50:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        // The boundary box for our resizing
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        $box  =  array ( 'width' => $width ,  'height' => $height , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                     'x' => $x ,          'y' => $y , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                     'w' => $w ,          'h' => $h ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        // Doublecheck that parameters are sane and integers.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( $box [ 'width' ]  <  1  ||  $box [ 'width' ]  >  common_config ( 'thumbnail' ,  'maxsize' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ||  $box [ 'height' ]  <  1  ||  $box [ 'height' ]  >  common_config ( 'thumbnail' ,  'maxsize' ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-25 02:27:37 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ||  $box [ 'w' ]  <  1  ||  $box [ 'x' ]  >=  $image -> width 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ||  $box [ 'h' ]  <  1  ||  $box [ 'y' ]  >=  $image -> height )  { 
							 
						 
					
						
							
								
									
										
										
										
											2014-06-17 11:50:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            // Fail on bad width parameter. If this occurs, it's due to algorithm in ImageFile->scaleToFit
 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-25 02:27:37 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            common_debug ( " Boundary box parameters for resize of  { $image -> filepath }  :  " . var_export ( $box , true )); 
							 
						 
					
						
							
								
									
										
										
										
											2014-06-17 11:50:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            throw  new  ServerException ( 'Bad thumbnail size parameters.' ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-01-25 02:27:37 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        common_debug ( sprintf ( 'Generating a thumbnail of File id==%u of size %ux%u' ,  $this -> id ,  $width ,  $height )); 
							 
						 
					
						
							
								
									
										
										
										
											2014-06-17 11:50:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        // Perform resize and store into file
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        $image -> resizeTo ( $outpath ,  $box ); 
							 
						 
					
						
							
								
									
										
										
										
											2014-04-21 20:39:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        // Avoid deleting the original
 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-25 02:27:37 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( $image -> getPath ()  !=  self :: path ( $image -> filename ))  { 
							 
						 
					
						
							
								
									
										
										
										
											2014-04-21 20:39:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            $image -> unlink (); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  File_thumbnail :: saveThumbnail ( $this -> id , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                      self :: url ( $outname ), 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-12 14:33:41 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                                      $width ,  $height , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                      $outname ); 
							 
						 
					
						
							
								
									
										
										
										
											2014-04-21 20:39:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-04-16 19:14:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    public  function  getPath () 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  self :: path ( $this -> filename ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-12 19:22:10 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-04-16 23:17:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    public  function  getUrl () 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-12 19:22:10 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( ! empty ( $this -> filename ))  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            // A locally stored file, so let's generate a URL for our instance.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            $url  =  self :: url ( $this -> filename ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ( $url  !=  $this -> url )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                // For indexing purposes, in case we do a lookup on the 'url' field.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                // also we're fixing possible changes from http to https, or paths
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                $this -> updateUrl ( $url ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  $url ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        // No local filename available, return the URL we have stored
 
							 
						 
					
						
							
								
									
										
										
										
											2014-04-16 23:17:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        return  $this -> url ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
									
										
										
										
											2014-04-16 19:14:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-01-12 19:22:10 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    public  function  updateUrl ( $url ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        $file  =  File :: getKV ( 'url' ,  $url ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( $file  instanceof  File )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            throw  new  ServerException ( 'URL already exists in DB' ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        $sql  =  'UPDATE %1$s SET url=%2$s WHERE url=%3$s;' ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        $result  =  $this -> query ( sprintf ( $sql ,  $this -> __table , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                             $this -> _quote (( string ) $url ), 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                             $this -> _quote (( string ) $this -> url ))); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( $result  ===  false )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            common_log_db_error ( $this ,  'UPDATE' ,  __FILE__ ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            throw  new  ServerException ( " Could not UPDATE  { $this -> __table } .url " ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  $result ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-12-28 12:57:31 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    /** 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     *  Blow  the  cache  of  notices  that  link  to  this  URL 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     *  @ param  boolean  $last  Whether  to  blow  the  " last "  cache  too 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     *  @ return  void 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-12-28 11:58:55 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    function  blowCache ( $last = false ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        self :: blow ( 'file:notice-ids:%s' ,  $this -> url ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( $last )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            self :: blow ( 'file:notice-ids:%s;last' ,  $this -> url ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-28 13:44:49 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        self :: blow ( 'file:notice-count:%d' ,  $this -> id ); 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-28 11:58:55 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    /** 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     *  Stream  of  notices  linking  to  this  URL 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     *  @ param  integer  $offset    Offset  to  show ;  default  is  0 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     *  @ param  integer  $limit     Limit  of  notices  to  show 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     *  @ param  integer  $since_id  Since  this  notice 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     *  @ param  integer  $max_id    Before  this  notice 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     *  @ return  array  ids  of  notices  that  link  to  this  file 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    function  stream ( $offset = 0 ,  $limit = NOTICES_PER_PAGE ,  $since_id = 0 ,  $max_id = 0 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
									
										
										
										
											2011-03-24 18:04:19 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        $stream  =  new  FileNoticeStream ( $this ); 
							 
						 
					
						
							
								
									
										
										
										
											2011-03-23 11:29:55 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        return  $stream -> getNotices ( $offset ,  $limit ,  $since_id ,  $max_id ); 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-28 11:58:55 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-12-28 13:44:49 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    function  noticeCount () 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        $cacheKey  =  sprintf ( 'file:notice-count:%d' ,  $this -> id ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        $count  =  self :: cacheGet ( $cacheKey ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( $count  ===  false )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            $f2p  =  new  File_to_post (); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            $f2p -> file_id  =  $this -> id ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            $count  =  $f2p -> count (); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            self :: cacheSet ( $cacheKey ,  $count ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        }  
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  $count ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-12 14:33:41 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    public  function  isLocal () 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  ! empty ( $this -> filename ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-12 15:16:41 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    public  function  delete ( $useWhere = false ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        // Delete the file, if it exists locally
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( ! empty ( $this -> filename )  &&  file_exists ( self :: path ( $this -> filename )))  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            $deleted  =  @ unlink ( self :: path ( $this -> filename )); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ( ! $deleted )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                common_log ( LOG_ERR ,  sprintf ( 'Could not unlink existing file: "%s"' ,  self :: path ( $this -> filename ))); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        // Clear out related things in the database and filesystem, such as thumbnails
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( Event :: handle ( 'FileDeleteRelated' ,  array ( $this )))  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            $thumbs  =  new  File_thumbnail (); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            $thumbs -> file_id  =  $this -> id ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ( $thumbs -> find ())  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                while  ( $thumbs -> fetch ())  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    $thumbs -> delete (); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        // And finally remove the entry from the database
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  parent :: delete ( $useWhere ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
									
										
										
										
											2014-08-05 11:30:45 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    public  function  getTitle () 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        $title  =  $this -> title  ? :  $this -> filename ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  $title  ? :  null ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
									
										
										
										
											2009-05-11 13:45:00 -04:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}