<?php
/**
 * Defines all profile and upload settings.
 *
 * @package    One User Avatar
 * @author     Bangbay Siboliban
 * @author     Flippercode
 * @author     ProfilePress
 * @author     One Designs
 * @copyright  2013-2014 Bangbay Siboliban
 * @copyright  2014-2020 Flippercode
 * @copyright  2020-2021 ProfilePress
 * @copyright  2021 One Designs
 * @version    2.3.9
 */

class WP_User_Avatar {
	/**
	 * Constructor
	 * @since 1.8
	 * @uses string $pagenow
	 * @uses bool $show_avatars
	 * @uses object $wpua_admin
	 * @uses bool $wpua_allow_upload
	 * @uses add_action()
	 * @uses add_filterI]()
	 * @uses is_admin()
	 * @uses is_user_logged_in()
	 * @uses wpua_is_author_or_above()
	 * @uses wpua_is_menu_page()
	 */
	public function __construct() {
		global $pagenow, $show_avatars, $wpua_admin, $wpua_allow_upload;

		// Add WPUA to profile for users with permission
		if ( $this->wpua_is_author_or_above() || ( 1 == (bool) $wpua_allow_upload && is_user_logged_in() ) ) {
			// Profile functions and scripts
			add_action( 'show_user_profile', array( $this, 'wpua_maybe_show_user_profile' ) );
			add_action( 'edit_user_profile', array( $this, 'wpua_maybe_show_user_profile' ) );

			add_action( 'personal_options_update',  array( $this, 'wpua_action_process_option_update' ) );
			add_action( 'edit_user_profile_update', array( $this, 'wpua_action_process_option_update' ) );

			add_action( 'user_new_form', array( $this, 'wpua_action_show_user_profile' ) );
			add_action( 'user_register', array( $this, 'wpua_action_process_option_update' ) );

			add_filter( 'user_profile_picture_description', array( $this, 'wpua_description_show_user_profile' ), PHP_INT_MAX, 2 );

			// Admin scripts
			$pages = array( 'profile.php', 'options-discussion.php', 'user-edit.php', 'user-new.php', 'admin.php' );

			if ( in_array( $pagenow, $pages ) || $wpua_admin->wpua_is_menu_page() ) {
				add_action( 'admin_enqueue_scripts', array( $this, 'wpua_media_upload_scripts' ) );
			}

			// Front pages
			if ( ! is_admin() ) {
				add_action( 'show_user_profile', array( 'wp_user_avatar', 'wpua_media_upload_scripts' ) );
				add_action( 'edit_user_profile', array( 'wp_user_avatar', 'wpua_media_upload_scripts' ) );
			}

			if ( ! $this->wpua_is_author_or_above() ) {
				// Upload errors
				add_action( 'user_profile_update_errors', array( $this, 'wpua_upload_errors' ), 10, 3 );

				// Prefilter upload size
				add_filter( 'wp_handle_upload_prefilter', array(  $this, 'wpua_handle_upload_prefilter' ) );
			}
		}

		add_filter( 'media_view_settings', array( $this, 'wpua_media_view_settings' ), 10, 1 );
	}

	/**
	 * Avatars have no parent posts
	 *
	 * @param array $settings
	 *
	 * @return array
	 * @uses object $post
	 * @uses bool $wpua_is_profile
	 * @uses is_admin()
	 * array $settings
	 * @since 1.8.4
	 */
	public function wpua_media_view_settings( $settings ) {
		global $post, $wpua_is_profile;

		// Get post ID so not to interfere with media uploads
		$post_id = is_object( $post ) ? $post->ID : 0;

		// Don't use post ID on front pages if there's a WPUA uploader
		$settings['post']['id'] = ( ! is_admin() && 1 == $wpua_is_profile ) ? 0 : $post_id;

		return $settings;
	}

