Plugin Directory

Changeset 3342338


Ignore:
Timestamp:
08/10/2025 02:15:24 PM (7 months ago)
Author:
alimir
Message:

Committing 4.7.10 to trunk

Location:
wp-ulike/trunk
Files:
98 added
16 edited

Legend:

Unmodified
Added
Removed
  • wp-ulike/trunk/assets/js/wp-ulike.js

    r3251532 r3342338  
    1 /*! WP ULike - v4.7.9.1
     1/*! WP ULike - v4.7.10
    22 *  https://wpulike.com
    33 *  TechnoWich 2025;
  • wp-ulike/trunk/includes/classes/class-wp-ulike-activator.php

    r3215648 r3342338  
    210210    }
    211211
     212    public function upgrade_3(){
     213        // Extract table names
     214        extract( $this->tables );
     215
     216        // Add 'fingerprint' column to posts table
     217        $this->database->query( "
     218            ALTER TABLE $posts
     219            ADD COLUMN `fingerprint` VARCHAR(64) DEFAULT NULL AFTER `user_id`;
     220        " );
     221
     222        // Add 'fingerprint' column to comments table
     223        $this->database->query( "
     224            ALTER TABLE $comments
     225            ADD COLUMN `fingerprint` VARCHAR(64) DEFAULT NULL AFTER `user_id`;
     226        " );
     227
     228        // Add 'fingerprint' column to activities table
     229        $this->database->query( "
     230            ALTER TABLE $activities
     231            ADD COLUMN `fingerprint` VARCHAR(64) DEFAULT NULL AFTER `user_id`,
     232            ADD INDEX (`fingerprint`);
     233        " );
     234
     235        // Add 'fingerprint' column to forums table
     236        $this->database->query( "
     237            ALTER TABLE $forums
     238            ADD COLUMN `fingerprint` VARCHAR(64) DEFAULT NULL AFTER `user_id`;
     239        " );
     240
     241        // Update db version
     242        update_option( 'wp_ulike_dbVersion', '2.4' );
     243    }
     244
     245
    212246    /**
    213247    * Return an instance of this class.
  • wp-ulike/trunk/includes/classes/class-wp-ulike-cta-process.php

    r3215648 r3342338  
    8484            // Check permission
    8585            if( ! $this->hasPermission( array(
    86                 'item_id'        => $this->parsedArgs['item_id'],
    87                 'type'           => $this->settings->getType(),
    88                 'current_user'   => $this->getCurrentUser(),
    89                 'current_status' => $this->getCurrentStatus(),
    90                 'prev_status'    => $this->getPrevStatus(),
    91                 'method'         => 'process'
     86                'item_id'              => $this->parsedArgs['item_id'],
     87                'type'                 => $this->settings->getType(),
     88                'current_user'         => $this->getCurrentUser(),
     89                'current_status'       => $this->getCurrentStatus(),
     90                'prev_status'          => $this->getPrevStatus(),
     91                'current_finger_print' => $this->getCurrentFingerPrint(),
     92                'method'               => 'process'
    9293            ), $this->settings ) ){
    9394                return false;
  • wp-ulike/trunk/includes/classes/class-wp-ulike-cta-template.php

    r3215648 r3342338  
    5252
    5353            if( ! $this->hasPermission( array(
    54                 'item_id'      => $this->args['id'],
    55                 'type'         => $this->args['slug'],
    56                 'current_user' => $this->getCurrentUser(),
    57                 'prev_status'  => $this->getPrevStatus(),
    58                 'method'       => 'lookup'
     54                'item_id'              => $this->args['id'],
     55                'type'                 => $this->args['slug'],
     56                'current_user'         => $this->getCurrentUser(),
     57                'prev_status'          => $this->getPrevStatus(),
     58                'current_finger_print' => $this->getCurrentFingerPrint(),
     59                'method'               => 'lookup'
    5960            ), $this->settings ) ){
    6061                // If has prev status
  • wp-ulike/trunk/includes/classes/class-wp-ulike-entities-process.php

    r3250832 r3342338  
    2222        protected $prevStatus;
    2323        protected $currentIP;
     24        protected $currentFingerPrint;
    2425        protected $currentUser;
    2526        protected $typeSettings;
     
    4849            $this->setCurrentUser( $parsed_args['user_id'] );
    4950            $this->setItemMethod( $parsed_args['item_method'] );
     51            $this->setCurrentFingerPrint();
    5052
    5153            // Set type settings
     
    6062        protected function setCurrentIP( $user_ip ){
    6163            $this->currentIP = $user_ip === NULL ? wp_ulike_get_user_ip() : $user_ip;
     64        }
     65
     66        /**
     67         * Set current user IP
     68         *
     69         * @return void
     70         */
     71        protected function setCurrentFingerPrint(){
     72            $this->currentFingerPrint = wp_ulike_generate_fingerprint();
    6273        }
    6374
     
    109120                $this->currentUser = $user_id;
    110121            }
     122        }
     123
     124        /**
     125         * Get current user finger print
     126         *
     127         * @return string
     128         */
     129        public function getCurrentFingerPrint(){
     130            return $this->currentFingerPrint;
    111131        }
    112132
     
    197217
    198218        /**
    199          * Check permission access
     219         * Check permission access with bot + fingerprint protection
    200220         *
    201221         * @param array $args
     222         * @param object $settings
    202223         * @return boolean
    203224         */
    204225        public static function hasPermission( $args, $settings ){
    205             // Get loggin method
     226            // Default status
     227            $status = true;
     228
     229            // Check bot status first
     230            if ( wp_ulike_is_bot_request() ) {
     231                return false;
     232            }
     233
     234            // Check for logging method
    206235            $method = wp_ulike_setting_repo::getMethod( $args['type'] );
    207             // Status check point
    208             $status = true;
    209 
    210             if ( in_array( $method, array( 'do_not_log' ) ) ) {
    211                 $user_item_count = wp_ulike_get_user_item_count_per_day( array(
    212                     "item_id"      => $args['item_id'],
    213                     "current_user" => $args['current_user'],
    214                     "settings"     => $settings
    215                 ) );
    216 
    217                 if ( $user_item_count >= wp_ulike_setting_repo::getVoteLimitNumber( $args['type'] ) ) {
    218                     $status = false;
    219                 }
    220             }
    221 
    222             // Check cookie permission
    223             if( in_array( $method, array( 'by_cookie', 'by_user_ip_cookie' ) ) ){
    224                 $has_cookie   = false;
     236
     237            // check cookie existense
     238            $has_cookie   = false;
     239
     240            if ( in_array( $method, array( 'by_cookie', 'by_user_ip_cookie' ) ) ) {
    225241                $cookie_key   = sanitize_key( 'wp_ulike_' . md5( $args['type'] . '_logs' ) );
    226242                $cookie_data  = self::getDecodedCookieData( $cookie_key );
     
    235251                        $has_cookie = true;
    236252                    }
    237                 // support old cookies
    238253                } elseif ( isset( $_COOKIE[ $settings->getCookieName() . $args['item_id'] ] ) ) {
    239254                    $status = false;
     
    241256                }
    242257
    243                 // Check user permission
    244                 if( $method === 'by_user_ip_cookie' ){
    245                     $cookie_hash  = array_keys( $cookie_data );
    246 
    247                     foreach ($cookie_hash as $value) {
     258                if ( $method === 'by_user_ip_cookie' ) {
     259                    $cookie_hash = array_keys( $cookie_data );
     260                    foreach ( $cookie_hash as $value ) {
    248261                        if ( ! empty( $cookie_data[ $value ][ $args['item_id'] ] ) ) {
    249262                            if ( is_numeric( $cookie_data[ $value ][ $args['item_id'] ] ) && $current_time >= $cookie_data[ $value ][ $args['item_id'] ] ) {
     
    259272                }
    260273
    261                 // set cookie on process method
    262                 if( ! $has_cookie && $args['method'] === 'process' ){
    263                     // Get current time
     274                if ( ! $has_cookie && $args['method'] === 'process' ) {
    264275                    $cookie_expire = wp_ulike_setting_repo::getCookieExpiration( $args['type'] );
    265276
    266                     if( empty( $cookie_data ) ){
     277                    if ( empty( $cookie_data ) ) {
    267278                        $cookie_data = array( $user_hash => array(
    268279                            $args['item_id'] => $cookie_expire
    269280                        ) );
    270281                    } else {
    271                         foreach ($cookie_data as $hash => $info) {
    272                             if( ! isset( $info[$args['item_id']] ) && $hash != $user_hash ){
     282                        foreach ( $cookie_data as $hash => $info ) {
     283                            if ( ! isset( $info[$args['item_id']] ) && $hash != $user_hash ) {
    273284                                $cookie_data[ $user_hash ][ $args['item_id'] ] = $cookie_expire;
    274                             } elseif( $hash == $user_hash ) {
     285                            } elseif ( $hash == $user_hash ) {
    275286                                $cookie_data[ $hash ][ $args['item_id'] ] = $cookie_expire;
    276287                            }
    277288                        }
    278289                    }
     290
    279291                    wp_ulike_setcookie( $cookie_key, wp_json_encode( $cookie_data ), time() + 2147483647 );
    280292                }
    281293            }
    282294
     295            // Fingerprint check for guests or requests without cookies
     296            if ( ! is_user_logged_in() && $args['method'] === 'process' && in_array( $method, ['do_not_log', 'by_cookie'] ) ) {
     297
     298                $fingerprint_count = wp_ulike_count_current_fingerprint(
     299                    $args['current_finger_print'],
     300                    $args['item_id'],
     301                    $args['type']
     302                );
     303
     304                if ( ! empty( $fingerprint_count ) ) {
     305                    if ( $method === 'do_not_log' ) {
     306                        if ( $fingerprint_count >= wp_ulike_setting_repo::getVoteLimitNumber( $args['type'] ) ) {
     307                            $status = false;
     308                        }
     309                    } elseif ( ! $has_cookie && $method === 'by_cookie' ) {
     310                        if ( $fingerprint_count >= 1 ) {
     311                            $status = false;
     312                        }
     313                    }
     314                }
     315            }
     316
     317
    283318            return apply_filters( 'wp_ulike_permission_status', $status, $args, $settings );
    284319        }
     320
    285321
    286322        /**
     
    314350            $data  = array(
    315351                $this->typeSettings->getColumnName() => $item_id,
    316                 'date_time' => current_time( 'mysql' ),
    317                 'ip'        => $this->maybeAnonymiseIp( $this->currentIP ),
    318                 'user_id'   => $this->currentUser,
    319                 'status'    => $this->currentStatus
     352                'date_time'                          => current_time( 'mysql' ),
     353                'ip'                                 => $this->maybeAnonymiseIp( $this->currentIP ),
     354                'user_id'                            => $this->currentUser,
     355                'fingerprint'                        => $this->currentFingerPrint,
     356                'status'                             => $this->currentStatus
    320357            );
    321             $format = array( '%d', '%s', '%s', '%s', '%s' ); // Adjust format specifiers
     358            $format = array( '%d', '%s', '%s', '%s', '%s', '%s' ); // Adjust format specifiers
    322359
    323360            $row = $this->wpdb->insert( $table, $data, $format );
  • wp-ulike/trunk/includes/functions/queries.php

    r3215648 r3342338  
    920920    }
    921921}
     922
     923if( ! function_exists('wp_ulike_count_current_fingerprint') ){
     924    /**
     925     * Check if user fingerprint has exceeded vote limit for the given item.
     926     *
     927     * Uses WordPress object caching to minimize DB queries.
     928     *
     929     * @param int $current_fingerprint
     930     * @param int $item_id
     931     * @param string $type
     932     * @return integer
     933     */
     934    function wp_ulike_count_current_fingerprint( $current_fingerprint, $item_id, $type ) {
     935        global $wpdb;
     936        // Sanitize key & prepare cache key
     937        $cache_key = 'fingerprint_' . md5( $type . '_' . $item_id . '_' . $current_fingerprint );
     938
     939        // Try to get from cache
     940        $existing_count = wp_cache_get( $cache_key, WP_ULIKE_SLUG );
     941        $settings       = new wp_ulike_setting_type( $type );
     942
     943        if ( false === $existing_count ) {
     944            $table = $wpdb->prefix . $settings->getTableName();
     945
     946            $existing_count = (int) $wpdb->get_var( $wpdb->prepare(
     947                "SELECT COUNT(*) FROM {$table} WHERE {$settings->getColumnName()} = %d AND fingerprint = %s",
     948                $item_id,
     949                $current_fingerprint
     950            ) );
     951
     952            // Store in cache to avoid repeated queries for same request
     953            wp_cache_add( $cache_key, $existing_count, WP_ULIKE_SLUG, 10 ); // TTL = 10 seconds
     954        }
     955
     956        return (int) $existing_count;
     957    }
     958}
  • wp-ulike/trunk/includes/functions/utilities.php

    r3215648 r3342338  
    460460
    461461}
     462
     463if( ! function_exists('wp_ulike_generate_fingerprint') ){
     464    /**
     465     * Generate a secure fingerprint hash for the current user/device session.
     466     *
     467     * This function uses a combination of the real IP address, user agent,
     468     * accept-language, and selected HTTP headers to generate a unique and consistent
     469     * fingerprint per device. It also parses the user agent using DeviceDetector
     470     * to extract client and OS information. If a bot is detected, the function returns false.
     471     *
     472     * @return string|false The hashed fingerprint string, or false if the client is a bot.
     473     */
     474    function wp_ulike_generate_fingerprint() {
     475        // Get real IP address (never trust spoofed headers)
     476        $ip = $_SERVER['REMOTE_ADDR'] ?? '0.0.0.0';
     477
     478        // Basic request headers
     479        $user_agent      = $_SERVER['HTTP_USER_AGENT'] ?? '';
     480        $accept_language = $_SERVER['HTTP_ACCEPT_LANGUAGE'] ?? '';
     481
     482        if (empty($accept_language)) {
     483            $accept_language = 'unknown-lang';
     484        }
     485
     486        // Initialize DeviceDetector to parse the User-Agent
     487        $dd = new \DeviceDetector\DeviceDetector($user_agent);
     488        $dd->parse();
     489
     490        // Extract client and OS info
     491        $client_info = $dd->getClient(); // ['name' => ..., 'version' => ...]
     492        $os_info     = $dd->getOs();     // ['name' => ..., 'version' => ...]
     493
     494        $client_name    = $client_info['name'] ?? 'unknown-client';
     495        $client_version = $client_info['version'] ?? '0.0';
     496        $os_name        = $os_info['name'] ?? 'unknown-os';
     497        $os_version     = $os_info['version'] ?? '0.0';
     498
     499        // Extra entropy from request headers (helps resist spoofing)
     500        $header_signature = hash('sha256', json_encode([
     501            $_SERVER['HTTP_ACCEPT_ENCODING'] ?? '',
     502            $_SERVER['HTTP_CONNECTION'] ?? '',
     503            $_SERVER['HTTP_CACHE_CONTROL'] ?? '',
     504        ]));
     505
     506        // Combine all parts into a unique source string
     507        $fingerprint_source = implode('|', [
     508            $ip,
     509            $client_name,
     510            $client_version,
     511            $os_name,
     512            $os_version,
     513            $accept_language,
     514            $header_signature
     515        ]);
     516
     517        // Return an md5 hash of the fingerprint source
     518        return md5($fingerprint_source);
     519    }
     520}
     521
     522if( ! function_exists('wp_ulike_is_bot_request') ){
     523    /**
     524     * Check if current request is a bot
     525     *
     526     * @return bool
     527     */
     528    function wp_ulike_is_bot_request(){
     529        $user_agent = $_SERVER['HTTP_USER_AGENT'] ?? '';
     530        $device = new \DeviceDetector\DeviceDetector($user_agent);
     531        $device->parse();
     532        return $device->isBot();
     533    }
     534}
  • wp-ulike/trunk/includes/plugin.php

    r3250832 r3342338  
    6969      wp_ulike_activator::get_instance()->upgrade_2();
    7070    }
     71    if ( version_compare( $current_version, '2.4', '<' ) ) {
     72      wp_ulike_activator::get_instance()->upgrade_3();
     73    }
    7174  }
    7275
  • wp-ulike/trunk/readme.txt

    r3251532 r3342338  
    66Requires PHP: 7.2.5
    77Requires at least: 6.0
    8 Tested up to: 6.7
    9 Stable tag: 4.7.9.1
     8Tested up to: 6.8
     9Stable tag: 4.7.10
    1010License: GPLv2 or later
    1111License URI: http://www.gnu.org/licenses/gpl-2.0.html
     
    9595== Changelog ==
    9696
     97= 4.7.10 =
     98* Improved: Added additional fingerprint + cookie presence check for 'cookie' & 'no limit' logging methods to further reduce the chance of automated/bot submissions without valid cookies. This was not a security vulnerability, but a preventive hardening measure to improve vote integrity.
     99
    97100= 4.7.9.1 =
    98101Fixed: Critical HTML sanitization issue.
  • wp-ulike/trunk/vendor/composer/autoload_classmap.php

    r3052611 r3342338  
    88return array(
    99    'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php',
     10    'DeviceDetector\\Cache\\CacheInterface' => $vendorDir . '/matomo/device-detector/Cache/CacheInterface.php',
     11    'DeviceDetector\\Cache\\DoctrineBridge' => $vendorDir . '/matomo/device-detector/Cache/DoctrineBridge.php',
     12    'DeviceDetector\\Cache\\LaravelCache' => $vendorDir . '/matomo/device-detector/Cache/LaravelCache.php',
     13    'DeviceDetector\\Cache\\PSR16Bridge' => $vendorDir . '/matomo/device-detector/Cache/PSR16Bridge.php',
     14    'DeviceDetector\\Cache\\PSR6Bridge' => $vendorDir . '/matomo/device-detector/Cache/PSR6Bridge.php',
     15    'DeviceDetector\\Cache\\StaticCache' => $vendorDir . '/matomo/device-detector/Cache/StaticCache.php',
     16    'DeviceDetector\\ClientHints' => $vendorDir . '/matomo/device-detector/ClientHints.php',
     17    'DeviceDetector\\DeviceDetector' => $vendorDir . '/matomo/device-detector/DeviceDetector.php',
     18    'DeviceDetector\\Parser\\AbstractBotParser' => $vendorDir . '/matomo/device-detector/Parser/AbstractBotParser.php',
     19    'DeviceDetector\\Parser\\AbstractParser' => $vendorDir . '/matomo/device-detector/Parser/AbstractParser.php',
     20    'DeviceDetector\\Parser\\Bot' => $vendorDir . '/matomo/device-detector/Parser/Bot.php',
     21    'DeviceDetector\\Parser\\Client\\AbstractClientParser' => $vendorDir . '/matomo/device-detector/Parser/Client/AbstractClientParser.php',
     22    'DeviceDetector\\Parser\\Client\\Browser' => $vendorDir . '/matomo/device-detector/Parser/Client/Browser.php',
     23    'DeviceDetector\\Parser\\Client\\Browser\\Engine' => $vendorDir . '/matomo/device-detector/Parser/Client/Browser/Engine.php',
     24    'DeviceDetector\\Parser\\Client\\Browser\\Engine\\Version' => $vendorDir . '/matomo/device-detector/Parser/Client/Browser/Engine/Version.php',
     25    'DeviceDetector\\Parser\\Client\\FeedReader' => $vendorDir . '/matomo/device-detector/Parser/Client/FeedReader.php',
     26    'DeviceDetector\\Parser\\Client\\Hints\\AppHints' => $vendorDir . '/matomo/device-detector/Parser/Client/Hints/AppHints.php',
     27    'DeviceDetector\\Parser\\Client\\Hints\\BrowserHints' => $vendorDir . '/matomo/device-detector/Parser/Client/Hints/BrowserHints.php',
     28    'DeviceDetector\\Parser\\Client\\Library' => $vendorDir . '/matomo/device-detector/Parser/Client/Library.php',
     29    'DeviceDetector\\Parser\\Client\\MediaPlayer' => $vendorDir . '/matomo/device-detector/Parser/Client/MediaPlayer.php',
     30    'DeviceDetector\\Parser\\Client\\MobileApp' => $vendorDir . '/matomo/device-detector/Parser/Client/MobileApp.php',
     31    'DeviceDetector\\Parser\\Client\\PIM' => $vendorDir . '/matomo/device-detector/Parser/Client/PIM.php',
     32    'DeviceDetector\\Parser\\Device\\AbstractDeviceParser' => $vendorDir . '/matomo/device-detector/Parser/Device/AbstractDeviceParser.php',
     33    'DeviceDetector\\Parser\\Device\\Camera' => $vendorDir . '/matomo/device-detector/Parser/Device/Camera.php',
     34    'DeviceDetector\\Parser\\Device\\CarBrowser' => $vendorDir . '/matomo/device-detector/Parser/Device/CarBrowser.php',
     35    'DeviceDetector\\Parser\\Device\\Console' => $vendorDir . '/matomo/device-detector/Parser/Device/Console.php',
     36    'DeviceDetector\\Parser\\Device\\HbbTv' => $vendorDir . '/matomo/device-detector/Parser/Device/HbbTv.php',
     37    'DeviceDetector\\Parser\\Device\\Mobile' => $vendorDir . '/matomo/device-detector/Parser/Device/Mobile.php',
     38    'DeviceDetector\\Parser\\Device\\Notebook' => $vendorDir . '/matomo/device-detector/Parser/Device/Notebook.php',
     39    'DeviceDetector\\Parser\\Device\\PortableMediaPlayer' => $vendorDir . '/matomo/device-detector/Parser/Device/PortableMediaPlayer.php',
     40    'DeviceDetector\\Parser\\Device\\ShellTv' => $vendorDir . '/matomo/device-detector/Parser/Device/ShellTv.php',
     41    'DeviceDetector\\Parser\\OperatingSystem' => $vendorDir . '/matomo/device-detector/Parser/OperatingSystem.php',
     42    'DeviceDetector\\Parser\\VendorFragment' => $vendorDir . '/matomo/device-detector/Parser/VendorFragment.php',
     43    'DeviceDetector\\Yaml\\ParserInterface' => $vendorDir . '/matomo/device-detector/Yaml/ParserInterface.php',
     44    'DeviceDetector\\Yaml\\Pecl' => $vendorDir . '/matomo/device-detector/Yaml/Pecl.php',
     45    'DeviceDetector\\Yaml\\Spyc' => $vendorDir . '/matomo/device-detector/Yaml/Spyc.php',
     46    'DeviceDetector\\Yaml\\Symfony' => $vendorDir . '/matomo/device-detector/Yaml/Symfony.php',
    1047    'Psr\\Http\\Message\\MessageInterface' => $vendorDir . '/psr/http-message/src/MessageInterface.php',
    1148    'Psr\\Http\\Message\\RequestInterface' => $vendorDir . '/psr/http-message/src/RequestInterface.php',
  • wp-ulike/trunk/vendor/composer/autoload_psr4.php

    r3052611 r3342338  
    99    'Vectorface\\Whip\\' => array($vendorDir . '/vectorface/whip/src'),
    1010    'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-message/src'),
     11    'DeviceDetector\\' => array($vendorDir . '/matomo/device-detector'),
    1112);
  • wp-ulike/trunk/vendor/composer/autoload_real.php

    r3052611 r3342338  
    3232        $loader->register(true);
    3333
     34        $includeFiles = \Composer\Autoload\ComposerStaticInitc58ba4e8ae01fe624f24a47c3b1dc47f::$files;
     35        foreach ($includeFiles as $fileIdentifier => $file) {
     36            composerRequirec58ba4e8ae01fe624f24a47c3b1dc47f($fileIdentifier, $file);
     37        }
     38
    3439        return $loader;
    3540    }
    3641}
     42
     43/**
     44 * @param string $fileIdentifier
     45 * @param string $file
     46 * @return void
     47 */
     48function composerRequirec58ba4e8ae01fe624f24a47c3b1dc47f($fileIdentifier, $file)
     49{
     50    if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
     51        $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;
     52
     53        require $file;
     54    }
     55}
  • wp-ulike/trunk/vendor/composer/autoload_static.php

    r2621001 r3342338  
    77class ComposerStaticInitc58ba4e8ae01fe624f24a47c3b1dc47f
    88{
     9    public static $files = array (
     10        '04c6c5c2f7095ccf6c481d3e53e1776f' => __DIR__ . '/..' . '/mustangostang/spyc/Spyc.php',
     11    );
     12
    913    public static $prefixLengthsPsr4 = array (
    1014        'V' =>
     
    1519        array (
    1620            'Psr\\Http\\Message\\' => 17,
     21        ),
     22        'D' =>
     23        array (
     24            'DeviceDetector\\' => 15,
    1725        ),
    1826    );
     
    2735            0 => __DIR__ . '/..' . '/psr/http-message/src',
    2836        ),
     37        'DeviceDetector\\' =>
     38        array (
     39            0 => __DIR__ . '/..' . '/matomo/device-detector',
     40        ),
    2941    );
    3042
    3143    public static $classMap = array (
    3244        'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php',
     45        'DeviceDetector\\Cache\\CacheInterface' => __DIR__ . '/..' . '/matomo/device-detector/Cache/CacheInterface.php',
     46        'DeviceDetector\\Cache\\DoctrineBridge' => __DIR__ . '/..' . '/matomo/device-detector/Cache/DoctrineBridge.php',
     47        'DeviceDetector\\Cache\\LaravelCache' => __DIR__ . '/..' . '/matomo/device-detector/Cache/LaravelCache.php',
     48        'DeviceDetector\\Cache\\PSR16Bridge' => __DIR__ . '/..' . '/matomo/device-detector/Cache/PSR16Bridge.php',
     49        'DeviceDetector\\Cache\\PSR6Bridge' => __DIR__ . '/..' . '/matomo/device-detector/Cache/PSR6Bridge.php',
     50        'DeviceDetector\\Cache\\StaticCache' => __DIR__ . '/..' . '/matomo/device-detector/Cache/StaticCache.php',
     51        'DeviceDetector\\ClientHints' => __DIR__ . '/..' . '/matomo/device-detector/ClientHints.php',
     52        'DeviceDetector\\DeviceDetector' => __DIR__ . '/..' . '/matomo/device-detector/DeviceDetector.php',
     53        'DeviceDetector\\Parser\\AbstractBotParser' => __DIR__ . '/..' . '/matomo/device-detector/Parser/AbstractBotParser.php',
     54        'DeviceDetector\\Parser\\AbstractParser' => __DIR__ . '/..' . '/matomo/device-detector/Parser/AbstractParser.php',
     55        'DeviceDetector\\Parser\\Bot' => __DIR__ . '/..' . '/matomo/device-detector/Parser/Bot.php',
     56        'DeviceDetector\\Parser\\Client\\AbstractClientParser' => __DIR__ . '/..' . '/matomo/device-detector/Parser/Client/AbstractClientParser.php',
     57        'DeviceDetector\\Parser\\Client\\Browser' => __DIR__ . '/..' . '/matomo/device-detector/Parser/Client/Browser.php',
     58        'DeviceDetector\\Parser\\Client\\Browser\\Engine' => __DIR__ . '/..' . '/matomo/device-detector/Parser/Client/Browser/Engine.php',
     59        'DeviceDetector\\Parser\\Client\\Browser\\Engine\\Version' => __DIR__ . '/..' . '/matomo/device-detector/Parser/Client/Browser/Engine/Version.php',
     60        'DeviceDetector\\Parser\\Client\\FeedReader' => __DIR__ . '/..' . '/matomo/device-detector/Parser/Client/FeedReader.php',
     61        'DeviceDetector\\Parser\\Client\\Hints\\AppHints' => __DIR__ . '/..' . '/matomo/device-detector/Parser/Client/Hints/AppHints.php',
     62        'DeviceDetector\\Parser\\Client\\Hints\\BrowserHints' => __DIR__ . '/..' . '/matomo/device-detector/Parser/Client/Hints/BrowserHints.php',
     63        'DeviceDetector\\Parser\\Client\\Library' => __DIR__ . '/..' . '/matomo/device-detector/Parser/Client/Library.php',
     64        'DeviceDetector\\Parser\\Client\\MediaPlayer' => __DIR__ . '/..' . '/matomo/device-detector/Parser/Client/MediaPlayer.php',
     65        'DeviceDetector\\Parser\\Client\\MobileApp' => __DIR__ . '/..' . '/matomo/device-detector/Parser/Client/MobileApp.php',
     66        'DeviceDetector\\Parser\\Client\\PIM' => __DIR__ . '/..' . '/matomo/device-detector/Parser/Client/PIM.php',
     67        'DeviceDetector\\Parser\\Device\\AbstractDeviceParser' => __DIR__ . '/..' . '/matomo/device-detector/Parser/Device/AbstractDeviceParser.php',
     68        'DeviceDetector\\Parser\\Device\\Camera' => __DIR__ . '/..' . '/matomo/device-detector/Parser/Device/Camera.php',
     69        'DeviceDetector\\Parser\\Device\\CarBrowser' => __DIR__ . '/..' . '/matomo/device-detector/Parser/Device/CarBrowser.php',
     70        'DeviceDetector\\Parser\\Device\\Console' => __DIR__ . '/..' . '/matomo/device-detector/Parser/Device/Console.php',
     71        'DeviceDetector\\Parser\\Device\\HbbTv' => __DIR__ . '/..' . '/matomo/device-detector/Parser/Device/HbbTv.php',
     72        'DeviceDetector\\Parser\\Device\\Mobile' => __DIR__ . '/..' . '/matomo/device-detector/Parser/Device/Mobile.php',
     73        'DeviceDetector\\Parser\\Device\\Notebook' => __DIR__ . '/..' . '/matomo/device-detector/Parser/Device/Notebook.php',
     74        'DeviceDetector\\Parser\\Device\\PortableMediaPlayer' => __DIR__ . '/..' . '/matomo/device-detector/Parser/Device/PortableMediaPlayer.php',
     75        'DeviceDetector\\Parser\\Device\\ShellTv' => __DIR__ . '/..' . '/matomo/device-detector/Parser/Device/ShellTv.php',
     76        'DeviceDetector\\Parser\\OperatingSystem' => __DIR__ . '/..' . '/matomo/device-detector/Parser/OperatingSystem.php',
     77        'DeviceDetector\\Parser\\VendorFragment' => __DIR__ . '/..' . '/matomo/device-detector/Parser/VendorFragment.php',
     78        'DeviceDetector\\Yaml\\ParserInterface' => __DIR__ . '/..' . '/matomo/device-detector/Yaml/ParserInterface.php',
     79        'DeviceDetector\\Yaml\\Pecl' => __DIR__ . '/..' . '/matomo/device-detector/Yaml/Pecl.php',
     80        'DeviceDetector\\Yaml\\Spyc' => __DIR__ . '/..' . '/matomo/device-detector/Yaml/Spyc.php',
     81        'DeviceDetector\\Yaml\\Symfony' => __DIR__ . '/..' . '/matomo/device-detector/Yaml/Symfony.php',
    3382        'Psr\\Http\\Message\\MessageInterface' => __DIR__ . '/..' . '/psr/http-message/src/MessageInterface.php',
    3483        'Psr\\Http\\Message\\RequestInterface' => __DIR__ . '/..' . '/psr/http-message/src/RequestInterface.php',
  • wp-ulike/trunk/vendor/composer/installed.json

    r2621001 r3342338  
    11{
    22    "packages": [
     3        {
     4            "name": "matomo/device-detector",
     5            "version": "6.4.6",
     6            "version_normalized": "6.4.6.0",
     7            "source": {
     8                "type": "git",
     9                "url": "https://github.com/matomo-org/device-detector.git",
     10                "reference": "6f07f615199851548db47a900815d2ea2cdcde08"
     11            },
     12            "dist": {
     13                "type": "zip",
     14                "url": "https://api.github.com/repos/matomo-org/device-detector/zipball/6f07f615199851548db47a900815d2ea2cdcde08",
     15                "reference": "6f07f615199851548db47a900815d2ea2cdcde08",
     16                "shasum": ""
     17            },
     18            "require": {
     19                "mustangostang/spyc": "*",
     20                "php": "^7.2|^8.0"
     21            },
     22            "replace": {
     23                "piwik/device-detector": "self.version"
     24            },
     25            "require-dev": {
     26                "matthiasmullie/scrapbook": "^1.4.7",
     27                "mayflower/mo4-coding-standard": "^v9.0.0",
     28                "phpstan/phpstan": "^1.10.44",
     29                "phpunit/phpunit": "^8.5.8",
     30                "psr/cache": "^1.0.1",
     31                "psr/simple-cache": "^1.0.1",
     32                "slevomat/coding-standard": "<8.16.0",
     33                "symfony/yaml": "^5.1.7"
     34            },
     35            "suggest": {
     36                "doctrine/cache": "Can directly be used for caching purpose",
     37                "ext-yaml": "Necessary for using the Pecl YAML parser"
     38            },
     39            "time": "2025-06-10T10:00:59+00:00",
     40            "type": "library",
     41            "installation-source": "dist",
     42            "autoload": {
     43                "psr-4": {
     44                    "DeviceDetector\\": ""
     45                },
     46                "exclude-from-classmap": [
     47                    "Tests/"
     48                ]
     49            },
     50            "notification-url": "https://packagist.org/downloads/",
     51            "license": [
     52                "LGPL-3.0-or-later"
     53            ],
     54            "authors": [
     55                {
     56                    "name": "The Matomo Team",
     57                    "email": "hello@matomo.org",
     58                    "homepage": "https://matomo.org/team/"
     59                }
     60            ],
     61            "description": "The Universal Device Detection library, that parses User Agents and detects devices (desktop, tablet, mobile, tv, cars, console, etc.), clients (browsers, media players, mobile apps, feed readers, libraries, etc), operating systems, devices, brands and models.",
     62            "homepage": "https://matomo.org",
     63            "keywords": [
     64                "devicedetection",
     65                "parser",
     66                "useragent"
     67            ],
     68            "support": {
     69                "forum": "https://forum.matomo.org/",
     70                "issues": "https://github.com/matomo-org/device-detector/issues",
     71                "source": "https://github.com/matomo-org/matomo",
     72                "wiki": "https://dev.matomo.org/"
     73            },
     74            "install-path": "../matomo/device-detector"
     75        },
     76        {
     77            "name": "mustangostang/spyc",
     78            "version": "0.6.3",
     79            "version_normalized": "0.6.3.0",
     80            "source": {
     81                "type": "git",
     82                "url": "https://github.com/mustangostang/spyc.git",
     83                "reference": "4627c838b16550b666d15aeae1e5289dd5b77da0"
     84            },
     85            "dist": {
     86                "type": "zip",
     87                "url": "https://api.github.com/repos/mustangostang/spyc/zipball/4627c838b16550b666d15aeae1e5289dd5b77da0",
     88                "reference": "4627c838b16550b666d15aeae1e5289dd5b77da0",
     89                "shasum": ""
     90            },
     91            "require": {
     92                "php": ">=5.3.1"
     93            },
     94            "require-dev": {
     95                "phpunit/phpunit": "4.3.*@dev"
     96            },
     97            "time": "2019-09-10T13:16:29+00:00",
     98            "type": "library",
     99            "extra": {
     100                "branch-alias": {
     101                    "dev-master": "0.5.x-dev"
     102                }
     103            },
     104            "installation-source": "dist",
     105            "autoload": {
     106                "files": [
     107                    "Spyc.php"
     108                ]
     109            },
     110            "notification-url": "https://packagist.org/downloads/",
     111            "license": [
     112                "MIT"
     113            ],
     114            "authors": [
     115                {
     116                    "name": "mustangostang",
     117                    "email": "vlad.andersen@gmail.com"
     118                }
     119            ],
     120            "description": "A simple YAML loader/dumper class for PHP",
     121            "homepage": "https://github.com/mustangostang/spyc/",
     122            "keywords": [
     123                "spyc",
     124                "yaml",
     125                "yml"
     126            ],
     127            "support": {
     128                "issues": "https://github.com/mustangostang/spyc/issues",
     129                "source": "https://github.com/mustangostang/spyc/tree/0.6.3"
     130            },
     131            "install-path": "../mustangostang/spyc"
     132        },
    3133        {
    4134            "name": "psr/http-message",
  • wp-ulike/trunk/vendor/composer/installed.php

    r3052611 r3342338  
    22    'root' => array(
    33        'name' => 'alimir/wp-ulike',
    4         'pretty_version' => 'dev-develop',
    5         'version' => 'dev-develop',
    6         'reference' => 'c76435f4074ec7010a6e4a1b1a5e5e297390c1fe',
     4        'pretty_version' => 'dev-master',
     5        'version' => 'dev-master',
     6        'reference' => '80637c2b09cb04264809b7465eb774f3a56b06b8',
    77        'type' => 'wordpress-plugin',
    88        'install_path' => __DIR__ . '/../../',
     
    1212    'versions' => array(
    1313        'alimir/wp-ulike' => array(
    14             'pretty_version' => 'dev-develop',
    15             'version' => 'dev-develop',
    16             'reference' => 'c76435f4074ec7010a6e4a1b1a5e5e297390c1fe',
     14            'pretty_version' => 'dev-master',
     15            'version' => 'dev-master',
     16            'reference' => '80637c2b09cb04264809b7465eb774f3a56b06b8',
    1717            'type' => 'wordpress-plugin',
    1818            'install_path' => __DIR__ . '/../../',
    1919            'aliases' => array(),
    2020            'dev_requirement' => false,
     21        ),
     22        'matomo/device-detector' => array(
     23            'pretty_version' => '6.4.6',
     24            'version' => '6.4.6.0',
     25            'reference' => '6f07f615199851548db47a900815d2ea2cdcde08',
     26            'type' => 'library',
     27            'install_path' => __DIR__ . '/../matomo/device-detector',
     28            'aliases' => array(),
     29            'dev_requirement' => false,
     30        ),
     31        'mustangostang/spyc' => array(
     32            'pretty_version' => '0.6.3',
     33            'version' => '0.6.3.0',
     34            'reference' => '4627c838b16550b666d15aeae1e5289dd5b77da0',
     35            'type' => 'library',
     36            'install_path' => __DIR__ . '/../mustangostang/spyc',
     37            'aliases' => array(),
     38            'dev_requirement' => false,
     39        ),
     40        'piwik/device-detector' => array(
     41            'dev_requirement' => false,
     42            'replaced' => array(
     43                0 => '6.4.6',
     44            ),
    2145        ),
    2246        'psr/http-message' => array(
  • wp-ulike/trunk/wp-ulike.php

    r3251532 r3342338  
    44 * Plugin URI:        https://wpulike.com/?utm_source=wp-plugins&utm_campaign=plugin-uri&utm_medium=wp-dash
    55 * Description:       Looking to increase user engagement on your WordPress site? WP ULike plugin lets you easily add voting buttons to your content. With customizable settings and detailed analytics, you can track user engagement, optimize your content, and build a loyal following.
    6  * Version:           4.7.9.1
     6 * Version:           4.7.10
    77 * Author:            TechnoWich
    88 * Author URI:        https://technowich.com/?utm_source=wp-plugins&utm_campaign=author-uri&utm_medium=wp-dash
     
    3131// Do not change these values
    3232define( 'WP_ULIKE_PLUGIN_URI'   , 'https://wpulike.com/'                    );
    33 define( 'WP_ULIKE_VERSION'      , '4.7.9.1'                                 );
     33define( 'WP_ULIKE_VERSION'      , '4.7.10'                                  );
    3434define( 'WP_ULIKE_DB_VERSION'   , '2.3'                                     );
    3535define( 'WP_ULIKE_SLUG'         , 'wp-ulike'                                );
Note: See TracChangeset for help on using the changeset viewer.