	/**
	 * Media Uploader
	 * @since 1.4
	 * @param object $user
	 * @uses object $current_user
	 * @uses string $mustache_admin
	 * @uses string $pagenow
	 * @uses object $post
	 * @uses bool $show_avatars
	 * @uses object $wp_user_avatar
	 * @uses object $wpua_admin
	 * @uses object $wpua_functions
	 * @uses bool $wpua_is_profile
	 * @uses int $wpua_upload_size_limit
	 * @uses get_user_by()
	 * @uses wp_enqueue_script()
	 * @uses wp_enqueue_media()
	 * @uses wp_enqueue_style()
	 * @uses wp_localize_script()
	 * @uses wp_max_upload_size()
	 * @uses wpua_get_avatar_original()
	 * @uses wpua_is_author_or_above()
	 * @uses wpua_is_menu_page()
	 */
	public static function wpua_media_upload_scripts( $user = '' ) {
		global  $current_user,
				$mustache_admin,
				$pagenow,
				$plugin_page,
				$post,
				$show_avatars,
				$wp_user_avatar,
				$wpua_force_file_uploader,
				$wpua_admin,
				$wpua_functions,
				$wpua_is_profile,
				$wpua_upload_size_limit;

		// This is a profile page
		$wpua_is_profile = 1;

		$user = ( $pagenow == 'user-edit.php' && isset( $_GET['user_id'] ) ) ? get_user_by( 'id', absint( $_GET['user_id'] ) ) : $current_user;

		wp_enqueue_style( 'wp-user-avatar', WPUA_CSS_URL . 'wp-user-avatar.css', '', WPUA_VERSION );

		wp_enqueue_script( 'jquery' );

		if ( ( $wp_user_avatar->wpua_is_author_or_above() && ! $wpua_force_file_uploader ) || 'options-discussion.php' == $pagenow ) {
			wp_enqueue_script( 'admin-bar' );
			wp_enqueue_media( array( 'post' => $post ) );
			wp_enqueue_script( 'wp-user-avatar', WPUA_JS_URL . 'wp-user-avatar.js', array( 'jquery', 'media-editor' ), WPUA_VERSION, true );
		} else {
			wp_enqueue_script( 'wp-user-avatar', WPUA_JS_URL . 'wp-user-avatar-user.js', array( 'jquery' ), WPUA_VERSION, true );
		}

		// Admin scripts
		if ( 'options-discussion.php' == $pagenow || $wpua_admin->wpua_is_menu_page() ) {
			wp_localize_script( 'wp-user-avatar', 'wpua_custom', array(
				'avatar_thumb' => $mustache_admin,
			) );
		}

		if (
			'options-discussion.php' == $pagenow
			||
			$wpua_admin->wpua_is_menu_page()
			||
			(
				'admin.php' == $pagenow
				&&
				isset( $plugin_page )
				&&
				'wp-user-avatar-library' == $plugin_page
			)
		) {
			// Settings control
			wp_enqueue_script( 'wp-user-avatar-admin', WPUA_JS_URL . 'wp-user-avatar-admin.js', array( 'wp-user-avatar' ), WPUA_VERSION, true );
			wp_localize_script( 'wp-user-avatar-admin', 'wpua_admin', array(
				'upload_size_limit' => $wpua_upload_size_limit,
				'max_upload_size'   => wp_max_upload_size(),
			) );
		} else {
			// Original user avatar
			$avatar_medium_src = 1 == (bool) $show_avatars ? $wpua_functions->wpua_get_avatar_original( $user->user_email, 'medium' ) : includes_url() . 'images/blank.gif';

			wp_localize_script( 'wp-user-avatar', 'wpua_custom', array(
				'avatar_thumb' => $avatar_medium_src,
			) );
		}
	}

	public static function wpua_core_show_user_profile( $user ) {
		global  $blog_id,
				$current_user,
				$show_avatars,
				$wpdb,
				$wp_user_avatar,
				$wpua_force_file_uploader,
				$wpua_edit_avatar,
				$wpua_functions,
				$wpua_upload_size_limit_with_units;

		$has_wp_user_avatar = has_wp_user_avatar( @$user->ID );

		// Get WPUA attachment ID
		$wpua = get_user_meta( @$user->ID, $wpdb->get_blog_prefix( $blog_id ) . 'user_avatar', true );

		// Show remove button if WPUA is set
		$hide_remove = ! $has_wp_user_avatar ? 'wpua-hide' : '';

		// Hide image tags if show avatars is off
		$hide_images = ! $has_wp_user_avatar && 0 == (bool) $show_avatars ? 'wpua-no-avatars' : '';

		// If avatars are enabled, get original avatar image or show blank
		$avatar_medium_src = 1 == (bool) $show_avatars ? $wpua_functions->wpua_get_avatar_original( @$user->user_email, 'medium' ) : includes_url() . 'images/blank.gif';

		// Check if user has wp_user_avatar, if not show image from above
		$avatar_medium = $has_wp_user_avatar ? get_wp_user_avatar_src( $user->ID, 'medium' ) : $avatar_medium_src;

		// Check if user has wp_user_avatar, if not show image from above
		$avatar_thumbnail     = $has_wp_user_avatar ? get_wp_user_avatar_src( $user->ID, 96 ) : $avatar_medium_src;
		$edit_attachment_link = esc_url( add_query_arg( array(
			'post'   => $wpua,
			'action' => 'edit',
		), admin_url( 'post.php' ) ) );
		?>

		<input type="hidden" name="wp-user-avatar" id="<?php echo esc_attr( ( 'add-new-user' == $user ) ? 'wp-user-avatar' : 'wp-user-avatar-existing' ) ?>" value="<?php echo esc_attr( $wpua ); ?>" />

		<?php
		if ( $wp_user_avatar->wpua_is_author_or_above() && ! $wpua_force_file_uploader ) :
			// Button to launch Media Uploader
			?>

			<p id="<?php echo esc_attr( ( 'add-new-user' == $user ) ? 'wpua-add-button' : 'wpua-add-button-existing' ); ?>">
				<button
					type="button"
					class="button"
					id="<?php echo esc_attr( ( 'add-new-user' == $user ) ? 'wpua-add' : 'wpua-add-existing' ); ?>"
					name="<?php echo esc_attr( ( 'add-new-user' == $user ) ? 'wpua-add' : 'wpua-add-existing' ); ?>"
					data-title="<?php printf(
						/* translators: user display name */
						__( 'Choose Image: %s', 'one-user-avatar' ),
						( ! empty( $user->display_name ) ? esc_attr( $user->display_name ) : '' )
					); ?>"
				>
					<?php esc_html_e( 'Choose Image', 'one-user-avatar' ); ?>
				</button>
			</p>

			<?php
		elseif ( ! $wp_user_avatar->wpua_is_author_or_above() || $wpua_force_file_uploader ) :
			// Upload button
			?>

			<p id="<?php echo esc_attr( ( 'add-new-user' == $user ) ? 'wpua-upload-button' : 'wpua-upload-button-existing' ); ?>">
				<input name="wpua-file" id="<?php echo esc_attr( ( 'add-new-user' == $user ) ? 'wpua-file' : 'wpua-file-existing' ); ?>" type="file" />

				<button type="submit" class="button" id="<?php echo esc_attr( ( 'add-new-user' == $user ) ? 'wpua-upload' : 'wpua-upload-existing' ); ?>" name="submit" value="<?php esc_html_e( 'Upload', 'one-user-avatar' ); ?>">
					<?php esc_html_e( 'Upload', 'one-user-avatar' ); ?>
				</button>
			</p>

			<p id="<?php echo esc_attr( ( 'add-new-user' == $user ) ? 'wpua-upload-messages' : 'wpua-upload-messages-existing' ); ?>">
				<span id="<?php echo esc_attr( ( $user == 'add-new-user') ? 'wpua-max-upload' : 'wpua-max-upload-existing' ); ?>" class="description">
					<?php
					printf(
						/* translators: file size in KB */
						__( 'Maximum upload file size: %s.', 'one-user-avatar' ),
						esc_html( $wpua_upload_size_limit_with_units . 'KB' )
					);
					?>
				</span>

				<span id="<?php echo esc_attr( ( 'add-new-user' == $user ) ? 'wpua-allowed-files' : 'wpua-allowed-files-existing' ); ?>" class="description">
					<?php
					printf(
						/* translators: allowed file extensions */
						__( 'Allowed Files: %s', 'one-user-avatar' ),
						'<code>jpg jpeg png gif</code>'
					);
					?>
				</span>
			</p>

			<?php
		endif;
		?>

		<div id="<?php echo esc_attr( ( 'add-new-user' == $user ) ? 'wpua-images' : 'wpua-images-existing' ); ?>" class="<?php echo esc_attr( $hide_images ); ?>">
			<p id="<?php echo esc_attr( ( 'add-new-user' == $user ) ? 'wpua-preview' : 'wpua-preview-existing' ); ?>">
				<img src="<?php echo esc_url( $avatar_medium ); ?>" alt="<?php echo esc_attr( __( 'Original Size', 'one-user-avatar' ) ); ?>" />

				<span class="description"><?php esc_html_e( 'Original Size', 'one-user-avatar' ); ?></span>
			</p>

			<p id="<?php echo esc_attr( ( 'add-new-user' == $user ) ? 'wpua-thumbnail' : 'wpua-thumbnail-existing' ); ?>">
				<img src="<?php echo esc_url( $avatar_thumbnail ); ?>" alt="<?php echo esc_attr( __( 'Thumbnail', 'one-user-avatar' ) ); ?>"/>

				<span class="description"><?php esc_html_e( 'Thumbnail', 'one-user-avatar' ); ?></span>
			</p>

			<p id="<?php echo esc_attr( ( 'add-new-user' == $user ) ? 'wpua-remove-button' : 'wpua-remove-button-existing' ); ?>" class="<?php echo esc_attr( $hide_remove ); ?>">
				<button type="button" class="button" id="<?php echo esc_attr( ( 'add-new-user' == $user ) ? 'wpua-remove' : 'wpua-remove-existing' ); ?>" name="wpua-remove"><?php esc_html_e( 'Remove Image', 'one-user-avatar' ); ?></button>
			</p>

			<p id="<?php echo esc_attr( ( 'add-new-user' == $user ) ? 'wpua-undo-button' : 'wpua-undo-button-existing' ); ?>">
				<button type="button" class="button" id="<?php echo esc_attr( ( 'add-new-user' == $user ) ? 'wpua-undo' : 'wpua-undo-existing' ); ?>" name="wpua-undo"><?php esc_html_e( 'Undo', 'one-user-avatar' ); ?></button>
			</p>
		</div>

		<?php
	}

	/**
	 * Add to edit user profile
	 *
	 * @param object $user
	 *
	 * @since 1.4
	 * @uses int $blog_id
	 * @uses object $current_user
	 * @uses bool $show_avatars
	 * @uses object $wpdb
	 * @uses object $wp_user_avatar
	 * @uses bool $wpua_edit_avatar
	 * @uses object $wpua_functions
	 * @uses string $wpua_upload_size_limit_with_units
	 * @uses add_query_arg()
	 * @uses admin_url()
	 * @uses do_action()
	 * @uses get_blog_prefix()
	 * @uses get_user_meta()
	 * @uses get_wp_user_avatar_src()
	 * @uses has_wp_user_avatar()
	 * @uses is_admin()
	 * @uses wpua_author()
	 * @uses wpua_get_avatar_original()
	 * @uses wpua_is_author_or_above()
	 */
	public static function wpua_action_show_user_profile( $user ) {
		$is_admin = is_admin() ? '_admin' : '';

		do_action( 'wpua_before_avatar' . $is_admin );

		self::wpua_core_show_user_profile( $user );

		do_action( 'wpua_after_avatar' . $is_admin );
	}

	public function wpua_maybe_show_user_profile( $user ) {
		if ( is_admin() ) {
			return;
		}

		$this->wpua_action_show_user_profile( $user );
	}

	// setting defaults for the filter callback fixes an error like https://wordpress.org/support/topic/error-missing-argument-2-for-wp_user_avatarclosure
	// see https://stackoverflow.com/questions/37779680/missing-argument-2-for-a-custom-function
	public function wpua_description_show_user_profile( $description = '', $profileuser = null ) {
		ob_start();

		echo wp_specialchars_decode( wp_kses(
			'<style>.user-profile-picture > td > .avatar { display: none; }</style>',
			array(
				'style' => array(),
			)
		) );

		self::wpua_core_show_user_profile( $profileuser );

		return ob_get_clean();
	}

	/**
	 * Add upload error messages
	 * @since 1.7.1
	 * @param array $errors
	 * @param bool $update
	 * @param object $user
	 * @uses int $wpua_upload_size_limit
	 * @uses add()
	 * @uses wp_upload_dir()
	 */
	public static function wpua_upload_errors( $errors, $update, $user ) {
		global $wpua_upload_size_limit;

		if ( $update && ! empty( $_FILES['wpua-file'] ) ) {
			$file = $_FILES['wpua-file'];
			$size = isset( $file['size'] ) ? absint( $file['size'] )             : 0;
			$type = isset( $file['type'] ) ? sanitize_mime_type( $file['type'] ) : '';

			$upload_dir = wp_upload_dir();

			// Allow only JPG, GIF, PNG
			if ( ! empty( $type ) && ! preg_match( '/(jpe?g|gif|png)$/i', $type ) ) {
				$errors->add( 'wpua_file_type', __( 'This file is not an image. Please try another.', 'one-user-avatar' ) );
			}

			// Upload size limit
			if ( ! empty( $size ) && $size > $wpua_upload_size_limit ) {
				$errors->add( 'wpua_file_size', __( 'Memory exceeded. Please try another smaller file.', 'one-user-avatar' ) );
			}

			// Check if directory is writeable
			if ( ! is_writeable( $upload_dir['path'] ) ) {
				$errors->add( 'wpua_file_directory', sprintf(
					/* translators: directory path */
					__( 'Unable to create directory %s. Is its parent directory writable by the server?', 'one-user-avatar' ), $upload_dir['path']
				) );
			}
		}
	}

	/**
	 * Set upload size limit
	 * @since 1.5
	 * @param object $file
	 * @uses int $wpua_upload_size_limit
	 * @uses add_action()
	 * @return object $file
	 */
	public function wpua_handle_upload_prefilter( $file ) {
		global $wpua_upload_size_limit;

		$size = absint( $file['size'] );

		if ( ! empty( $size ) && $size > $wpua_upload_size_limit ) {
			/**
			 * Error handling that only appears on front pages
			 * @since 1.7
			 */
			function wpua_file_size_error( $errors, $update, $user ) {
				$errors->add( 'wpua_file_size', __( 'Memory exceeded. Please try another smaller file.', 'one-user-avatar' ) );
			}

			add_action( 'user_profile_update_errors', 'wpua_file_size_error', 10, 3 );

			return;
		}

		return $file;
	}

	/**
	 * Update user meta
	 * @since 1.4
	 * @param int $user_id
	 * @uses int $blog_id
	 * @uses object $post
	 * @uses object $wpdb
	 * @uses object $wp_user_avatar
	 * @uses bool $wpua_resize_crop
	 * @uses int $wpua_resize_h
	 * @uses bool $wpua_resize_upload
	 * @uses int $wpua_resize_w
	 * @uses add_post_meta()
	 * @uses delete_metadata()
	 * @uses get_blog_prefix()
	 * @uses is_wp_error()
	 * @uses update_post_meta()
	 * @uses update_user_meta()
	 * @uses wp_delete_attachment()
	 * @uses wp_generate_attachment_metadata()
	 * @uses wp_get_image_editor()
	 * @uses wp_handle_upload()
	 * @uses wp_insert_attachment()
	 * @uses WP_Query()
	 * @uses wp_read_image_metadata()
	 * @uses wp_reset_query()
	 * @uses wp_update_attachment_metadata()
	 * @uses wp_upload_dir()
	 * @uses wpua_is_author_or_above()
	 * @uses object $wpua_admin
	 * @uses wpua_has_gravatar()
	 */
	public static function wpua_action_process_option_update( $user_id ) {
		global  $blog_id,
				$post,
				$wpdb,
				$wp_user_avatar,
				$wpua_force_file_uploader,
				$wpua_resize_crop,
				$wpua_resize_h,
				$wpua_resize_upload,
				$wpua_resize_w,
				$wpua_admin;

		// Check if user has publish_posts capability
		if ( $wp_user_avatar->wpua_is_author_or_above() && ! $wpua_force_file_uploader ) {
			$wpua_id = isset( $_POST['wp-user-avatar'] ) ? absint( $_POST['wp-user-avatar'] ) : 0;

			// Remove old attachment postmeta
			delete_metadata( 'post', null, '_wp_attachment_wp_user_avatar', $user_id, true );

			// Create new attachment postmeta
			add_post_meta( $wpua_id, '_wp_attachment_wp_user_avatar', $user_id );

			// Update usermeta
			update_user_meta( $user_id, $wpdb->get_blog_prefix( $blog_id ) . 'user_avatar', $wpua_id );
		} else {
			// Remove attachment info if avatar is blank
			if ( isset( $_POST['wp-user-avatar'] ) && empty( $_POST['wp-user-avatar'] ) ) {
				// Delete other uploads by user
				$q = array(
					'author'         => $user_id,
					'post_type'      => 'attachment',
					'post_status'    => 'inherit',
					'posts_per_page' => '-1',
					'meta_query'     => array(
						array(
							'key'     => '_wp_attachment_wp_user_avatar',
							'value'   => "",
							'compare' => '!='
						),
					),
				);

				$avatars_wp_query = new WP_Query( $q );

				while( $avatars_wp_query->have_posts() ) {
					$avatars_wp_query->the_post();

					wp_delete_attachment( $post->ID );
				}

				wp_reset_query();

				// Remove attachment postmeta
				delete_metadata( 'post', null, '_wp_attachment_wp_user_avatar', $user_id, true );

				// Remove usermeta
				update_user_meta( $user_id, $wpdb->get_blog_prefix( $blog_id ) . 'user_avatar', '' );
			}

			// Create attachment from upload
			if ( isset( $_POST['submit'] ) && $_POST['submit'] && ! empty( $_FILES['wpua-file'] ) ) {
				$file = $_FILES['wpua-file'];
				$name = isset( $file['name'] ) ? sanitize_file_name( $file['name'] ) : '';
				$type = isset( $file['type'] ) ? sanitize_mime_type( $file['type'] ) : '';
				$file = wp_handle_upload( $file, array(
					'test_form' => false,
				) );

				if ( isset( $file['url'] ) ) {
					if ( ! empty( $type ) && preg_match( '/(jpe?g|gif|png)$/i' , $type ) ) {
						// Resize uploaded image
						if ( 1 == (bool) $wpua_resize_upload ) {
							// Original image
							$uploaded_image = wp_get_image_editor( $file['file'] );

							// Check for errors
							if ( ! is_wp_error( $uploaded_image ) ) {
								// Resize image
								$uploaded_image->resize( $wpua_resize_w, $wpua_resize_h, $wpua_resize_crop );

								// Save image
								$uploaded_image->save( $file['file'] );
							}
						}

						// Break out file info
						$name_parts = pathinfo( $name );
						$name       = trim( substr( $name, 0, -( 1 + strlen( $name_parts['extension'] ) ) ) );
						$url        = $file['url'];
						$file       = $file['file'];
						$title      = $name;

						// Use image exif/iptc data for title if possible
						if ( $image_meta = @wp_read_image_metadata( $file ) ) {
							if ( trim( $image_meta['title'] ) && ! is_numeric( sanitize_title( $image_meta['title'] ) ) ) {
								$title = $image_meta['title'];
							}
						}

						// Construct the attachment array
						$attachment = array(
							'guid'			 => $url,
							'post_mime_type' => $type,
							'post_title'	 => $title,
							'post_content'	 => '',
						);

						// This should never be set as it would then overwrite an existing attachment
						if ( isset( $attachment['ID'] ) ) {
							unset( $attachment['ID'] );
						}

						// Save the attachment metadata
						$attachment_id = wp_insert_attachment( $attachment, $file );

						if ( ! is_wp_error( $attachment_id ) ) {
							// Delete other uploads by user
							$q = array(
								'author'         => $user_id,
								'post_type'      => 'attachment',
								'post_status'    => 'inherit',
								'posts_per_page' => '-1',
								'meta_query'     => array(
									array(
										'key'     => '_wp_attachment_wp_user_avatar',
										'value'   => '',
										'compare' => '!=',
									),
								),
							);

							$avatars_wp_query = new WP_Query( $q );

							while ( $avatars_wp_query->have_posts() ){
								$avatars_wp_query->the_post();

								wp_delete_attachment($post->ID);
							}

							wp_reset_query();

							wp_update_attachment_metadata( $attachment_id, wp_generate_attachment_metadata( $attachment_id, $file ) );

							// Remove old attachment postmeta
							delete_metadata( 'post', null, '_wp_attachment_wp_user_avatar', $user_id, true );

							// Create new attachment postmeta
							update_post_meta( $attachment_id, '_wp_attachment_wp_user_avatar', $user_id );

							// Update usermeta
							update_user_meta( $user_id, $wpdb->get_blog_prefix( $blog_id ) . 'user_avatar', $attachment_id );
						}
					}
				}
			}
		}
	}

	/**
	 * Check attachment is owned by user
	 * @since 1.4
	 * @param int $attachment_id
	 * @param int $user_id
	 * @param bool $wpua_author
	 * @uses get_post()
	 * @return bool
	 */
	private function wpua_author( $attachment_id, $user_id, $wpua_author = 0 ) {
		$attachment = get_post( $attachment_id );

		if ( ! empty( $attachment ) && $attachment->post_author == $user_id ) {
			$wpua_author = true;
		}

		return (bool) $wpua_author;
	}

	/**
	 * Check if current user has at least Author privileges
	 * @since 1.8.5
	 * @uses current_user_can()
	 * @uses apply_filters()
	 * @return bool
	 */
	public function wpua_is_author_or_above() {
		$is_author_or_above = (
			current_user_can( 'edit_published_posts' )  &&
			current_user_can( 'upload_files' )          &&
			current_user_can( 'publish_posts')          &&
			current_user_can( 'delete_published_posts')
		) ? true : false;

		/**
		 * Filter Author privilege check
		 * @since 1.9.2
		 * @param bool $is_author_or_above
		 */
		return (bool) apply_filters( 'wpua_is_author_or_above', $is_author_or_above );
	}
}

/**
 * Initialize WP_User_Avatar
 * @since 1.8
 */
function wpua_init() {
	global $wp_user_avatar;

	if ( ! isset( $wp_user_avatar ) ) {
		$wp_user_avatar = new WP_User_Avatar();
	}

	return $wp_user_avatar;
}
add_action( 'init', 'wpua_init' );