From 9caab8ce681c642320ebc57546418865ff6a6425 Mon Sep 17 00:00:00 2001 From: Sophia Atkinson Date: Fri, 1 Sep 2023 00:37:57 -0700 Subject: [PATCH] first commit --- admin/blocks/js/blocks.asset.php | 1 + admin/blocks/js/blocks.js | 2 + admin/blocks/src/avatar/block.json | 29 + admin/blocks/src/avatar/edit.js | 101 +++ admin/blocks/src/avatar/index.js | 46 ++ admin/blocks/src/blocks.js | 38 + admin/blocks/src/frontend-form/block.json | 19 + admin/blocks/src/frontend-form/edit.js | 82 ++ admin/blocks/src/frontend-form/index.js | 47 ++ admin/css/blocks.css | 4 + admin/css/blocks.min.css | 1 + admin/css/settings.css | 14 + admin/css/settings.min.css | 1 + admin/partials/network/section.php | 30 + admin/partials/network/settings-page.php | 42 + admin/partials/profile/allow-anonymous.php | 53 ++ admin/partials/profile/use-gravatar.php | 58 ++ admin/partials/profile/user-avatar-upload.php | 69 ++ .../sections/avatars-disabled-script.php | 39 + admin/partials/sections/avatars-disabled.php | 39 + admin/partials/sections/avatars-enabled.php | 42 + avatar-privacy.php | 84 ++ includes/avatar-privacy-functions.php | 54 ++ .../avatar-handlers/class-avatar-handler.php | 84 ++ .../class-default-icons-handler.php | 200 +++++ .../class-gravatar-cache-handler.php | 249 ++++++ .../class-legacy-icon-handler.php | 185 +++++ .../class-user-avatar-handler.php | 221 ++++++ .../class-abstract-icon-provider.php | 127 ++++ .../class-custom-icon-provider.php | 139 ++++ .../class-generating-icon-provider.php | 116 +++ .../default-icons/class-generator.php | 48 ++ .../default-icons/class-icon-provider.php | 87 +++ .../class-static-icon-provider.php | 79 ++ .../default-icons/class-svg-icon-provider.php | 55 ++ .../class-bird-avatar-icon-provider.php | 73 ++ .../class-cat-avatar-icon-provider.php | 73 ++ .../class-identicon-icon-provider.php | 66 ++ .../class-monster-id-icon-provider.php | 66 ++ .../class-retro-icon-provider.php | 66 ++ .../class-rings-icon-provider.php | 77 ++ .../class-robohash-icon-provider.php | 73 ++ .../class-wavatar-icon-provider.php | 66 ++ .../generators/class-bird-avatar.php | 109 +++ .../generators/class-cat-avatar.php | 109 +++ .../generators/class-jdenticon.php | 74 ++ .../generators/class-monster-id.php | 460 +++++++++++ .../generators/class-parts-generator.php | 321 ++++++++ .../generators/class-png-parts-generator.php | 383 ++++++++++ .../default-icons/generators/class-retro.php | 198 +++++ .../default-icons/generators/class-rings.php | 55 ++ .../generators/class-robohash.php | 275 +++++++ .../generators/class-wavatar.php | 279 +++++++ .../class-bowling-pin-icon-provider.php | 57 ++ .../class-mystery-icon-provider.php | 46 ++ .../class-silhouette-icon-provider.php | 57 ++ .../class-speech-bubble-icon-provider.php | 57 ++ includes/avatar-privacy/class-component.php | 44 ++ includes/avatar-privacy/class-controller.php | 82 ++ includes/avatar-privacy/class-core.php | 490 ++++++++++++ includes/avatar-privacy/class-factory.php | 578 ++++++++++++++ .../avatar-privacy/class-requirements.php | 137 ++++ .../cli/class-abstract-command.php | 106 +++ includes/avatar-privacy/cli/class-command.php | 46 ++ .../avatar-privacy/cli/class-cron-command.php | 104 +++ .../cli/class-database-command.php | 324 ++++++++ .../cli/class-default-command.php | 209 +++++ .../cli/class-uninstall-command.php | 239 ++++++ .../avatar-privacy/cli/class-user-command.php | 206 +++++ .../components/class-avatar-handling.php | 682 +++++++++++++++++ .../components/class-block-editor.php | 249 ++++++ .../class-command-line-interface.php | 76 ++ .../components/class-comments.php | 334 ++++++++ .../components/class-image-proxy.php | 349 +++++++++ .../components/class-integrations.php | 80 ++ .../class-network-settings-page.php | 376 +++++++++ .../components/class-privacy-tools.php | 355 +++++++++ .../components/class-settings-page.php | 229 ++++++ .../avatar-privacy/components/class-setup.php | 485 ++++++++++++ .../components/class-shortcodes.php | 151 ++++ .../components/class-uninstallation.php | 288 +++++++ .../components/class-user-profile.php | 171 +++++ includes/avatar-privacy/core/class-api.php | 36 + .../core/class-comment-author-fields.php | 413 ++++++++++ .../core/class-default-avatars.php | 270 +++++++ .../avatar-privacy/core/class-settings.php | 449 +++++++++++ .../avatar-privacy/core/class-user-fields.php | 525 +++++++++++++ .../data-storage/class-cache.php | 46 ++ .../data-storage/class-filesystem-cache.php | 278 +++++++ .../data-storage/class-network-options.php | 134 ++++ .../data-storage/class-options.php | 82 ++ .../data-storage/class-site-transients.php | 45 ++ .../data-storage/class-transients.php | 45 ++ .../database/class-comment-author-table.php | 454 +++++++++++ .../database/class-hashes-table.php | 162 ++++ .../data-storage/database/class-table.php | 694 +++++++++++++++++ .../class-avatar-comment-type-exception.php | 38 + .../exceptions/class-database-exception.php | 37 + .../class-file-deletion-exception.php | 39 + .../exceptions/class-filesystem-exception.php | 37 + .../class-form-field-not-found-exception.php | 39 + .../class-invalid-nonce-exception.php | 38 + .../class-object-factory-exception.php | 37 + .../class-part-files-not-found-exception.php | 38 + .../exceptions/class-png-image-exception.php | 37 + .../class-upload-handling-exception.php | 37 + includes/avatar-privacy/functions.php | 59 ++ .../class-bbpress-integration.php | 145 ++++ .../class-buddypress-integration.php | 275 +++++++ .../integrations/class-plugin-integration.php | 45 ++ .../class-simple-author-box-integration.php | 170 +++++ ...class-simple-local-avatars-integration.php | 173 +++++ .../class-simple-user-avatar-integration.php | 164 ++++ ...ss-theme-my-login-profiles-integration.php | 145 ++++ .../class-ultimate-member-integration.php | 177 +++++ .../class-wp-user-manager-integration.php | 161 ++++ .../class-wpdiscuz-integration.php | 191 +++++ .../avatar-privacy/tools/class-hasher.php | 133 ++++ .../avatar-privacy/tools/class-multisite.php | 80 ++ .../tools/class-number-generator.php | 72 ++ .../avatar-privacy/tools/class-template.php | 256 +++++++ includes/avatar-privacy/tools/functions.php | 51 ++ .../tools/html/class-dependencies.php | 242 ++++++ .../tools/html/class-user-form.php | 574 ++++++++++++++ .../tools/images/class-color.php | 135 ++++ .../tools/images/class-editor.php | 350 +++++++++ .../tools/images/class-image-file.php | 350 +++++++++ .../tools/images/class-image-stream.php | 579 ++++++++++++++ .../avatar-privacy/tools/images/class-png.php | 266 +++++++ .../avatar-privacy/tools/images/class-svg.php | 716 ++++++++++++++++++ .../tools/images/class-type.php | 62 ++ .../tools/network/class-gravatar-service.php | 287 +++++++ .../network/class-remote-image-service.php | 233 ++++++ ...ass-custom-default-icon-upload-handler.php | 300 ++++++++ .../upload-handlers/class-upload-handler.php | 366 +++++++++ .../class-user-avatar-upload-handler.php | 257 +++++++ .../ui/class-file-upload-input.php | 139 ++++ public/images/LICENSE.md | 82 ++ public/images/birds/accessoire_1.png | Bin 0 -> 1154 bytes public/images/birds/accessoire_10.png | Bin 0 -> 21719 bytes public/images/birds/accessoire_11.png | Bin 0 -> 19617 bytes public/images/birds/accessoire_12.png | Bin 0 -> 20814 bytes public/images/birds/accessoire_13.png | Bin 0 -> 1154 bytes public/images/birds/accessoire_14.png | Bin 0 -> 24307 bytes public/images/birds/accessoire_15.png | Bin 0 -> 1154 bytes public/images/birds/accessoire_16.png | Bin 0 -> 57418 bytes public/images/birds/accessoire_17.png | Bin 0 -> 1154 bytes public/images/birds/accessoire_18.png | Bin 0 -> 1154 bytes public/images/birds/accessoire_19.png | Bin 0 -> 1154 bytes public/images/birds/accessoire_2.png | Bin 0 -> 1154 bytes public/images/birds/accessoire_20.png | Bin 0 -> 1154 bytes public/images/birds/accessoire_3.png | Bin 0 -> 16538 bytes public/images/birds/accessoire_4.png | Bin 0 -> 1154 bytes public/images/birds/accessoire_5.png | Bin 0 -> 31256 bytes public/images/birds/accessoire_6.png | Bin 0 -> 23989 bytes public/images/birds/accessoire_7.png | Bin 0 -> 20560 bytes public/images/birds/accessoire_8.png | Bin 0 -> 40871 bytes public/images/birds/accessoire_9.png | Bin 0 -> 1154 bytes public/images/birds/beak_1.png | Bin 0 -> 19875 bytes public/images/birds/beak_2.png | Bin 0 -> 13109 bytes public/images/birds/beak_3.png | Bin 0 -> 16880 bytes public/images/birds/beak_4.png | Bin 0 -> 16564 bytes public/images/birds/beak_5.png | Bin 0 -> 13407 bytes public/images/birds/beak_6.png | Bin 0 -> 13495 bytes public/images/birds/beak_7.png | Bin 0 -> 11784 bytes public/images/birds/beak_8.png | Bin 0 -> 12530 bytes public/images/birds/beak_9.png | Bin 0 -> 16121 bytes public/images/birds/body_1.png | Bin 0 -> 51871 bytes public/images/birds/body_2.png | Bin 0 -> 52945 bytes public/images/birds/body_3.png | Bin 0 -> 64016 bytes public/images/birds/body_4.png | Bin 0 -> 63904 bytes public/images/birds/body_5.png | Bin 0 -> 95203 bytes public/images/birds/body_6.png | Bin 0 -> 68081 bytes public/images/birds/body_7.png | Bin 0 -> 57771 bytes public/images/birds/body_8.png | Bin 0 -> 85868 bytes public/images/birds/body_9.png | Bin 0 -> 65307 bytes public/images/birds/eyes_1.png | Bin 0 -> 21166 bytes public/images/birds/eyes_2.png | Bin 0 -> 22784 bytes public/images/birds/eyes_3.png | Bin 0 -> 29633 bytes public/images/birds/eyes_4.png | Bin 0 -> 24429 bytes public/images/birds/eyes_5.png | Bin 0 -> 43086 bytes public/images/birds/eyes_6.png | Bin 0 -> 49544 bytes public/images/birds/eyes_7.png | Bin 0 -> 40419 bytes public/images/birds/eyes_8.png | Bin 0 -> 22898 bytes public/images/birds/eyes_9.png | Bin 0 -> 22350 bytes public/images/birds/guide.png | Bin 0 -> 30012 bytes public/images/birds/hoop_1.png | Bin 0 -> 17265 bytes public/images/birds/hoop_10.png | Bin 0 -> 28832 bytes public/images/birds/hoop_2.png | Bin 0 -> 18659 bytes public/images/birds/hoop_3.png | Bin 0 -> 24208 bytes public/images/birds/hoop_4.png | Bin 0 -> 21347 bytes public/images/birds/hoop_5.png | Bin 0 -> 20449 bytes public/images/birds/hoop_6.png | Bin 0 -> 16851 bytes public/images/birds/hoop_7.png | Bin 0 -> 17756 bytes public/images/birds/hoop_8.png | Bin 0 -> 1154 bytes public/images/birds/hoop_9.png | Bin 0 -> 19382 bytes public/images/birds/tail_1.png | Bin 0 -> 32146 bytes public/images/birds/tail_2.png | Bin 0 -> 33521 bytes public/images/birds/tail_3.png | Bin 0 -> 80234 bytes public/images/birds/tail_4.png | Bin 0 -> 16890 bytes public/images/birds/tail_5.png | Bin 0 -> 36826 bytes public/images/birds/tail_6.png | Bin 0 -> 40426 bytes public/images/birds/tail_7.png | Bin 0 -> 41481 bytes public/images/birds/tail_8.png | Bin 0 -> 32175 bytes public/images/birds/tail_9.png | Bin 0 -> 51238 bytes public/images/birds/wing_1.png | Bin 0 -> 20111 bytes public/images/birds/wing_2.png | Bin 0 -> 20285 bytes public/images/birds/wing_3.png | Bin 0 -> 20916 bytes public/images/birds/wing_4.png | Bin 0 -> 20159 bytes public/images/birds/wing_5.png | Bin 0 -> 17367 bytes public/images/birds/wing_6.png | Bin 0 -> 26855 bytes public/images/birds/wing_7.png | Bin 0 -> 28041 bytes public/images/birds/wing_8.png | Bin 0 -> 22129 bytes public/images/birds/wing_9.png | Bin 0 -> 31448 bytes public/images/cats/accessoire_1.png | Bin 0 -> 30367 bytes public/images/cats/accessoire_10.png | Bin 0 -> 21357 bytes public/images/cats/accessoire_11.png | Bin 0 -> 19617 bytes public/images/cats/accessoire_12.png | Bin 0 -> 21921 bytes public/images/cats/accessoire_13.png | Bin 0 -> 78046 bytes public/images/cats/accessoire_14.png | Bin 0 -> 24307 bytes public/images/cats/accessoire_15.png | Bin 0 -> 30137 bytes public/images/cats/accessoire_16.png | Bin 0 -> 67553 bytes public/images/cats/accessoire_17.png | Bin 0 -> 1154 bytes public/images/cats/accessoire_18.png | Bin 0 -> 1154 bytes public/images/cats/accessoire_19.png | Bin 0 -> 1154 bytes public/images/cats/accessoire_2.png | Bin 0 -> 10600 bytes public/images/cats/accessoire_20.png | Bin 0 -> 1154 bytes public/images/cats/accessoire_3.png | Bin 0 -> 16538 bytes public/images/cats/accessoire_4.png | Bin 0 -> 8521 bytes public/images/cats/accessoire_5.png | Bin 0 -> 29685 bytes public/images/cats/accessoire_6.png | Bin 0 -> 23989 bytes public/images/cats/accessoire_7.png | Bin 0 -> 20560 bytes public/images/cats/accessoire_8.png | Bin 0 -> 47364 bytes public/images/cats/accessoire_9.png | Bin 0 -> 34943 bytes public/images/cats/body_1.png | Bin 0 -> 72209 bytes public/images/cats/body_10.png | Bin 0 -> 93365 bytes public/images/cats/body_11.png | Bin 0 -> 76675 bytes public/images/cats/body_12.png | Bin 0 -> 87220 bytes public/images/cats/body_13.png | Bin 0 -> 69420 bytes public/images/cats/body_14.png | Bin 0 -> 102399 bytes public/images/cats/body_15.png | Bin 0 -> 82671 bytes public/images/cats/body_2.png | Bin 0 -> 83734 bytes public/images/cats/body_3.png | Bin 0 -> 95393 bytes public/images/cats/body_4.png | Bin 0 -> 71104 bytes public/images/cats/body_5.png | Bin 0 -> 84140 bytes public/images/cats/body_6.png | Bin 0 -> 97372 bytes public/images/cats/body_7.png | Bin 0 -> 83905 bytes public/images/cats/body_8.png | Bin 0 -> 80819 bytes public/images/cats/body_9.png | Bin 0 -> 82031 bytes public/images/cats/eyes_1.png | Bin 0 -> 17343 bytes public/images/cats/eyes_10.png | Bin 0 -> 17595 bytes public/images/cats/eyes_11.png | Bin 0 -> 13166 bytes public/images/cats/eyes_12.png | Bin 0 -> 11934 bytes public/images/cats/eyes_13.png | Bin 0 -> 28162 bytes public/images/cats/eyes_14.png | Bin 0 -> 13887 bytes public/images/cats/eyes_15.png | Bin 0 -> 17427 bytes public/images/cats/eyes_2.png | Bin 0 -> 12544 bytes public/images/cats/eyes_3.png | Bin 0 -> 4261 bytes public/images/cats/eyes_4.png | Bin 0 -> 13612 bytes public/images/cats/eyes_5.png | Bin 0 -> 25733 bytes public/images/cats/eyes_6.png | Bin 0 -> 13836 bytes public/images/cats/eyes_7.png | Bin 0 -> 4716 bytes public/images/cats/eyes_8.png | Bin 0 -> 18488 bytes public/images/cats/eyes_9.png | Bin 0 -> 15271 bytes public/images/cats/fur_1.png | Bin 0 -> 13713 bytes public/images/cats/fur_10.png | Bin 0 -> 28965 bytes public/images/cats/fur_2.png | Bin 0 -> 20685 bytes public/images/cats/fur_3.png | Bin 0 -> 1154 bytes public/images/cats/fur_4.png | Bin 0 -> 38615 bytes public/images/cats/fur_5.png | Bin 0 -> 31096 bytes public/images/cats/fur_6.png | Bin 0 -> 32904 bytes public/images/cats/fur_7.png | Bin 0 -> 1154 bytes public/images/cats/fur_8.png | Bin 0 -> 15228 bytes public/images/cats/fur_9.png | Bin 0 -> 14064 bytes public/images/cats/mouth_1.png | Bin 0 -> 5322 bytes public/images/cats/mouth_10.png | Bin 0 -> 8270 bytes public/images/cats/mouth_2.png | Bin 0 -> 4822 bytes public/images/cats/mouth_3.png | Bin 0 -> 2883 bytes public/images/cats/mouth_4.png | Bin 0 -> 10812 bytes public/images/cats/mouth_5.png | Bin 0 -> 5594 bytes public/images/cats/mouth_6.png | Bin 0 -> 5908 bytes public/images/cats/mouth_7.png | Bin 0 -> 4535 bytes public/images/cats/mouth_8.png | Bin 0 -> 4921 bytes public/images/cats/mouth_9.png | Bin 0 -> 9648 bytes public/images/cats/zz_1.png | Bin 0 -> 26493 bytes public/images/cats/zz_2.png | Bin 0 -> 26487 bytes public/images/comment-bubble.svg | 1 + public/images/monster-id/arms_1.png | Bin 0 -> 1796 bytes public/images/monster-id/arms_2.png | Bin 0 -> 2141 bytes public/images/monster-id/arms_3.png | Bin 0 -> 8560 bytes public/images/monster-id/arms_4.png | Bin 0 -> 6181 bytes public/images/monster-id/arms_5.png | Bin 0 -> 12373 bytes public/images/monster-id/arms_S1.png | Bin 0 -> 8795 bytes public/images/monster-id/arms_S2.png | Bin 0 -> 14199 bytes public/images/monster-id/arms_S3.png | Bin 0 -> 9928 bytes public/images/monster-id/arms_S4.png | Bin 0 -> 2960 bytes public/images/monster-id/arms_S5.png | Bin 0 -> 5236 bytes public/images/monster-id/arms_S6.png | Bin 0 -> 14273 bytes public/images/monster-id/arms_S7.png | Bin 0 -> 8545 bytes public/images/monster-id/arms_S8.png | Bin 0 -> 14929 bytes public/images/monster-id/arms_S9.png | Bin 0 -> 6424 bytes public/images/monster-id/back.png | Bin 0 -> 136 bytes public/images/monster-id/body_1.png | Bin 0 -> 7014 bytes public/images/monster-id/body_10.png | Bin 0 -> 7685 bytes public/images/monster-id/body_11.png | Bin 0 -> 12299 bytes public/images/monster-id/body_12.png | Bin 0 -> 13138 bytes public/images/monster-id/body_13.png | Bin 0 -> 7996 bytes public/images/monster-id/body_14.png | Bin 0 -> 10474 bytes public/images/monster-id/body_15.png | Bin 0 -> 10799 bytes public/images/monster-id/body_2.png | Bin 0 -> 10266 bytes public/images/monster-id/body_3.png | Bin 0 -> 8653 bytes public/images/monster-id/body_4.png | Bin 0 -> 10977 bytes public/images/monster-id/body_5.png | Bin 0 -> 13768 bytes public/images/monster-id/body_6.png | Bin 0 -> 9507 bytes public/images/monster-id/body_7.png | Bin 0 -> 11324 bytes public/images/monster-id/body_8.png | Bin 0 -> 10629 bytes public/images/monster-id/body_9.png | Bin 0 -> 10319 bytes public/images/monster-id/body_S1.png | Bin 0 -> 10197 bytes public/images/monster-id/body_S2.png | Bin 0 -> 7002 bytes public/images/monster-id/body_S3.png | Bin 0 -> 9411 bytes public/images/monster-id/body_S4.png | Bin 0 -> 14521 bytes public/images/monster-id/body_S5.png | Bin 0 -> 11345 bytes public/images/monster-id/eyes_1.png | Bin 0 -> 2307 bytes public/images/monster-id/eyes_10.png | Bin 0 -> 2821 bytes public/images/monster-id/eyes_11.png | Bin 0 -> 2730 bytes public/images/monster-id/eyes_12.png | Bin 0 -> 2382 bytes public/images/monster-id/eyes_13.png | Bin 0 -> 3992 bytes public/images/monster-id/eyes_14.png | Bin 0 -> 4711 bytes public/images/monster-id/eyes_15.png | Bin 0 -> 952 bytes public/images/monster-id/eyes_2.png | Bin 0 -> 2074 bytes public/images/monster-id/eyes_3.png | Bin 0 -> 2834 bytes public/images/monster-id/eyes_4.png | Bin 0 -> 1199 bytes public/images/monster-id/eyes_5.png | Bin 0 -> 2049 bytes public/images/monster-id/eyes_6.png | Bin 0 -> 1682 bytes public/images/monster-id/eyes_7.png | Bin 0 -> 1679 bytes public/images/monster-id/eyes_8.png | Bin 0 -> 2502 bytes public/images/monster-id/eyes_9.png | Bin 0 -> 889 bytes public/images/monster-id/eyes_S1.png | Bin 0 -> 2973 bytes public/images/monster-id/eyes_S2.png | Bin 0 -> 724 bytes public/images/monster-id/eyes_S3.png | Bin 0 -> 2752 bytes public/images/monster-id/eyes_S4.png | Bin 0 -> 2035 bytes public/images/monster-id/eyes_S5.png | Bin 0 -> 2291 bytes public/images/monster-id/hair_1.png | Bin 0 -> 2928 bytes public/images/monster-id/hair_2.png | Bin 0 -> 1563 bytes public/images/monster-id/hair_3.png | Bin 0 -> 5504 bytes public/images/monster-id/hair_4.png | Bin 0 -> 4122 bytes public/images/monster-id/hair_5.png | Bin 0 -> 2141 bytes public/images/monster-id/hair_S1.png | Bin 0 -> 8218 bytes public/images/monster-id/hair_S2.png | Bin 0 -> 5363 bytes public/images/monster-id/hair_S3.png | Bin 0 -> 8868 bytes public/images/monster-id/hair_S4.png | Bin 0 -> 9470 bytes public/images/monster-id/hair_S5.png | Bin 0 -> 10038 bytes public/images/monster-id/hair_S6.png | Bin 0 -> 8684 bytes public/images/monster-id/hair_S7.png | Bin 0 -> 2719 bytes public/images/monster-id/legs_1.png | Bin 0 -> 7274 bytes public/images/monster-id/legs_2.png | Bin 0 -> 7575 bytes public/images/monster-id/legs_3.png | Bin 0 -> 7617 bytes public/images/monster-id/legs_4.png | Bin 0 -> 1995 bytes public/images/monster-id/legs_5.png | Bin 0 -> 7272 bytes public/images/monster-id/legs_S1.png | Bin 0 -> 8853 bytes public/images/monster-id/legs_S10.png | Bin 0 -> 4388 bytes public/images/monster-id/legs_S11.png | Bin 0 -> 3232 bytes public/images/monster-id/legs_S12.png | Bin 0 -> 7214 bytes public/images/monster-id/legs_S13.png | Bin 0 -> 7896 bytes public/images/monster-id/legs_S2.png | Bin 0 -> 8696 bytes public/images/monster-id/legs_S3.png | Bin 0 -> 11615 bytes public/images/monster-id/legs_S4.png | Bin 0 -> 6961 bytes public/images/monster-id/legs_S5.png | Bin 0 -> 9919 bytes public/images/monster-id/legs_S6.png | Bin 0 -> 8156 bytes public/images/monster-id/legs_S7.png | Bin 0 -> 4377 bytes public/images/monster-id/legs_S8.png | Bin 0 -> 1401 bytes public/images/monster-id/legs_S9.png | Bin 0 -> 4227 bytes public/images/monster-id/mouth_1.png | Bin 0 -> 881 bytes public/images/monster-id/mouth_10.png | Bin 0 -> 4709 bytes public/images/monster-id/mouth_2.png | Bin 0 -> 1227 bytes public/images/monster-id/mouth_3.png | Bin 0 -> 2984 bytes public/images/monster-id/mouth_4.png | Bin 0 -> 3074 bytes public/images/monster-id/mouth_5.png | Bin 0 -> 1944 bytes public/images/monster-id/mouth_6.png | Bin 0 -> 2645 bytes public/images/monster-id/mouth_7.png | Bin 0 -> 2071 bytes public/images/monster-id/mouth_8.png | Bin 0 -> 2539 bytes public/images/monster-id/mouth_9.png | Bin 0 -> 5094 bytes public/images/monster-id/mouth_S1.png | Bin 0 -> 2373 bytes public/images/monster-id/mouth_S2.png | Bin 0 -> 2212 bytes public/images/monster-id/mouth_S3.png | Bin 0 -> 2500 bytes public/images/monster-id/mouth_S4.png | Bin 0 -> 2400 bytes public/images/monster-id/mouth_S5.png | Bin 0 -> 2323 bytes public/images/monster-id/mouth_S6.png | Bin 0 -> 2411 bytes public/images/monster-id/mouth_S7.png | Bin 0 -> 715 bytes public/images/mystery.svg | 1 + .../robohash/accessory/accessory-01.svg | 1 + .../robohash/accessory/accessory-02.svg | 1 + .../robohash/accessory/accessory-03.svg | 1 + .../robohash/accessory/accessory-04.svg | 1 + .../robohash/accessory/accessory-05.svg | 1 + .../robohash/accessory/accessory-06.svg | 1 + .../robohash/accessory/accessory-07.svg | 1 + .../robohash/accessory/accessory-08.svg | 1 + .../robohash/accessory/accessory-09.svg | 1 + .../robohash/accessory/accessory-10.svg | 1 + public/images/robohash/body/body-01.svg | 1 + public/images/robohash/body/body-02.svg | 1 + public/images/robohash/body/body-03.svg | 1 + public/images/robohash/body/body-04.svg | 1 + public/images/robohash/body/body-05.svg | 1 + public/images/robohash/body/body-06.svg | 1 + public/images/robohash/body/body-07.svg | 1 + public/images/robohash/body/body-08.svg | 1 + public/images/robohash/body/body-09.svg | 1 + public/images/robohash/body/body-10.svg | 1 + public/images/robohash/eyes/eyes-01.svg | 1 + public/images/robohash/eyes/eyes-02.svg | 1 + public/images/robohash/eyes/eyes-03.svg | 1 + public/images/robohash/eyes/eyes-04.svg | 1 + public/images/robohash/eyes/eyes-05.svg | 1 + public/images/robohash/eyes/eyes-06.svg | 1 + public/images/robohash/eyes/eyes-07.svg | 1 + public/images/robohash/eyes/eyes-08.svg | 1 + public/images/robohash/eyes/eyes-09.svg | 1 + public/images/robohash/eyes/eyes-10.svg | 1 + public/images/robohash/face/face-01.svg | 1 + public/images/robohash/face/face-02.svg | 1 + public/images/robohash/face/face-03.svg | 1 + public/images/robohash/face/face-04.svg | 1 + public/images/robohash/face/face-05.svg | 1 + public/images/robohash/face/face-06.svg | 1 + public/images/robohash/face/face-07.svg | 1 + public/images/robohash/face/face-08.svg | 1 + public/images/robohash/face/face-09.svg | 1 + public/images/robohash/face/face-10.svg | 1 + public/images/robohash/mouth/mouth-01.svg | 1 + public/images/robohash/mouth/mouth-02.svg | 1 + public/images/robohash/mouth/mouth-03.svg | 1 + public/images/robohash/mouth/mouth-04.svg | 1 + public/images/robohash/mouth/mouth-05.svg | 1 + public/images/robohash/mouth/mouth-06.svg | 1 + public/images/robohash/mouth/mouth-07.svg | 1 + public/images/robohash/mouth/mouth-08.svg | 1 + public/images/robohash/mouth/mouth-09.svg | 1 + public/images/robohash/mouth/mouth-10.svg | 1 + public/images/shaded-cone.svg | 1 + public/images/silhouette.svg | 1 + public/images/wavatars/brow_1.png | Bin 0 -> 189 bytes public/images/wavatars/brow_2.png | Bin 0 -> 401 bytes public/images/wavatars/brow_3.png | Bin 0 -> 363 bytes public/images/wavatars/brow_4.png | Bin 0 -> 418 bytes public/images/wavatars/brow_5.png | Bin 0 -> 346 bytes public/images/wavatars/brow_6.png | Bin 0 -> 488 bytes public/images/wavatars/brow_7.png | Bin 0 -> 383 bytes public/images/wavatars/brow_8.png | Bin 0 -> 160 bytes public/images/wavatars/eyes_1.png | Bin 0 -> 941 bytes public/images/wavatars/eyes_10.png | Bin 0 -> 948 bytes public/images/wavatars/eyes_11.png | Bin 0 -> 871 bytes public/images/wavatars/eyes_12.png | Bin 0 -> 860 bytes public/images/wavatars/eyes_13.png | Bin 0 -> 929 bytes public/images/wavatars/eyes_2.png | Bin 0 -> 502 bytes public/images/wavatars/eyes_3.png | Bin 0 -> 883 bytes public/images/wavatars/eyes_4.png | Bin 0 -> 1235 bytes public/images/wavatars/eyes_5.png | Bin 0 -> 903 bytes public/images/wavatars/eyes_6.png | Bin 0 -> 934 bytes public/images/wavatars/eyes_7.png | Bin 0 -> 160 bytes public/images/wavatars/eyes_8.png | Bin 0 -> 715 bytes public/images/wavatars/eyes_9.png | Bin 0 -> 709 bytes public/images/wavatars/fade_1.png | Bin 0 -> 501 bytes public/images/wavatars/fade_2.png | Bin 0 -> 3051 bytes public/images/wavatars/fade_3.png | Bin 0 -> 1210 bytes public/images/wavatars/fade_4.png | Bin 0 -> 160 bytes public/images/wavatars/mask_1.png | Bin 0 -> 1865 bytes public/images/wavatars/mask_10.png | Bin 0 -> 2422 bytes public/images/wavatars/mask_11.png | Bin 0 -> 2189 bytes public/images/wavatars/mask_2.png | Bin 0 -> 759 bytes public/images/wavatars/mask_3.png | Bin 0 -> 1895 bytes public/images/wavatars/mask_4.png | Bin 0 -> 1210 bytes public/images/wavatars/mask_5.png | Bin 0 -> 1138 bytes public/images/wavatars/mask_6.png | Bin 0 -> 969 bytes public/images/wavatars/mask_7.png | Bin 0 -> 822 bytes public/images/wavatars/mask_8.png | Bin 0 -> 1586 bytes public/images/wavatars/mask_9.png | Bin 0 -> 1445 bytes public/images/wavatars/mouth_1.png | Bin 0 -> 308 bytes public/images/wavatars/mouth_10.png | Bin 0 -> 226 bytes public/images/wavatars/mouth_11.png | Bin 0 -> 962 bytes public/images/wavatars/mouth_12.png | Bin 0 -> 1028 bytes public/images/wavatars/mouth_13.png | Bin 0 -> 350 bytes public/images/wavatars/mouth_14.png | Bin 0 -> 391 bytes public/images/wavatars/mouth_15.png | Bin 0 -> 1430 bytes public/images/wavatars/mouth_16.png | Bin 0 -> 314 bytes public/images/wavatars/mouth_17.png | Bin 0 -> 719 bytes public/images/wavatars/mouth_18.png | Bin 0 -> 786 bytes public/images/wavatars/mouth_19.png | Bin 0 -> 571 bytes public/images/wavatars/mouth_2.png | Bin 0 -> 548 bytes public/images/wavatars/mouth_3.png | Bin 0 -> 446 bytes public/images/wavatars/mouth_4.png | Bin 0 -> 457 bytes public/images/wavatars/mouth_5.png | Bin 0 -> 421 bytes public/images/wavatars/mouth_6.png | Bin 0 -> 290 bytes public/images/wavatars/mouth_7.png | Bin 0 -> 188 bytes public/images/wavatars/mouth_8.png | Bin 0 -> 360 bytes public/images/wavatars/mouth_9.png | Bin 0 -> 486 bytes public/images/wavatars/pupils_1.png | Bin 0 -> 529 bytes public/images/wavatars/pupils_10.png | Bin 0 -> 478 bytes public/images/wavatars/pupils_11.png | Bin 0 -> 298 bytes public/images/wavatars/pupils_2.png | Bin 0 -> 516 bytes public/images/wavatars/pupils_3.png | Bin 0 -> 462 bytes public/images/wavatars/pupils_4.png | Bin 0 -> 454 bytes public/images/wavatars/pupils_5.png | Bin 0 -> 397 bytes public/images/wavatars/pupils_6.png | Bin 0 -> 308 bytes public/images/wavatars/pupils_7.png | Bin 0 -> 241 bytes public/images/wavatars/pupils_8.png | Bin 0 -> 309 bytes public/images/wavatars/pupils_9.png | Bin 0 -> 849 bytes public/images/wavatars/shine_1.png | Bin 0 -> 5561 bytes public/images/wavatars/shine_10.png | Bin 0 -> 4153 bytes public/images/wavatars/shine_11.png | Bin 0 -> 4242 bytes public/images/wavatars/shine_2.png | Bin 0 -> 3016 bytes public/images/wavatars/shine_3.png | Bin 0 -> 3772 bytes public/images/wavatars/shine_4.png | Bin 0 -> 3386 bytes public/images/wavatars/shine_5.png | Bin 0 -> 3219 bytes public/images/wavatars/shine_6.png | Bin 0 -> 3464 bytes public/images/wavatars/shine_7.png | Bin 0 -> 3704 bytes public/images/wavatars/shine_8.png | Bin 0 -> 3224 bytes public/images/wavatars/shine_9.png | Bin 0 -> 3261 bytes public/js/wpdiscuz/src/use-gravatar.js | 31 + public/js/wpdiscuz/use-gravatar.js | 31 + public/js/wpdiscuz/use-gravatar.min.js | 2 + .../bbpress/profile/allow-anonymous.php | 55 ++ .../partials/bbpress/profile/use-gravatar.php | 59 ++ .../bbpress/profile/user-avatar-upload.php | 65 ++ .../partials/bbpress/user-profile-picture.php | 43 ++ public/partials/block/avatar.php | 51 ++ public/partials/block/frontend-form.php | 59 ++ public/partials/comments/use-gravatar.php | 29 + public/partials/profile/allow-anonymous.php | 55 ++ public/partials/profile/use-gravatar.php | 59 ++ .../partials/profile/user-avatar-upload.php | 65 ++ public/partials/retro/svg.php | 69 ++ public/partials/robohash/svg.php | 50 ++ public/partials/shortcode/avatar-upload.php | 49 ++ .../partials/tml-profiles/allow-anonymous.php | 54 ++ public/partials/tml-profiles/use-gravatar.php | 58 ++ .../tml-profiles/user-avatar-upload.php | 63 ++ public/partials/wpdiscuz/use-gravatar.php | 53 ++ readme.txt | 365 +++++++++ uninstall.php | 63 ++ vendor-scoped/autoload.php | 25 + vendor-scoped/composer/ClassLoader.php | 585 ++++++++++++++ vendor-scoped/composer/LICENSE | 21 + vendor-scoped/composer/autoload_classmap.php | 181 +++++ vendor-scoped/composer/autoload_files.php | 12 + .../composer/autoload_namespaces.php | 9 + vendor-scoped/composer/autoload_real.php | 49 ++ vendor-scoped/composer/autoload_static.php | 234 ++++++ vendor-scoped/jdenticon/jdenticon/LICENSE | 21 + vendor-scoped/jdenticon/jdenticon/README.md | 60 ++ .../jdenticon/jdenticon/src/Color.php | 673 ++++++++++++++++ .../jdenticon/jdenticon/src/Identicon.php | 421 ++++++++++ .../jdenticon/src/IdenticonStyle.php | 384 ++++++++++ .../src/Rendering/AbstractRenderer.php | 174 +++++ .../jdenticon/src/Rendering/ColorTheme.php | 83 ++ .../jdenticon/src/Rendering/IconGenerator.php | 257 +++++++ .../jdenticon/src/Rendering/Point.php | 51 ++ .../jdenticon/src/Rendering/Rectangle.php | 56 ++ .../src/Rendering/RendererInterface.php | 128 ++++ .../jdenticon/src/Rendering/SvgPath.php | 64 ++ .../jdenticon/src/Rendering/SvgRenderer.php | 114 +++ .../jdenticon/src/Rendering/Transform.php | 79 ++ .../src/Rendering/TriangleDirection.php | 35 + .../jdenticon/jdenticon/src/Shapes/Shape.php | 54 ++ .../jdenticon/src/Shapes/ShapeCategory.php | 64 ++ .../jdenticon/src/Shapes/ShapeDefinitions.php | 154 ++++ .../jdenticon/src/Shapes/ShapePosition.php | 42 + vendor-scoped/level-2/dice/Dice.php | 319 ++++++++ vendor-scoped/level-2/dice/README.md | 365 +++++++++ .../mistic100/randomcolor/src/RandomColor.php | 259 +++++++ .../check-wp-requirements/LICENSE | 339 +++++++++ .../check-wp-requirements/README.md | 59 ++ .../class-wp-requirements.php | 219 ++++++ .../partials/requirements-error-notice.php | 31 + .../mundschenk-at/wp-data-storage/LICENSE | 339 +++++++++ .../mundschenk-at/wp-data-storage/README.md | 22 + .../src/class-abstract-cache.php | 112 +++ .../wp-data-storage/src/class-cache.php | 105 +++ .../src/class-network-options.php | 97 +++ .../wp-data-storage/src/class-options.php | 108 +++ .../src/class-site-transients.php | 96 +++ .../wp-data-storage/src/class-transients.php | 183 +++++ .../mundschenk-at/wp-settings-ui/LICENSE | 339 +++++++++ .../mundschenk-at/wp-settings-ui/README.md | 17 + .../wp-settings-ui/partials/control.php | 65 ++ .../src/ui/class-abstract-control.php | 413 ++++++++++ .../src/ui/class-control-factory.php | 76 ++ .../wp-settings-ui/src/ui/class-control.php | 116 +++ .../src/ui/controls/class-checkbox-input.php | 75 ++ .../src/ui/controls/class-display-text.php | 121 +++ .../src/ui/controls/class-hidden-input.php | 63 ++ .../src/ui/controls/class-input.php | 121 +++ .../src/ui/controls/class-number-input.php | 78 ++ .../src/ui/controls/class-select.php | 152 ++++ .../src/ui/controls/class-submit-input.php | 100 +++ .../src/ui/controls/class-text-input.php | 63 ++ .../src/ui/controls/class-textarea.php | 104 +++ vendor-scoped/splitbrain/php-ringicon/LICENSE | 19 + .../splitbrain/php-ringicon/README.md | 24 + .../php-ringicon/src/AbstractRingIcon.php | 69 ++ .../php-ringicon/src/RingIconSVG.php | 145 ++++ 602 files changed, 33485 insertions(+) create mode 100644 admin/blocks/js/blocks.asset.php create mode 100644 admin/blocks/js/blocks.js create mode 100644 admin/blocks/src/avatar/block.json create mode 100644 admin/blocks/src/avatar/edit.js create mode 100644 admin/blocks/src/avatar/index.js create mode 100644 admin/blocks/src/blocks.js create mode 100644 admin/blocks/src/frontend-form/block.json create mode 100644 admin/blocks/src/frontend-form/edit.js create mode 100644 admin/blocks/src/frontend-form/index.js create mode 100644 admin/css/blocks.css create mode 100644 admin/css/blocks.min.css create mode 100644 admin/css/settings.css create mode 100644 admin/css/settings.min.css create mode 100644 admin/partials/network/section.php create mode 100644 admin/partials/network/settings-page.php create mode 100644 admin/partials/profile/allow-anonymous.php create mode 100644 admin/partials/profile/use-gravatar.php create mode 100644 admin/partials/profile/user-avatar-upload.php create mode 100644 admin/partials/sections/avatars-disabled-script.php create mode 100644 admin/partials/sections/avatars-disabled.php create mode 100644 admin/partials/sections/avatars-enabled.php create mode 100644 avatar-privacy.php create mode 100644 includes/avatar-privacy-functions.php create mode 100644 includes/avatar-privacy/avatar-handlers/class-avatar-handler.php create mode 100644 includes/avatar-privacy/avatar-handlers/class-default-icons-handler.php create mode 100644 includes/avatar-privacy/avatar-handlers/class-gravatar-cache-handler.php create mode 100644 includes/avatar-privacy/avatar-handlers/class-legacy-icon-handler.php create mode 100644 includes/avatar-privacy/avatar-handlers/class-user-avatar-handler.php create mode 100644 includes/avatar-privacy/avatar-handlers/default-icons/class-abstract-icon-provider.php create mode 100644 includes/avatar-privacy/avatar-handlers/default-icons/class-custom-icon-provider.php create mode 100644 includes/avatar-privacy/avatar-handlers/default-icons/class-generating-icon-provider.php create mode 100644 includes/avatar-privacy/avatar-handlers/default-icons/class-generator.php create mode 100644 includes/avatar-privacy/avatar-handlers/default-icons/class-icon-provider.php create mode 100644 includes/avatar-privacy/avatar-handlers/default-icons/class-static-icon-provider.php create mode 100644 includes/avatar-privacy/avatar-handlers/default-icons/class-svg-icon-provider.php create mode 100644 includes/avatar-privacy/avatar-handlers/default-icons/generated-icons/class-bird-avatar-icon-provider.php create mode 100644 includes/avatar-privacy/avatar-handlers/default-icons/generated-icons/class-cat-avatar-icon-provider.php create mode 100644 includes/avatar-privacy/avatar-handlers/default-icons/generated-icons/class-identicon-icon-provider.php create mode 100644 includes/avatar-privacy/avatar-handlers/default-icons/generated-icons/class-monster-id-icon-provider.php create mode 100644 includes/avatar-privacy/avatar-handlers/default-icons/generated-icons/class-retro-icon-provider.php create mode 100644 includes/avatar-privacy/avatar-handlers/default-icons/generated-icons/class-rings-icon-provider.php create mode 100644 includes/avatar-privacy/avatar-handlers/default-icons/generated-icons/class-robohash-icon-provider.php create mode 100644 includes/avatar-privacy/avatar-handlers/default-icons/generated-icons/class-wavatar-icon-provider.php create mode 100644 includes/avatar-privacy/avatar-handlers/default-icons/generators/class-bird-avatar.php create mode 100644 includes/avatar-privacy/avatar-handlers/default-icons/generators/class-cat-avatar.php create mode 100644 includes/avatar-privacy/avatar-handlers/default-icons/generators/class-jdenticon.php create mode 100644 includes/avatar-privacy/avatar-handlers/default-icons/generators/class-monster-id.php create mode 100644 includes/avatar-privacy/avatar-handlers/default-icons/generators/class-parts-generator.php create mode 100644 includes/avatar-privacy/avatar-handlers/default-icons/generators/class-png-parts-generator.php create mode 100644 includes/avatar-privacy/avatar-handlers/default-icons/generators/class-retro.php create mode 100644 includes/avatar-privacy/avatar-handlers/default-icons/generators/class-rings.php create mode 100644 includes/avatar-privacy/avatar-handlers/default-icons/generators/class-robohash.php create mode 100644 includes/avatar-privacy/avatar-handlers/default-icons/generators/class-wavatar.php create mode 100644 includes/avatar-privacy/avatar-handlers/default-icons/static-icons/class-bowling-pin-icon-provider.php create mode 100644 includes/avatar-privacy/avatar-handlers/default-icons/static-icons/class-mystery-icon-provider.php create mode 100644 includes/avatar-privacy/avatar-handlers/default-icons/static-icons/class-silhouette-icon-provider.php create mode 100644 includes/avatar-privacy/avatar-handlers/default-icons/static-icons/class-speech-bubble-icon-provider.php create mode 100644 includes/avatar-privacy/class-component.php create mode 100644 includes/avatar-privacy/class-controller.php create mode 100644 includes/avatar-privacy/class-core.php create mode 100644 includes/avatar-privacy/class-factory.php create mode 100644 includes/avatar-privacy/class-requirements.php create mode 100644 includes/avatar-privacy/cli/class-abstract-command.php create mode 100644 includes/avatar-privacy/cli/class-command.php create mode 100644 includes/avatar-privacy/cli/class-cron-command.php create mode 100644 includes/avatar-privacy/cli/class-database-command.php create mode 100644 includes/avatar-privacy/cli/class-default-command.php create mode 100644 includes/avatar-privacy/cli/class-uninstall-command.php create mode 100644 includes/avatar-privacy/cli/class-user-command.php create mode 100644 includes/avatar-privacy/components/class-avatar-handling.php create mode 100644 includes/avatar-privacy/components/class-block-editor.php create mode 100644 includes/avatar-privacy/components/class-command-line-interface.php create mode 100644 includes/avatar-privacy/components/class-comments.php create mode 100644 includes/avatar-privacy/components/class-image-proxy.php create mode 100644 includes/avatar-privacy/components/class-integrations.php create mode 100644 includes/avatar-privacy/components/class-network-settings-page.php create mode 100644 includes/avatar-privacy/components/class-privacy-tools.php create mode 100644 includes/avatar-privacy/components/class-settings-page.php create mode 100644 includes/avatar-privacy/components/class-setup.php create mode 100644 includes/avatar-privacy/components/class-shortcodes.php create mode 100644 includes/avatar-privacy/components/class-uninstallation.php create mode 100644 includes/avatar-privacy/components/class-user-profile.php create mode 100644 includes/avatar-privacy/core/class-api.php create mode 100644 includes/avatar-privacy/core/class-comment-author-fields.php create mode 100644 includes/avatar-privacy/core/class-default-avatars.php create mode 100644 includes/avatar-privacy/core/class-settings.php create mode 100644 includes/avatar-privacy/core/class-user-fields.php create mode 100644 includes/avatar-privacy/data-storage/class-cache.php create mode 100644 includes/avatar-privacy/data-storage/class-filesystem-cache.php create mode 100644 includes/avatar-privacy/data-storage/class-network-options.php create mode 100644 includes/avatar-privacy/data-storage/class-options.php create mode 100644 includes/avatar-privacy/data-storage/class-site-transients.php create mode 100644 includes/avatar-privacy/data-storage/class-transients.php create mode 100644 includes/avatar-privacy/data-storage/database/class-comment-author-table.php create mode 100644 includes/avatar-privacy/data-storage/database/class-hashes-table.php create mode 100644 includes/avatar-privacy/data-storage/database/class-table.php create mode 100644 includes/avatar-privacy/exceptions/class-avatar-comment-type-exception.php create mode 100644 includes/avatar-privacy/exceptions/class-database-exception.php create mode 100644 includes/avatar-privacy/exceptions/class-file-deletion-exception.php create mode 100644 includes/avatar-privacy/exceptions/class-filesystem-exception.php create mode 100644 includes/avatar-privacy/exceptions/class-form-field-not-found-exception.php create mode 100644 includes/avatar-privacy/exceptions/class-invalid-nonce-exception.php create mode 100644 includes/avatar-privacy/exceptions/class-object-factory-exception.php create mode 100644 includes/avatar-privacy/exceptions/class-part-files-not-found-exception.php create mode 100644 includes/avatar-privacy/exceptions/class-png-image-exception.php create mode 100644 includes/avatar-privacy/exceptions/class-upload-handling-exception.php create mode 100644 includes/avatar-privacy/functions.php create mode 100644 includes/avatar-privacy/integrations/class-bbpress-integration.php create mode 100644 includes/avatar-privacy/integrations/class-buddypress-integration.php create mode 100644 includes/avatar-privacy/integrations/class-plugin-integration.php create mode 100644 includes/avatar-privacy/integrations/class-simple-author-box-integration.php create mode 100644 includes/avatar-privacy/integrations/class-simple-local-avatars-integration.php create mode 100644 includes/avatar-privacy/integrations/class-simple-user-avatar-integration.php create mode 100644 includes/avatar-privacy/integrations/class-theme-my-login-profiles-integration.php create mode 100644 includes/avatar-privacy/integrations/class-ultimate-member-integration.php create mode 100644 includes/avatar-privacy/integrations/class-wp-user-manager-integration.php create mode 100644 includes/avatar-privacy/integrations/class-wpdiscuz-integration.php create mode 100644 includes/avatar-privacy/tools/class-hasher.php create mode 100644 includes/avatar-privacy/tools/class-multisite.php create mode 100644 includes/avatar-privacy/tools/class-number-generator.php create mode 100644 includes/avatar-privacy/tools/class-template.php create mode 100644 includes/avatar-privacy/tools/functions.php create mode 100644 includes/avatar-privacy/tools/html/class-dependencies.php create mode 100644 includes/avatar-privacy/tools/html/class-user-form.php create mode 100644 includes/avatar-privacy/tools/images/class-color.php create mode 100644 includes/avatar-privacy/tools/images/class-editor.php create mode 100644 includes/avatar-privacy/tools/images/class-image-file.php create mode 100644 includes/avatar-privacy/tools/images/class-image-stream.php create mode 100644 includes/avatar-privacy/tools/images/class-png.php create mode 100644 includes/avatar-privacy/tools/images/class-svg.php create mode 100644 includes/avatar-privacy/tools/images/class-type.php create mode 100644 includes/avatar-privacy/tools/network/class-gravatar-service.php create mode 100644 includes/avatar-privacy/tools/network/class-remote-image-service.php create mode 100644 includes/avatar-privacy/upload-handlers/class-custom-default-icon-upload-handler.php create mode 100644 includes/avatar-privacy/upload-handlers/class-upload-handler.php create mode 100644 includes/avatar-privacy/upload-handlers/class-user-avatar-upload-handler.php create mode 100644 includes/avatar-privacy/upload-handlers/ui/class-file-upload-input.php create mode 100644 public/images/LICENSE.md create mode 100644 public/images/birds/accessoire_1.png create mode 100644 public/images/birds/accessoire_10.png create mode 100644 public/images/birds/accessoire_11.png create mode 100644 public/images/birds/accessoire_12.png create mode 100644 public/images/birds/accessoire_13.png create mode 100644 public/images/birds/accessoire_14.png create mode 100644 public/images/birds/accessoire_15.png create mode 100644 public/images/birds/accessoire_16.png create mode 100644 public/images/birds/accessoire_17.png create mode 100644 public/images/birds/accessoire_18.png create mode 100644 public/images/birds/accessoire_19.png create mode 100644 public/images/birds/accessoire_2.png create mode 100644 public/images/birds/accessoire_20.png create mode 100644 public/images/birds/accessoire_3.png create mode 100644 public/images/birds/accessoire_4.png create mode 100644 public/images/birds/accessoire_5.png create mode 100644 public/images/birds/accessoire_6.png create mode 100644 public/images/birds/accessoire_7.png create mode 100644 public/images/birds/accessoire_8.png create mode 100644 public/images/birds/accessoire_9.png create mode 100644 public/images/birds/beak_1.png create mode 100644 public/images/birds/beak_2.png create mode 100644 public/images/birds/beak_3.png create mode 100644 public/images/birds/beak_4.png create mode 100644 public/images/birds/beak_5.png create mode 100644 public/images/birds/beak_6.png create mode 100644 public/images/birds/beak_7.png create mode 100644 public/images/birds/beak_8.png create mode 100644 public/images/birds/beak_9.png create mode 100644 public/images/birds/body_1.png create mode 100644 public/images/birds/body_2.png create mode 100644 public/images/birds/body_3.png create mode 100644 public/images/birds/body_4.png create mode 100644 public/images/birds/body_5.png create mode 100644 public/images/birds/body_6.png create mode 100644 public/images/birds/body_7.png create mode 100644 public/images/birds/body_8.png create mode 100644 public/images/birds/body_9.png create mode 100644 public/images/birds/eyes_1.png create mode 100644 public/images/birds/eyes_2.png create mode 100644 public/images/birds/eyes_3.png create mode 100644 public/images/birds/eyes_4.png create mode 100644 public/images/birds/eyes_5.png create mode 100644 public/images/birds/eyes_6.png create mode 100644 public/images/birds/eyes_7.png create mode 100644 public/images/birds/eyes_8.png create mode 100644 public/images/birds/eyes_9.png create mode 100644 public/images/birds/guide.png create mode 100644 public/images/birds/hoop_1.png create mode 100644 public/images/birds/hoop_10.png create mode 100644 public/images/birds/hoop_2.png create mode 100644 public/images/birds/hoop_3.png create mode 100644 public/images/birds/hoop_4.png create mode 100644 public/images/birds/hoop_5.png create mode 100644 public/images/birds/hoop_6.png create mode 100644 public/images/birds/hoop_7.png create mode 100644 public/images/birds/hoop_8.png create mode 100644 public/images/birds/hoop_9.png create mode 100644 public/images/birds/tail_1.png create mode 100644 public/images/birds/tail_2.png create mode 100644 public/images/birds/tail_3.png create mode 100644 public/images/birds/tail_4.png create mode 100644 public/images/birds/tail_5.png create mode 100644 public/images/birds/tail_6.png create mode 100644 public/images/birds/tail_7.png create mode 100644 public/images/birds/tail_8.png create mode 100644 public/images/birds/tail_9.png create mode 100644 public/images/birds/wing_1.png create mode 100644 public/images/birds/wing_2.png create mode 100644 public/images/birds/wing_3.png create mode 100644 public/images/birds/wing_4.png create mode 100644 public/images/birds/wing_5.png create mode 100644 public/images/birds/wing_6.png create mode 100644 public/images/birds/wing_7.png create mode 100644 public/images/birds/wing_8.png create mode 100644 public/images/birds/wing_9.png create mode 100644 public/images/cats/accessoire_1.png create mode 100644 public/images/cats/accessoire_10.png create mode 100644 public/images/cats/accessoire_11.png create mode 100644 public/images/cats/accessoire_12.png create mode 100644 public/images/cats/accessoire_13.png create mode 100644 public/images/cats/accessoire_14.png create mode 100644 public/images/cats/accessoire_15.png create mode 100644 public/images/cats/accessoire_16.png create mode 100644 public/images/cats/accessoire_17.png create mode 100644 public/images/cats/accessoire_18.png create mode 100644 public/images/cats/accessoire_19.png create mode 100644 public/images/cats/accessoire_2.png create mode 100644 public/images/cats/accessoire_20.png create mode 100644 public/images/cats/accessoire_3.png create mode 100644 public/images/cats/accessoire_4.png create mode 100644 public/images/cats/accessoire_5.png create mode 100644 public/images/cats/accessoire_6.png create mode 100644 public/images/cats/accessoire_7.png create mode 100644 public/images/cats/accessoire_8.png create mode 100644 public/images/cats/accessoire_9.png create mode 100644 public/images/cats/body_1.png create mode 100644 public/images/cats/body_10.png create mode 100644 public/images/cats/body_11.png create mode 100644 public/images/cats/body_12.png create mode 100644 public/images/cats/body_13.png create mode 100644 public/images/cats/body_14.png create mode 100644 public/images/cats/body_15.png create mode 100644 public/images/cats/body_2.png create mode 100644 public/images/cats/body_3.png create mode 100644 public/images/cats/body_4.png create mode 100644 public/images/cats/body_5.png create mode 100644 public/images/cats/body_6.png create mode 100644 public/images/cats/body_7.png create mode 100644 public/images/cats/body_8.png create mode 100644 public/images/cats/body_9.png create mode 100644 public/images/cats/eyes_1.png create mode 100644 public/images/cats/eyes_10.png create mode 100644 public/images/cats/eyes_11.png create mode 100644 public/images/cats/eyes_12.png create mode 100644 public/images/cats/eyes_13.png create mode 100644 public/images/cats/eyes_14.png create mode 100644 public/images/cats/eyes_15.png create mode 100644 public/images/cats/eyes_2.png create mode 100644 public/images/cats/eyes_3.png create mode 100644 public/images/cats/eyes_4.png create mode 100644 public/images/cats/eyes_5.png create mode 100644 public/images/cats/eyes_6.png create mode 100644 public/images/cats/eyes_7.png create mode 100644 public/images/cats/eyes_8.png create mode 100644 public/images/cats/eyes_9.png create mode 100644 public/images/cats/fur_1.png create mode 100644 public/images/cats/fur_10.png create mode 100644 public/images/cats/fur_2.png create mode 100644 public/images/cats/fur_3.png create mode 100644 public/images/cats/fur_4.png create mode 100644 public/images/cats/fur_5.png create mode 100644 public/images/cats/fur_6.png create mode 100644 public/images/cats/fur_7.png create mode 100644 public/images/cats/fur_8.png create mode 100644 public/images/cats/fur_9.png create mode 100644 public/images/cats/mouth_1.png create mode 100644 public/images/cats/mouth_10.png create mode 100644 public/images/cats/mouth_2.png create mode 100644 public/images/cats/mouth_3.png create mode 100644 public/images/cats/mouth_4.png create mode 100644 public/images/cats/mouth_5.png create mode 100644 public/images/cats/mouth_6.png create mode 100644 public/images/cats/mouth_7.png create mode 100644 public/images/cats/mouth_8.png create mode 100644 public/images/cats/mouth_9.png create mode 100644 public/images/cats/zz_1.png create mode 100644 public/images/cats/zz_2.png create mode 100644 public/images/comment-bubble.svg create mode 100644 public/images/monster-id/arms_1.png create mode 100644 public/images/monster-id/arms_2.png create mode 100644 public/images/monster-id/arms_3.png create mode 100644 public/images/monster-id/arms_4.png create mode 100644 public/images/monster-id/arms_5.png create mode 100644 public/images/monster-id/arms_S1.png create mode 100644 public/images/monster-id/arms_S2.png create mode 100644 public/images/monster-id/arms_S3.png create mode 100644 public/images/monster-id/arms_S4.png create mode 100644 public/images/monster-id/arms_S5.png create mode 100644 public/images/monster-id/arms_S6.png create mode 100644 public/images/monster-id/arms_S7.png create mode 100644 public/images/monster-id/arms_S8.png create mode 100644 public/images/monster-id/arms_S9.png create mode 100644 public/images/monster-id/back.png create mode 100644 public/images/monster-id/body_1.png create mode 100644 public/images/monster-id/body_10.png create mode 100644 public/images/monster-id/body_11.png create mode 100644 public/images/monster-id/body_12.png create mode 100644 public/images/monster-id/body_13.png create mode 100644 public/images/monster-id/body_14.png create mode 100644 public/images/monster-id/body_15.png create mode 100644 public/images/monster-id/body_2.png create mode 100644 public/images/monster-id/body_3.png create mode 100644 public/images/monster-id/body_4.png create mode 100644 public/images/monster-id/body_5.png create mode 100644 public/images/monster-id/body_6.png create mode 100644 public/images/monster-id/body_7.png create mode 100644 public/images/monster-id/body_8.png create mode 100644 public/images/monster-id/body_9.png create mode 100644 public/images/monster-id/body_S1.png create mode 100644 public/images/monster-id/body_S2.png create mode 100644 public/images/monster-id/body_S3.png create mode 100644 public/images/monster-id/body_S4.png create mode 100644 public/images/monster-id/body_S5.png create mode 100644 public/images/monster-id/eyes_1.png create mode 100644 public/images/monster-id/eyes_10.png create mode 100644 public/images/monster-id/eyes_11.png create mode 100644 public/images/monster-id/eyes_12.png create mode 100644 public/images/monster-id/eyes_13.png create mode 100644 public/images/monster-id/eyes_14.png create mode 100644 public/images/monster-id/eyes_15.png create mode 100644 public/images/monster-id/eyes_2.png create mode 100644 public/images/monster-id/eyes_3.png create mode 100644 public/images/monster-id/eyes_4.png create mode 100644 public/images/monster-id/eyes_5.png create mode 100644 public/images/monster-id/eyes_6.png create mode 100644 public/images/monster-id/eyes_7.png create mode 100644 public/images/monster-id/eyes_8.png create mode 100644 public/images/monster-id/eyes_9.png create mode 100644 public/images/monster-id/eyes_S1.png create mode 100644 public/images/monster-id/eyes_S2.png create mode 100644 public/images/monster-id/eyes_S3.png create mode 100644 public/images/monster-id/eyes_S4.png create mode 100644 public/images/monster-id/eyes_S5.png create mode 100644 public/images/monster-id/hair_1.png create mode 100644 public/images/monster-id/hair_2.png create mode 100644 public/images/monster-id/hair_3.png create mode 100644 public/images/monster-id/hair_4.png create mode 100644 public/images/monster-id/hair_5.png create mode 100644 public/images/monster-id/hair_S1.png create mode 100644 public/images/monster-id/hair_S2.png create mode 100644 public/images/monster-id/hair_S3.png create mode 100644 public/images/monster-id/hair_S4.png create mode 100644 public/images/monster-id/hair_S5.png create mode 100644 public/images/monster-id/hair_S6.png create mode 100644 public/images/monster-id/hair_S7.png create mode 100644 public/images/monster-id/legs_1.png create mode 100644 public/images/monster-id/legs_2.png create mode 100644 public/images/monster-id/legs_3.png create mode 100644 public/images/monster-id/legs_4.png create mode 100644 public/images/monster-id/legs_5.png create mode 100644 public/images/monster-id/legs_S1.png create mode 100644 public/images/monster-id/legs_S10.png create mode 100644 public/images/monster-id/legs_S11.png create mode 100644 public/images/monster-id/legs_S12.png create mode 100644 public/images/monster-id/legs_S13.png create mode 100644 public/images/monster-id/legs_S2.png create mode 100644 public/images/monster-id/legs_S3.png create mode 100644 public/images/monster-id/legs_S4.png create mode 100644 public/images/monster-id/legs_S5.png create mode 100644 public/images/monster-id/legs_S6.png create mode 100644 public/images/monster-id/legs_S7.png create mode 100644 public/images/monster-id/legs_S8.png create mode 100644 public/images/monster-id/legs_S9.png create mode 100644 public/images/monster-id/mouth_1.png create mode 100644 public/images/monster-id/mouth_10.png create mode 100644 public/images/monster-id/mouth_2.png create mode 100644 public/images/monster-id/mouth_3.png create mode 100644 public/images/monster-id/mouth_4.png create mode 100644 public/images/monster-id/mouth_5.png create mode 100644 public/images/monster-id/mouth_6.png create mode 100644 public/images/monster-id/mouth_7.png create mode 100644 public/images/monster-id/mouth_8.png create mode 100644 public/images/monster-id/mouth_9.png create mode 100644 public/images/monster-id/mouth_S1.png create mode 100644 public/images/monster-id/mouth_S2.png create mode 100644 public/images/monster-id/mouth_S3.png create mode 100644 public/images/monster-id/mouth_S4.png create mode 100644 public/images/monster-id/mouth_S5.png create mode 100644 public/images/monster-id/mouth_S6.png create mode 100644 public/images/monster-id/mouth_S7.png create mode 100644 public/images/mystery.svg create mode 100644 public/images/robohash/accessory/accessory-01.svg create mode 100644 public/images/robohash/accessory/accessory-02.svg create mode 100644 public/images/robohash/accessory/accessory-03.svg create mode 100644 public/images/robohash/accessory/accessory-04.svg create mode 100644 public/images/robohash/accessory/accessory-05.svg create mode 100644 public/images/robohash/accessory/accessory-06.svg create mode 100644 public/images/robohash/accessory/accessory-07.svg create mode 100644 public/images/robohash/accessory/accessory-08.svg create mode 100644 public/images/robohash/accessory/accessory-09.svg create mode 100644 public/images/robohash/accessory/accessory-10.svg create mode 100644 public/images/robohash/body/body-01.svg create mode 100644 public/images/robohash/body/body-02.svg create mode 100644 public/images/robohash/body/body-03.svg create mode 100644 public/images/robohash/body/body-04.svg create mode 100644 public/images/robohash/body/body-05.svg create mode 100644 public/images/robohash/body/body-06.svg create mode 100644 public/images/robohash/body/body-07.svg create mode 100644 public/images/robohash/body/body-08.svg create mode 100644 public/images/robohash/body/body-09.svg create mode 100644 public/images/robohash/body/body-10.svg create mode 100644 public/images/robohash/eyes/eyes-01.svg create mode 100644 public/images/robohash/eyes/eyes-02.svg create mode 100644 public/images/robohash/eyes/eyes-03.svg create mode 100644 public/images/robohash/eyes/eyes-04.svg create mode 100644 public/images/robohash/eyes/eyes-05.svg create mode 100644 public/images/robohash/eyes/eyes-06.svg create mode 100644 public/images/robohash/eyes/eyes-07.svg create mode 100644 public/images/robohash/eyes/eyes-08.svg create mode 100644 public/images/robohash/eyes/eyes-09.svg create mode 100644 public/images/robohash/eyes/eyes-10.svg create mode 100644 public/images/robohash/face/face-01.svg create mode 100644 public/images/robohash/face/face-02.svg create mode 100644 public/images/robohash/face/face-03.svg create mode 100644 public/images/robohash/face/face-04.svg create mode 100644 public/images/robohash/face/face-05.svg create mode 100644 public/images/robohash/face/face-06.svg create mode 100644 public/images/robohash/face/face-07.svg create mode 100644 public/images/robohash/face/face-08.svg create mode 100644 public/images/robohash/face/face-09.svg create mode 100644 public/images/robohash/face/face-10.svg create mode 100644 public/images/robohash/mouth/mouth-01.svg create mode 100644 public/images/robohash/mouth/mouth-02.svg create mode 100644 public/images/robohash/mouth/mouth-03.svg create mode 100644 public/images/robohash/mouth/mouth-04.svg create mode 100644 public/images/robohash/mouth/mouth-05.svg create mode 100644 public/images/robohash/mouth/mouth-06.svg create mode 100644 public/images/robohash/mouth/mouth-07.svg create mode 100644 public/images/robohash/mouth/mouth-08.svg create mode 100644 public/images/robohash/mouth/mouth-09.svg create mode 100644 public/images/robohash/mouth/mouth-10.svg create mode 100644 public/images/shaded-cone.svg create mode 100644 public/images/silhouette.svg create mode 100644 public/images/wavatars/brow_1.png create mode 100644 public/images/wavatars/brow_2.png create mode 100644 public/images/wavatars/brow_3.png create mode 100644 public/images/wavatars/brow_4.png create mode 100644 public/images/wavatars/brow_5.png create mode 100644 public/images/wavatars/brow_6.png create mode 100644 public/images/wavatars/brow_7.png create mode 100644 public/images/wavatars/brow_8.png create mode 100644 public/images/wavatars/eyes_1.png create mode 100644 public/images/wavatars/eyes_10.png create mode 100644 public/images/wavatars/eyes_11.png create mode 100644 public/images/wavatars/eyes_12.png create mode 100644 public/images/wavatars/eyes_13.png create mode 100644 public/images/wavatars/eyes_2.png create mode 100644 public/images/wavatars/eyes_3.png create mode 100644 public/images/wavatars/eyes_4.png create mode 100644 public/images/wavatars/eyes_5.png create mode 100644 public/images/wavatars/eyes_6.png create mode 100644 public/images/wavatars/eyes_7.png create mode 100644 public/images/wavatars/eyes_8.png create mode 100644 public/images/wavatars/eyes_9.png create mode 100644 public/images/wavatars/fade_1.png create mode 100644 public/images/wavatars/fade_2.png create mode 100644 public/images/wavatars/fade_3.png create mode 100644 public/images/wavatars/fade_4.png create mode 100644 public/images/wavatars/mask_1.png create mode 100644 public/images/wavatars/mask_10.png create mode 100644 public/images/wavatars/mask_11.png create mode 100644 public/images/wavatars/mask_2.png create mode 100644 public/images/wavatars/mask_3.png create mode 100644 public/images/wavatars/mask_4.png create mode 100644 public/images/wavatars/mask_5.png create mode 100644 public/images/wavatars/mask_6.png create mode 100644 public/images/wavatars/mask_7.png create mode 100644 public/images/wavatars/mask_8.png create mode 100644 public/images/wavatars/mask_9.png create mode 100644 public/images/wavatars/mouth_1.png create mode 100644 public/images/wavatars/mouth_10.png create mode 100644 public/images/wavatars/mouth_11.png create mode 100644 public/images/wavatars/mouth_12.png create mode 100644 public/images/wavatars/mouth_13.png create mode 100644 public/images/wavatars/mouth_14.png create mode 100644 public/images/wavatars/mouth_15.png create mode 100644 public/images/wavatars/mouth_16.png create mode 100644 public/images/wavatars/mouth_17.png create mode 100644 public/images/wavatars/mouth_18.png create mode 100644 public/images/wavatars/mouth_19.png create mode 100644 public/images/wavatars/mouth_2.png create mode 100644 public/images/wavatars/mouth_3.png create mode 100644 public/images/wavatars/mouth_4.png create mode 100644 public/images/wavatars/mouth_5.png create mode 100644 public/images/wavatars/mouth_6.png create mode 100644 public/images/wavatars/mouth_7.png create mode 100644 public/images/wavatars/mouth_8.png create mode 100644 public/images/wavatars/mouth_9.png create mode 100644 public/images/wavatars/pupils_1.png create mode 100644 public/images/wavatars/pupils_10.png create mode 100644 public/images/wavatars/pupils_11.png create mode 100644 public/images/wavatars/pupils_2.png create mode 100644 public/images/wavatars/pupils_3.png create mode 100644 public/images/wavatars/pupils_4.png create mode 100644 public/images/wavatars/pupils_5.png create mode 100644 public/images/wavatars/pupils_6.png create mode 100644 public/images/wavatars/pupils_7.png create mode 100644 public/images/wavatars/pupils_8.png create mode 100644 public/images/wavatars/pupils_9.png create mode 100644 public/images/wavatars/shine_1.png create mode 100644 public/images/wavatars/shine_10.png create mode 100644 public/images/wavatars/shine_11.png create mode 100644 public/images/wavatars/shine_2.png create mode 100644 public/images/wavatars/shine_3.png create mode 100644 public/images/wavatars/shine_4.png create mode 100644 public/images/wavatars/shine_5.png create mode 100644 public/images/wavatars/shine_6.png create mode 100644 public/images/wavatars/shine_7.png create mode 100644 public/images/wavatars/shine_8.png create mode 100644 public/images/wavatars/shine_9.png create mode 100644 public/js/wpdiscuz/src/use-gravatar.js create mode 100644 public/js/wpdiscuz/use-gravatar.js create mode 100644 public/js/wpdiscuz/use-gravatar.min.js create mode 100644 public/partials/bbpress/profile/allow-anonymous.php create mode 100644 public/partials/bbpress/profile/use-gravatar.php create mode 100644 public/partials/bbpress/profile/user-avatar-upload.php create mode 100644 public/partials/bbpress/user-profile-picture.php create mode 100644 public/partials/block/avatar.php create mode 100644 public/partials/block/frontend-form.php create mode 100644 public/partials/comments/use-gravatar.php create mode 100644 public/partials/profile/allow-anonymous.php create mode 100644 public/partials/profile/use-gravatar.php create mode 100644 public/partials/profile/user-avatar-upload.php create mode 100644 public/partials/retro/svg.php create mode 100644 public/partials/robohash/svg.php create mode 100644 public/partials/shortcode/avatar-upload.php create mode 100644 public/partials/tml-profiles/allow-anonymous.php create mode 100644 public/partials/tml-profiles/use-gravatar.php create mode 100644 public/partials/tml-profiles/user-avatar-upload.php create mode 100644 public/partials/wpdiscuz/use-gravatar.php create mode 100644 readme.txt create mode 100644 uninstall.php create mode 100644 vendor-scoped/autoload.php create mode 100644 vendor-scoped/composer/ClassLoader.php create mode 100644 vendor-scoped/composer/LICENSE create mode 100644 vendor-scoped/composer/autoload_classmap.php create mode 100644 vendor-scoped/composer/autoload_files.php create mode 100644 vendor-scoped/composer/autoload_namespaces.php create mode 100644 vendor-scoped/composer/autoload_real.php create mode 100644 vendor-scoped/composer/autoload_static.php create mode 100644 vendor-scoped/jdenticon/jdenticon/LICENSE create mode 100644 vendor-scoped/jdenticon/jdenticon/README.md create mode 100644 vendor-scoped/jdenticon/jdenticon/src/Color.php create mode 100644 vendor-scoped/jdenticon/jdenticon/src/Identicon.php create mode 100644 vendor-scoped/jdenticon/jdenticon/src/IdenticonStyle.php create mode 100644 vendor-scoped/jdenticon/jdenticon/src/Rendering/AbstractRenderer.php create mode 100644 vendor-scoped/jdenticon/jdenticon/src/Rendering/ColorTheme.php create mode 100644 vendor-scoped/jdenticon/jdenticon/src/Rendering/IconGenerator.php create mode 100644 vendor-scoped/jdenticon/jdenticon/src/Rendering/Point.php create mode 100644 vendor-scoped/jdenticon/jdenticon/src/Rendering/Rectangle.php create mode 100644 vendor-scoped/jdenticon/jdenticon/src/Rendering/RendererInterface.php create mode 100644 vendor-scoped/jdenticon/jdenticon/src/Rendering/SvgPath.php create mode 100644 vendor-scoped/jdenticon/jdenticon/src/Rendering/SvgRenderer.php create mode 100644 vendor-scoped/jdenticon/jdenticon/src/Rendering/Transform.php create mode 100644 vendor-scoped/jdenticon/jdenticon/src/Rendering/TriangleDirection.php create mode 100644 vendor-scoped/jdenticon/jdenticon/src/Shapes/Shape.php create mode 100644 vendor-scoped/jdenticon/jdenticon/src/Shapes/ShapeCategory.php create mode 100644 vendor-scoped/jdenticon/jdenticon/src/Shapes/ShapeDefinitions.php create mode 100644 vendor-scoped/jdenticon/jdenticon/src/Shapes/ShapePosition.php create mode 100644 vendor-scoped/level-2/dice/Dice.php create mode 100644 vendor-scoped/level-2/dice/README.md create mode 100644 vendor-scoped/mistic100/randomcolor/src/RandomColor.php create mode 100644 vendor-scoped/mundschenk-at/check-wp-requirements/LICENSE create mode 100644 vendor-scoped/mundschenk-at/check-wp-requirements/README.md create mode 100644 vendor-scoped/mundschenk-at/check-wp-requirements/class-wp-requirements.php create mode 100644 vendor-scoped/mundschenk-at/check-wp-requirements/partials/requirements-error-notice.php create mode 100644 vendor-scoped/mundschenk-at/wp-data-storage/LICENSE create mode 100644 vendor-scoped/mundschenk-at/wp-data-storage/README.md create mode 100644 vendor-scoped/mundschenk-at/wp-data-storage/src/class-abstract-cache.php create mode 100644 vendor-scoped/mundschenk-at/wp-data-storage/src/class-cache.php create mode 100644 vendor-scoped/mundschenk-at/wp-data-storage/src/class-network-options.php create mode 100644 vendor-scoped/mundschenk-at/wp-data-storage/src/class-options.php create mode 100644 vendor-scoped/mundschenk-at/wp-data-storage/src/class-site-transients.php create mode 100644 vendor-scoped/mundschenk-at/wp-data-storage/src/class-transients.php create mode 100644 vendor-scoped/mundschenk-at/wp-settings-ui/LICENSE create mode 100644 vendor-scoped/mundschenk-at/wp-settings-ui/README.md create mode 100644 vendor-scoped/mundschenk-at/wp-settings-ui/partials/control.php create mode 100644 vendor-scoped/mundschenk-at/wp-settings-ui/src/ui/class-abstract-control.php create mode 100644 vendor-scoped/mundschenk-at/wp-settings-ui/src/ui/class-control-factory.php create mode 100644 vendor-scoped/mundschenk-at/wp-settings-ui/src/ui/class-control.php create mode 100644 vendor-scoped/mundschenk-at/wp-settings-ui/src/ui/controls/class-checkbox-input.php create mode 100644 vendor-scoped/mundschenk-at/wp-settings-ui/src/ui/controls/class-display-text.php create mode 100644 vendor-scoped/mundschenk-at/wp-settings-ui/src/ui/controls/class-hidden-input.php create mode 100644 vendor-scoped/mundschenk-at/wp-settings-ui/src/ui/controls/class-input.php create mode 100644 vendor-scoped/mundschenk-at/wp-settings-ui/src/ui/controls/class-number-input.php create mode 100644 vendor-scoped/mundschenk-at/wp-settings-ui/src/ui/controls/class-select.php create mode 100644 vendor-scoped/mundschenk-at/wp-settings-ui/src/ui/controls/class-submit-input.php create mode 100644 vendor-scoped/mundschenk-at/wp-settings-ui/src/ui/controls/class-text-input.php create mode 100644 vendor-scoped/mundschenk-at/wp-settings-ui/src/ui/controls/class-textarea.php create mode 100644 vendor-scoped/splitbrain/php-ringicon/LICENSE create mode 100644 vendor-scoped/splitbrain/php-ringicon/README.md create mode 100644 vendor-scoped/splitbrain/php-ringicon/src/AbstractRingIcon.php create mode 100644 vendor-scoped/splitbrain/php-ringicon/src/RingIconSVG.php diff --git a/admin/blocks/js/blocks.asset.php b/admin/blocks/js/blocks.asset.php new file mode 100644 index 0000000..3fb3332 --- /dev/null +++ b/admin/blocks/js/blocks.asset.php @@ -0,0 +1 @@ + array('wp-blocks', 'wp-components', 'wp-data', 'wp-editor', 'wp-element', 'wp-i18n', 'wp-server-side-render'), 'version' => '2226b124181394cb78e7'); diff --git a/admin/blocks/js/blocks.js b/admin/blocks/js/blocks.js new file mode 100644 index 0000000..74b8b16 --- /dev/null +++ b/admin/blocks/js/blocks.js @@ -0,0 +1,2 @@ +!function(){"use strict";var e={n:function(t){var r=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(r,{a:r}),r},d:function(t,r){for(var a in r)e.o(r,a)&&!e.o(t,a)&&Object.defineProperty(t,a,{enumerable:!0,get:r[a]})},o:function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r:function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}},t={};e.r(t),e.d(t,{metadata:function(){return v},name:function(){return f},settings:function(){return m}});var r={};function a(e){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},a(e)}function n(e,t,r){return(t=function(e){var t=function(e,t){if("object"!==a(e)||null===e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,"string");if("object"!==a(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"===a(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}e.r(r),e.d(r,{metadata:function(){return y},name:function(){return b},settings:function(){return _}});var i=window.wp.blocks,o=window.wp.i18n,u=window.wp.element,l=window.wp.components,c=window.wp.serverSideRender,s=e.n(c),p=window.wp.editor,v=JSON.parse('{"name":"avatar-privacy/form","title":"Avatar Privacy Form","category":"common","icon":"id-alt","description":"Inserts a form to upload a local avatar and manage related settings.","keywords":["avatar","upload","frontend"],"textdomain":"avatar-privacy","attributes":{"avatar_size":{"type":"integer","default":96},"show_descriptions":{"type":"boolean","default":true}}}'),f=v.name,m={title:(0,o.__)("Avatar Privacy Form","avatar-privacy"),supports:{html:!1,multiple:!1,reusable:!1},edit:function(e){var t=e.attributes,r=e.className,a=e.setAttributes;return(0,u.createElement)(u.Fragment,null,(0,u.createElement)(p.InspectorControls,null,(0,u.createElement)(l.PanelBody,{title:(0,o.__)("Form","avatar-privacy")},(0,u.createElement)(l.PanelRow,null,(0,u.createElement)(l.RangeControl,{label:(0,o.__)("Avatar Size","avatar-privacy"),value:t.avatar_size,initialPosition:t.avatar_size,onChange:function(e){return a({avatar_size:e})},min:48,max:240})),(0,u.createElement)(l.PanelRow,null,(0,u.createElement)(l.ToggleControl,{label:(0,o.__)("Show Descriptions","avatar-privacy"),checked:!!t.show_descriptions,onChange:function(){return a({show_descriptions:!t.show_descriptions})}})))),(0,u.createElement)(s(),{block:"avatar-privacy/form",attributes:{avatar_size:t.avatar_size,show_descriptions:t.show_descriptions,className:r,preview:!0}}))},save:function(){}},d=(0,window.wp.data.withSelect)((function(e){return{users:e("core").getAuthors()}}))((function(e){var t=e.attributes,r=e.setAttributes,a=e.users;if(!a||a.length<1)return(0,o.__)("Loading…","avatar-privacy");t.user_id=t.user_id||a[0].id;var n=function(e){return a.find((function(t){return parseInt(e)===t.id}))},i=n(t.user_id);return t.user=t.user||i,(0,u.createElement)(u.Fragment,null,(0,u.createElement)(p.InspectorControls,null,(0,u.createElement)(l.PanelBody,{title:(0,o.__)("Avatar","avatar-privacy")},(0,u.createElement)(l.PanelRow,null,(0,u.createElement)(l.SelectControl,{label:(0,o.__)("User","avatar-privacy"),value:t.user_id,options:a.map((function(e){return{label:e.name,value:e.id}})),onChange:function(e){return r({user_id:parseInt(e),user:n(e)})}})),(0,u.createElement)(l.PanelRow,null,(0,u.createElement)(l.RangeControl,{label:(0,o.__)("Avatar Size","avatar-privacy"),value:t.avatar_size,initialPosition:t.avatar_size,onChange:function(e){return r({avatar_size:e})},min:48,max:240})))),(0,u.createElement)("img",{width:t.avatar_size,src:t.user.avatar_urls[96],alt:(0,o.sprintf)(/* translators: user display name */ +(0,o.__)("Avatar of %s","avatar-privacy"),t.user.name)}))})),y=JSON.parse('{"name":"avatar-privacy/avatar","title":"Avatar","category":"common","icon":"admin-users","description":"Displays a user\'s avatar.","keywords":["avatar","user","icon"],"textdomain":"avatar-privacy","attributes":{"avatar_size":{"type":"integer","default":96},"user_id":{"type":"integer","default":0},"align":{"type":"string","default":""},"user":{"type":"object","source":"attribute","selector":"*","default":null}}}'),b=y.name,_={title:(0,o.__)("Avatar","avatar-privacy"),supports:{align:["left","center","right"],html:!1},edit:d,save:function(){}};function w(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function g(e){for(var t=1;t + * @license GPL-2.0-or-later + * @since 2.3.0 + */ + +'use strict'; + +/** + * WordPress dependencies + */ +import { + PanelBody, + PanelRow, + RangeControl, + SelectControl, +} from '@wordpress/components'; +import { withSelect } from '@wordpress/data'; +import { InspectorControls } from '@wordpress/editor'; +import { Fragment } from '@wordpress/element'; +import { __, sprintf } from '@wordpress/i18n'; + +/** + * Renders the markup for editing the block attributes of the Avatar block. + * + * @param {Object} props The block properties. + * @param {Object} props.attributes The block attributes. + * @param {Object} props.setAttributes The attribute setter function. + * @return {Object} ECMAScript JSX Markup for the editor + */ +export default withSelect( + // Retrieve WordPress authors. + ( select ) => ( { users: select( 'core' ).getAuthors() } ) +)( ( { attributes, setAttributes, users } ) => { + // The authors list has not finished loading yet. + if ( ! users || users.length < 1 ) { + return __( 'Loading…', 'avatar-privacy' ); + } + + // Set default for user_id. + attributes.user_id = attributes.user_id || users[ 0 ].id; + + // Find the current user object. + const findUser = ( userID ) => + users.find( ( user ) => parseInt( userID ) === user.id ); + const currentUser = findUser( attributes.user_id ); + + // Set the user attribute if missing. + attributes.user = attributes.user || currentUser; + + return ( + + + + + ( { + label: user.name, + value: user.id, + } ) ) } + onChange={ ( newUser ) => + setAttributes( { + user_id: parseInt( newUser ), + user: findUser( newUser ), + } ) + } + /> + + + + setAttributes( { avatar_size: newSize } ) + } + min={ 48 } + max={ 240 } + /> + + + + { + + ); +} ); diff --git a/admin/blocks/src/avatar/index.js b/admin/blocks/src/avatar/index.js new file mode 100644 index 0000000..df504ee --- /dev/null +++ b/admin/blocks/src/avatar/index.js @@ -0,0 +1,46 @@ +/** + * Avatar block for the WordPress block editor. + * + * This file is part of Avatar Privacy. + * + * @file This file provides the Avatar block. + * @author Peter Putzer + * @license GPL-2.0-or-later + * @since 2.3.0 + */ + +'use strict'; + +/** + * WordPress dependencies + */ +import { __ } from '@wordpress/i18n'; + +/** + * Internal dependencies + */ +import edit from './edit'; +import metadata from './block.json'; + +const { name } = metadata; + +export { metadata, name }; + +/** + * The Avatar block. + * + * The block is rendered server-side to be current (avatars can change frequently). + */ +export const settings = { + title: __( 'Avatar', 'avatar-privacy' ), + + supports: { + align: [ 'left', 'center', 'right' ], + html: false, + }, + + edit, + save: () => { + // Intentionally empty because this is a dynamic block + }, +}; diff --git a/admin/blocks/src/blocks.js b/admin/blocks/src/blocks.js new file mode 100644 index 0000000..36cdc37 --- /dev/null +++ b/admin/blocks/src/blocks.js @@ -0,0 +1,38 @@ +/** + * Blocks for the WordPress block editor. + * + * This file is part of Avatar Privacy. + * + * @file This file registers the blocks included with the Avatar Privacy plugin. + * @author Peter Putzer + * @license GPL-2.0-or-later + * @since 2.3.0 + * @requires Gutenberg 4.3 + */ + +'use strict'; + +/** + * WordPress dependencies + */ +import { registerBlockType } from '@wordpress/blocks'; + +/** + * Internal dependencies + */ +import * as frontendForm from './frontend-form'; +import * as avatar from './avatar'; + +/** + * Registers all our blocks. + */ +[ frontendForm, avatar ].forEach( ( block ) => { + if ( ! block ) { + return; + } + const { metadata, settings, name } = block; + registerBlockType( name, { + ...metadata, + ...settings, + } ); +} ); diff --git a/admin/blocks/src/frontend-form/block.json b/admin/blocks/src/frontend-form/block.json new file mode 100644 index 0000000..7d3f8a6 --- /dev/null +++ b/admin/blocks/src/frontend-form/block.json @@ -0,0 +1,19 @@ +{ + "name": "avatar-privacy/form", + "title": "Avatar Privacy Form", + "category": "common", + "icon": "id-alt", + "description": "Inserts a form to upload a local avatar and manage related settings.", + "keywords": [ "avatar", "upload", "frontend" ], + "textdomain": "avatar-privacy", + "attributes": { + "avatar_size": { + "type": "integer", + "default": 96 + }, + "show_descriptions": { + "type": "boolean", + "default": true + } + } +} diff --git a/admin/blocks/src/frontend-form/edit.js b/admin/blocks/src/frontend-form/edit.js new file mode 100644 index 0000000..10a69e9 --- /dev/null +++ b/admin/blocks/src/frontend-form/edit.js @@ -0,0 +1,82 @@ +/** + * Frontend Form block for the WordPress block editor. + * + * This file is part of Avatar Privacy. + * + * @file This file provides the edit method for the Avatar block. + * @author Peter Putzer + * @license GPL-2.0-or-later + * @since 2.3.0 + */ + +'use strict'; + +/** + * WordPress dependencies + */ +import { + PanelBody, + PanelRow, + RangeControl, + ToggleControl, +} from '@wordpress/components'; +import ServerSideRender from '@wordpress/server-side-render'; +import { InspectorControls } from '@wordpress/editor'; +import { Fragment } from '@wordpress/element'; +import { __ } from '@wordpress/i18n'; + +/** + * Renders the markup for editing the block attributes of the Avatar block. + * + * @param {Object} props The block properties. + * @param {Object} props.attributes The block attributes. + * @param {string} props.className The CSS class to use. + * @param {Object} props.setAttributes The attribute setter function. + * @return {Object} ECMAScript JSX Markup for the editor + */ +export default ( { attributes, className, setAttributes } ) => { + return ( + + + + + + setAttributes( { avatar_size: newSize } ) + } + min={ 48 } + max={ 240 } + /> + + + + setAttributes( { + show_descriptions: + ! attributes.show_descriptions, + } ) + } + /> + + + + + + ); +}; diff --git a/admin/blocks/src/frontend-form/index.js b/admin/blocks/src/frontend-form/index.js new file mode 100644 index 0000000..9e21951 --- /dev/null +++ b/admin/blocks/src/frontend-form/index.js @@ -0,0 +1,47 @@ +/** + * Frontend Form block for the WordPress block editor. + * + * This file is part of Avatar Privacy. + * + * @file This file provides the Frontend Form block. + * @author Peter Putzer + * @license GPL-2.0-or-later + * @since 2.3.0 + */ + +'use strict'; + +/** + * WordPress dependencies + */ +import { __ } from '@wordpress/i18n'; + +/** + * Internal dependencies + */ +import edit from './edit'; +import metadata from './block.json'; + +const { name } = metadata; + +export { metadata, name }; + +/** + * The Frontend Form block. + * + * The block is rendered server-side to be current (avatars can change frequently). + */ +export const settings = { + title: __( 'Avatar Privacy Form', 'avatar-privacy' ), + + supports: { + html: false, + multiple: false, + reusable: false, + }, + + edit, + save: () => { + // Intentionally empty because this is a dynamic block + }, +}; diff --git a/admin/css/blocks.css b/admin/css/blocks.css new file mode 100644 index 0000000..29f04d8 --- /dev/null +++ b/admin/css/blocks.css @@ -0,0 +1,4 @@ +.components-panel__row .components-range-control .components-base-control__label { + max-width: 100%; +} +/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImJsb2Nrcy5jc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7RUFDRSxlQUFlO0FBQ2pCIiwiZmlsZSI6ImJsb2Nrcy5jc3MiLCJzb3VyY2VzQ29udGVudCI6WyIuY29tcG9uZW50cy1wYW5lbF9fcm93IC5jb21wb25lbnRzLXJhbmdlLWNvbnRyb2wgLmNvbXBvbmVudHMtYmFzZS1jb250cm9sX19sYWJlbCB7XG4gIG1heC13aWR0aDogMTAwJTtcbn0iXX0= */ \ No newline at end of file diff --git a/admin/css/blocks.min.css b/admin/css/blocks.min.css new file mode 100644 index 0000000..d37ce77 --- /dev/null +++ b/admin/css/blocks.min.css @@ -0,0 +1 @@ +.components-panel__row .components-range-control .components-base-control__label{max-width:100%} \ No newline at end of file diff --git a/admin/css/settings.css b/admin/css/settings.css new file mode 100644 index 0000000..d66c106 --- /dev/null +++ b/admin/css/settings.css @@ -0,0 +1,14 @@ +.submit .aux-buttons { + display: block; + float: right; +} + +select, +input { + margin-top: -0.1em; +} + +input[type=number] { + width: 5em; +} +/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNldHRpbmdzLmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtFQUNFLGNBQWM7RUFDZCxZQUFZO0FBQ2Q7O0FBRUE7O0VBRUUsa0JBQWtCO0FBQ3BCOztBQUVBO0VBQ0UsVUFBVTtBQUNaIiwiZmlsZSI6InNldHRpbmdzLmNzcyIsInNvdXJjZXNDb250ZW50IjpbIi5zdWJtaXQgLmF1eC1idXR0b25zIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIGZsb2F0OiByaWdodDtcbn1cblxuc2VsZWN0LFxuaW5wdXQge1xuICBtYXJnaW4tdG9wOiAtMC4xZW07XG59XG5cbmlucHV0W3R5cGU9bnVtYmVyXSB7XG4gIHdpZHRoOiA1ZW07XG59Il19 */ \ No newline at end of file diff --git a/admin/css/settings.min.css b/admin/css/settings.min.css new file mode 100644 index 0000000..9130591 --- /dev/null +++ b/admin/css/settings.min.css @@ -0,0 +1 @@ +.submit .aux-buttons{display:block;float:right}select,input{margin-top:-0.1em}input[type=number]{width:5em} \ No newline at end of file diff --git a/admin/partials/network/section.php b/admin/partials/network/section.php new file mode 100644 index 0000000..1a3adad --- /dev/null +++ b/admin/partials/network/section.php @@ -0,0 +1,30 @@ + +

+ +
+

+ +
+ + + +

+ 1 ] ); ?> +

+
+ +
+` element. + * @var string $value The checkbox value. + */ +?> + + + + + + /> +
+

+ +

+ + +` element. + * @var string $value The checkbox value. + */ +?> + + + + + + /> +
+

+ + +

+ + +` element. + * @var string $erase_field The name of the erase checkbox `` element. + * @var bool $uploads_disabled Whether the uploads system has been disabled completely.. + * @var bool $can_upload Whether the currently active user can upload files. + * @var bool $has_local_avatar Whether a local avatar has been uploaded. + * @var int $size The width/height of the avatar preview image (in pixels). + * @var bool $show_description Whether the field description should be shown. + */ + +?> + + + + true ] ); ?> + + +

+ + + + +
+ +

+ + +

+ get_uploader_description( $can_upload, $has_local_avatar ), T::ALLOWED_HTML_LABEL ); ?> +

+ + + + + + +
+

+ +

+

+ +

+
+ [] ]; + +?> +
+

+ +

+
    +
  • +
  • +
  • +
+
+check() ) { + + /** + * Create and start the plugin. + * + * @var Controller + */ + $plugin = Factory::get()->create( Controller::class ); + $plugin->run(); + } +} +run_avatar_privacy(); diff --git a/includes/avatar-privacy-functions.php b/includes/avatar-privacy-functions.php new file mode 100644 index 0000000..b5e4280 --- /dev/null +++ b/includes/avatar-privacy-functions.php @@ -0,0 +1,54 @@ + + * + * @phpstan-type AvatarArguments array{ force?: bool, ... } + */ +interface Avatar_Handler { + + /** + * Retrieves the URL for the given default icon type. + * + * @since 2.7.0 Removed argument index 'type' as it is not required for all implemntations. + * + * @param string $url The fallback image URL. + * @param string $hash The hashed mail address. + * @param int $size The size of the avatar image in pixels. + * @param array $args { + * An array of arguments. + * + * @type bool $force Optional. Whether to force the regeneration of the image file. Default false. + * } + * + * @return string + * + * @phpstan-param AvatarArguments $args + */ + public function get_url( $url, $hash, $size, array $args ); + + /** + * Caches the image specified by the parameters. + * + * @param string $type The image (sub-)type. + * @param string $hash The hashed mail address. + * @param int $size The requested size in pixels. + * @param string $subdir The requested sub-directory (may contain implementation-specific data). + * @param string $extension The requested file extension. + * + * @return bool Returns `true` if successful, `false` otherwise. + */ + public function cache_image( $type, $hash, $size, $subdir, $extension ); + + /** + * Retrieves the name of the cache directory for avatars provided by this handler + * (e.g. 'gravatar'). Implementations may return an empty string if the actual + * type can vary. + * + * @since 2.4.0 + * + * @return string + */ + public function get_type(); +} diff --git a/includes/avatar-privacy/avatar-handlers/class-default-icons-handler.php b/includes/avatar-privacy/avatar-handlers/class-default-icons-handler.php new file mode 100644 index 0000000..b246bb0 --- /dev/null +++ b/includes/avatar-privacy/avatar-handlers/class-default-icons-handler.php @@ -0,0 +1,200 @@ + + * + * @phpstan-type AvatarArguments array{ + * type?: string, + * force?: bool, + * } + */ +class Default_Icons_Handler implements Avatar_Handler { + + /** + * A list of icon providers. + * + * @var Icon_Provider[] + */ + private array $icon_providers = []; + + /** + * The mapping of icon types to providers. + * + * @var Icon_Provider[] + */ + private array $icon_provider_mapping = []; + + /** + * The remote images handler. + * + * @var Remote_Image_Service + */ + private Remote_Image_Service $remote_images; + + /** + * Creates a new instance. + * + * @since 2.1.0 Parameter $plugin_file removed. + * @since 2.3.4 Parameter $remote_images added. + * @since 2.4.0 Parameter $file_cache removed. + * + * @param Icon_Provider[] $icon_providers An array of icon providers. + * @param Remote_Image_Service $remote_images The remote images handler. + */ + public function __construct( array $icon_providers, Remote_Image_Service $remote_images ) { + $this->icon_providers = $icon_providers; + $this->remote_images = $remote_images; + } + + /** + * Returns a mapping from icon types to specific providers. + * + * @since 2.1.0 Visibility changed to protected. + * + * @return Icon_Provider[] + */ + protected function get_provider_mapping() { + if ( empty( $this->icon_provider_mapping ) ) { + foreach ( $this->icon_providers as $provider ) { + foreach ( $provider->get_provided_types() as $type ) { + $this->icon_provider_mapping[ $type ] = $provider; + } + } + } + + return $this->icon_provider_mapping; + } + + /** + * Retrieves the URL for the given default icon type. + * + * @since 2.3.4 Documentation for optional arguments adapted to follow implementation. + * @since 2.7.0 Argument key 'default' replaced with 'type' for consistency. + * + * @param string $url The fallback image URL. + * @param string $hash The hashed mail address. + * @param int $size The size of the avatar image in pixels. + * @param array $args { + * An array of arguments. + * + * @type string $type The default icon type. + * @type bool $force Optional. Whether to force the regeneration of the image file. Default false. + * } + * + * @return string + * + * @phpstan-param AvatarArguments $args + */ + public function get_url( $url, $hash, $size, array $args ) { + $defaults = [ + 'type' => '', + 'force' => false, + ]; + + $args = \wp_parse_args( $args, $defaults ); + + // Check for named icon providers first. + $providers = $this->get_provider_mapping(); + if ( ! empty( $providers[ $args['type'] ] ) ) { + return $providers[ $args['type'] ]->get_icon_url( $hash, $size, $args['force'] ); + } + + // Check if the given default icon type is a valid image URL (a common + // pattern due to how the default WordPress implementation uses Gravatar.com). + if ( $this->remote_images->validate_image_url( $args['type'], 'default_icon' ) ) { + // Prepare filter arguments. + $url = $args['type']; + $hash = $this->remote_images->get_hash( $url ); + + /** This filter is documented in avatar-privacy/components/class-avatar-handling.php */ + return \apply_filters( 'avatar_privacy_legacy_icon_url', $url, $hash, $size, [ 'force' => $args['force'] ] ); + } + + // Return the fallback default icon URL. + return $url; + } + + /** + * Caches the image specified by the parameters. + * + * @param string $type The image (sub-)type. + * @param string $hash The hashed mail address. + * @param int $size The requested size in pixels. + * @param string $subdir The requested sub-directory. + * @param string $extension The requested file extension. + * + * @return bool Returns `true` if successful, `false` otherwise. + */ + public function cache_image( $type, $hash, $size, $subdir, $extension ) { + return ! empty( $this->get_url( '', $hash, $size, [ 'type' => $type ] ) ); + } + + /** + * Adds new images to the list of default avatar images. + * + * @param string[] $avatar_defaults The list of default avatar images. + * + * @return string[] The modified default avatar array. + */ + public function avatar_defaults( $avatar_defaults ) { + // Remove Gravatar logo. + unset( $avatar_defaults['gravatar_default'] ); + + // Add non-default icons. + foreach ( $this->icon_providers as $provider ) { + $type = $provider->get_option_value(); + if ( ! isset( $avatar_defaults[ $type ] ) ) { + $avatar_defaults[ $type ] = $provider->get_name(); + } + } + + return $avatar_defaults; + } + + /** + * Retrieves the name of the cache subdirectory for avatars provided by this + * handler (e.g. 'gravatar'). Implementations may return an empty string if + * the actual type can vary. + * + * @since 2.4.0 + * + * @return string + */ + public function get_type() { + return ''; + } +} diff --git a/includes/avatar-privacy/avatar-handlers/class-gravatar-cache-handler.php b/includes/avatar-privacy/avatar-handlers/class-gravatar-cache-handler.php new file mode 100644 index 0000000..11098b9 --- /dev/null +++ b/includes/avatar-privacy/avatar-handlers/class-gravatar-cache-handler.php @@ -0,0 +1,249 @@ + + * + * @phpstan-type AvatarArguments array{ + * email?: string, + * rating?: key-of, + * mimetype?: string, + * force?: bool + * } + */ +class Gravatar_Cache_Handler implements Avatar_Handler { + + /** + * Valid Gravatar image ratings. + * + * @since 2.7.0. + */ + private const GRAVATAR_RATING = [ + 'g' => true, + 'pg' => true, + 'r' => true, + 'x' => true, + ]; + + /** + * The core API. + * + * @var Core + */ + private Core $core; + + /** + * The options handler. + * + * @var Options + */ + private Options $options; + + /** + * The filesystem cache handler. + * + * @var Filesystem_Cache + */ + private Filesystem_Cache $file_cache; + + /** + * The Gravatar network service. + * + * @var Gravatar_Service + */ + private Gravatar_Service $gravatar; + + /** + * Creates a new instance. + * + * @since 2.0.0 Parameter $gravatar added. + * + * @param Core $core The core API. + * @param Options $options The options handler. + * @param Filesystem_Cache $file_cache The file cache handler. + * @param Gravatar_Service $gravatar The Gravatar network service. + */ + public function __construct( Core $core, Options $options, Filesystem_Cache $file_cache, Gravatar_Service $gravatar ) { + $this->core = $core; + $this->options = $options; + $this->file_cache = $file_cache; + $this->gravatar = $gravatar; + } + + /** + * Retrieves the Gravatar icon URL. + * + * Note: Not all of the arguments provided by the `avatar_privacy_gravatar_icon_url` + * filter hook are actually required. + * + * @since 2.7.0 Unused arguments key 'user_id' removed. + * + * @param string $url The fallback default icon URL. + * @param string $hash The hashed mail address. + * @param int $size The size of the avatar image in pixels. + * @param array $args { + * An array of arguments. + * + * @type string $email The mail address used to generate the identity hash. + * @type string $rating Optional. The audience rating (e.g. 'g', 'pg', 'r', 'x'). Default 'g'. + * @type string $mimetype Optional. The expected MIME type of the Gravatar image. Default 'image/png'. + * @type bool $force Optional. Whether to force re-caching of the image file. Default false. + * } + * + * @return string + * + * @phpstan-param AvatarArguments $args + */ + public function get_url( $url, $hash, $size, array $args ) { + $defaults = [ + 'email' => '', + 'rating' => 'g', + 'mimetype' => Image_File::PNG_IMAGE, + 'force' => false, + ]; + + $args = \wp_parse_args( $args, $defaults ); + $filename = "gravatar/{$this->get_sub_dir( $hash )}/{$hash}-{$size}." . Image_File::FILE_EXTENSION[ $args['mimetype'] ]; + + // Only retrieve new Gravatar if necessary. + if ( $args['force'] || ! \file_exists( "{$this->file_cache->get_base_dir()}{$filename}" ) ) { + // Retrieve the gravatar icon. + $icon = $this->gravatar->get_image( $args['email'], $size, $args['rating'] ); + + // Store it (empty files will fail this check). + if ( ! $this->file_cache->set( $filename, $icon, $args['force'] ) ) { + // Something went wrong.. + return $url; + } + } + + return $this->file_cache->get_url( $filename ); + } + + /** + * Calculates the subdirectory from the given identity hash. + * + * @since 2.1.0 Visibility changed to protected. + * @since 2.4.0 Parameter $user removed. + * + * @param string $identity The identity (mail address) hash. + * + * @return string + */ + protected function get_sub_dir( $identity ) { + return \implode( '/', \str_split( \substr( $identity, 0, 2 ) ) ); + } + + /** + * Caches the image specified by the parameters. + * + * @since 2.0.0 + * + * @param string $type The image (sub-)type. Ignored. + * @param string $hash The hashed mail address. + * @param int $size The requested size in pixels. + * @param string $subdir The requested sub-directory. + * @param string $extension The requested file extension. + * + * @return bool Returns `true` if successful, `false` otherwise. + */ + public function cache_image( $type, $hash, $size, $subdir, $extension ) { + + // Lookup user and/or email address. + $user = $this->core->get_user_by_hash( $hash ); + + if ( ! empty( $user ) ) { + $email = ! empty( $user->user_email ) ? $user->user_email : ''; + } else { + $email = $this->core->get_comment_author_email( $hash ); + } + + // Could not find user/comment author. + if ( empty( $email ) ) { + return false; + } + + // Prepare arguments. + $args = [ + 'email' => $email, + 'rating' => $this->get_avatar_rating(), + 'mimetype' => Image_File::CONTENT_TYPE[ $extension ], + ]; + + // Try to cache the icon. + return ! empty( $this->get_url( '', $hash, $size, $args ) ); + } + + /** + * Retrieves the name of the cache subdirectory for avatars provided by this + * handler (e.g. 'gravatar'). Implementations may return an empty string if + * the actual type can vary. + * + * @since 2.4.0 + * + * @return string + */ + public function get_type() { + return 'gravatar'; + } + + /** + * Retrieves the allowed avatar image ratings. + * + * @since 2.7.0 + * + * @return string + * + * @phpstan-return key-of + */ + protected function get_avatar_rating() { + $rating = $this->options->get( 'avatar_rating', 'g', true ); + + if ( ! \is_string( $rating ) || empty( self::GRAVATAR_RATING[ $rating ] ) ) { + $rating = 'g'; + } + + return $rating; // @phpstan-ignore-line -- https://github.com/phpstan/phpstan/issues/8559 + } +} diff --git a/includes/avatar-privacy/avatar-handlers/class-legacy-icon-handler.php b/includes/avatar-privacy/avatar-handlers/class-legacy-icon-handler.php new file mode 100644 index 0000000..7a49548 --- /dev/null +++ b/includes/avatar-privacy/avatar-handlers/class-legacy-icon-handler.php @@ -0,0 +1,185 @@ + + * + * @phpstan-import-type AvatarArguments from Avatar_Handler + */ +class Legacy_Icon_Handler implements Avatar_Handler { + + /** + * The filesystem cache handler. + * + * @var Filesystem_Cache + */ + private Filesystem_Cache $file_cache; + + /** + * The remote image service. + * + * @var Remote_Image_Service + */ + private Remote_Image_Service $remote_images; + + /** + * Creates a new instance. + * + * @param Filesystem_Cache $file_cache The file cache handler. + * @param Remote_Image_Service $remote_images The remote image service. + */ + public function __construct( Filesystem_Cache $file_cache, Remote_Image_Service $remote_images ) { + $this->file_cache = $file_cache; + $this->remote_images = $remote_images; + } + + /** + * Retrieves the legacy icon URL. + * + * @param string $url The legacy image URL. + * @param string $hash The hashed URL. + * @param int $size The size of the avatar image in pixels. + * @param array $args { + * An array of arguments. + * + * @type string $mimetype Optional. The expected MIME type of the avatar image. Default based on the URL file extension. + * @type bool $force Optional. Whether to force re-caching of the image file. Default false. + * } + * + * @return string + * + * @phpstan-param AvatarArguments $args + */ + public function get_url( $url, $hash, $size, array $args ) { + $defaults = [ + 'mimetype' => $this->get_target_mime_type( $url ), + 'force' => false, + ]; + + $args = \wp_parse_args( $args, $defaults ); + $filename = "legacy/{$this->get_sub_dir( $hash )}/{$hash}-{$size}." . Image_File::FILE_EXTENSION[ $args['mimetype'] ]; + + // Only retrieve new Gravatar if necessary. + if ( $args['force'] || ! \file_exists( "{$this->file_cache->get_base_dir()}{$filename}" ) ) { + // Retrieve the legacy icon. + $icon = $this->remote_images->get_image( $url, $size, $args['mimetype'] ); + + // Store it (empty files will fail this check). + if ( ! $this->file_cache->set( $filename, $icon, $args['force'] ) ) { + // Something went wrong.. + return $url; + } + } + + return $this->file_cache->get_url( $filename ); + } + + /** + * Retrieves the target MIME type for our resized image. + * + * @param string $url The image URL. + * + * @return string The target MIME type ('image/png' if the URL extension + * is not one of our supported image formats). + */ + protected function get_target_mime_type( $url ) { + $mimetype = Image_File::PNG_IMAGE; + $path = \wp_parse_url( $url, \PHP_URL_PATH ); + $extension = \pathinfo( \is_string( $path ) ? $path : '', \PATHINFO_EXTENSION ); + + // Determine MIME type based on the file extension. + if ( isset( Image_File::CONTENT_TYPE[ $extension ] ) ) { + $mimetype = Image_File::CONTENT_TYPE[ $extension ]; + } + + return $mimetype; + } + + /** + * Calculates the subdirectory from the given identity hash. + * + * @param string $identity The identity (mail address) hash. + * + * @return string + */ + protected function get_sub_dir( $identity ) { + return \implode( '/', \str_split( \substr( $identity, 0, 2 ) ) ); + } + + /** + * Caches the image specified by the parameters. + * + * @param string $type The image (sub-)type. Ignored. + * @param string $hash The hashed mail address. + * @param int $size The requested size in pixels. + * @param string $subdir The requested sub-directory. + * @param string $extension The requested file extension. + * + * @return bool Returns `true` if successful, `false` otherwise. + */ + public function cache_image( $type, $hash, $size, $subdir, $extension ) { + + // Lookup image URL. + $url = $this->remote_images->get_image_url( $hash ); + + // Could not find legacy image URL. + if ( empty( $url ) ) { + return false; + } + + // Prepare arguments. + $args = [ + 'mimetype' => Image_File::CONTENT_TYPE[ $extension ], + ]; + + // Try to cache the icon. + return ! empty( $this->get_url( $url, $hash, $size, $args ) ); + } + + /** + * Retrieves the name of the cache subdirectory for avatars provided by this + * handler (e.g. 'gravatar'). Implementations may return an empty string if + * the actual type can vary. + * + * @return string + */ + public function get_type() { + return 'legacy'; + } +} diff --git a/includes/avatar-privacy/avatar-handlers/class-user-avatar-handler.php b/includes/avatar-privacy/avatar-handlers/class-user-avatar-handler.php new file mode 100644 index 0000000..5e616ed --- /dev/null +++ b/includes/avatar-privacy/avatar-handlers/class-user-avatar-handler.php @@ -0,0 +1,221 @@ + + * + * @phpstan-type AvatarArguments array{ + * avatar?: string, + * mimetype?: string, + * timestamp?: bool, + * force?: bool + * } + */ +class User_Avatar_Handler implements Avatar_Handler { + + /** + * The core API. + * + * @var User_Fields + */ + private User_Fields $user_fields; + + /** + * The filesystem cache handler. + * + * @var Filesystem_Cache + */ + private Filesystem_Cache $file_cache; + + /** + * The uploads base directory. + * + * @var string + */ + private string $base_dir; + + /** + * The image editor support class. + * + * @var Images\Editor + */ + private Images\Editor $images; + + /** + * Creates a new instance. + * + * @since 2.4.0 Parameter $core replaced by $user_fields. + * + * @param User_Fields $user_fields The user data API. + * @param Filesystem_Cache $file_cache The file cache handler. + * @param Images\Editor $images The image editing handler. + */ + public function __construct( User_Fields $user_fields, Filesystem_Cache $file_cache, Images\Editor $images ) { + $this->user_fields = $user_fields; + $this->file_cache = $file_cache; + $this->images = $images; + } + + /** + * Retrieves the URL for the given default icon type. + * + * Note: Not all of the arguments provided by the `avatar_privacy_user_avatar_icon_url` + * filter hook are actually required. + * + * @since 2.7.0 Unused arguments key 'type' removed. + * + * @param string $url The fallback image URL. + * @param string $hash The hashed mail address. + * @param int $size The size of the avatar image in pixels. + * @param array $args { + * An array of arguments. + * + * @type string $avatar The full-size avatar image path. + * @type string $mimetype Optional. The expected MIME type of the avatar image. Default 'image/png'. + * @type bool $timestamp Optional. Whether to add a timestamp for cache busting. Default false. + * @type bool $force Optional. Whether to force the regeneration of the image file. Default false. + * } + * + * @return string + * + * @phpstan-param AvatarArguments $args + */ + public function get_url( $url, $hash, $size, array $args ) { + // Cache base directory. + if ( empty( $this->base_dir ) ) { + $this->base_dir = $this->file_cache->get_base_dir(); + } + + // Default arguments. + $defaults = [ + 'avatar' => '', + 'mimetype' => Image_File::PNG_IMAGE, + 'timestamp' => false, + 'force' => false, + ]; + + $args = \wp_parse_args( $args, $defaults ); + $extension = Image_File::FILE_EXTENSION[ $args['mimetype'] ]; + $filename = "user/{$this->get_sub_dir( $hash )}/{$hash}-{$size}.{$extension}"; + $abspath = "{$this->base_dir}{$filename}"; + + if ( $args['force'] || ! \file_exists( $abspath ) ) { + $data = $this->images->get_resized_image_data( + $this->images->get_image_editor( $args['avatar'] ), $size, $size, $args['mimetype'] + ); + + // Save the generated PNG file (empty files will fail this check). + if ( ! $this->file_cache->set( $filename, $data, $args['force'] ) ) { + // Something went wrong.. + return $url; + } + } + + // Optionally add file modification time as `ts` query argument to bust caches. + $query_args = [ + 'ts' => $args['timestamp'] ? @\filemtime( $abspath ) : false, + ]; + + return \add_query_arg( + \rawurlencode_deep( \array_filter( $query_args ) ), + $this->file_cache->get_url( $filename ) + ); + } + + /** + * Calculates the subdirectory from the given identity hash. + * + * @since 2.1.0 Visibility changed to protected. + * + * @param string $identity The identity (mail address) hash. + * + * @return string + */ + protected function get_sub_dir( $identity ) { + return \implode( '/', \str_split( \substr( $identity, 0, 2 ) ) ); + } + + /** + * Caches the image specified by the parameters. + * + * @since 2.0.0 + * + * @param string $type The image (sub-)type. + * @param string $hash The hashed mail address. + * @param int $size The requested size in pixels. + * @param string $subdir The requested sub-directory. + * @param string $extension The requested file extension. + * + * @return bool Returns `true` if successful, `false` otherwise. + */ + public function cache_image( $type, $hash, $size, $subdir, $extension ) { + $user = $this->user_fields->get_user_by_hash( $hash ); + if ( ! empty( $user ) ) { + $local_avatar = $this->user_fields->get_local_avatar( $user->ID ); + } + + // Could not find user or uploaded avatar. + if ( empty( $local_avatar ) ) { + return false; + } + + // Prepare arguments. + $args = [ + 'avatar' => $local_avatar['file'], + 'mimetype' => $local_avatar['type'], + ]; + + // Try to cache the icon. + return ! empty( $this->get_url( '', $hash, $size, $args ) ); + } + + /** + * Retrieves the name of the cache subdirectory for avatars provided by this + * handler (e.g. 'gravatar'). Implementations may return an empty string if + * the actual type can vary. + * + * @since 2.4.0 + * + * @return string + */ + public function get_type() { + return 'user'; + } +} diff --git a/includes/avatar-privacy/avatar-handlers/default-icons/class-abstract-icon-provider.php b/includes/avatar-privacy/avatar-handlers/default-icons/class-abstract-icon-provider.php new file mode 100644 index 0000000..36842f2 --- /dev/null +++ b/includes/avatar-privacy/avatar-handlers/default-icons/class-abstract-icon-provider.php @@ -0,0 +1,127 @@ + + */ +abstract class Abstract_Icon_Provider implements Icon_Provider { + + /** + * An array containing valid types as indexes. + * + * @var string[] + */ + private array $valid_types; + + /** + * The primary type (option value). + * + * @var string + */ + private string $primary_type; + + /** + * Creates a new instance. + * + * @since 2.0.0 Parameter $name added. + * @since 2.1.0 Parameter $name removed to allow proper translation loading. + * + * @param string[] $types An array of valid types. + */ + protected function __construct( array $types ) { + $this->valid_types = \array_flip( $types ); + $this->primary_type = $types[0]; + } + + /** + * Checks if this Default_Icon_Provider handles the given icon type. + * + * @param string $type The default icon type. + * + * @return bool + */ + public function provides( $type ) { + return isset( $this->valid_types[ $type ] ); + } + + /** + * Retrieves all icon types handled by the class. + * + * @since 2.0.0 + * + * @return string[] + */ + public function get_provided_types() { + return \array_keys( $this->valid_types ); + } + + /** + * Retrieves the default icon. + * + * @since 2.7.0 Parameter `$force` added. + * + * @param string $identity The identity (mail address) hash. + * @param int $size The requested size in pixels. + * @param bool $force Whether the icon cache should be invalidated (if applicable). + * + * @return string + */ + abstract public function get_icon_url( $identity, $size, bool $force = false ); + + /** + * Retrieves the option value (the primary provided type). + * + * @since 2.0.0 + * + * @return string + */ + public function get_option_value() { + return $this->primary_type; + } + + /** + * Retrieves the user-visible, translated name. Replacements for existing + * core default icon styles may return the empty string instead (as does the + * default implementation). + * + * @since 2.0.0 + * @since 2.1.0 Always returns '' to encourage subclasses to do just-in-time translation loading. + * + * @return string + */ + public function get_name() { + return ''; + } +} diff --git a/includes/avatar-privacy/avatar-handlers/default-icons/class-custom-icon-provider.php b/includes/avatar-privacy/avatar-handlers/default-icons/class-custom-icon-provider.php new file mode 100644 index 0000000..0db3e1b --- /dev/null +++ b/includes/avatar-privacy/avatar-handlers/default-icons/class-custom-icon-provider.php @@ -0,0 +1,139 @@ + + */ +class Custom_Icon_Provider extends Abstract_Icon_Provider { + + /** + * The filesystem cache handler. + * + * @var Filesystem_Cache + */ + private $file_cache; + + /** + * The settings API. + * + * @since 2.4.0 + * + * @var Default_Avatars + */ + private $default_avatars; + + /** + * The image editor support class. + * + * @var Images\Editor + */ + private $images; + + /** + * Creates a new instance. + * + * @since 2.4.0 Parameter $default_avatars added, parameter $core removed. + * + * @param Filesystem_Cache $file_cache The file cache handler. + * @param Default_Avatars $default_avatars The custom default avatars API. + * @param Images\Editor $images The image editing handler. + */ + public function __construct( Filesystem_Cache $file_cache, Default_Avatars $default_avatars, Images\Editor $images ) { + parent::__construct( [ 'custom' ] ); + + $this->file_cache = $file_cache; + $this->default_avatars = $default_avatars; + $this->images = $images; + } + + /** + * Retrieves the default icon. + * + * @since 2.7.0 Parameter `$force` added. + * + * @param string $identity The identity (mail address) hash. + * @param int $size The requested size in pixels. + * @param bool $force Whether the icon cache should be invalidated (if applicable). + * + * @return string + */ + public function get_icon_url( $identity, $size, bool $force = false ) { + // Abort if no custom image has been set. + $default = \includes_url( 'images/blank.gif' ); + $icon = $this->default_avatars->get_custom_default_avatar(); + if ( empty( $icon['file'] ) ) { + return $default; + } + + // We need the current site ID. + $site_id = \get_current_blog_id(); + $extension = Image_File::FILE_EXTENSION[ $icon['type'] ]; + $identity = $this->default_avatars->get_hash( $site_id ); + $filename = "custom/{$site_id}/{$identity}-{$size}.{$extension}"; + + // Only generate a new icon if necessary. + if ( $force || ! \file_exists( "{$this->file_cache->get_base_dir()}{$filename}" ) ) { + + $data = $this->images->get_resized_image_data( $this->images->get_image_editor( $icon['file'] ), $size, $size, $icon['type'] ); + if ( empty( $data ) ) { + // Something went wrong.. + return $default; + } + + // Save the generated image file. + $this->file_cache->set( $filename, $data ); + } + + return $this->file_cache->get_url( $filename ); + } + + /** + * Retrieves the user-visible, translated name. + * + * @since 2.1.0 + * + * @return string + */ + public function get_name() { + return \__( 'Custom', 'avatar-privacy' ); + } +} diff --git a/includes/avatar-privacy/avatar-handlers/default-icons/class-generating-icon-provider.php b/includes/avatar-privacy/avatar-handlers/default-icons/class-generating-icon-provider.php new file mode 100644 index 0000000..3f559f3 --- /dev/null +++ b/includes/avatar-privacy/avatar-handlers/default-icons/class-generating-icon-provider.php @@ -0,0 +1,116 @@ + + */ +abstract class Generating_Icon_Provider extends Abstract_Icon_Provider { + + /** + * The filesystem cache handler. + * + * @var Filesystem_Cache + */ + private $file_cache; + + /** + * The icon generator. + * + * @var Generator + */ + private $generator; + + /** + * Creates a new instance. + * + * @since 2.0.0 Parameter $name added. + * @since 2.1.0 Parameter $name removed to allow proper translation loading. + * + * @param Generator $generator An image generator. + * @param Filesystem_Cache $file_cache The file cache handler. + * @param string[] $types An array of valid types. The first entry is used as the cache sub-directory. + */ + protected function __construct( Generator $generator, Filesystem_Cache $file_cache, array $types ) { + parent::__construct( $types ); + + $this->generator = $generator; + $this->file_cache = $file_cache; + } + + /** + * Retrieves the default icon. + * + * @since 2.7.0 Parameter `$force` added. + * + * @param string $identity The identity (mail address) hash. + * @param int $size The requested size in pixels. + * @param bool $force Whether the icon cache should be invalidated (if applicable). + * + * @return string + */ + public function get_icon_url( $identity, $size, bool $force = false ) { + $filename = $this->get_filename( $identity, $size ); + + // Only generate a new icon if necessary. + if ( $force || ! \file_exists( "{$this->file_cache->get_base_dir()}{$filename}" ) ) { + $this->file_cache->set( $filename, (string) $this->generator->build( $identity, $size ) ); + } + + return $this->file_cache->get_url( $filename ); + } + + /** + * Calculates the subdirectory from the given identity hash. + * + * @param string $identity The identity (mail address) hash. + * + * @return string + */ + protected function get_sub_dir( $identity ) { + return \implode( '/', \str_split( \substr( $identity, 0, 2 ) ) ); + } + + /** + * Retrieves the filename (including the sub-directory and file extension). + * + * @param string $identity The identity (mail address) hash. + * @param int $size The requested size in pixels. + * + * @return string + */ + abstract protected function get_filename( $identity, $size ); +} diff --git a/includes/avatar-privacy/avatar-handlers/default-icons/class-generator.php b/includes/avatar-privacy/avatar-handlers/default-icons/class-generator.php new file mode 100644 index 0000000..6ec85fb --- /dev/null +++ b/includes/avatar-privacy/avatar-handlers/default-icons/class-generator.php @@ -0,0 +1,48 @@ + + */ +interface Generator { + + /** + * Builds an icon based on the given seed returns the image data. + * + * @param string $seed The seed data (hash). + * @param int $size The size in pixels. + * + * @return string|false + */ + public function build( $seed, $size ); +} diff --git a/includes/avatar-privacy/avatar-handlers/default-icons/class-icon-provider.php b/includes/avatar-privacy/avatar-handlers/default-icons/class-icon-provider.php new file mode 100644 index 0000000..93eceda --- /dev/null +++ b/includes/avatar-privacy/avatar-handlers/default-icons/class-icon-provider.php @@ -0,0 +1,87 @@ + + */ +interface Icon_Provider { + + /** + * Checks if this Icon_Provider handles the given icon type. + * + * @param string $type The default icon type. + * + * @return bool + */ + public function provides( $type ); + + /** + * Retrieves all icon types handled by the class. + * + * @since 2.0.0 + * + * @return string[] + */ + public function get_provided_types(); + + /** + * Retrieves the default icon. + * + * @since 2.7.0 Parameter `$force` added. + * + * @param string $identity The identity (mail address) hash. + * @param int $size The requested size in pixels. + * @param bool $force Whether the icon cache should be invalidated (if applicable). + * + * @return string + */ + public function get_icon_url( $identity, $size, bool $force = false ); + + /** + * Retrieves the option value (the primary provided type). + * + * @since 2.0.0 + * + * @return string + */ + public function get_option_value(); + + /** + * Retrieves the user-visible, translated name. + * + * @since 2.0.0 + * + * @return string + */ + public function get_name(); +} diff --git a/includes/avatar-privacy/avatar-handlers/default-icons/class-static-icon-provider.php b/includes/avatar-privacy/avatar-handlers/default-icons/class-static-icon-provider.php new file mode 100644 index 0000000..8d38747 --- /dev/null +++ b/includes/avatar-privacy/avatar-handlers/default-icons/class-static-icon-provider.php @@ -0,0 +1,79 @@ + + */ +class Static_Icon_Provider extends Abstract_Icon_Provider { + + /** + * The basename of the icon files residing in `public/images`. + * + * @var string + */ + protected $icon_basename; + + /** + * Creates a new instance. + * + * @since 2.0.0 Parameter $name added. + * @since 2.1.0 Parameters $name and $plugin_file removed. + * + * @param string[]|string $types Either a single identifier string or an array thereof. + * @param string $basename The icon basename (without extension or size suffix). + */ + public function __construct( $types, $basename ) { + parent::__construct( (array) $types ); + + $this->icon_basename = $basename; + } + + /** + * Retrieves the default icon. + * + * @since 2.7.0 Parameter `$force` added. + * + * @param string $identity The identity (mail address) hash. + * @param int $size The requested size in pixels. + * @param bool $force Whether the icon cache should be invalidated (if applicable). + * + * @return string + */ + public function get_icon_url( $identity, $size, bool $force = false ) { + $use_size = ( $size > 64 ) ? '128' : '64'; + + return \plugins_url( "public/images/{$this->icon_basename}-{$use_size}.png", \AVATAR_PRIVACY_PLUGIN_FILE ); + } +} diff --git a/includes/avatar-privacy/avatar-handlers/default-icons/class-svg-icon-provider.php b/includes/avatar-privacy/avatar-handlers/default-icons/class-svg-icon-provider.php new file mode 100644 index 0000000..0617f61 --- /dev/null +++ b/includes/avatar-privacy/avatar-handlers/default-icons/class-svg-icon-provider.php @@ -0,0 +1,55 @@ + + */ +class SVG_Icon_Provider extends Static_Icon_Provider { + + /** + * Retrieves the default icon. + * + * @since 2.7.0 Parameter `$force` added. + * + * @param string $identity The identity (mail address) hash. + * @param int $size The requested size in pixels. + * @param bool $force Whether the icon cache should be invalidated (if applicable). + * + * @return string + */ + public function get_icon_url( $identity, $size, bool $force = false ) { + return \plugins_url( "public/images/{$this->icon_basename}.svg", \AVATAR_PRIVACY_PLUGIN_FILE ); + } +} diff --git a/includes/avatar-privacy/avatar-handlers/default-icons/generated-icons/class-bird-avatar-icon-provider.php b/includes/avatar-privacy/avatar-handlers/default-icons/generated-icons/class-bird-avatar-icon-provider.php new file mode 100644 index 0000000..9f04a78 --- /dev/null +++ b/includes/avatar-privacy/avatar-handlers/default-icons/generated-icons/class-bird-avatar-icon-provider.php @@ -0,0 +1,73 @@ + + */ +class Bird_Avatar_Icon_Provider extends Generating_Icon_Provider { + + /** + * Creates a new instance. + * + * @param Generators\Bird_Avatar $generator A generator instance. + * @param Filesystem_Cache $file_cache The file cache handler. + */ + public function __construct( Generators\Bird_Avatar $generator, Filesystem_Cache $file_cache ) { + parent::__construct( $generator, $file_cache, [ 'bird' ] ); + } + + /** + * Retrieves the filename (including the sub-directory and file extension). + * + * @param string $identity The identity (mail address) hash. Ignored. + * @param int $size The requested size in pixels. + * + * @return string + */ + protected function get_filename( $identity, $size ) { + return "bird/{$this->get_sub_dir( $identity )}/{$identity}-{$size}.png"; + } + + /** + * Retrieves the user-visible, translated name. + * + * @return string + */ + public function get_name() { + return \__( 'Birds (Generated)', 'avatar-privacy' ); + } +} diff --git a/includes/avatar-privacy/avatar-handlers/default-icons/generated-icons/class-cat-avatar-icon-provider.php b/includes/avatar-privacy/avatar-handlers/default-icons/generated-icons/class-cat-avatar-icon-provider.php new file mode 100644 index 0000000..02402c2 --- /dev/null +++ b/includes/avatar-privacy/avatar-handlers/default-icons/generated-icons/class-cat-avatar-icon-provider.php @@ -0,0 +1,73 @@ + + */ +class Cat_Avatar_Icon_Provider extends Generating_Icon_Provider { + + /** + * Creates a new instance. + * + * @param Generators\Cat_Avatar $generator A generator instance. + * @param Filesystem_Cache $file_cache The file cache handler. + */ + public function __construct( Generators\Cat_Avatar $generator, Filesystem_Cache $file_cache ) { + parent::__construct( $generator, $file_cache, [ 'cat' ] ); + } + + /** + * Retrieves the filename (including the sub-directory and file extension). + * + * @param string $identity The identity (mail address) hash. Ignored. + * @param int $size The requested size in pixels. + * + * @return string + */ + protected function get_filename( $identity, $size ) { + return "cat/{$this->get_sub_dir( $identity )}/{$identity}-{$size}.png"; + } + + /** + * Retrieves the user-visible, translated name. + * + * @return string + */ + public function get_name() { + return \__( 'Cats (Generated)', 'avatar-privacy' ); + } +} diff --git a/includes/avatar-privacy/avatar-handlers/default-icons/generated-icons/class-identicon-icon-provider.php b/includes/avatar-privacy/avatar-handlers/default-icons/generated-icons/class-identicon-icon-provider.php new file mode 100644 index 0000000..3dd7121 --- /dev/null +++ b/includes/avatar-privacy/avatar-handlers/default-icons/generated-icons/class-identicon-icon-provider.php @@ -0,0 +1,66 @@ + + */ +class Identicon_Icon_Provider extends Generating_Icon_Provider { + + /** + * Creates a new instance. + * + * @param Generators\Jdenticon $generator A generator instance. + * @param Filesystem_Cache $file_cache The file cache handler. + */ + public function __construct( Generators\Jdenticon $generator, Filesystem_Cache $file_cache ) { + parent::__construct( $generator, $file_cache, [ 'identicon' ] ); + } + + /** + * Retrieves the filename (including the sub-directory and file extension). + * + * @param string $identity The identity (mail address) hash. Ignored. + * @param int $size The requested size in pixels. + * + * @return string + */ + protected function get_filename( $identity, $size ) { + return "identicon/{$this->get_sub_dir( $identity )}/{$identity}.svg"; + } +} diff --git a/includes/avatar-privacy/avatar-handlers/default-icons/generated-icons/class-monster-id-icon-provider.php b/includes/avatar-privacy/avatar-handlers/default-icons/generated-icons/class-monster-id-icon-provider.php new file mode 100644 index 0000000..b06a9ea --- /dev/null +++ b/includes/avatar-privacy/avatar-handlers/default-icons/generated-icons/class-monster-id-icon-provider.php @@ -0,0 +1,66 @@ + + */ +class Monster_ID_Icon_Provider extends Generating_Icon_Provider { + + /** + * Creates a new instance. + * + * @param Generators\Monster_ID $generator A generator instance. + * @param Filesystem_Cache $file_cache The file cache handler. + */ + public function __construct( Generators\Monster_ID $generator, Filesystem_Cache $file_cache ) { + parent::__construct( $generator, $file_cache, [ 'monsterid' ] ); + } + + /** + * Retrieves the filename (including the sub-directory and file extension). + * + * @param string $identity The identity (mail address) hash. Ignored. + * @param int $size The requested size in pixels. + * + * @return string + */ + protected function get_filename( $identity, $size ) { + return "monsterid/{$this->get_sub_dir( $identity )}/{$identity}-{$size}.png"; + } +} diff --git a/includes/avatar-privacy/avatar-handlers/default-icons/generated-icons/class-retro-icon-provider.php b/includes/avatar-privacy/avatar-handlers/default-icons/generated-icons/class-retro-icon-provider.php new file mode 100644 index 0000000..d589b83 --- /dev/null +++ b/includes/avatar-privacy/avatar-handlers/default-icons/generated-icons/class-retro-icon-provider.php @@ -0,0 +1,66 @@ + + */ +class Retro_Icon_Provider extends Generating_Icon_Provider { + + /** + * Creates a new instance. + * + * @param Generators\Retro $generator A generator instance. + * @param Filesystem_Cache $file_cache The file cache handler. + */ + public function __construct( Generators\Retro $generator, Filesystem_Cache $file_cache ) { + parent::__construct( $generator, $file_cache, [ 'retro' ] ); + } + + /** + * Retrieves the filename (including the sub-directory and file extension). + * + * @param string $identity The identity (mail address) hash. Ignored. + * @param int $size The requested size in pixels. + * + * @return string + */ + protected function get_filename( $identity, $size ) { + return "retro/{$this->get_sub_dir( $identity )}/{$identity}.svg"; + } +} diff --git a/includes/avatar-privacy/avatar-handlers/default-icons/generated-icons/class-rings-icon-provider.php b/includes/avatar-privacy/avatar-handlers/default-icons/generated-icons/class-rings-icon-provider.php new file mode 100644 index 0000000..7fd708d --- /dev/null +++ b/includes/avatar-privacy/avatar-handlers/default-icons/generated-icons/class-rings-icon-provider.php @@ -0,0 +1,77 @@ + + */ +class Rings_Icon_Provider extends Generating_Icon_Provider { + + /** + * Creates a new instance. + * + * @param Generators\Rings $generator A generator instance. + * @param Filesystem_Cache $file_cache The file cache handler. + */ + public function __construct( Generators\Rings $generator, Filesystem_Cache $file_cache ) { + parent::__construct( $generator, $file_cache, [ 'rings' ] ); + } + + /** + * Retrieves the filename (including the sub-directory and file extension). + * + * @param string $identity The identity (mail address) hash. Ignored. + * @param int $size The requested size in pixels. + * + * @return string + */ + protected function get_filename( $identity, $size ) { + return "rings/{$this->get_sub_dir( $identity )}/{$identity}.svg"; + } + + /** + * Retrieves the user-visible, translated name. + * + * @since 2.1.0 + * + * @return string + */ + public function get_name() { + return \__( 'Rings (Generated)', 'avatar-privacy' ); + } +} diff --git a/includes/avatar-privacy/avatar-handlers/default-icons/generated-icons/class-robohash-icon-provider.php b/includes/avatar-privacy/avatar-handlers/default-icons/generated-icons/class-robohash-icon-provider.php new file mode 100644 index 0000000..b2670aa --- /dev/null +++ b/includes/avatar-privacy/avatar-handlers/default-icons/generated-icons/class-robohash-icon-provider.php @@ -0,0 +1,73 @@ + + */ +class Robohash_Icon_Provider extends Generating_Icon_Provider { + + /** + * Creates a new instance. + * + * @param Generators\Robohash $generator A generator instance. + * @param Filesystem_Cache $file_cache The file cache handler. + */ + public function __construct( Generators\Robohash $generator, Filesystem_Cache $file_cache ) { + parent::__construct( $generator, $file_cache, [ 'robohash' ] ); + } + + /** + * Retrieves the filename (including the sub-directory and file extension). + * + * @param string $identity The identity (mail address) hash. Ignored. + * @param int $size The requested size in pixels. + * + * @return string + */ + protected function get_filename( $identity, $size ) { + return "robohash/{$this->get_sub_dir( $identity )}/{$identity}.svg"; + } + + /** + * Retrieves the user-visible, translated name. + * + * @return string + */ + public function get_name() { + return \__( 'Robohash (Generated)', 'avatar-privacy' ); + } +} diff --git a/includes/avatar-privacy/avatar-handlers/default-icons/generated-icons/class-wavatar-icon-provider.php b/includes/avatar-privacy/avatar-handlers/default-icons/generated-icons/class-wavatar-icon-provider.php new file mode 100644 index 0000000..9f04837 --- /dev/null +++ b/includes/avatar-privacy/avatar-handlers/default-icons/generated-icons/class-wavatar-icon-provider.php @@ -0,0 +1,66 @@ + + */ +class Wavatar_Icon_Provider extends Generating_Icon_Provider { + + /** + * Creates a new instance. + * + * @param Generators\Wavatar $generator A generator instance. + * @param Filesystem_Cache $file_cache The file cache handler. + */ + public function __construct( Generators\Wavatar $generator, Filesystem_Cache $file_cache ) { + parent::__construct( $generator, $file_cache, [ 'wavatar' ] ); + } + + /** + * Retrieves the filename (including the sub-directory and file extension). + * + * @param string $identity The identity (mail address) hash. Ignored. + * @param int $size The requested size in pixels. + * + * @return string + */ + protected function get_filename( $identity, $size ) { + return "wavatar/{$this->get_sub_dir( $identity )}/{$identity}-{$size}.png"; + } +} diff --git a/includes/avatar-privacy/avatar-handlers/default-icons/generators/class-bird-avatar.php b/includes/avatar-privacy/avatar-handlers/default-icons/generators/class-bird-avatar.php new file mode 100644 index 0000000..6dad088 --- /dev/null +++ b/includes/avatar-privacy/avatar-handlers/default-icons/generators/class-bird-avatar.php @@ -0,0 +1,109 @@ + + * + * @phpstan-type PartType value-of + * @phpstan-type PartsTemplate array + * @phpstan-type AllPossibleParts array + * @phpstan-type RandomizedParts array + * @phpstan-type AdditionalArguments array{} + */ +class Bird_Avatar extends PNG_Parts_Generator { + + /** + * All Bird parts in their natural order. + * + * @since 2.7.0 + */ + private const PARTS = [ 'tail', 'hoop', 'body', 'wing', 'eyes', 'beak', 'accessoire' ]; + + /** + * Creates a new instance. + * + * @param Images\Editor $editor The image editing handler. + * @param Images\PNG $png The PNG image helper. + * @param Number_Generator $number_generator A pseudo-random number generator. + * @param Site_Transients $site_transients The site transients handler. + */ + public function __construct( + Images\Editor $editor, + Images\PNG $png, + Number_Generator $number_generator, + Site_Transients $site_transients + ) { + parent::__construct( + \AVATAR_PRIVACY_PLUGIN_PATH . '/public/images/birds', + self::PARTS, + 512, + $editor, + $png, + $number_generator, + $site_transients + ); + } + + /** + * Renders the avatar from its parts, using any of the given additional arguments. + * + * @since 2.5.0 Returns a resource or GdImage instance, depending on the PHP version. + * + * @param array $parts The (randomized) avatar parts. + * @param array $args Any additional arguments defined by the subclass. + * + * @return resource|GdImage + * + * @phpstan-param RandomizedParts $parts + * @phpstan-param AdditionalArguments $args + */ + protected function render_avatar( array $parts, array $args ) { + // Create background. + $bird = $this->create_image( 'transparent' ); + + // Add parts. + foreach ( $parts as $file ) { + $this->combine_images( $bird, $file ); + } + + return $bird; + } +} diff --git a/includes/avatar-privacy/avatar-handlers/default-icons/generators/class-cat-avatar.php b/includes/avatar-privacy/avatar-handlers/default-icons/generators/class-cat-avatar.php new file mode 100644 index 0000000..48ac71b --- /dev/null +++ b/includes/avatar-privacy/avatar-handlers/default-icons/generators/class-cat-avatar.php @@ -0,0 +1,109 @@ + + * + * @phpstan-type PartType value-of + * @phpstan-type PartsTemplate array + * @phpstan-type AllPossibleParts array + * @phpstan-type RandomizedParts array + * @phpstan-type AdditionalArguments array{} + */ +class Cat_Avatar extends PNG_Parts_Generator { + + /** + * All Cat parts in their natural order. + * + * @since 2.7.0 + */ + private const PARTS = [ 'body', 'fur', 'eyes', 'mouth', 'accessoire' ]; + + /** + * Creates a new instance. + * + * @param Images\Editor $editor The image editing handler. + * @param Images\PNG $png The PNG image helper. + * @param Number_Generator $number_generator A pseudo-random number generator. + * @param Site_Transients $site_transients The site transients handler. + */ + public function __construct( + Images\Editor $editor, + Images\PNG $png, + Number_Generator $number_generator, + Site_Transients $site_transients + ) { + parent::__construct( + \AVATAR_PRIVACY_PLUGIN_PATH . '/public/images/cats', + self::PARTS, + 512, + $editor, + $png, + $number_generator, + $site_transients + ); + } + + /** + * Renders the avatar from its parts, using any of the given additional arguments. + * + * @since 2.5.0 Returns a resource or GdImage instance, depending on the PHP version. + * + * @param array $parts The (randomized) avatar parts. + * @param array $args Any additional arguments defined by the subclass. + * + * @return resource|GdImage + * + * @phpstan-param RandomizedParts $parts + * @phpstan-param AdditionalArguments $args + */ + protected function render_avatar( array $parts, array $args ) { + // Create background. + $cat = $this->create_image( 'transparent' ); + + // Add parts. + foreach ( $parts as $file ) { + $this->combine_images( $cat, $file ); + } + + return $cat; + } +} diff --git a/includes/avatar-privacy/avatar-handlers/default-icons/generators/class-jdenticon.php b/includes/avatar-privacy/avatar-handlers/default-icons/generators/class-jdenticon.php new file mode 100644 index 0000000..f9c0bc8 --- /dev/null +++ b/includes/avatar-privacy/avatar-handlers/default-icons/generators/class-jdenticon.php @@ -0,0 +1,74 @@ + + */ +class Jdenticon implements Generator { + + /** + * The identicon instance. + * + * @var \Avatar_Privacy\Vendor\Jdenticon\Identicon + */ + private $identicon; + + /** + * Creates a new instance. + * + * @since 2.1.0 Parameter $identicon added. + * + * @param \Avatar_Privacy\Vendor\Jdenticon\Identicon $identicon The Jdenticon implementation. + */ + public function __construct( \Avatar_Privacy\Vendor\Jdenticon\Identicon $identicon ) { + $this->identicon = $identicon; + } + + /** + * Builds an icon based on the given seed returns the image data. + * + * @param string $seed The seed data (hash). + * @param int $size Optional. The size in pixels. Default 128 (but really ignored). + * + * @return string + */ + public function build( $seed, $size = 128 ) { + $this->identicon->setHash( $seed ); + $this->identicon->setSize( $size ); + + return $this->identicon->getImageData( 'svg' ); + } + +} diff --git a/includes/avatar-privacy/avatar-handlers/default-icons/generators/class-monster-id.php b/includes/avatar-privacy/avatar-handlers/default-icons/generators/class-monster-id.php new file mode 100644 index 0000000..73f2db8 --- /dev/null +++ b/includes/avatar-privacy/avatar-handlers/default-icons/generators/class-monster-id.php @@ -0,0 +1,460 @@ + + * @author Scott Sherrill-Mix + * + * @phpstan-type PartType value-of + * @phpstan-type PartsTemplate array + * @phpstan-type AllPossibleParts array + * @phpstan-type RandomizedParts array + * + * @phpstan-type Hue int<-359, 359> + * @phpstan-type Saturation int<0, 100> + * @phpstan-type AdditionalArguments array{ hue: Hue, saturation: Saturation } + */ +class Monster_ID extends PNG_Parts_Generator { + // Monster ports. + private const PART_LEGS = 'legs'; + private const PART_HAIR = 'hair'; + private const PART_ARMS = 'arms'; + private const PART_BODY = 'body'; + private const PART_EYES = 'eyes'; + private const PART_MOUTH = 'mouth'; + + /** + * All Monster parts in their natural order. + * + * @since 2.7.0 + */ + private const PARTS = [ + self::PART_LEGS, + self::PART_HAIR, + self::PART_ARMS, + self::PART_BODY, + self::PART_EYES, + self::PART_MOUTH, + ]; + + const COLOR_HUE = 'hue'; + const COLOR_SATURATION = 'saturation'; + + const SAME_COLOR_PARTS = [ + 'arms_S8.png' => true, + 'legs_S5.png' => true, + 'legs_S13.png' => true, + 'mouth_S5.png' => true, + 'mouth_S4.png' => true, + ]; + const SPECIFIC_COLOR_PARTS = [ + // Blue (values are hue degrees). + 'hair_S4.png' => [ 216, 270 ], + // Red (values are hue degrees). + 'arms_S2.png' => [ -18, 18 ], + 'hair_S6.png' => [ -18, 18 ], + 'mouth_9.png' => [ -18, 18 ], + 'mouth_6.png' => [ -18, 18 ], + 'mouth_S2.png' => [ -18, 18 ], + ]; + const RANDOM_COLOR_PARTS = [ + 'arms_3.png' => true, + 'arms_4.png' => true, + 'arms_5.png' => true, + 'arms_S1.png' => true, + 'arms_S3.png' => true, + 'arms_S5.png' => true, + 'arms_S6.png' => true, + 'arms_S7.png' => true, + 'arms_S9.png' => true, + 'hair_S1.png' => true, + 'hair_S2.png' => true, + 'hair_S3.png' => true, + 'hair_S5.png' => true, + 'legs_1.png' => true, + 'legs_2.png' => true, + 'legs_3.png' => true, + 'legs_5.png' => true, + 'legs_S1.png' => true, + 'legs_S2.png' => true, + 'legs_S3.png' => true, + 'legs_S4.png' => true, + 'legs_S6.png' => true, + 'legs_S7.png' => true, + 'legs_S10.png' => true, + 'legs_S12.png' => true, + 'mouth_3.png' => true, + 'mouth_4.png' => true, + 'mouth_7.png' => true, + 'mouth_10.png' => true, + 'mouth_S6.png' => true, + ]; + // Generated from get_parts_dimensions. + const PART_OPTIMIZATION = [ + 'legs_1.png' => [ [ 17, 99 ], [ 58, 119 ] ], + 'legs_2.png' => [ [ 25, 94 ], [ 54, 119 ] ], + 'legs_3.png' => [ [ 34, 99 ], [ 48, 117 ] ], + 'legs_4.png' => [ [ 999999, 0 ], [ 999999, 0 ] ], + 'legs_5.png' => [ [ 28, 91 ], [ 64, 119 ] ], + 'legs_S1.png' => [ [ 17, 105 ], [ 53, 118 ] ], + 'legs_S10.png' => [ [ 42, 88 ], [ 54, 118 ] ], + 'legs_S11.png' => [ [ 999999, 0 ], [ 999999, 0 ] ], + 'legs_S12.png' => [ [ 15, 107 ], [ 60, 115 ] ], + 'legs_S13.png' => [ [ 8, 106 ], [ 69, 119 ] ], + 'legs_S2.png' => [ [ 23, 99 ], [ 56, 117 ] ], + 'legs_S3.png' => [ [ 30, 114 ], [ 53, 118 ] ], + 'legs_S4.png' => [ [ 12, 100 ], [ 50, 116 ] ], + 'legs_S5.png' => [ [ 17, 109 ], [ 63, 118 ] ], + 'legs_S6.png' => [ [ 10, 100 ], [ 56, 119 ] ], + 'legs_S7.png' => [ [ 33, 78 ], [ 73, 114 ] ], + 'legs_S8.png' => [ [ 33, 95 ], [ 102, 116 ] ], + 'legs_S9.png' => [ [ 42, 75 ], [ 72, 116 ] ], + 'hair_1.png' => [ [ 999999, 0 ], [ 999999, 0 ] ], + 'hair_2.png' => [ [ 999999, 0 ], [ 999999, 0 ] ], + 'hair_3.png' => [ [ 999999, 0 ], [ 999999, 0 ] ], + 'hair_4.png' => [ [ 34, 84 ], [ 0, 41 ] ], + 'hair_5.png' => [ [ 999999, 0 ], [ 999999, 0 ] ], + 'hair_S1.png' => [ [ 25, 96 ], [ 2, 58 ] ], + 'hair_S2.png' => [ [ 45, 86 ], [ 3, 51 ] ], + 'hair_S3.png' => [ [ 15, 105 ], [ 4, 48 ] ], + 'hair_S4.png' => [ [ 15, 102 ], [ 1, 51 ] ], + 'hair_S5.png' => [ [ 16, 95 ], [ 4, 65 ] ], + 'hair_S6.png' => [ [ 28, 88 ], [ 1, 48 ] ], + 'hair_S7.png' => [ [ 51, 67 ], [ 6, 49 ] ], + 'arms_1.png' => [ [ 999999, 0 ], [ 999999, 0 ] ], + 'arms_2.png' => [ [ 999999, 0 ], [ 999999, 0 ] ], + 'arms_3.png' => [ [ 2, 119 ], [ 20, 72 ] ], + 'arms_4.png' => [ [ 2, 115 ], [ 14, 98 ] ], + 'arms_5.png' => [ [ 5, 119 ], [ 17, 90 ] ], + 'arms_S1.png' => [ [ 0, 117 ], [ 23, 109 ] ], + 'arms_S2.png' => [ [ 2, 118 ], [ 8, 75 ] ], + 'arms_S3.png' => [ [ 2, 116 ], [ 17, 93 ] ], + 'arms_S4.png' => [ [ 999999, 0 ], [ 999999, 0 ] ], + 'arms_S5.png' => [ [ 1, 115 ], [ 6, 40 ] ], + 'arms_S6.png' => [ [ 3, 117 ], [ 7, 90 ] ], + 'arms_S7.png' => [ [ 1, 116 ], [ 21, 67 ] ], + 'arms_S8.png' => [ [ 2, 119 ], [ 18, 98 ] ], + 'arms_S9.png' => [ [ 8, 110 ], [ 18, 65 ] ], + 'body_1.png' => [ [ 22, 99 ], [ 17, 90 ] ], + 'body_10.png' => [ [ 37, 85 ], [ 22, 98 ] ], + 'body_11.png' => [ [ 23, 108 ], [ 10, 106 ] ], + 'body_12.png' => [ [ 9, 113 ], [ 6, 112 ] ], + 'body_13.png' => [ [ 29, 98 ], [ 26, 97 ] ], + 'body_14.png' => [ [ 31, 93 ], [ 25, 94 ] ], + 'body_15.png' => [ [ 23, 100 ], [ 20, 97 ] ], + 'body_2.png' => [ [ 14, 104 ], [ 16, 89 ] ], + 'body_3.png' => [ [ 22, 102 ], [ 22, 93 ] ], + 'body_4.png' => [ [ 18, 107 ], [ 22, 103 ] ], + 'body_5.png' => [ [ 22, 101 ], [ 12, 99 ] ], + 'body_6.png' => [ [ 24, 103 ], [ 10, 92 ] ], + 'body_7.png' => [ [ 22, 99 ], [ 7, 92 ] ], + 'body_8.png' => [ [ 21, 103 ], [ 12, 95 ] ], + 'body_9.png' => [ [ 20, 99 ], [ 9, 91 ] ], + 'body_S1.png' => [ [ 22, 102 ], [ 25, 96 ] ], + 'body_S2.png' => [ [ 35, 94 ], [ 17, 96 ] ], + 'body_S3.png' => [ [ 30, 100 ], [ 20, 102 ] ], + 'body_S4.png' => [ [ 26, 104 ], [ 14, 92 ] ], + 'body_S5.png' => [ [ 26, 100 ], [ 16, 97 ] ], + 'eyes_1.png' => [ [ 43, 76 ], [ 31, 48 ] ], + 'eyes_10.png' => [ [ 40, 80 ], [ 32, 50 ] ], + 'eyes_11.png' => [ [ 41, 82 ], [ 31, 54 ] ], + 'eyes_12.png' => [ [ 45, 78 ], [ 30, 50 ] ], + 'eyes_13.png' => [ [ 10, 111 ], [ 10, 34 ] ], + 'eyes_14.png' => [ [ 40, 79 ], [ 21, 56 ] ], + 'eyes_15.png' => [ [ 49, 72 ], [ 38, 43 ] ], + 'eyes_2.png' => [ [ 37, 72 ], [ 36, 53 ] ], + 'eyes_3.png' => [ [ 47, 75 ], [ 31, 53 ] ], + 'eyes_4.png' => [ [ 999999, 0 ], [ 999999, 0 ] ], + 'eyes_5.png' => [ [ 44, 77 ], [ 43, 52 ] ], + 'eyes_6.png' => [ [ 43, 57 ], [ 35, 49 ] ], + 'eyes_7.png' => [ [ 62, 76 ], [ 35, 49 ] ], + 'eyes_8.png' => [ [ 45, 72 ], [ 23, 51 ] ], + 'eyes_9.png' => [ [ 999999, 0 ], [ 999999, 0 ] ], + 'eyes_S1.png' => [ [ 41, 82 ], [ 29, 52 ] ], + 'eyes_S2.png' => [ [ 999999, 0 ], [ 999999, 0 ] ], + 'eyes_S3.png' => [ [ 34, 88 ], [ 39, 52 ] ], + 'eyes_S4.png' => [ [ 47, 74 ], [ 39, 51 ] ], + 'eyes_S5.png' => [ [ 41, 76 ], [ 36, 51 ] ], + 'mouth_1.png' => [ [ 999999, 0 ], [ 999999, 0 ] ], + 'mouth_10.png' => [ [ 40, 84 ], [ 56, 89 ] ], + 'mouth_2.png' => [ [ 57, 65 ], [ 56, 61 ] ], + 'mouth_3.png' => [ [ 38, 85 ], [ 54, 72 ] ], + 'mouth_4.png' => [ [ 44, 77 ], [ 56, 81 ] ], + 'mouth_5.png' => [ [ 53, 72 ], [ 59, 76 ] ], + 'mouth_6.png' => [ [ 48, 74 ], [ 56, 77 ] ], + 'mouth_7.png' => [ [ 51, 70 ], [ 57, 80 ] ], + 'mouth_8.png' => [ [ 44, 81 ], [ 64, 78 ] ], + 'mouth_9.png' => [ [ 49, 75 ], [ 52, 103 ] ], + 'mouth_S1.png' => [ [ 47, 82 ], [ 57, 73 ] ], + 'mouth_S2.png' => [ [ 45, 71 ], [ 65, 84 ] ], + 'mouth_S3.png' => [ [ 48, 77 ], [ 56, 86 ] ], + 'mouth_S4.png' => [ [ 46, 77 ], [ 56, 73 ] ], + 'mouth_S5.png' => [ [ 55, 69 ], [ 55, 98 ] ], + 'mouth_S6.png' => [ [ 40, 79 ], [ 56, 72 ] ], + 'mouth_S7.png' => [ [ 999999, 0 ], [ 999999, 0 ] ], + ]; + + /** + * The color conversion helper. + * + * @since 2.7.0 + * + * @var Images\Color + */ + protected Images\Color $color; + + /** + * Creates a new instance. + * + * @since 2.1.0 Parameter $plugin_file removed. + * + * @param Images\Editor $editor The image editing handler. + * @param Images\PNG $png The PNG image helper. + * @param Images\Color $color The color conversion helper. + * @param Number_Generator $number_generator A pseudo-random number generator. + * @param Site_Transients $site_transients The site transients handler. + */ + public function __construct( + Images\Editor $editor, + Images\PNG $png, + Images\Color $color, + Number_Generator $number_generator, + Site_Transients $site_transients + ) { + parent::__construct( + \AVATAR_PRIVACY_PLUGIN_PATH . '/public/images/monster-id', + self::PARTS, + 120, + $editor, + $png, + $number_generator, + $site_transients + ); + + $this->color = $color; + } + + /** + * Prepares additional arguments needed for rendering the avatar image. + * + * @param string $seed The seed data (hash). + * @param int $size The size in pixels. + * @param array $parts The (randomized) avatar parts. + * + * @return array + * + * @phpstan-param RandomizedParts $parts + * @phpstan-return AdditionalArguments + */ + protected function get_additional_arguments( $seed, $size, array $parts ) { + return [ + self::COLOR_HUE => $this->get_hue(), + self::COLOR_SATURATION => $this->get_saturation( 25, 100 ), + ]; + } + + /** + * Renders the avatar from its parts, using any of the given additional arguments. + * + * @since 2.5.0 Returns a resource or GdImage instance, depending on the PHP version. + * + * @param array $parts The (randomized) avatar parts. + * @param array $args Any additional arguments defined by the subclass. + * + * @return resource|GdImage + * + * @phpstan-param RandomizedParts $parts + * @phpstan-param AdditionalArguments $args + */ + protected function render_avatar( array $parts, array $args ) { + // Create background. + $monster = $this->png->create_from_file( "{$this->parts_dir}/back.png" ); + + // Add parts. + foreach ( $parts as $part => $file ) { + $im = $this->png->create_from_file( "{$this->parts_dir}/{$file}" ); + + // Randomly color body parts. + if ( self::PART_BODY === $part || isset( self::SAME_COLOR_PARTS[ $file ] ) ) { + // Use the main color. + $this->colorize_image( $im, $args[ self::COLOR_HUE ], $args[ self::COLOR_SATURATION ], $file ); + } elseif ( isset( self::RANDOM_COLOR_PARTS[ $file ] ) ) { + $this->colorize_image( + $im, + $this->get_hue(), + $this->get_saturation( 25, 100 ), + $file + ); + } elseif ( isset( self::SPECIFIC_COLOR_PARTS[ $file ] ) ) { + // Retrieve specific hue range. + list( $low, $high ) = self::SPECIFIC_COLOR_PARTS[ $file ]; + + $this->colorize_image( + $im, + $this->get_hue( $low, $high ), + $this->get_saturation( 25, 100 ), + $file + ); + } + + $this->combine_images( $monster, $im ); + } + + return $monster; + } + + /** + * Adds color to the given image. + * + * @since 2.1.0 Visibility changed to protected. + * @since 2.3.0 Name changed to colorize_image() for consistency. + * @since 2.5.0 Parameter $image can now also be a GdImage. Returns a resource + * or GdImage instance, depending on the PHP version. + * @since 2.7.0 Default values removed and PHPStan annotation added. + * Parameter $part renamed to $file. + * + * @param resource|GdImage $image The image. + * @param int $hue The hue (0-360). + * @param int $saturation The saturation (0-100). + * @param string $file The image filename. + * + * @return resource|GdImage The image, for chaining. + * + * @phpstan-param Hue $hue + * @phpstan-param Saturation $saturation + */ + protected function colorize_image( $image, $hue, $saturation, $file ) { + // Ensure non-negative hue. + $hue = $this->color->normalize_hue( $hue ); + + \imageAlphaBlending( $image, false ); + if ( isset( self::PART_OPTIMIZATION[ $file ] ) ) { + $xmin = self::PART_OPTIMIZATION[ $file ][0][0]; + $xmax = self::PART_OPTIMIZATION[ $file ][0][1]; + $ymin = self::PART_OPTIMIZATION[ $file ][1][0]; + $ymax = self::PART_OPTIMIZATION[ $file ][1][1]; + } else { + $xmin = 0; + $xmax = \imageSX( $image ) - 1; + $ymin = 0; + $ymax = \imageSY( $image ) - 1; + } + + for ( $i = $xmin; $i <= $xmax; $i++ ) { + for ( $j = $ymin; $j <= $ymax; $j++ ) { + $rgb = \imageColorAt( $image, $i, $j ); + $r = ( $rgb >> 16 ) & 0xFF; + $g = ( $rgb >> 8 ) & 0xFF; + $b = $rgb & 0xFF; + $alpha = ( $rgb & 0x7F000000 ) >> 24; + $lightness = (int) ( ( $r + $g + $b ) / 3 / 255 * Images\Color::MAX_PERCENT ); + if ( $lightness > 10 && $lightness < 99 && $alpha < 115 ) { + // Convert HSL color to RGB. + list( $r, $g, $b ) = $this->color->hsl_to_rgb( $hue, $saturation, $lightness ); + + // Change color of pixel. + $color = \imageColorAllocateAlpha( $image, $r, $g, $b, $alpha ); + if ( false !== $color ) { + \imageSetPixel( $image, $i, $j, $color ); + } + } + } + } + \imageAlphaBlending( $image, true ); + + return $image; + } + + /** + * Generates a random hue. + * + * @param int $min Optional. The lower bound. Default 0. + * @param int $max Optional. The upper bound. Default 359. + * + * @return int + * + * @phpstan-param Hue $min + * @phpstan-param Hue $max + * @phpstan-return Hue + */ + protected function get_hue( int $min = 0, int $max = Images\Color::MAX_DEGREE - 1 ) { + assert( $min > - Images\Color::MAX_DEGREE && $max < Images\Color::MAX_DEGREE && $min < $max ); + + /** + * Return a pseudo-random hue between the lower and the upper bound. + * + * @phpstan-var Hue + */ + return $this->number_generator->get( $min, $max ); + } + + /** + * Generates a random saturation level. + * + * @param int $min Optional. The lower bound. Default 0 percent. + * @param int $max Optional. The upper bound. Default 100 percent. + * + * @return int + * + * @phpstan-param Saturation $min + * @phpstan-param Saturation $max + * @phpstan-return Saturation + */ + protected function get_saturation( int $min = 0, int $max = Images\Color::MAX_PERCENT ) { + assert( $min >= 0 && $max <= Images\Color::MAX_PERCENT && $min < $max ); + + /** + * Return a pseudo-random saturation level between the lower and the upper bound. + * + * @phpstan-var Saturation + */ + return $this->number_generator->get( $min, $max ); + } +} diff --git a/includes/avatar-privacy/avatar-handlers/default-icons/generators/class-parts-generator.php b/includes/avatar-privacy/avatar-handlers/default-icons/generators/class-parts-generator.php new file mode 100644 index 0000000..17bdf5f --- /dev/null +++ b/includes/avatar-privacy/avatar-handlers/default-icons/generators/class-parts-generator.php @@ -0,0 +1,321 @@ + + * + * @phpstan-type PartType string + * @phpstan-type PartsTemplate array + * @phpstan-type AllPossibleParts array + * @phpstan-type RandomizedParts array + * @phpstan-type AdditionalArguments array + */ +abstract class Parts_Generator implements Generator { + + /** + * The path to the monster parts image files. + * + * @var string + */ + protected string $parts_dir; + + /** + * An array of part types. + * + * @var string[] + */ + protected array $part_types; + + /** + * Lists of files, indexed by part types. + * + * @since 2.4.0 Property renamed to $all_parts, visibility changed to private. + * + * @var array { + * @type string[] $type An array of files. + * } + * + * @phpstan-var array + */ + private array $all_parts; + + /** + * The random number generator. + * + * @var Number_Generator + */ + protected Number_Generator $number_generator; + + /** + * The site transients handler. + * + * @var Site_Transients + */ + private Site_Transients $site_transients; + + /** + * Creates a new generator. + * + * @param string $parts_dir The directory containing our image parts. + * @param string[] $part_types The valid part types for this generator. + * @param Number_Generator $number_generator A pseudo-random number generator. + * @param Site_Transients $site_transients The site transients handler. + */ + public function __construct( + $parts_dir, + array $part_types, + Number_Generator $number_generator, + Site_Transients $site_transients + ) { + $this->parts_dir = $parts_dir; + $this->part_types = $part_types; + $this->number_generator = $number_generator; + $this->site_transients = $site_transients; + } + + /** + * Builds an icon based on the given seed returns the image data. + * + * @param string $seed The seed data (hash). + * @param int $size The size in pixels. + * + * @return string|false + */ + public function build( $seed, $size ) { + try { + // Set randomness from seed. + $this->number_generator->seed( $seed ); + + // Throw the dice for avatar parts. + $parts = $this->get_randomized_parts(); + + // Prepare any additional arguments needed. + $args = $this->get_additional_arguments( $seed, $size, $parts ); + + // Build the avatar image in its final size. + return $this->get_avatar( $size, $parts, $args ); + } catch ( \Exception $e ) { + // Something went wrong but don't want to mess up blog layout. + return false; + } finally { + // Reset randomness to something unknonwn. + $this->number_generator->reset(); + } + } + + /** + * Retrieves the "randomized" parts for the avatar being built. + * + * @return array A simple array of files, indexed by part. + * + * @throws Part_Files_Not_Found_Exception The part files could not be found. + * + * @phpstan-return RandomizedParts + */ + protected function get_randomized_parts() { + return $this->randomize_parts( $this->get_parts() ); + } + + /** + * Prepares any additional arguments needed for rendering the avatar image. + * + * The arguments will be passed to `render_avatar()`. + * + * @param string $seed The seed data (hash). + * @param int $size The size in pixels. + * @param array $parts The (randomized) avatar parts. + * + * @return array + * + * @phpstan-param RandomizedParts $parts + * @phpstan-return AdditionalArguments + */ + protected function get_additional_arguments( $seed, $size, array $parts ) { + return []; + } + + /** + * Renders the avatar from its parts in the given size, using any of the + * optional additional arguments. + * + * @param int $size The target image size in pixels. + * @param array $parts The (randomized) avatar parts. + * @param array $args Any additional arguments defined by the subclass. + * + * @return string The image data (bytes). + * + * @phpstan-param RandomizedParts $parts + * @phpstan-param AdditionalArguments $args + */ + abstract protected function get_avatar( $size, array $parts, array $args ); + + /** + * Throws the dice for parts. + * + * @param array $parts An array of arrays containing all parts definitions. + * + * @return array A simple array of part definitions, indexed by type. + * + * @phpstan-param AllPossibleParts $parts + * @phpstan-return RandomizedParts + */ + protected function randomize_parts( array $parts ) { + $randomized_parts = []; + + // Throw the dice for every part type. + foreach ( $parts as $type => $list ) { + $randomized_parts[ $type ] = $list[ $this->get_random_part_index( $type, \count( $list ) ) ]; + } + + return $randomized_parts; + } + + /** + * Generates a random but valid part index based on the type and number of parts. + * + * @param string $type The part type. + * @param int $count The number of different parts of the type. + * + * @return int + */ + protected function get_random_part_index( $type, $count ) { + return $this->number_generator->get( 0, $count - 1 ); + } + + /** + * Retrieves the avatar parts image files. + * + * @return array { + * An array of file lists indexed by the part name. + * + * @type string[] $part An array of part definitions (the exact content + * is determined by the subclasses). + * } + * + * @throws Part_Files_Not_Found_Exception The part files could not be found. + * + * @phpstan-return AllPossibleParts + */ + protected function get_parts() { + if ( empty( $this->all_parts ) ) { + // Calculate transient key. + $basename = \basename( $this->parts_dir ); + $key = "avatar_privacy_{$basename}_parts"; + + // Check existence of transient first. + $cached_parts = $this->site_transients->get( $key ); + if ( \is_array( $cached_parts ) && ! empty( $cached_parts ) ) { + /** + * The cached parts look good, let's use those. + * + * @phpstan-var AllPossibleParts $cached_parts + */ + $this->all_parts = $cached_parts; + } else { + // Look at the actual filesystem. + $this->all_parts = $this->build_parts_array(); + + // Only store transient if we got a result. + if ( ! empty( $this->all_parts ) ) { + $this->site_transients->set( $key, $this->all_parts, \YEAR_IN_SECONDS ); + } + } + } + + return $this->all_parts; + } + + /** + * Builds a sorted array of parts. + * + * @return array { + * An array of part type definitions. + * + * @type string $type The part definition list, indexed by type. + * } + * + * @throws Part_Files_Not_Found_Exception The part files could not be found. + * + * @phpstan-return AllPossibleParts + */ + protected function build_parts_array() { + // Make sure the keys are in the correct order. + $empty_parts = \array_fill_keys( $this->part_types, [] ); + + // Read part definitions. + $parts = $this->read_parts_from_filesystem( $empty_parts ); + + // Raise an exception if there were no files found. + if ( $parts === $empty_parts ) { + throw new Part_Files_Not_Found_Exception( "Could not find parts images in {$this->parts_dir}" ); + } + + return $this->sort_parts( $parts ); + } + + /** + * Retrieves an array of SVG part type definitions. + * + * @param array $parts An array of empty arrays indexed by part type. + * + * @return array The same array, but now containing the part type definitions. + * + * @phpstan-param array $parts + * @phpstan-return AllPossibleParts + */ + abstract protected function read_parts_from_filesystem( array $parts ); + + /** + * Sorts the parts array to be independent of filesystem sort order. + * + * @param array $parts { + * An array of part type definitions. + * + * @type string $type The part definition list, indexed by type. + * } + * + * @return array + * + * @phpstan-param AllPossibleParts $parts + * @phpstan-return AllPossibleParts + */ + abstract protected function sort_parts( array $parts ); +} diff --git a/includes/avatar-privacy/avatar-handlers/default-icons/generators/class-png-parts-generator.php b/includes/avatar-privacy/avatar-handlers/default-icons/generators/class-png-parts-generator.php new file mode 100644 index 0000000..b0fc3fa --- /dev/null +++ b/includes/avatar-privacy/avatar-handlers/default-icons/generators/class-png-parts-generator.php @@ -0,0 +1,383 @@ + + * @author Scott Sherrill-Mix + * + * @phpstan-import-type PartsTemplate from Parts_Generator + * @phpstan-import-type AllPossibleParts from Parts_Generator + * @phpstan-import-type RandomizedParts from Parts_Generator + * @phpstan-import-type AdditionalArguments from Parts_Generator + * + * @phpstan-type BoundsTuple array{ 0: int, 1: int } + */ +abstract class PNG_Parts_Generator extends Parts_Generator { + + // Units used in HSL colors. + /** + * Use Image\Color::MAX_PERCENT instead. + * + * @deprecated 2.7.0 + */ + const PERCENT = Images\Color::MAX_PERCENT; + /** + * Use Image\Color::MAX_DEGREE instead. + * + * @deprecated 2.7.0 + */ + const DEGREE = Images\Color::MAX_DEGREE; + + /** + * The base size of the generated avatar. + * + * @var int + */ + protected int $size; + + /** + * The image editor support class. + * + * @var Images\Editor + */ + private Images\Editor $editor; + + /** + * The PNG image helper. + * + * @var Images\PNG + */ + protected Images\PNG $png; + + /** + * Creates a new generator. + * + * @param string $parts_dir The directory containing our image parts. + * @param string[] $part_types The valid part types for this generator. + * @param int $size The width and height of the generated image (in pixels). + * @param Images\Editor $editor The image editing handler. + * @param Images\PNG $png The PNG image helper. + * @param Number_Generator $number_generator A pseudo-random number generator. + * @param Site_Transients $site_transients The site transients handler. + */ + public function __construct( + $parts_dir, + array $part_types, + $size, + Images\Editor $editor, + Images\PNG $png, + Number_Generator $number_generator, + Site_Transients $site_transients + ) { + $this->size = $size; + $this->editor = $editor; + $this->png = $png; + + parent::__construct( $parts_dir, $part_types, $number_generator, $site_transients ); + } + + /** + * Renders the avatar from its parts in the given size, using any of the + * optional additional arguments. + * + * @param int $size The target image size in pixels. + * @param array $parts The (randomized) avatar parts. + * @param array $args Any additional arguments defined by the subclass. + * + * @return string The image data (bytes). + * + * @phpstan-param RandomizedParts $parts + * @phpstan-param AdditionalArguments $args + */ + protected function get_avatar( $size, array $parts, array $args ) { + // Build the avatar image in its native size. + $avatar = $this->render_avatar( $parts, $args ); + + // Resize if necessary. + return $this->get_resized_image_data( $avatar, $size ); + } + + /** + * Renders the avatar from its parts, using any of the given additional arguments. + * + * @since 2.7.0 Return type amended to include `GdImage` on PHP 8.x + * + * @param array $parts The (randomized) avatar parts. + * @param array $args Any additional arguments defined by the subclass. + * + * @return resource|GdImage + * + * @phpstan-param RandomizedParts $parts + * @phpstan-param AdditionalArguments $args + */ + abstract protected function render_avatar( array $parts, array $args ); + + /** + * Resizes the image and returns the raw data. + * + * @since 2.5.0 Parameter $image can now also be a GdImage. + * + * @param resource|GdImage $image The image resource. + * @param int $size The size in pixels. + * + * @return string The image data (or the empty string on error). + */ + protected function get_resized_image_data( $image, $size ) { + return $this->editor->get_resized_image_data( + $this->editor->create_from_image_resource( $image ), $size, $size, 'image/png' + ); + } + + /** + * Retrieves an array of SVG part type definitions. + * + * @param array $parts An array of empty arrays indexed by part type. + * + * @return array The same array, but now containing the part type definitions. + * + * @phpstan-param PartsTemplate $parts + * @phpstan-return AllPossibleParts + */ + protected function read_parts_from_filesystem( array $parts ) { + // Iterate over the files in the parts directory. + $dir = new \FilesystemIterator( + $this->parts_dir, + \FilesystemIterator::KEY_AS_FILENAME | + \FilesystemIterator::CURRENT_AS_PATHNAME | + \FilesystemIterator::SKIP_DOTS + ); + + foreach ( $dir as $file => $path ) { + list( $partname, ) = \explode( '_', $file ); + if ( isset( $parts[ $partname ] ) ) { + $parts[ $partname ][] = $file; + } + } + + return $parts; + } + + /** + * Sorts the parts array to be independent of filesystem sort order. + * + * @param array $parts { + * An array of part type definitions. + * + * @type string $type The part definition list, indexed by type. + * } + * + * @return array + * + * @phpstan-param AllPossibleParts $parts + * @phpstan-return AllPossibleParts + */ + protected function sort_parts( array $parts ) { + foreach ( $parts as $key => $value ) { + \sort( $parts[ $key ], \SORT_NATURAL ); + } + + return $parts; + } + + /** + * Creates a GD image of the chosen type with the set avatar size for width + * and height. + * + * @since 2.3.0 + * @since 2.5.0 Returns a resource or GdImage instance, depending on the PHP version. + * + * @param string $type The type of background to create. Valid: 'white', 'black', 'transparent'. + * + * @return resource|GdImage + * + * @throws \RuntimeException The image could not be copied. + */ + protected function create_image( $type ) { + return $this->png->create( $type, $this->size, $this->size ); + } + + /** + * Copies an image onto an existing base image. Image parts are loaded from + * the parts directory if a filename is given, assuming the avatar size for + * width and height. + * + * The GD image (resource) is freed after copying. + * + * @since 2.5.0 Parameters $base and $image can now also be GdImage instances. + * + * @param resource|GdImage $base The avatar image resource. + * @param string|resource|GdImage $image The image to be copied onto the base. Can + * be either the name of the image file + * relative to the parts directory, or an + * existing image resource. + * + * @return void + * + * @throws \RuntimeException The image could not be copied. + */ + protected function combine_images( $base, $image ) { + // Load image if we are given a filename. + if ( \is_string( $image ) ) { + $image = $this->png->create_from_file( "{$this->parts_dir}/{$image}" ); + } + + $this->png->combine( $base, $image, $this->size, $this->size ); + } + + /** + * Determines exact dimensions for individual parts. Mainly useful for subclasses + * exchanging the provided images. + * + * @since 2.1.0 Visibility changed to protected. + * @since 2.3.0 Moved to PNG_Parts_Generator class and paramter $text removed. + * Use new method `get_parts_dimensions_as_text` to retrieve the + * human-readable array definition. + * + * @author Peter Putzer + * @author Scott Sherrill-Mix + * + * @return array { + * An array of boundary coordinates indexed by filename. + * + * @type array $file { + * The boundary coordinates for a single file. + * + * @type int[] $xbounds The low and high boundary on the X axis. + * @type int[] $ybounds The low and high boundary on the Y axis. + * } + * } + * + * @phpstan-return array + */ + protected function get_parts_dimensions() { + /** + * An array of boundary coordinates indexed by filename. + * + * @phpstan-var array $bounds + */ + $bounds = []; + + foreach ( $this->get_parts() as $file_list ) { + foreach ( $file_list as $file ) { + $im = @\imageCreateFromPNG( "{$this->parts_dir}/{$file}" ); + + if ( false === $im ) { + // Not a valid image file. + continue; + } + + $bounds[ $file ] = $this->get_image_bounds( $im ); + } + } + + return $bounds; + } + + /** + * Determines exact dimensions for an image (i.e. not including very light or + * transparent pixels). + * + * @since 2.4.0 Extracted from ::get_parts_dimensions. + * @since 2.5.0 Parameter $im can now also be a GdImage. + * + * @author Peter Putzer + * @author Scott Sherrill-Mix + * + * @param resource|GdImage $im The image resource. + * + * @return array { + * The boundary coordinates for the image. + * + * @type int[] $xbounds The low and high boundary on the X axis. + * @type int[] $ybounds The low and high boundary on the Y axis. + * } + * + * @phpstan-return array{ 0: BoundsTuple, 1: BoundsTuple } + */ + protected function get_image_bounds( $im ) { + $imgw = \imageSX( $im ); + $imgh = \imageSY( $im ); + $xbounds = [ 999999, 0 ]; + $ybounds = [ 999999, 0 ]; + for ( $i = 0;$i < $imgw;$i++ ) { + for ( $j = 0;$j < $imgh;$j++ ) { + $rgb = \imageColorAt( $im, $i, $j ); + $r = ( $rgb >> 16 ) & 0xFF; + $g = ( $rgb >> 8 ) & 0xFF; + $b = $rgb & 0xFF; + $alpha = ( $rgb & 0x7F000000 ) >> 24; + $lightness = ( $r + $g + $b ) / 3 / Images\Color::MAX_RGB * Images\Color::MAX_PERCENT; + if ( $lightness > 10 && $lightness < 99 && $alpha < 115 ) { + $xbounds[0] = \min( $xbounds[0],$i ); + $xbounds[1] = \max( $xbounds[1],$i ); + $ybounds[0] = \min( $ybounds[0],$j ); + $ybounds[1] = \max( $ybounds[1],$j ); + } + } + } + + return [ $xbounds, $ybounds ]; + } + + /** + * Prints the exact dimensions for individual parts as human-readable PHP + * array definitions. + * + * Mainly useful for subclasses exchanging the provided images. + * + * @since 2.3.0 + * + * @return string + */ + protected function get_parts_dimensions_as_text() { + $result = ''; + + foreach ( $this->get_parts_dimensions() as $part => $bounds ) { + list( $xbounds, $ybounds ) = $bounds; + + $result .= "'$part' => [ [ {$xbounds[0]}, {$xbounds[1]} ], [ {$ybounds[0]}, {$ybounds[1]} ] ],\n"; + } + + return $result; + } +} diff --git a/includes/avatar-privacy/avatar-handlers/default-icons/generators/class-retro.php b/includes/avatar-privacy/avatar-handlers/default-icons/generators/class-retro.php new file mode 100644 index 0000000..3983bbc --- /dev/null +++ b/includes/avatar-privacy/avatar-handlers/default-icons/generators/class-retro.php @@ -0,0 +1,198 @@ + + * Copyright (c) 2015 Grummfy + * Copyright (c) 2016, 2017 Lucas Michot + * Copyright (c) 2019 Arjen van der Meijden + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is furnished + * to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * *** + * + * @package mundschenk-at/avatar-privacy + * @license http://www.gnu.org/licenses/gpl-2.0.html + */ + +namespace Avatar_Privacy\Avatar_Handlers\Default_Icons\Generators; + +use Avatar_Privacy\Avatar_Handlers\Default_Icons\Generator; + +use Avatar_Privacy\Tools\Number_Generator; +use Avatar_Privacy\Tools\Template; + +use Avatar_Privacy\Vendor\Colors\RandomColor; + +/** + * Generates a "retro" SVG icon based on a hash. + * + * @since 1.0.0 + * @since 2.0.0 Moved to Avatar_Privacy\Avatar_Handlers\Default_Icons\Generators + * @since 2.7.0 Now directly incorporates the SVG generation code from the + * deprecated package `yzalis/identicon`. + * + * @author Peter Putzer + * @author Grummfy + */ +class Retro implements Generator { + + private const NUMBER_OF_PIXELS = 5; + + private const DIVIDER = 3; + + private const POSSIBLE_COLUMNS = [ + 0 => [ 0, 4 ], + 1 => [ 1, 3 ], + 2 => [ 2 ], + ]; + + /** + * The random number generator. + * + * @since 2.3.0 + * + * @var Number_Generator + */ + protected Number_Generator $number_generator; + + + /** + * The templating handler. + * + * @since 2.7.0 + * + * @var Template + */ + protected Template $template; + + + /** + * Creates a new instance. + * + * @since 2.1.0 Parameter `$identicon` added. + * @since 2.3.0 Parameter `$number_generator` added. + * @since 2.7.0 Parameter `$template` added. + * + * @param Number_Generator $number_generator A pseudo-random number generator. + * @param Template $template The templating handler. + */ + public function __construct( Number_Generator $number_generator, Template $template ) { + $this->number_generator = $number_generator; + $this->template = $template; + } + + /** + * Builds an icon based on the given seed returns the image data. + * + * @param string $seed The seed data (hash). + * @param int $size Optional. The size in pixels. Default 128 (but really ignored). + * + * @return string + */ + public function build( $seed, $size = 128 ) { + // Initialize random number with seed. + $this->number_generator->seed( $seed ); + + // Generate icon. + $bitmap = $this->get_bitmap( \md5( $seed ) ); // The seed is already hashed, but we want to generate the same result as earlier versions did using `yzalis/identicon`. + $args = [ + 'rows' => \count( $bitmap ), + 'columns' => \count( $bitmap[1] ), + 'path' => $this->draw_path( $bitmap ), + 'color' => RandomColor::one( [ 'luminosity' => 'bright' ] ), + 'bg_color' => RandomColor::one( [ 'luminosity' => 'light' ] ), + ]; + $result = $this->template->get_partial( 'public/partials/retro/svg.php', $args ); + + // Restore randomness. + $this->number_generator->reset(); + + return $result; + } + + /** + * Converts the hash into an two-dimensional array of boolean. + * + * @since 2.7.0 + * + * @param string $hash The MD5 hash. + * + * @return array> + */ + protected function get_bitmap( string $hash ): array { + $bitmap = []; + + foreach ( \array_slice( \str_split( $hash, 2 ), 0, self::NUMBER_OF_PIXELS * self::DIVIDER ) as $i => $hex_tuple ) { + $row = (int) ( $i / self::DIVIDER ); + $pixel = (bool) \round( \hexdec( $hex_tuple[0] ) / 10 ); + + foreach ( self::POSSIBLE_COLUMNS[ $i % self::DIVIDER ] as $column ) { + $bitmap[ $row ][ $column ] = $pixel; + } + + \ksort( $bitmap[ $row ] ); + } + + return $bitmap; + } + + /** + * Draws an SVG path from the given bitmap. + * + * @since 2.7.0 + * + * @param array $bitmap A two-dimensional array of boolean pixel values. + * + * @return string + * + * @phpstan-param array> $bitmap + */ + protected function draw_path( array $bitmap ): string { + $rects = []; + foreach ( $bitmap as $line_key => $line_value ) { + foreach ( $line_value as $col_key => $col_value ) { + if ( true === $col_value ) { + $rects[] = 'M' . $col_key . ',' . $line_key . 'h1v1h-1v-1'; + } + } + } + + return \implode( '', $rects ); + } +} diff --git a/includes/avatar-privacy/avatar-handlers/default-icons/generators/class-rings.php b/includes/avatar-privacy/avatar-handlers/default-icons/generators/class-rings.php new file mode 100644 index 0000000..ac4b3c3 --- /dev/null +++ b/includes/avatar-privacy/avatar-handlers/default-icons/generators/class-rings.php @@ -0,0 +1,55 @@ + + */ +class Rings extends RingIconSVG implements Generator { + + /** + * Builds an icon based on the given seed returns the image data. + * + * @param string $seed The seed data (hash). + * @param int $size The size in pixels (ignored for SVG images). + * + * @return string|false + */ + public function build( $seed, $size ) { + return $this->generateSVGImage( $seed, true ); + } +} diff --git a/includes/avatar-privacy/avatar-handlers/default-icons/generators/class-robohash.php b/includes/avatar-privacy/avatar-handlers/default-icons/generators/class-robohash.php new file mode 100644 index 0000000..da666d4 --- /dev/null +++ b/includes/avatar-privacy/avatar-handlers/default-icons/generators/class-robohash.php @@ -0,0 +1,275 @@ + + * + * @phpstan-type PartType value-of + * @phpstan-type PartsTemplate array + * @phpstan-type AllPossibleParts array + * @phpstan-type RandomizedParts array + * @phpstan-type AdditionalArguments array{ color: value-of, bg_color: value-of } + */ +class Robohash extends Parts_Generator { + // Robot parts. + private const PART_BODY = 'body'; + private const PART_FACE = 'face'; + private const PART_EYES = 'eyes'; + private const PART_MOUTH = 'mouth'; + private const PART_ACCESSORY = 'accessory'; + + /** + * All Robot parts in their natural order. + * + * @since 2.7.0 + */ + private const PARTS = [ + self::PART_BODY, + self::PART_FACE, + self::PART_EYES, + self::PART_MOUTH, + self::PART_ACCESSORY, + ]; + + const COLORS = [ + '#ff9800', // orange-500. + '#E53935', // red-600. + '#FDD835', // yellow-600. + '#3f51b5', // indigo-500. + '#03a9f4', // light-blue-500. + '#9c27b0', // purple-500. + '#009688', // teal-500. + '#EC407A', // pink-400. + '#8bc34a', // light-green-500. + '#795548', // brown-500. + ]; + + const BG_COLORS = [ + /* Red */ + '#FF8A80', // red-a100. + '#F48FB1', // pink-200. + '#ea80fc', // purple-a100. + + /* Blue */ + '#8c9eff', // indigo-a100. + '#80d8ff', // light-blue-a100. + '#CFD8DC', // blue-grey-100. + + /* Green */ + '#1DE9B6', // teal-a400. + '#00C853', // green-a-700. + + /* Orange */ + '#FF9E80', // deep-orange-a100. + '#FFE57F', // amber-a100. + ]; + + /** + * The templating handler. + * + * @var Template + */ + private $template; + + /** + * Creates a new instance. + * + * @since 2.4.0 Parameter $template added. + * + * @param Number_Generator $number_generator A pseudo-random number generator. + * @param Site_Transients $site_transients The transients handler. + * @param Template $template The templating handler. + */ + public function __construct( Number_Generator $number_generator, Site_Transients $site_transients, Template $template ) { + parent::__construct( + \dirname( \AVATAR_PRIVACY_PLUGIN_FILE ) . '/public/images/robohash', + self::PARTS, + $number_generator, + $site_transients + ); + + $this->template = $template; + } + + /** + * Prepares any additional arguments needed for rendering the avatar image. + * + * The arguments will be passed to `render_avatar()`. + * + * @param string $seed The seed data (hash). + * @param int $size The size in pixels. + * @param array $parts The (randomized) avatar parts. + * + * @return array + * + * @phpstan-param RandomizedParts $parts + * @phpstan-return AdditionalArguments + */ + protected function get_additional_arguments( $seed, $size, array $parts ) { + // Randomize colors. + return [ + 'color' => self::COLORS[ $this->number_generator->get( 0, \count( self::COLORS ) - 1 ) ], + 'bg_color' => self::BG_COLORS[ $this->number_generator->get( 0, \count( self::BG_COLORS ) - 1 ) ], + ]; + } + + /** + * Renders the avatar from its parts in the given size, using any of the + * optional additional arguments. + * + * @param int $size The target image size in pixels. + * @param array $parts The (randomized) avatar parts. + * @param array $args Any additional arguments defined by the subclass. + * + * @return string The image data (bytes). + * + * @phpstan-param RandomizedParts $parts + * @phpstan-param AdditionalArguments $args + */ + protected function get_avatar( $size, array $parts, array $args ) { + + // Add robot parts to arguments. + $args[ self::PART_BODY ] = $parts[ self::PART_BODY ]; + $args[ self::PART_FACE ] = $parts[ self::PART_FACE ]; + $args[ self::PART_EYES ] = $parts[ self::PART_EYES ]; + $args[ self::PART_MOUTH ] = $parts[ self::PART_MOUTH ]; + $args[ self::PART_ACCESSORY ] = $parts[ self::PART_ACCESSORY ]; + + return $this->template->get_partial( 'public/partials/robohash/svg.php', $args ); + } + + /** + * Retrieves an array of SVG part type definitions. + * + * @param array $parts An array of empty arrays indexed by part type. + * + * @return array The same array, but now containing the part type definitions. + * + * @phpstan-param PartsTemplate $parts + * @phpstan-return AllPossibleParts + */ + protected function read_parts_from_filesystem( array $parts ) { + // Get a recursive depth-first iterator over the part type directories. + $dir = new \RecursiveIteratorIterator( + new \RecursiveDirectoryIterator( + $this->parts_dir, + \FilesystemIterator::KEY_AS_FILENAME | + \FilesystemIterator::CURRENT_AS_FILEINFO | + \FilesystemIterator::SKIP_DOTS + ), + \RecursiveIteratorIterator::CHILD_FIRST + ); + + /** + * Iterate over the files in the parts directory. + * + * @var string $file + * @var \SplFileInfo $info + */ + foreach ( $dir as $file => $info ) { + if ( ! $info->isFile() ) { + continue; + } + + /** + * Extract the part from the filename. + * + * @phpstan-var PartType $partname + */ + list( $partname, ) = \explode( '-', $file ); + if ( isset( $parts[ $partname ] ) ) { + $parts[ $partname ][ $file ] = $this->prepare_svg_part( + (string) \file_get_contents( $info ) // phpcs:ignore WordPress.WP.AlternativeFunctions.file_get_contents_file_get_contents + ); + } + } + + return $parts; + } + + /** + * Sorts the parts array to be independent of filesystem sort order. + * + * @param array $parts { + * An array of part type definitions. + * + * @type string $type The part definition list, indexed by type. + * } + * + * @return array + * + * @phpstan-param AllPossibleParts $parts + * @phpstan-return AllPossibleParts + */ + protected function sort_parts( array $parts ) { + foreach ( $parts as $key => $list ) { + \ksort( $list, \SORT_NATURAL ); + $parts[ $key ] = \array_values( $list ); + } + + return $parts; + } + + /** + * Prepares SVG elements for inclusion as robot parts. + * + * @param string $svg The part to include. + * + * @return string + */ + protected function prepare_svg_part( $svg ) { + $svg = \preg_replace( + [ + '#]+>(.*)#', + '/#26a9e0/', + ], [ + '$1', + 'currentColor', + ], + $svg + ); + + return "{$svg}"; + } +} diff --git a/includes/avatar-privacy/avatar-handlers/default-icons/generators/class-wavatar.php b/includes/avatar-privacy/avatar-handlers/default-icons/generators/class-wavatar.php new file mode 100644 index 0000000..edcc47d --- /dev/null +++ b/includes/avatar-privacy/avatar-handlers/default-icons/generators/class-wavatar.php @@ -0,0 +1,279 @@ + + * @author Shamus Young + * + * @phpstan-import-type HueDegree from Images\Color + * @phpstan-import-type NormalizedHue from Images\Color + * + * @phpstan-type PartType value-of + * @phpstan-type PartsTemplate array + * @phpstan-type AllPossibleParts array + * @phpstan-type RandomizedParts array + * @phpstan-type AdditionalArguments array + */ +class Wavatar extends PNG_Parts_Generator { + + // Wavatar parts. + private const PART_MASK = 'mask'; + private const PART_SHINE = 'shine'; + private const PART_FADE = 'fade'; + private const PART_BROW = 'brow'; + private const PART_EYES = 'eyes'; + private const PART_PUPILS = 'pupils'; + private const PART_MOUTH = 'mouth'; + + /** + * All Wavatar parts in their natural order. + * + * @since 2.7.0 + */ + private const PARTS = [ + self::PART_FADE, + self::PART_MASK, + self::PART_SHINE, + self::PART_BROW, + self::PART_EYES, + self::PART_PUPILS, + self::PART_MOUTH, + ]; + + // Hues. + private const HUE_BACKGROUND = 'background_hue'; + private const HUE_WAVATAR = 'wavatar_hue'; + + /** + * A mapping from part types to the seed positions to take their values from. + * + * @since 2.3.0 + * + * @var array + */ + const SEED_INDEX = [ + // Mask and shine form the face, so they use the same random element. + self::PART_MASK => 1, + self::PART_SHINE => 1, + self::HUE_BACKGROUND => 3, // Not a part type, but part of the sequence. + self::PART_FADE => 5, + self::HUE_WAVATAR => 7, // Not a part type, but part of the sequence. + self::PART_BROW => 9, + self::PART_EYES => 11, + self::PART_PUPILS => 13, + self::PART_MOUTH => 15, + ]; + + /** + * The seed string used in the last call to `::build()`. + * + * @since 2.3.0 + * + * @var string + */ + private $current_seed; + + /** + * The color conversion helper. + * + * @since 2.7.0 + * + * @var Images\Color + */ + protected Images\Color $color; + + /** + * Creates a new Wavatars generator. + * + * @since 2.1.0 Parameter $plugin_file removed. + * @since 2.3.0 Parameter $images renamed to $editor. Parameters $png and + * $number_generator added. + * @since 2.7.0 Parameter $color added. + * + * @param Images\Editor $editor The image editing handler. + * @param Images\PNG $png The PNG image helper. + * @param Images\Color $color The color conversion helper. + * @param Number_Generator $number_generator A pseudo-random number generator. + * @param Site_Transients $site_transients The site transients handler. + */ + public function __construct( + Images\Editor $editor, + Images\PNG $png, + Images\Color $color, + Number_Generator $number_generator, + Site_Transients $site_transients + ) { + parent::__construct( + \AVATAR_PRIVACY_PLUGIN_PATH . '/public/images/wavatars', + self::PARTS, + 80, + $editor, + $png, + $number_generator, + $site_transients + ); + + $this->color = $color; + } + + /** + * Prepares additional arguments needed for rendering the avatar image. + * + * @param string $seed The seed data (hash). + * @param int $size The size in pixels. + * @param array $parts The (randomized) avatar parts. + * + * @return array + * + * @phpstan-param RandomizedParts $parts + * @phpstan-return AdditionalArguments + */ + protected function get_additional_arguments( $seed, $size, array $parts ) { + // Also randomize the colors. + return [ + self::HUE_BACKGROUND => $this->get_hue( $seed, self::HUE_BACKGROUND ), + self::HUE_WAVATAR => $this->get_hue( $seed, self::HUE_WAVATAR ), + ]; + } + + /** + * Renders the avatar from its parts, using any of the given additional arguments. + * + * @since 2.5.0 Returns a resource or GdImage instance, depending on the PHP version. + * + * @param array $parts The (randomized) avatar parts. + * @param array $args Any additional arguments defined by the subclass. + * + * @return resource|GdImage + * + * @phpstan-param RandomizedParts $parts + * @phpstan-param AdditionalArguments $args + */ + protected function render_avatar( array $parts, array $args ) { + // Create background. + $avatar = $this->create_image( 'white' ); + + // Fill in the background color. + $this->png->fill_hsl( $avatar, $args[ self::HUE_BACKGROUND ], 94, 20, 1, 1 ); + + // Now add the various layers onto the image. + foreach ( $parts as $type => $file ) { + $this->combine_images( $avatar, $file ); + + if ( self::PART_MASK === $type ) { + $this->png->fill_hsl( $avatar, $args[ self::HUE_WAVATAR ], 94, 66, (int) ( $this->size / 2 ), (int) ( $this->size / 2 ) ); + } + } + + return $avatar; + } + + /** + * Generates a random but valid part index based on the type and number of parts. + * + * @param string $type The part type. + * @param int $count The number of different parts of the type. + * + * @return int + */ + protected function get_random_part_index( $type, $count ) { + return $this->seed( $this->current_seed, self::SEED_INDEX[ $type ], 2, $count ); + } + + /** + * Extract a "random" value from the seed string. + * + * @since 2.1.0 Visibility changed to protected. + * + * @param string $seed The seed. + * @param int $index The index. + * @param int $length The number of bytes. + * @param int $modulo The maximum value of the result. + * + * @return int + */ + protected function seed( $seed, $index, $length, $modulo ) { + return \hexdec( \substr( $seed, $index, $length ) ) % $modulo; + } + + /** + * Generate pseudo-random hue from the seed. + * + * @since 2.7.0 + * + * @param string $seed The seed data (hash). + * @param string $seed_index The seed index to use for the generated hue. + * + * @return int + * + * @phpstan-param self::HUE_* $seed_index + * @phpstan-return NormalizedHue + */ + protected function get_hue( string $seed, string $seed_index ) { + /** + * Generate hue from seed. + * + * @phpstan-var HueDegree + */ + $seeded_hue = (int) ( $this->seed( $seed, self::SEED_INDEX[ $seed_index ], 2, 240 ) / 255 * Images\Color::MAX_DEGREE ); + + return $this->color->normalize_hue( $seeded_hue ); + } + + /** + * Builds an icon based on the given seed returns the image data. + * + * @param string $seed The seed data (hash). + * @param int $size The size in pixels. + * + * @return string|false + */ + public function build( $seed, $size ) { + // Save seed for part randomization. + $this->current_seed = $seed; + + return parent::build( $seed, $size ); + } +} diff --git a/includes/avatar-privacy/avatar-handlers/default-icons/static-icons/class-bowling-pin-icon-provider.php b/includes/avatar-privacy/avatar-handlers/default-icons/static-icons/class-bowling-pin-icon-provider.php new file mode 100644 index 0000000..5e65756 --- /dev/null +++ b/includes/avatar-privacy/avatar-handlers/default-icons/static-icons/class-bowling-pin-icon-provider.php @@ -0,0 +1,57 @@ + + */ +class Bowling_Pin_Icon_Provider extends SVG_Icon_Provider { + + /** + * Creates a new instance. + */ + public function __construct() { + parent::__construct( [ 'bowling-pin', 'im-user-offline' ], 'shaded-cone' ); + } + + /** + * Retrieves the user-visible, translated name. + * + * @since 2.1.0 + * + * @return string + */ + public function get_name() { + return \__( 'Bowling Pin', 'avatar-privacy' ); + } +} diff --git a/includes/avatar-privacy/avatar-handlers/default-icons/static-icons/class-mystery-icon-provider.php b/includes/avatar-privacy/avatar-handlers/default-icons/static-icons/class-mystery-icon-provider.php new file mode 100644 index 0000000..750bad1 --- /dev/null +++ b/includes/avatar-privacy/avatar-handlers/default-icons/static-icons/class-mystery-icon-provider.php @@ -0,0 +1,46 @@ + + */ +class Mystery_Icon_Provider extends SVG_Icon_Provider { + + /** + * Creates a new instance. + */ + public function __construct() { + parent::__construct( [ 'mystery', 'mystery-man', 'mm' ], 'mystery' ); + } +} diff --git a/includes/avatar-privacy/avatar-handlers/default-icons/static-icons/class-silhouette-icon-provider.php b/includes/avatar-privacy/avatar-handlers/default-icons/static-icons/class-silhouette-icon-provider.php new file mode 100644 index 0000000..e8952be --- /dev/null +++ b/includes/avatar-privacy/avatar-handlers/default-icons/static-icons/class-silhouette-icon-provider.php @@ -0,0 +1,57 @@ + + */ +class Silhouette_Icon_Provider extends SVG_Icon_Provider { + + /** + * Creates a new instance. + */ + public function __construct() { + parent::__construct( [ 'silhouette', 'view-media-artist' ], 'silhouette' ); + } + + /** + * Retrieves the user-visible, translated name. + * + * @since 2.1.0 + * + * @return string + */ + public function get_name() { + return \__( 'Silhouette', 'avatar-privacy' ); + } +} diff --git a/includes/avatar-privacy/avatar-handlers/default-icons/static-icons/class-speech-bubble-icon-provider.php b/includes/avatar-privacy/avatar-handlers/default-icons/static-icons/class-speech-bubble-icon-provider.php new file mode 100644 index 0000000..67ad4c3 --- /dev/null +++ b/includes/avatar-privacy/avatar-handlers/default-icons/static-icons/class-speech-bubble-icon-provider.php @@ -0,0 +1,57 @@ + + */ +class Speech_Bubble_Icon_Provider extends SVG_Icon_Provider { + + /** + * Creates a new instance. + */ + public function __construct() { + parent::__construct( [ 'bubble', 'comment' ], 'comment-bubble' ); + } + + /** + * Retrieves the user-visible, translated name. + * + * @since 2.1.0 + * + * @return string + */ + public function get_name() { + return \__( 'Speech Bubble', 'avatar-privacy' ); + } +} diff --git a/includes/avatar-privacy/class-component.php b/includes/avatar-privacy/class-component.php new file mode 100644 index 0000000..450ce6a --- /dev/null +++ b/includes/avatar-privacy/class-component.php @@ -0,0 +1,44 @@ + + */ +interface Component { + + /** + * Sets up the various hooks for the plugin component. + * + * @return void + */ + public function run(); +} diff --git a/includes/avatar-privacy/class-controller.php b/includes/avatar-privacy/class-controller.php new file mode 100644 index 0000000..e75c7f6 --- /dev/null +++ b/includes/avatar-privacy/class-controller.php @@ -0,0 +1,82 @@ + + */ +class Controller { + + /** + * The settings page handler. + * + * @var Component[] + */ + private $components = []; + + /** + * The core plugin API. + * + * @var Core + */ + private $core; + + /** + * Creates an instance of the plugin controller. + * + * @since 2.3.0 Component parameters replaced with factory-cofigured array. + * + * @param Core $core The core API. + * @param Component[] $components An array of plugin components. + */ + public function __construct( Core $core, array $components ) { + $this->core = $core; + $this->components = $components; + } + + /** + * Starts the plugin for real. + * + * @return void + */ + public function run() { + // Set plugin singleton. + Core::set_instance( $this->core ); + + foreach ( $this->components as $component ) { + $component->run(); + } + } +} diff --git a/includes/avatar-privacy/class-core.php b/includes/avatar-privacy/class-core.php new file mode 100644 index 0000000..75454bd --- /dev/null +++ b/includes/avatar-privacy/class-core.php @@ -0,0 +1,490 @@ + + * @author Johannes Freudendahl + * + * @phpstan-import-type AvatarDefinition from Default_Avatars + * @phpstan-import-type SettingsFields from Settings + */ +class Core { + + /** + * The default settings. + * + * @var Settings + */ + private Settings $settings; + + /** + * The hashing helper. + * + * @since 2.4.0 + * + * @var Hasher + */ + private Hasher $hasher; + + /** + * The user data helper. + * + * @since 2.4.0 + * + * @var User_Fields + */ + private User_Fields $user_fields; + + /** + * The comment author data helper. + * + * @since 2.4.0 + * + * @var Comment_Author_Fields + */ + private Comment_Author_Fields $comment_author_fields; + + /** + * The default avatars API. + * + * @since 2.4.0 + * + * @var Default_Avatars + */ + private Default_Avatars $default_avatars; + + /** + * The singleton instance. + * + * @var Core + */ + private static $instance; + + /** + * Creates a \Avatar_Privacy\Core instance and registers all necessary hooks + * and filters for the plugin. + * + * @since 2.1.0 Parameter $plugin_file removed. + * @since 2.4.0 Parameters $hasher, $user_fields, $comment_author_fields, and + * $default_avatars added, $transients, $version, $options, + * $site_transients, and $cache removed. + * + * @param Settings $settings Required. + * @param Hasher $hasher Required. + * @param User_Fields $user_fields Required. + * @param Comment_Author_Fields $comment_author_fields Required. + * @param Default_Avatars $default_avatars Required. + */ + public function __construct( + Settings $settings, + Hasher $hasher, + User_Fields $user_fields, + Comment_Author_Fields $comment_author_fields, + Default_Avatars $default_avatars + ) { + $this->settings = $settings; + $this->hasher = $hasher; + $this->user_fields = $user_fields; + $this->comment_author_fields = $comment_author_fields; + $this->default_avatars = $default_avatars; + } + + /** + * Retrieves (and if necessary creates) the API instance. Should not be called outside of plugin set-up. + * + * @internal + * + * @since 1.0.0 + * + * @param Core $instance Only used for plugin initialization. Don't ever pass a value in user code. + * + * @return void + * + * @throws \BadMethodCallException Thrown when Avatar_Privacy_Core::set_instance after plugin initialization. + */ + public static function set_instance( Core $instance ) { + if ( null === self::$instance ) { + self::$instance = $instance; + } else { + throw new \BadMethodCallException( __METHOD__ . ' called more than once.' ); + } + } + + /** + * Retrieves the plugin instance. + * + * @since 1.0.0 + * + * @throws \BadMethodCallException Thrown when Avatar_Privacy_Core::get_instance is called before plugin initialization. + * + * @return Core + */ + public static function get_instance() { + if ( null === self::$instance ) { + throw new \BadMethodCallException( __METHOD__ . ' called without prior plugin intialization.' ); + } + + return self::$instance; + } + + /** + * Retrieves the plugin version. + * + * @return string + */ + public function get_version() { + return $this->settings->get_version(); + } + + /** + * Retrieves the full path to the main plugin file. + * + * @deprecated 2.3.0 Use AVATAR_PRIVACY_PLUGIN_FILE instead. + * + * @return string + */ + public function get_plugin_file() { + \_deprecated_function( __METHOD__, '2.3.0' ); + + return \AVATAR_PRIVACY_PLUGIN_FILE; + } + + /** + * Retrieves the plugin settings. + * + * @since 2.0.0 Parameter $force added. + * + * @param bool $force Optional. Forces retrieval of settings from database. Default false. + * + * @return array + * + * @phpstan-return SettingsFields + */ + public function get_settings( $force = false ) { + return $this->settings->get_all_settings( $force ); + } + + /** + * Checks whether an anonymous comment author has opted-in to Gravatar usage. + * + * @param string $email_or_hash The comment author's e-mail address or the unique hash. + * + * @return bool + */ + public function comment_author_allows_gravatar_use( $email_or_hash ) { + return $this->comment_author_fields->allows_gravatar_use( $email_or_hash ); + } + + /** + * Checks whether an anonymous comment author is in our Gravatar policy database. + * + * @param string $email_or_hash The comment author's e-mail address or the unique hash. + * + * @return bool + */ + public function comment_author_has_gravatar_policy( $email_or_hash ) { + return $this->comment_author_fields->has_gravatar_policy( $email_or_hash ); + } + + /** + * Retrieves the database primary key for the given email address. + * + * @param string $email_or_hash The comment author's e-mail address or the unique hash. + * + * @return int The database key for the given email address (or 0). + */ + public function get_comment_author_key( $email_or_hash ) { + return $this->comment_author_fields->get_key( $email_or_hash ); + } + + /** + * Retrieves the hash for the given user ID. If there currently is no hash, + * a new one is generated. + * + * @since 2.1.0 False is returned on error. + * + * @param int $user_id The user ID. + * + * @return string|false The hashed email, or `false` on failure. + */ + public function get_user_hash( $user_id ) { + return $this->user_fields->get_hash( $user_id ); + } + + /** + * Retrieves the email for the given comment author database key. + * + * @param string $hash The hashed mail address. + * + * @return string + */ + public function get_comment_author_email( $hash ) { + return $this->comment_author_fields->get_email( $hash ); + } + + /** + * Ensures that the comment author gravatar policy is updated. + * + * @param string $email The comment author's mail address. + * @param int $comment_id The comment ID. + * @param int $use_gravatar 1 if Gravatar.com is enabled, 0 otherwise. + * + * @return void + */ + public function update_comment_author_gravatar_use( $email, $comment_id, $use_gravatar ) { + $this->comment_author_fields->update_gravatar_use( $email, $comment_id, $use_gravatar ); + } + + /** + * Updates the hash using the ID and email. + * + * @since 2.4.0 The parameter `$id` has been deprecated. + * @since 2.6.0 A warning is emitted if the deprecated argument `$id` is used. + * + * @param int|null $id Deprecated. + * @param string $email The email. + * + * @return void + */ + public function update_comment_author_hash( $id, $email ) { + if ( ! empty( $id ) ) { + \_deprecated_argument( __FUNCTION__, '2.4.0', 'Please pass null to prevent this warning.' ); + } + + $this->comment_author_fields->update_hash( $email ); + } + + /** + * Retrieves the salt for current the site/network. + * + * @deprecated 2.4.0 + * + * @return string + */ + public function get_salt() { + \_deprecated_function( __METHOD__, '2.4.0' ); + + return $this->hasher->get_salt(); + } + + /** + * Generates a salted SHA-256 hash for the given e-mail address. + * + * @since 2.4.0 Implementation extracted to \Avatar_Privacy\Tools\Hasher + * + * @param string $email The mail address. + * + * @return string + */ + public function get_hash( $email ) { + return $this->hasher->get_hash( $email ); + } + + /** + * Retrieves a user by email hash. + * + * @since 2.0.0 + * + * @param string $hash The user's email hash. + * + * @return \WP_User|null + */ + public function get_user_by_hash( $hash ) { + return $this->user_fields->get_user_by_hash( $hash ); + } + + /** + * Retrieves the full-size local avatar for a user (if one exists). + * + * @since 2.2.0 + * + * @param int $user_id The user ID. + * + * @return array { + * An avatar definition, or the empty array. + * + * @type string $file The local filename. + * @type string $type The MIME type. + * } + * + * @phpstan-return AvatarDefinition|array{} + */ + public function get_user_avatar( $user_id ) { + return $this->user_fields->get_local_avatar( $user_id ); + } + + /** + * Sets the local avatar for the given user. + * + * @since 2.4.0 + * + * @param int $user_id The user ID. + * @param string $image Raw image data. + * + * @return void + * + * @throws \InvalidArgumentException An exception is thrown if the user ID does + * not exist or the upload result does not + * contain the 'file' key. + * @throws \RuntimeException A `RuntimeException` is thrown if the sideloading + * fails for some reason. + */ + public function set_user_avatar( $user_id, $image ) { + $this->user_fields->set_local_avatar( $user_id, $image ); + } + + /** + * Checks whether a user has opted-in to Gravatar usage. + * + * @since 2.4.0 + * + * @param int $user_id The user ID. + * + * @return bool + */ + public function user_allows_gravatar_use( $user_id ) { + return $this->user_fields->allows_gravatar_use( $user_id ); + } + + /** + * Checks whether a user has set a Gravatar usage policy. + * + * @since 2.4.0 + * + * @param int $user_id The user ID. + * + * @return bool + */ + public function user_has_gravatar_policy( $user_id ) { + return $this->user_fields->has_gravatar_policy( $user_id ); + } + + /** + * Updates a user's gravatar policy. + * + * @since 2.4.0 + * + * @param int $user_id The user ID. + * @param bool $use_gravatar Whether using Gravatar should be allowed or not. + * + * @return void + */ + public function update_user_gravatar_use( $user_id, $use_gravatar ) { + $this->user_fields->update_gravatar_use( $user_id, $use_gravatar ); + } + + /** + * Checks whether a user has opted-in to anonymous commenting. + * + * @since 2.4.0 + * + * @param int $user_id The user ID. + * + * @return bool + */ + public function user_allows_anonymous_commenting( $user_id ) { + return $this->user_fields->allows_anonymous_commenting( $user_id ); + } + + /** + * Updates a user's gravatar policy. + * + * @since 2.4.0 + * + * @param int $user_id The user ID. + * @param bool $anonymous Whether anonymous commenting should be allowed or not. + * + * @return void + */ + public function update_user_anonymous_commenting( $user_id, $anonymous ) { + $this->user_fields->update_anonymous_commenting( $user_id, $anonymous ); + } + + /** + * Retrieves the full-size custom default avatar for the current site. + * + * Note: On multisite, the caller is responsible for switching to the site + * (using `switch_to_blog`) before calling this method, and for restoring + * the original site afterwards (using `restore_current_blog`). + * + * @since 2.4.0 + * + * @return array { + * An avatar definition, or the empty array. + * + * @type string $file The local filename. + * @type string $type The MIME type. + * } + * + * @phpstan-return AvatarDefinition|array{} + */ + public function get_custom_default_avatar() { + return $this->default_avatars->get_custom_default_avatar(); + } + + /** + * Sets the custom default avatar for the current site. + * + * Please note that the calling function is responsible for cleaning up the + * provided image if it is a temporary file (i.e the image is copied before + * being used as the new avatar). + * + * On multisite, the caller is responsible for switching to the site + * (using `switch_to_blog`) before calling this method, and for restoring + * the original site afterwards (using `restore_current_blog`). + * + * @since 2.4.0 + * + * @param string $image_url The image URL or filename. + * + * @return void + * + * @throws \InvalidArgumentException An exception is thrown if the image URL + * is invalid. + * @throws Upload_Handling_Exception An exception is thrown if there was an + * while processing the image sideloading. + * @throws File_Deletion_Exception An exception is thrown if the previously + * set image could not be deleted. + */ + public function set_custom_default_avatar( $image_url ) { + $this->default_avatars->set_custom_default_avatar( $image_url ); + } +} diff --git a/includes/avatar-privacy/class-factory.php b/includes/avatar-privacy/class-factory.php new file mode 100644 index 0000000..76dd606 --- /dev/null +++ b/includes/avatar-privacy/class-factory.php @@ -0,0 +1,578 @@ + + * + * @phpstan-import-type ConfigData from User_Form + */ +class Factory extends Dice { + const SHARED = [ 'shared' => true ]; + + // Named instances. + const USERFORM_PROFILE_INSTANCE = '$UserProfileForm'; + const USERFORM_FRONTEND_INSTANCE = '$FrontendUserForm'; + const USERFORM_THEME_MY_LOGIN_PROFILES_INSTANCE = '$ThemeMyLoginProfilesUserForm'; + const USERFORM_BBPRESS_PROFILE_INSTANCE = '$bbPressProfileForm'; + const JDENTICON_INSTANCE = '$JdenticonIdenticon'; + + /** + * The factory instance. + * + * @var Factory|null + */ + private static $factory; + + /** + * Creates a new instance. + */ + final protected function __construct() { + } + + /** + * Retrieves a factory set up for creating Avatar_Privacy instances. + * + * @since 2.1.0 Parameter $full_plugin_path replaced with AVATAR_PRIVACY_PLUGIN_FILE constant. + * @since 2.5.1 Now throws an Object_Factory_Exception in case of error. + * + * @return Factory + * + * @throws Object_Factory_Exception An exception is thrown if the factory cannot + * be created. + */ + public static function get() { + if ( ! isset( self::$factory ) ) { + + // Create factory. + $factory = new static(); + $factory = $factory->addRules( $factory->get_rules() ); + + if ( $factory instanceof Factory ) { + self::$factory = $factory; + } else { + throw new Object_Factory_Exception( 'Could not create object factory.' ); // @codeCoverageIgnore + } + } + + return self::$factory; + } + + /** + * Retrieves the rules for setting up the plugin. + * + * @since 2.1.0 + * + * @return array + * + * @phpstan-return array + */ + protected function get_rules() { + return [ + // Shared helpers. + Cache::class => self::SHARED, + Database\Table::class => self::SHARED, + Transients::class => self::SHARED, + Site_Transients::class => self::SHARED, + Options::class => self::SHARED, + Network_Options::class => self::SHARED, + Filesystem_Cache::class => self::SHARED, + + // Core API. + API::class => self::SHARED, + Core::class => self::SHARED, + Settings::class => [ + 'constructParams' => [ $this->get_plugin_version( \AVATAR_PRIVACY_PLUGIN_FILE ) ], + ], + + // The plugin controller. + Controller::class => [ + 'constructParams' => [ $this->get_components() ], + ], + + // Components. + Component::class => self::SHARED, + Components\Block_Editor::class => [ + 'substitutions' => [ + User_Form::class => [ self::INSTANCE => self::USERFORM_FRONTEND_INSTANCE ], + ], + ], + Components\Command_Line_Interface::class => [ + 'constructParams' => [ $this->get_cli_commands() ], + ], + Components\Image_Proxy::class => [ + 'constructParams' => [ $this->get_avatar_handlers() ], + ], + Components\Integrations::class => [ + 'constructParams' => [ $this->get_plugin_integrations() ], + ], + Components\Setup::class => [ + 'constructParams' => [ $this->get_database_tables() ], + ], + Components\Shortcodes::class => [ + 'substitutions' => [ + User_Form::class => [ self::INSTANCE => self::USERFORM_FRONTEND_INSTANCE ], + ], + ], + Components\User_Profile::class => [ + 'substitutions' => [ + User_Form::class => [ self::INSTANCE => self::USERFORM_PROFILE_INSTANCE ], + ], + ], + + // Default icon providers. + Static_Icons\Mystery_Icon_Provider::class => self::SHARED, + Static_Icons\Speech_Bubble_Icon_Provider::class => self::SHARED, + Static_Icons\Bowling_Pin_Icon_Provider::class => self::SHARED, + Static_Icons\Silhouette_Icon_Provider::class => self::SHARED, + + // Avatar handlers. + Avatar_Handler::class => self::SHARED, + Default_Icons_Handler::class => [ + 'constructParams' => [ $this->get_default_icons() ], + ], + + // Default icon generators. + Default_Icons\Generator::class => self::SHARED, + Default_Icons\Generators\Jdenticon::class => [ + 'substitutions' => [ + \Avatar_Privacy\Vendor\Jdenticon\Identicon::class => [ self::INSTANCE => self::JDENTICON_INSTANCE ], + ], + ], + Default_Icons\Generators\Rings::class => [ + 'constructParams' => [ + 512, // The bounding box dimensions. + 3, // The number of rings. + ], + 'call' => [ + [ 'setMono', [ true ] ], // The rings should be monochrome. + ], + ], + + // Icon components. + self::JDENTICON_INSTANCE => [ + 'instanceOf' => \Avatar_Privacy\Vendor\Jdenticon\Identicon::class, + 'constructParams' => [ + // Some extra styling for the Jdenticon instance. + [ 'style' => [ 'padding' => 0 ] ], + ], + ], + + // Upload handlers. + Upload_Handler::class => self::SHARED, + + // Form helpers. + User_Form::class => self::SHARED, + self::USERFORM_PROFILE_INSTANCE => [ + 'instanceOf' => User_Form::class, + 'constructParams' => $this->get_user_form_parameters( self::USERFORM_PROFILE_INSTANCE ), + ], + self::USERFORM_BBPRESS_PROFILE_INSTANCE => [ + 'instanceOf' => User_Form::class, + 'constructParams' => $this->get_user_form_parameters( self::USERFORM_BBPRESS_PROFILE_INSTANCE ), + ], + self::USERFORM_FRONTEND_INSTANCE => [ + 'instanceOf' => User_Form::class, + 'constructParams' => $this->get_user_form_parameters( self::USERFORM_FRONTEND_INSTANCE ), + ], + self::USERFORM_THEME_MY_LOGIN_PROFILES_INSTANCE => [ + 'instanceOf' => User_Form::class, + 'constructParams' => $this->get_user_form_parameters( self::USERFORM_THEME_MY_LOGIN_PROFILES_INSTANCE ), + ], + + // Plugin integrations. + Integrations\Plugin_Integration::class => self::SHARED, + Integrations\BBPress_Integration::class => [ + 'substitutions' => [ + User_Form::class => [ self::INSTANCE => self::USERFORM_BBPRESS_PROFILE_INSTANCE ], + ], + ], + Integrations\Theme_My_Login_Profiles_Integration::class => [ + 'substitutions' => [ + User_Form::class => [ self::INSTANCE => self::USERFORM_THEME_MY_LOGIN_PROFILES_INSTANCE ], + ], + ], + + // Shared tools. + Tools\Hasher::class => self::SHARED, + Tools\Number_Generator::class => self::SHARED, + Tools\Multisite::class => self::SHARED, + Tools\Images\Color::class => self::SHARED, + Tools\Images\Editor::class => self::SHARED, + Tools\Images\PNG::class => self::SHARED, + Tools\Network\Gravatar_Service::class => self::SHARED, + ]; + } + + /** + * Retrieves the plugin version. + * + * @since 2.1.0 + * + * @param string $plugin_file The full plugin path. + * + * @return string + */ + protected function get_plugin_version( $plugin_file ) { + // Load version from plugin data. + if ( ! \function_exists( 'get_plugin_data' ) ) { + require_once \ABSPATH . 'wp-admin/includes/plugin.php'; + } + + return \get_plugin_data( $plugin_file, false, false )['Version']; + } + + /** + * Retrieves the list of plugin components run during normal operations + * (i.e. not including the Uninstallation component). + * + * @return array { + * An array of `Component` instances in `Dice` syntax. + * + * @type array { + * @type string $instance The classname. + * } + * } + * + * @phpstan-return array>> + */ + protected function get_components() { + return [ + [ self::INSTANCE => Components\Setup::class ], + [ self::INSTANCE => Components\Image_Proxy::class ], + [ self::INSTANCE => Components\Avatar_Handling::class ], + [ self::INSTANCE => Components\Comments::class ], + [ self::INSTANCE => Components\User_Profile::class ], + [ self::INSTANCE => Components\Settings_Page::class ], + [ self::INSTANCE => Components\Network_Settings_Page::class ], + [ self::INSTANCE => Components\Privacy_Tools::class ], + [ self::INSTANCE => Components\Integrations::class ], + [ self::INSTANCE => Components\Shortcodes::class ], + [ self::INSTANCE => Components\Block_Editor::class ], + [ self::INSTANCE => Components\Command_Line_Interface::class ], + ]; + } + + /** + * Retrieves a list of default icon providers suitable for inclusion in a `Dice` rule. + * + * @since 2.1.0 + * + * @return array { + * An array of `Icon_Provider` instances in `Dice` syntax. + * + * @type array { + * @type string $instance The classname. + * } + * } + * + * @phpstan-return array>> + */ + protected function get_default_icons() { + return [ + // These are sorted as the should appear for selection in the discussion settings. + [ self::INSTANCE => Static_Icons\Mystery_Icon_Provider::class ], + [ self::INSTANCE => Generated_Icons\Identicon_Icon_Provider::class ], + [ self::INSTANCE => Generated_Icons\Wavatar_Icon_Provider::class ], + [ self::INSTANCE => Generated_Icons\Monster_ID_Icon_Provider::class ], + [ self::INSTANCE => Generated_Icons\Retro_Icon_Provider::class ], + [ self::INSTANCE => Generated_Icons\Rings_Icon_Provider::class ], + [ self::INSTANCE => Generated_Icons\Bird_Avatar_Icon_Provider::class ], + [ self::INSTANCE => Generated_Icons\Cat_Avatar_Icon_Provider::class ], + [ self::INSTANCE => Generated_Icons\Robohash_Icon_Provider::class ], + [ self::INSTANCE => Static_Icons\Speech_Bubble_Icon_Provider::class ], + [ self::INSTANCE => Static_Icons\Bowling_Pin_Icon_Provider::class ], + [ self::INSTANCE => Static_Icons\Silhouette_Icon_Provider::class ], + [ self::INSTANCE => Default_Icons\Custom_Icon_Provider::class ], + ]; + } + + /** + * Retrieves a list of plugin integrations. + * + * @since 2.1.0 + * + * @return array { + * An array of `Plugin_Integration` instances in `Dice` syntax. + * + * @type array { + * @type string $instance The classname. + * } + * } + * + * @phpstan-return array>> + */ + protected function get_plugin_integrations() { + return [ + [ self::INSTANCE => Integrations\BBPress_Integration::class ], + [ self::INSTANCE => Integrations\BuddyPress_Integration::class ], + [ self::INSTANCE => Integrations\Simple_Author_Box_Integration::class ], + [ self::INSTANCE => Integrations\Simple_Local_Avatars_Integration::class ], + [ self::INSTANCE => Integrations\Simple_User_Avatar_Integration::class ], + [ self::INSTANCE => Integrations\Theme_My_Login_Profiles_Integration::class ], + [ self::INSTANCE => Integrations\Ultimate_Member_Integration::class ], + [ self::INSTANCE => Integrations\WPDiscuz_Integration::class ], + [ self::INSTANCE => Integrations\WP_User_Manager_Integration::class ], + ]; + } + + /** + * Retrieves a list of CLI commands. + * + * @since 2.3.0 + * + * @return array { + * An array of `Command` instances in `Dice` syntax. + * + * @type array { + * @type string $instance The classname. + * } + * } + * + * @phpstan-return array>> + */ + protected function get_cli_commands() { + return [ + [ self::INSTANCE => CLI\Cron_Command::class ], + [ self::INSTANCE => CLI\Database_Command::class ], + [ self::INSTANCE => CLI\Default_Command::class ], + [ self::INSTANCE => CLI\Uninstall_Command::class ], + [ self::INSTANCE => CLI\User_Command::class ], + ]; + } + + /** + * Retrieves a list of database table handlers. + * + * @since 2.4.0 + * + * @return array { + * An array of `Table` instances in `Dice` syntax. + * + * @type array { + * @type string $instance The classname. + * } + * } + * + * @phpstan-return array>> + */ + protected function get_database_tables() { + $classes = [ + Database\Comment_Author_Table::class, + Database\Hashes_Table::class, + ]; + $tables = []; + + foreach ( $classes as $table_class ) { + $tables[ $table_class::TABLE_BASENAME ] = [ self::INSTANCE => $table_class ]; + } + + return $tables; + } + + /** + * Retrieves a list of avatar handlers. + * + * @since 2.4.0 + * + * @return array { + * An array of `Avatar_Handler` instances (in `Dice` syntax), indexed by + * their filter hooks. + * + * @type array { + * @type array $hook The instance definition. + * } + * } + * + * @phpstan-return array>> + */ + protected function get_avatar_handlers() { + return [ + 'avatar_privacy_user_avatar_icon_url' => [ self::INSTANCE => User_Avatar_Handler::class ], + 'avatar_privacy_gravatar_icon_url' => [ self::INSTANCE => Gravatar_Cache_Handler::class ], + 'avatar_privacy_default_icon_url' => [ self::INSTANCE => Default_Icons_Handler::class ], + 'avatar_privacy_legacy_icon_url' => [ self::INSTANCE => Legacy_Icon_Handler::class ], + ]; + } + + /** + * Retrieves the constructor parameters for configuring named user form instances. + * + * @since 2.4.0 + * + * @param string $instance The named instance. + * + * @return array The constructor parameter array for the named instance. + * + * @throws \InvalidArgumentException An exception is raised when $instance is + * not one of the expected constants. + * + * @phpstan-return array{ 0: ConfigData, 1: ConfigData, 2: ConfigData } + */ + protected function get_user_form_parameters( $instance ) { + switch ( $instance ) { + case self::USERFORM_PROFILE_INSTANCE: + $use_gravatar = [ + 'nonce' => 'avatar_privacy_use_gravatar_nonce_', + 'action' => 'avatar_privacy_edit_use_gravatar', + 'field' => 'avatar-privacy-use-gravatar', + 'partial' => 'admin/partials/profile/use-gravatar.php', + ]; + $allow_anonymous = [ + 'nonce' => 'avatar_privacy_allow_anonymous_nonce_', + 'action' => 'avatar_privacy_edit_allow_anonymous', + 'field' => 'avatar-privacy-allow-anonymous', + 'partial' => 'admin/partials/profile/allow-anonymous.php', + ]; + $user_avatar = [ + 'nonce' => 'avatar_privacy_upload_avatar_nonce_', + 'action' => 'avatar_privacy_upload_avatar', + 'field' => 'avatar-privacy-user-avatar-upload', + 'erase' => 'avatar-privacy-user-avatar-erase', + 'partial' => 'admin/partials/profile/user-avatar-upload.php', + ]; + break; + + case self::USERFORM_BBPRESS_PROFILE_INSTANCE: + $use_gravatar = [ + 'nonce' => 'avatar_privacy_bbpress_use_gravatar_nonce_', + 'action' => 'avatar_privacy_bbpress_edit_use_gravatar', + 'field' => 'avatar-privacy-bbpress-use-gravatar', + 'partial' => 'public/partials/bbpress/profile/use-gravatar.php', + ]; + $allow_anonymous = [ + 'nonce' => 'avatar_privacy_bbpress_allow_anonymous_nonce_', + 'action' => 'avatar_privacy_bbpress_edit_allow_anonymous', + 'field' => 'avatar-privacy-bbpress-allow-anonymous', + 'partial' => 'public/partials/bbpress/profile/allow-anonymous.php', + ]; + $user_avatar = [ + 'nonce' => 'avatar_privacy_bbpress_upload_avatar_nonce_', + 'action' => 'avatar_privacy_bbpress_upload_avatar', + 'field' => 'avatar-privacy-bbpress-user-avatar-upload', + 'erase' => 'avatar-privacy-bbpress-user-avatar-erase', + 'partial' => 'public/partials/bbpress/profile/user-avatar-upload.php', + ]; + break; + + case self::USERFORM_FRONTEND_INSTANCE: + $use_gravatar = [ + 'nonce' => 'avatar_privacy_frontend_use_gravatar_nonce_', + 'action' => 'avatar_privacy_frontend_edit_use_gravatar', + 'field' => 'avatar-privacy-frontend-use-gravatar', + 'partial' => 'public/partials/profile/use-gravatar.php', + ]; + $allow_anonymous = [ + 'nonce' => 'avatar_privacy_frontend_allow_anonymous_nonce_', + 'action' => 'avatar_privacy_frontend_edit_allow_anonymous', + 'field' => 'avatar_privacy-frontend-allow_anonymous', + 'partial' => 'public/partials/profile/allow-anonymous.php', + ]; + $user_avatar = [ + 'nonce' => 'avatar_privacy_frontend_upload_avatar_nonce_', + 'action' => 'avatar_privacy_frontend_upload_avatar', + 'field' => 'avatar-privacy-frontend-user-avatar-upload', + 'erase' => 'avatar-privacy-frontend-user-avatar-erase', + 'partial' => 'public/partials/profile/user-avatar-upload.php', + ]; + break; + + case self::USERFORM_THEME_MY_LOGIN_PROFILES_INSTANCE: + $use_gravatar = [ + 'nonce' => 'avatar_privacy_tml_profiles_use_gravatar_nonce_', + 'action' => 'avatar_privacy_tml_profiles_edit_use_gravatar', + 'field' => 'avatar-privacy-tml-profiles-use-gravatar', + 'partial' => 'public/partials/tml-profiles/use-gravatar.php', + ]; + $allow_anonymous = [ + 'nonce' => 'avatar_privacy_tml_profiles_allow_anonymous_nonce_', + 'action' => 'avatar_privacy_tml_profiles_edit_allow_anonymous', + 'field' => 'avatar_privacy-tml-profiles-allow_anonymous', + 'partial' => 'public/partials/tml-profiles/allow-anonymous.php', + ]; + $user_avatar = [ + 'nonce' => 'avatar_privacy_tml_profiles_upload_avatar_nonce_', + 'action' => 'avatar_privacy_tml_profiles_upload_avatar', + 'field' => 'avatar-privacy-tml-profiles-user-avatar-upload', + 'erase' => 'avatar-privacy-tml-profiles-user-avatar-erase', + 'partial' => 'public/partials/tml-profiles/user-avatar-upload.php', + ]; + break; + + default: + throw new \InvalidArgumentException( "Invalid named instance {$instance}." ); + } + + return [ $use_gravatar, $allow_anonymous, $user_avatar ]; + } +} diff --git a/includes/avatar-privacy/class-requirements.php b/includes/avatar-privacy/class-requirements.php new file mode 100644 index 0000000..a36f5ac --- /dev/null +++ b/includes/avatar-privacy/class-requirements.php @@ -0,0 +1,137 @@ + + */ +class Requirements extends \Avatar_Privacy\Vendor\Mundschenk\WP_Requirements { + + const REQUIREMENTS = [ + 'php' => '7.2.0', + 'multibyte' => false, + 'utf-8' => false, + 'gd' => true, + 'uploads_writable' => true, + ]; + + /** + * Creates a new requirements instance. + * + * @since 2.1.0 Parameter $plugin_file replaced with AVATAR_PRIVACY_PLUGIN_FILE constant. + */ + public function __construct() { + parent::__construct( 'Avatar Privacy', \AVATAR_PRIVACY_PLUGIN_FILE, 'avatar-privacy', self::REQUIREMENTS ); + } + + /** + * Retrieves an array of requirement specifications. + * + * @return array { + * An array of requirements checks. + * + * @type string $enable_key An index in the $install_requirements array to switch the check on and off. + * @type callable $check A function returning true if the check was successful, false otherwise. + * @type callable $notice A function displaying an appropriate error notice. + * } + * + * @phpstan-return array + */ + protected function get_requirements() { + $requirements = parent::get_requirements(); + $requirements[] = [ + 'enable_key' => 'gd', + 'check' => [ $this, 'check_gd_support' ], + 'notice' => [ $this, 'admin_notices_gd_incompatible' ], + ]; + $requirements[] = [ + 'enable_key' => 'uploads_writable', + 'check' => [ $this, 'check_uploads_writable' ], + 'notice' => [ $this, 'admin_notices_uploads_not_writable' ], + ]; + + return $requirements; + } + + /** + * Checks for availability of the GD extension. + * + * @return bool + */ + protected function check_gd_support() { + return \function_exists( 'imagecreatefrompng' ) + && \function_exists( 'imagecopy' ) + && \function_exists( 'imagedestroy' ) + && \function_exists( 'imagepng' ) + && \function_exists( 'imagecreatetruecolor' ); + } + + /** + * Prints 'GD extension missing' admin notice + * + * @return void + */ + public function admin_notices_gd_incompatible() { + $this->display_error_notice( + /* translators: 1: plugin name 2: GD documentation URL */ + \__( 'The activated plugin %1$s requires the GD PHP extension to be enabled on your server. Please deactivate this plugin, or enable the extension.', 'avatar-privacy' ), + 'Avatar Privacy', + /* translators: URL with GD PHP extension installation instructions */ + \__( 'http://php.net/manual/en/image.setup.php', 'avatar-privacy' ) + ); + } + + /** + * Checks for availability of the GD extension. + * + * @return bool + */ + protected function check_uploads_writable() { + $uploads = \wp_get_upload_dir(); + + return \wp_is_writable( $uploads['basedir'] ); + } + + /** + * Prints 'GD extension missing' admin notice + * + * @return void + */ + public function admin_notices_uploads_not_writable() { + $this->display_error_notice( + /* translators: 1: plugin name */ + \__( 'The activated plugin %1$s requires write access to the WordPress uploads folder on your server. Please check the folder\'s permissions, or deactivate this plugin.', 'avatar-privacy' ), + 'Avatar Privacy' + ); + } +} diff --git a/includes/avatar-privacy/cli/class-abstract-command.php b/includes/avatar-privacy/cli/class-abstract-command.php new file mode 100644 index 0000000..09865d5 --- /dev/null +++ b/includes/avatar-privacy/cli/class-abstract-command.php @@ -0,0 +1,106 @@ + + */ +abstract class Abstract_Command implements Command { + + /** + * Clears all of the caches for memory management. Should be called after + * every 100 updates or so. + * + * @global \WP_Object_Cache $wp_object_cache The WordPress object cache. + * @global \wpdb $wpdb The WordPress database. + * + * @return void + */ + protected function stop_the_insanity() { + global $wpdb, $wp_object_cache; + + // Clean up saved queries. + $wpdb->queries = []; + + // TODO: Check if any of these are at least somewhat universal. + if ( \is_object( $wp_object_cache ) ) { + if ( \property_exists( $wp_object_cache, 'group_ops' ) ) { + $wp_object_cache->group_ops = []; + } + + if ( \property_exists( $wp_object_cache, 'stats' ) ) { + $wp_object_cache->stats = []; + } + + if ( \property_exists( $wp_object_cache, 'memcache_debug' ) ) { + $wp_object_cache->memcache_debug = []; + } + + if ( \property_exists( $wp_object_cache, 'cache' ) ) { + $wp_object_cache->cache = []; + } + + // For some large memcached implementations. + if ( \method_exists( $wp_object_cache, '__remoteset' ) ) { + $wp_object_cache->__remoteset(); // @codeCoverageIgnore + } + } + } + + /** + * Copies the iterator into an array. + * + * This method replaces to the builtin `\iterator_to_array()` to facilitate + * unit testing. + * + * @since 2.7.0 Documented as generic method. + * + * @template TKey of array-key + * @template TValue + * + * @param \Iterator $iterator Any iterator (but TKey must be a valid array key). + * + * @return array + * + * @phpstan-param \Iterator $iterator -- workaround for https://github.com/squizlabs/PHP_CodeSniffer/issues/3589 + */ + protected function iterator_to_array( \Iterator $iterator ) { + $result = []; + + foreach ( $iterator as $key => $item ) { + $result[ $key ] = $item; + } + + return $result; + } +} diff --git a/includes/avatar-privacy/cli/class-command.php b/includes/avatar-privacy/cli/class-command.php new file mode 100644 index 0000000..71671c8 --- /dev/null +++ b/includes/avatar-privacy/cli/class-command.php @@ -0,0 +1,46 @@ + + */ +interface Command { + + /** + * Registers the command (and any optional subcommands). + * + * The method assumes that `\WP_CLI` is available. + * + * @return void + */ + public function register(); +} diff --git a/includes/avatar-privacy/cli/class-cron-command.php b/includes/avatar-privacy/cli/class-cron-command.php new file mode 100644 index 0000000..c800aed --- /dev/null +++ b/includes/avatar-privacy/cli/class-cron-command.php @@ -0,0 +1,104 @@ + + */ +class Cron_Command extends Abstract_Command { + + /** + * Registers the command (and any optional subcommands). + * + * The method assumes that `\WP_CLI` is available. + * + * @return void + */ + public function register() { + WP_CLI::add_command( 'avatar-privacy cron list', [ $this, 'list_' ] ); + WP_CLI::add_command( 'avatar-privacy cron delete', [ $this, 'delete' ] ); + } + + /** + * Displays information on the cron jobs installed by Avatar Privacy. + * + * ## EXAMPLES + * + * # Show when cron job will run next. + * $ wp avatar-privacy cron list + * Success: Cron job will run next at 2019-09-03 20:56:16 on this site. + * + * @subcommand list + * + * @return void + */ + public function list_() { + $job = Image_Proxy::CRON_JOB_ACTION; + $next = \wp_next_scheduled( $job ); + + if ( false === $next ) { + WP_CLI::success( WP_CLI::colorize( "Cron job %B{$job}%n not scheduled on this site." ) ); + } else { + $timestamp = \gmdate( 'Y-m-d H:i:s', $next ); + WP_CLI::success( WP_CLI::colorize( "Cron job %B{$job}%n will run next at %B{$timestamp}%n on this site." ) ); + } + } + + /** + * Deletes the cron jobs installed by Avatar Privacy. + * + * They will be scheduled again on the next request. + * + * ## EXAMPLES + * + * # Delete all cron jobs hooked by Avatar Privacy. + * $ wp avatar-privacy cron delete + * Success: Cron job avatar_privacy_daily was unscheduled on this site (1 event). + * + * @return void + */ + public function delete() { + $job = Image_Proxy::CRON_JOB_ACTION; + $events = \wp_unschedule_hook( $job ); + + if ( false === $events ) { + WP_CLI::error( WP_CLI::colorize( "Cron job %B{$job}%n could not be unscheduled on this site." ) ); + } else { + $events = ( 1 === $events ) ? "{$events} event" : "{$events} events"; + WP_CLI::success( WP_CLI::colorize( "Cron job %B{$job}%n was unscheduled on this site (%B{$events}%n)." ) ); + } + } +} diff --git a/includes/avatar-privacy/cli/class-database-command.php b/includes/avatar-privacy/cli/class-database-command.php new file mode 100644 index 0000000..3c04667 --- /dev/null +++ b/includes/avatar-privacy/cli/class-database-command.php @@ -0,0 +1,324 @@ + + */ +class Database_Command extends Abstract_Command { + + /** + * The core API. + * + * @var Core + */ + private $core; + + /** + * The table handler. + * + * @var Comment_Author_Table + */ + private $comment_author_table; + + + /** + * Creates a new command instance. + * + * @since 2.4.0 Parameter $db replaced with $comment_author_table. + * + * @param Core $core The core API. + * @param Comment_Author_Table $comment_author_table The table handler. + */ + public function __construct( Core $core, Comment_Author_Table $comment_author_table ) { + $this->core = $core; + $this->comment_author_table = $comment_author_table; + } + + /** + * Registers the command (and any optional subcommands). + * + * The method assumes that `\WP_CLI` is available. + * + * @return void + */ + public function register() { + WP_CLI::add_command( 'avatar-privacy db create', [ $this, 'create' ] ); + WP_CLI::add_command( 'avatar-privacy db show', [ $this, 'show' ] ); + WP_CLI::add_command( 'avatar-privacy db list', [ $this, 'list_' ] ); + WP_CLI::add_command( 'avatar-privacy db upgrade', [ $this, 'upgrade' ] ); + } + + /** + * Displays information about the database configuration of the Avatar Privacy installation. + * + * ## EXAMPLES + * + * # Output information on the custom table used by Avatar Privacy. + * $ wp avatar-privacy db show + * Avatar Privacy Database Information + * Version: 2.3.0 + * Table name: wp_avatar_privacy + * The database currently contains 13 rows. + * + * @global \wpdb $wpdb The WordPress database. + * + * @return void + */ + public function show() { + global $wpdb; + + // Query data. + $count = (int) $wpdb->get_var( "SELECT COUNT(*) FROM {$wpdb->avatar_privacy}" ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.NoCaching,WordPress.DB.DirectDatabaseQuery.DirectQuery + $schema = $wpdb->get_results( "DESCRIBE {$wpdb->avatar_privacy}", \ARRAY_A ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.NoCaching,WordPress.DB.DirectDatabaseQuery.DirectQuery + + // Display everything in a nice way. + WP_CLI::line( '' ); + WP_CLI::line( WP_CLI::colorize( '%GAvatar Privacy Database Information%n' ) ); + WP_CLI::line( '' ); + WP_CLI::line( WP_CLI::colorize( "Version: %g{$this->core->get_version()}%n" ) ); + WP_CLI::line( WP_CLI::colorize( "Table name: %g{$this->comment_author_table->get_table_name()}%n" ) ); + WP_CLI::line( '' ); + format_items( 'table', $schema, [ 'Field', 'Type', 'Null', 'Key', 'Default', 'Extra' ] ); + + if ( \is_multisite() ) { + if ( $this->comment_author_table->use_global_table() ) { + WP_CLI::line( 'The global table is used for all sites in this network.' ); + } else { + WP_CLI::line( 'Each site in this network uses a separate table.' ); + } + } + + WP_CLI::line( '' ); + WP_CLI::line( WP_CLI::colorize( "The table currently contains %g{$count} rows%n." ) ); + WP_CLI::line( '' ); + } + + /** + * Lists the contents of Avatar Privacy's consent logging database for comment authors that were not logged in at the time. + * + * ## OPTIONS + * + * [--=] + * : Filter by one or more fields (see "Available Fields" section). + * + * [--field=] + * : Prints the value of a single field for each row. + * + * [--fields=] + * : Comma-separated list of fields to show. + * + * [--format=] + * : Render output in a particular format. + * --- + * default: table + * options: + * - table + * - csv + * - json + * - count + * - ids + * - yaml + * --- + * + * ## AVAILABLE FIELDS + * + * These fields will be displayed by default for each row: + * + * * id + * * email + * * use_gravatar + * * last_updated + * + * These fields are optionally available: + * + * * hash + * * log_message + * + * ## EXAMPLES + * + * # Output list of email address for which gravatars are enabled. + * $ wp avatar-privacy db list --field=email --use_gravatar=1 + * firstname.lastname@example.org + * office@example.com + * + * @subcommand list + * + * @param string[] $args The positional arguments. + * @param string[] $assoc_args The associative arguments. + * + * @return void + */ + public function list_( array $args, array $assoc_args ) { + $assoc_args = \wp_parse_args( $assoc_args, [ + 'fields' => [ 'id', 'email', 'use_gravatar', 'last_updated' ], + 'format' => 'table', + ] ); + + // Create query data. + $where = []; + $db_cols = [ 'id', 'email', 'hash', 'use_gravatar', 'last_updated', 'log_message' ]; + foreach ( $db_cols as $col ) { + if ( isset( $assoc_args[ $col ] ) ) { + $where[ $col ] = $assoc_args[ $col ]; + } + } + + /** + * Load table data. + * + * @phpstan-var \Iterator $iterator + */ + $iterator = new Table_Iterator( [ + 'table' => $this->comment_author_table->get_table_name(), + 'where' => $where, + ] ); + + // Optionally load only IDs. + $items = $iterator; + if ( 'ids' === $assoc_args['format'] ) { + $items = \wp_list_pluck( \iterator_to_array( $iterator ), 'id' ); + } + + // Display everything in a nice way. + $formatter = new Formatter( $assoc_args, null ); + $formatter->display_items( $items ); // @phpstan-ignore-line -- https://github.com/php-stubs/wp-cli-stubs/issues/7 + } + + /** + * Creates the table for logging gravatar use consent for comment authors that are not logged-in WordPress users (e.g. anonymous comments). + * + * ## OPTIONS + * + * [ --global ] + * Creates the global table. Only valid in a multisite environment with global table use enabled. + * + * ## EXAMPLES + * + * # Creates the database table. + * $ wp avatar-privacy db create + * Success: Table wp_avatar_privacy created/updated successfully. + * + * @param string[] $args The positional arguments. + * @param string[] $assoc_args The associative arguments. + * + * @return void + */ + public function create( array $args, array $assoc_args ) { + $global = get_flag_value( $assoc_args, 'global', false ); + $multisite = \is_multisite(); + if ( $global ) { + if ( ! $multisite ) { + WP_CLI::error( 'This is not a multisite installation.' ); + } elseif ( ! $this->comment_author_table->use_global_table() ) { + WP_CLI::error( 'Cannot create global table because global table use is disabled.' ); + } + } elseif ( $multisite && $this->comment_author_table->use_global_table() && ! \is_main_site() ) { + WP_CLI::error( 'Cannot create site-specific table because the global is used for all sites. Use `--global` switch to create the global table instead.' ); + } + + $table_name = $this->comment_author_table->get_table_name(); + + if ( $this->comment_author_table->table_exists( $table_name ) ) { + WP_CLI::error( WP_CLI::colorize( "Table %B{$table_name}%n already exists." ) ); + } + + if ( $this->comment_author_table->maybe_create_table( '' ) ) { + WP_CLI::success( WP_CLI::colorize( "Table %B{$table_name}%n created/updated successfully." ) ); + } else { + WP_CLI::error( WP_CLI::colorize( "An error occured while creating the table %B{$table_name}%n." ) ); + } + } + + /** + * Upgrades the gravatar-use consent data. + * + * ## OPTIONS + * + * [ --global ] + * Upgrades the global table. Only valid in a multisite environment with global table use enabled. + * + * ## EXAMPLES + * + * # Creates the database table. + * $ wp avatar-privacy db upgrade + * Success: Table wp_avatar_privacy upgraded successfully. + * + * @param string[] $args The positional arguments. + * @param string[] $assoc_args The associative arguments. + * + * @return void + */ + public function upgrade( array $args, array $assoc_args ) { + $global = get_flag_value( $assoc_args, 'global', false ); + $multisite = \is_multisite(); + if ( $global ) { + if ( ! $multisite ) { + WP_CLI::error( 'This is not a multisite installation.' ); + } elseif ( ! $this->comment_author_table->use_global_table() ) { + WP_CLI::error( 'Cannot upgrade global table because global table use is disabled.' ); + } + } elseif ( $multisite && $this->comment_author_table->use_global_table() && ! \is_main_site() ) { + WP_CLI::error( 'Cannot upgrade site-specific table because the global is used for all sites. Use `--global` switch to create the global table instead.' ); + } + + // Check for existence of table. + $table = $this->comment_author_table->get_table_name(); + if ( ! $this->comment_author_table->table_exists( $table ) ) { + WP_CLI::error( WP_CLI::colorize( "Table %B{$table}%n does not exist. Use `wp avatar-privacy db create` to create it." ) ); + } + + // Upgrade table structure. + if ( ! $this->comment_author_table->maybe_create_table( '' ) ) { + WP_CLI::error( WP_CLI::colorize( "An error occured while creating or updating the table %B{$table}%n." ) ); + } + + // Upgrade data. + $rows = $this->comment_author_table->maybe_upgrade_data( '' ); + + if ( $rows > 0 ) { + WP_CLI::success( "Upgraded {$rows} rows in table {$table}." ); + } else { + WP_CLI::success( "No rows to upgrade in table {$table}." ); + } + } +} diff --git a/includes/avatar-privacy/cli/class-default-command.php b/includes/avatar-privacy/cli/class-default-command.php new file mode 100644 index 0000000..5cc8e28 --- /dev/null +++ b/includes/avatar-privacy/cli/class-default-command.php @@ -0,0 +1,209 @@ + + */ +class Default_Command extends Abstract_Command { + + /** + * The default avatars data helper. + * + * @var Default_Avatars + */ + private Default_Avatars $default_avatars; + + /** + * Creates a new command instance. + * + * @param Default_Avatars $default_avatars The default avatars API. + */ + public function __construct( Default_Avatars $default_avatars ) { + $this->default_avatars = $default_avatars; + } + + /** + * Registers the command (and any optional subcommands). + * + * The method assumes that `\WP_CLI` is available. + * + * @return void + */ + public function register() { + WP_CLI::add_command( 'avatar-privacy default get-custom-default-avatar', [ $this, 'get_custom_default_avatar' ] ); + WP_CLI::add_command( 'avatar-privacy default set-custom-default-avatar', [ $this, 'set_custom_default_avatar' ] ); + WP_CLI::add_command( 'avatar-privacy default delete-custom-default-avatar', [ $this, 'delete_custom_default_avatar' ] ); + } + + /** + * Retrieves the custom default avatar for the site. + * + * ## EXAMPLES + * + * # Show the current custom default avatar. + * $ wp avatar-privacy default get-custom-default-avatar + * Success: Currently set custom default avatar: /path/image.jpg + * + * @return void + */ + public function get_custom_default_avatar() { + $avatar = $this->default_avatars->get_custom_default_avatar(); + if ( empty( $avatar['file'] ) ) { + WP_CLI::success( 'No custom default avatar set for this site.' ); + } else { + WP_CLI::success( WP_CLI::colorize( "Currently set custom default avatar: %g{$avatar['file']}%n" ) ); + } + } + + /** + * Sets the custom default avatar for the site. + * + * ## OPTIONS + * + * + * : The URL of the avatar to set. + * + * [--live] + * : Actually change the default avatar (instead of only listing it). + * + * [--yes] + * : Do not ask for confirmation when updating data. + * + * ## EXAMPLES + * + * # Set a new custom default avatar. + * $ wp avatar-privacy user set-local-avatar http://example.org/image.jpg --live --yes + * Currently set custom default avatar: /path/old-image.jpg + * Success: Custom default avatar http://example.org/image.jpg has been set. + * + * @param string[] $args The positional arguments. + * @param string[] $assoc_args The associative arguments. + * + * @return void + */ + public function set_custom_default_avatar( array $args, array $assoc_args ) { + $live = get_flag_value( $assoc_args, 'live', false ); + $image_url = $args[0]; + + if ( \esc_url_raw( $image_url ) !== $image_url ) { + WP_CLI::error( "Invalid image URL {$image_url}" ); + } + + if ( ! $live ) { + WP_CLI::warning( 'Starting dry run.' ); + } + + $avatar = $this->default_avatars->get_custom_default_avatar(); + $current_image = $avatar['file'] ?? 'none'; + + WP_CLI::line( WP_CLI::colorize( "Currently set custom default avatar: %g{$current_image}%n" ) ); + + // OK, let's do this. + if ( $live ) { + // Get confirmation. + WP_CLI::confirm( "Are you sure you want to set {$image_url} as the new custom default avatar for this site?", $assoc_args ); + + try { + // Actually set the new avatar image. + $this->default_avatars->set_custom_default_avatar( $image_url ); + } catch ( \Exception $e ) { + WP_CLI::error( $e->getMessage() ); + } + + WP_CLI::success( WP_CLI::colorize( "Custom default avatar {$image_url} has been set." ) ); + } else { + WP_CLI::success( 'Dry run finished.' ); + } + } + + /** + * Deletes the custom default avatar for the site. + * + * ## OPTIONS + * + * [--live] + * : Actually delete the custom default avatar (instead of only listing it). + * + * [--yes] + * : Do not ask for confirmation when removing data. + * + * ## EXAMPLES + * + * # Show when cron job will run next. + * $ wp avatar-privacy user delete-local-avatar --live --yes + * Currently set custom default avatar: /path/image.jpg + * Success: The custom default avatar for this site has been deleted. + * + * @param string[] $args The positional arguments. + * @param string[] $assoc_args The associative arguments. + * + * @return void + */ + public function delete_custom_default_avatar( array $args, array $assoc_args ) { + $live = get_flag_value( $assoc_args, 'live', false ); + + $avatar = $this->default_avatars->get_custom_default_avatar(); + if ( empty( $avatar['file'] ) ) { + WP_CLI::error( 'No custom default avatar set for this site.' ); + } + + if ( ! $live ) { + WP_CLI::warning( 'Starting dry run.' ); + } + + WP_CLI::line( WP_CLI::colorize( "Currently set custom default avatar: %g{$avatar['file']}%n" ) ); + + // OK, let's do this. + if ( $live ) { + // Get confirmation. + WP_CLI::confirm( 'Are you sure you want to delete the custom default avatar?', $assoc_args ); + + try { + // Actually set the new avatar image. + $this->default_avatars->delete_custom_default_avatar(); + } catch ( \Exception $e ) { + WP_CLI::error( $e->getMessage() ); + } + + WP_CLI::success( WP_CLI::colorize( 'The custom default avatar for this site has been deleted.' ) ); + } else { + WP_CLI::success( 'Dry run finished.' ); + } + } +} diff --git a/includes/avatar-privacy/cli/class-uninstall-command.php b/includes/avatar-privacy/cli/class-uninstall-command.php new file mode 100644 index 0000000..1faa2c8 --- /dev/null +++ b/includes/avatar-privacy/cli/class-uninstall-command.php @@ -0,0 +1,239 @@ + + */ +class Uninstall_Command extends Abstract_Command { + + /** + * The setup component. + * + * @var Setup + */ + private Setup $setup; + + /** + * The uninstallation component. + * + * @var Uninstallation + */ + private Uninstallation $uninstall; + + /** + * The DB handler. + * + * @var Database + */ + private Database $db; + + /** + * Creates a new command instance. + * + * @param Setup $setup The setup component. + * @param Uninstallation $uninstall The uninstallation component. + * @param Database $db The database handler. + */ + public function __construct( Setup $setup, Uninstallation $uninstall, Database $db ) { + $this->setup = $setup; + $this->uninstall = $uninstall; + $this->db = $db; + } + + /** + * Registers the command (and any optional subcommands). + * + * The method assumes that `\WP_CLI` is available. + * + * @return void + */ + public function register() { + WP_CLI::add_command( 'avatar-privacy uninstall', [ $this, 'uninstall' ] ); + } + + /** + * Removes all data from the current site. Optionally, also removes global data on multisite. + * + * Data that will be removed: + * * Cached avatar images + * * Uploaded user avatars + * * Uploaded custom default images + * * Avatar privacy user settings + * * Options created by Avatar Privacy + * * Transients created by Avatar Privacy + * * Network options (on multisite) + * * Network transients (on multisite) + * * The custom database table used for non-logged-in comment author consent logging. + * + * ## OPTIONS + * + * [--live] + * : Actually remove the data (instead of only listing it). + * + * [--yes] + * : Do not ask for confirmation when removing data. + * + * [--global] + * : Also uninstall global data (only applicable on multisite installations). + * + * ## EXAMPLES + * + * # Remove all data from a non-multisite installatin. + * $ wp avatar-privacy uninstall + * + * # Remove site-specific and global data from a multisite installation + * # (site-specific data needs to be deleted from each site seperately). + * $ wp avatar-privacy uninstall --global + * + * @global \wpdb $wpdb The WordPress database. + * + * @param string[] $args The positional arguments. + * @param string[] $assoc_args The associative arguments. + * + * @return void + */ + public function uninstall( array $args, array $assoc_args ) { + $live = get_flag_value( $assoc_args, 'live', false ); + $remove_global = get_flag_value( $assoc_args, 'global', false ); + $multisite = \is_multisite(); + + // Abort early if we're not on a multsitie installation. + if ( $remove_global && ! $multisite ) { + WP_CLI::error( 'This is not a multisite installation.' ); + } + + // On non-multisite installations, global data is always removed. + $remove_global = $remove_global || ! $multisite; + + if ( ! $live ) { + WP_CLI::warning( 'Starting dry run.' ); + } + + // Marker text for site-specific data. + $site_id = \get_current_blog_id(); + $for_site = $multisite ? " for site {$site_id}" : ''; + + // List the data that will be deleted. + $this->print_data_to_delete( $for_site, $remove_global ); + + // OK, let's do this. + if ( $live ) { + // Get confirmation. + WP_CLI::confirm( 'Are you sure you want to delete this data?', $assoc_args ); + + // Actually delete data. + $this->delete_data( $site_id, $for_site, $remove_global ); + } else { + WP_CLI::success( 'Dry run finished.' ); + } + } + + /** + * Deletes the data and prints a confirmation message. + * + * @param int $site_id The site ID. + * @param string $for_site Label part describing the site ("for site "). + * @param bool $remove_global A flag indicating that global data should be removed as well. + * + * @return void + */ + protected function delete_data( $site_id, $for_site, $remove_global ) { + + // Act as if deactivating plugin. + $this->setup->deactivate_plugin(); + + // Add tasks to uninstallation actions. + $this->uninstall->enqueue_cleanup_tasks(); + + if ( $remove_global ) { + // Remove global data. + /** This action is documented in class-uninstallation.php */ + \do_action( 'avatar_privacy_uninstallation_global' ); + + if ( \is_multisite() ) { + // Only show extra message on multsite. + WP_CLI::success( 'Global data deleted.' ); + } + } + + // Remove site data. + /** This action is documented in class-uninstallation.php */ + \do_action( 'avatar_privacy_uninstallation_site', $site_id ); + + WP_CLI::success( "Site data{$for_site} deleted." ); + } + + /** + * Prints the list of data to be deleted. + * + * @param string $for_site Label part describing the site ("for site "). + * @param bool $remove_global A flag indicating that global data should be removed as well. + * + * @return void + */ + protected function print_data_to_delete( $for_site, $remove_global ) { + if ( $remove_global ) { + // List global data to delete. + WP_CLI::line( 'Deleting cached avatar images.' ); + WP_CLI::line( 'Deleting uploaded user avatar and custom default images.' ); + WP_CLI::line( 'Deleting avatar privacy user settings (user_meta).' ); + + if ( \is_multisite() ) { + // These do not make sense in single-site environment, even though + // they technically do exist. + WP_CLI::line( 'Deleting network options.' ); + WP_CLI::line( 'Deleting network transients.' ); + } + } + + // List site data to delete. + WP_CLI::line( "Deleting options{$for_site}." ); + WP_CLI::line( "Deleting transients{$for_site}." ); + + // Show dropped table. + $table_name = $this->db->get_table_name(); + if ( ! $this->db->use_global_table() ) { + WP_CLI::line( "Dropping table {$table_name}{$for_site}." ); + } else { + WP_CLI::line( "Dropping global table {$table_name}." ); + } + } +} diff --git a/includes/avatar-privacy/cli/class-user-command.php b/includes/avatar-privacy/cli/class-user-command.php new file mode 100644 index 0000000..9a7fdb5 --- /dev/null +++ b/includes/avatar-privacy/cli/class-user-command.php @@ -0,0 +1,206 @@ + + */ +class User_Command extends Abstract_Command { + + /** + * The user data helper. + * + * @var User_Fields + */ + private User_Fields $user_fields; + + /** + * Creates a new command instance. + * + * @param User_Fields $user_fields The user data API. + */ + public function __construct( User_Fields $user_fields ) { + $this->user_fields = $user_fields; + } + + /** + * Registers the command (and any optional subcommands). + * + * The method assumes that `\WP_CLI` is available. + * + * @return void + */ + public function register() { + WP_CLI::add_command( 'avatar-privacy user set-local-avatar', [ $this, 'set_local_avatar' ] ); + WP_CLI::add_command( 'avatar-privacy user delete-local-avatar', [ $this, 'delete_local_avatar' ] ); + } + + /** + * Sets a new local avatar for the given user. + * + * ## OPTIONS + * + * + * : The ID of the user whose local avatar should be set. + * + * + * : The URL of the avatar to set. + * + * [--live] + * : Actually change the user avatar (instead of only listing it). + * + * [--yes] + * : Do not ask for confirmation when removing data. + * + * ## EXAMPLES + * + * # Show when cron job will run next. + * $ wp avatar-privacy user set-local-avatar 1 http://example.org/image.jpg --live --yes + * Success: Local avatar http://example.org/image.jpg set for user 'example_user' (ID: 1) has been set. + * + * @param string[] $args The positional arguments. + * @param string[] $assoc_args The associative arguments. + * + * @return void + */ + public function set_local_avatar( array $args, array $assoc_args ) { + $live = get_flag_value( $assoc_args, 'live', false ); + $user_id = (int) $args[0]; + $image_url = $args[1]; + + $user = \get_user_by( 'id', $user_id ); + $user_login = ! empty( $user ) ? $user->user_login : ''; + if ( empty( $user_login ) ) { + WP_CLI::error( "Invalid user ID {$user_id}" ); + } + + if ( \esc_url_raw( $image_url ) !== $image_url ) { + WP_CLI::error( "Invalid image URL {$image_url}" ); + } + + if ( ! $live ) { + WP_CLI::warning( 'Starting dry run.' ); + } + + $avatar = $this->user_fields->get_local_avatar( $user_id ); + $current_image = $avatar['file'] ?? 'none'; + + WP_CLI::line( WP_CLI::colorize( "Currently set local avatar for user '{$user_login}' (ID: {$user_id}): %g{$current_image}%n" ) ); + + // OK, let's do this. + if ( $live ) { + // Get confirmation. + WP_CLI::confirm( "Are you sure you want to set {$image_url} as the new local avatar for user '{$user_login}' (ID: {$user_id})?", $assoc_args ); + + try { + // Actually set the new avatar image. + $this->user_fields->set_local_avatar( $user_id, $image_url ); + } catch ( \Exception $e ) { + WP_CLI::error( $e->getMessage() ); + } + + WP_CLI::success( WP_CLI::colorize( "Local avatar {$image_url} for user '{$user_login}' (ID: {$user_id}) has been set." ) ); + } else { + WP_CLI::success( 'Dry run finished.' ); + } + } + + /** + * Deletes the local avatar for the given user. + * + * ## OPTIONS + * + * + * : The ID of the user whose local avatar should be deleted. + * + * [--live] + * : Actually change the user avatar (instead of only listing it). + * + * [--yes] + * : Do not ask for confirmation when removing data. + * + * ## EXAMPLES + * + * # Show when cron job will run next. + * $ wp avatar-privacy user delete-local-avatar 1 --live --yes + * Success: The local avatar for user 'example_user' (ID: 1) has been deleted. + * + * @param string[] $args The positional arguments. + * @param string[] $assoc_args The associative arguments. + * + * @return void + */ + public function delete_local_avatar( array $args, array $assoc_args ) { + $live = get_flag_value( $assoc_args, 'live', false ); + $user_id = (int) $args[0]; + + $user = \get_user_by( 'id', $user_id ); + $user_login = ! empty( $user ) ? $user->user_login : ''; + if ( empty( $user_login ) ) { + WP_CLI::error( "Invalid user ID {$user_id}" ); + } + + $avatar = $this->user_fields->get_local_avatar( $user_id ); + if ( empty( $avatar['file'] ) ) { + WP_CLI::error( "No local avatar set for user '{$user_login}' (ID: {$user_id})." ); + } + + if ( ! $live ) { + WP_CLI::warning( 'Starting dry run.' ); + } + + WP_CLI::line( WP_CLI::colorize( "Currently set local avatar for user '{$user_login}' (ID: {$user_id}): %g{$avatar['file']}%n" ) ); + + // OK, let's do this. + if ( $live ) { + // Get confirmation. + WP_CLI::confirm( "Are you sure you want to delete the current local avatar of user '{$user_login}' (ID: {$user_id})?", $assoc_args ); + + try { + // Actually set the new avatar image. + $this->user_fields->delete_local_avatar( $user_id ); + } catch ( \Exception $e ) { + WP_CLI::error( $e->getMessage() ); + } + + WP_CLI::success( WP_CLI::colorize( "The local avatar for user '{$user_login}' (ID: {$user_id}) has been deleted." ) ); + } else { + WP_CLI::success( 'Dry run finished.' ); + } + } +} diff --git a/includes/avatar-privacy/components/class-avatar-handling.php b/includes/avatar-privacy/components/class-avatar-handling.php new file mode 100644 index 0000000..f7192ae --- /dev/null +++ b/includes/avatar-privacy/components/class-avatar-handling.php @@ -0,0 +1,682 @@ + + * + * @phpstan-type AvatarData array{ + * size: int, height: int, width: int, + * default: string, force_default: bool, + * rating: string, + * scheme: ?string, + * processed_args: ?mixed[], + * extra_attr: string, + * url?: string|false, + * found_avatar: bool + * } + * @phpstan-type IdentityTuple array{ 0: int|false, 1: string, 2: int } + */ +class Avatar_Handling implements Component { + + /** + * The settings API. + * + * @var Settings + */ + private Settings $settings; + + /** + * The user data helper. + * + * @since 2.4.0 + * + * @var User_Fields + */ + private User_Fields $registered_user; + + /** + * The comment author data helper. + * + * @since 2.4.0 + * + * @var Comment_Author_Fields + */ + private Comment_Author_Fields $comment_author; + + /** + * The Gravatar network service. + * + * @var Gravatar_Service + */ + private Gravatar_Service $gravatar; + + /** + * The remote image network service. + * + * @var Remote_Image_Service + */ + private Remote_Image_Service $remote_images; + + /** + * Creates a new instance. + * + * @since 2.0.0 Parameter $gravatar added. + * @since 2.1.0 Parameter $plugin_file removed. + * @since 2.3.4 Parameter $remote_images added. + * @since 2.4.0 Parameters $settings, $user_fields and $comment_author_fields + * added, unused parameters $core and $options removed. + * + * @param Settings $settings The settings API. + * @param User_Fields $user_fields User data API. + * @param Comment_Author_Fields $comment_author_fields Comment author data API. + * @param Gravatar_Service $gravatar The Gravatar network service. + * @param Remote_Image_Service $remote_images The remote images network service. + */ + public function __construct( Settings $settings, User_Fields $user_fields, Comment_Author_Fields $comment_author_fields, Gravatar_Service $gravatar, Remote_Image_Service $remote_images ) { + $this->settings = $settings; + $this->registered_user = $user_fields; + $this->comment_author = $comment_author_fields; + $this->gravatar = $gravatar; + $this->remote_images = $remote_images; + } + + /** + * Sets up the various hooks for the plugin component. + * + * @return void + */ + public function run() { + // Allow remote URLs by default for legacy avatar images. Use priority 9 + // to allow filters with the default priority to override this consistently. + \add_filter( 'avatar_privacy_allow_remote_avatar_url', '__return_true', 9, 0 ); + + // Start handling avatars when all plugins have been loaded and initialized. + \add_action( 'init', [ $this, 'setup_avatar_filters' ] ); + + // Generate presets from saved settings. + \add_action( 'init', [ $this, 'enable_presets' ] ); + } + + /** + * Sets up avatar handling filters. + * + * @since 2.4.0 Renamed from init(). + * + * @return void + */ + public function setup_avatar_filters() { + /** + * Filters the priority used for filtering the `pre_get_avatar_data` hook. + * + * @since 2.3.4 + * + * @param int $priority Default 9999. + */ + $priority = \apply_filters( 'avatar_privacy_pre_get_avatar_data_filter_priority', 9999 ); + + // New default image display: filter the gravatar image upon display. + \add_filter( 'pre_get_avatar_data', [ $this, 'get_avatar_data' ], $priority, 2 ); + } + + /** + * Enables default filters from the user settings. + * + * @return void + */ + public function enable_presets() { + if ( ! empty( $this->settings->get( Settings::GRAVATAR_USE_DEFAULT ) ) ) { + // Use priority 9 to allow filters with the default priority to override this consistently. + \add_filter( 'avatar_privacy_gravatar_use_default', '__return_true', 9, 0 ); + } + } + + /** + * Before displaying an avatar image, checks that displaying the gravatar + * for this e-mail address has been enabled (opted-in). Also, if the option + * "Don't publish encrypted e-mail addresses for non-members of Gravatar." is + * enabled, the function checks if a gravatar is actually available for the + * e-mail address. If not, it displays the default image directly. + * + * @param array $args Arguments passed to get_avatar_data(), after processing. + * @param int|string|object $id_or_email The Gravatar to retrieve. Accepts a user_id, user email, WP_User object, WP_Post object, or WP_Comment object. + * + * @return array + * + * @phpstan-param AvatarData $args + * @phpstan-return AvatarData + */ + public function get_avatar_data( $args, $id_or_email ) { + // Process the user identifier. + try { + list( $user_id, $email, $age ) = $this->parse_id_or_email( $id_or_email ); + } catch ( Avatar_Comment_Type_Exception $e ) { + // The $id_or_email is a comment of a type that should not display an avatar. + $args['url'] = false; + $args['found_avatar'] = false; + return $args; + } + + // Generate the hash. + if ( ! empty( $user_id ) ) { + // Since we are having a non-empty $user_id, we'll always get a hash. + $hash = (string) $this->registered_user->get_hash( (int) $user_id ); + } else { + // This might generate hashes for empty email addresses. + // That's OK in case some plugins want to display avatars for + // e.g. trackbacks and linkbacks. + $hash = $this->comment_author->get_hash( $email ); + } + + // We only need to check these if we are not forcing a default icon to be shown. + if ( empty( $args['force_default'] ) ) { + if ( ! empty( $user_id ) ) { + // Uploaded avatars take precedence. + $url = $this->get_local_avatar_url( $user_id, $hash, $args['size'], ! empty( $args['upload_timestamp'] ) ); + } + + if ( empty( $url ) ) { + // "Sniffed" Gravatar MIME type. + $mimetype = ''; + + // Maybe display a gravatar. + if ( $this->should_show_gravatar( $user_id, $email, $id_or_email, $age, $mimetype ) ) { + $url = $this->get_gravatar_url( $user_id, $email, $hash, $args['size'], $args['rating'], $mimetype ); + } elseif ( ! empty( $args['url'] ) && $this->remote_images->validate_image_url( $args['url'], 'avatar' ) ) { + // Fall back to avatars set by other plugins. + $url = $this->get_legacy_icon_url( $args['url'], $args['size'] ); + } + } + } + + if ( empty( $url ) ) { + // Nothing so far, use the default icon. + $url = $this->get_default_icon_url( $hash, $args['default'], $args['size'] ); + } + + // Return found image. + $args['url'] = $url; + $args['found_avatar'] = true; + + return $args; + } + + /** + * Determines if we should go for a gravatar. + * + * @since 2.1.0 Visibility changed to protected. + * + * @param int|false $user_id A WordPress user ID (or false). + * @param string $email The email address. + * @param int|string|object $id_or_email The Gravatar to retrieve. Accepts a user_id, user email, WP_User object, WP_Post object, or WP_Comment object. + * @param int $age The seconds since the post or comment was first created, or 0 if $id_or_email was not one of these object types. + * @param string $mimetype The expected MIME type of the gravatar image (if any). Passed by reference. + * + * @return bool + */ + protected function should_show_gravatar( $user_id, $email, $id_or_email, $age, &$mimetype ) { + // Find out if the user opted into displaying a gravatar. + $show_gravatar = $this->determine_gravatar_policy( $user_id, $email, $id_or_email ); + + // Check if a gravatar exists for the e-mail address. + if ( $show_gravatar ) { + /** + * Filters whether we check if opting-in users and commenters actually have a Gravatar.com account. + * + * @param bool $enable_check Defaults to true. + * @param string $email The email address. + * @param int|false $user_id A WordPress user ID (or false). + */ + if ( \apply_filters( 'avatar_privacy_enable_gravatar_check', true, $email, $user_id ) ) { + $mimetype = $this->gravatar->validate( $email, $age ); + $show_gravatar = ! empty( $mimetype ); + } + } + + return $show_gravatar; + } + + /** + * Parses e-mail address and/or user ID from $id_or_email. + * + * @since 2.1.0 Visibility changed to protected. + * @since 2.3.4 Throws an Avatar_Comment_Type_Exception for invalid comment types. + * + * @param int|string|object $id_or_email The Gravatar to retrieve. Accepts a user_id, user email, WP_User object, WP_Post object, or WP_Comment object. + * + * @return array { + * The tuple `[ $user_id, $email, $age ]`. + * + * @type int|false $user_id The WordPress user ID, or `false`. + * @type string $email The email address (or the empty string). + * @type int $age The seconds since the post or comment was first created, + * or 0 if `$id_or_email was` not one of these object types. + * } + * + * @throws Avatar_Comment_Type_Exception The function throws an + * `Avatar_Comment_Type_Exception` if `$id_or_email` is an instance of + * `WP_Comment` but its comment type is not one of the allowed avatar + * comment types. + * + * @phpstan-return IdentityTuple + */ + protected function parse_id_or_email( $id_or_email ) { + list( $user_id, $email, $age ) = $this->parse_id_or_email_unfiltered( $id_or_email ); + + if ( ! empty( $user_id ) && empty( $email ) ) { + $user = \get_user_by( 'ID', $user_id ); + + // Prevent warnings when a user ID is invalid (e.g. because a user was deleted directly from the database). + if ( ! empty( $user ) ) { + $email = $user->user_email; + } else { + $user_id = false; // The user ID was invalid. + } + } elseif ( empty( $user_id ) && ! empty( $email ) ) { + // Check if anonymous comments "as user" are allowed. + $user = $this->registered_user->get_user_by_email( $email ); + if ( ! empty( $user ) && $this->registered_user->allows_anonymous_commenting( $user->ID ) ) { + $user_id = $user->ID; + } + } + + /** + * Filters the parsed user ID, email address and "object age". + * + * @param array $parsed_data { + * The information parsed from $id_or_email. + * + * @type int|false $user_id The WordPress user ID, or `false`. + * @type string $email The email address (or the empty string). + * @type int $age The seconds since the post or comment was first created, + * or 0 if `$id_or_email was` not one of these object types. + * } + * @param int|string|object $id_or_email The Gravatar to retrieve. Accepts a user_id, user email, WP_User object, WP_Post object, or WP_Comment object. + * + * @phpstan-var IdentityTuple + */ + return \apply_filters( 'avatar_privacy_parse_id_or_email', [ $user_id, $email, $age ], $id_or_email ); + } + + /** + * Parses e-mail address and/or user ID from $id_or_email without filtering + * the result in any way. + * + * @since 2.3.0 + * @since 2.3.4 Throws an Avatar_Comment_Type_Exception for invalid comment types. + * + * @internal + * + * @param int|string|object $id_or_email The identity to retrieven an avatar for. + * Accepts a user_id, user email, WP_User object, + * WP_Post object, or WP_Comment object. + * + * @return array { + * The tuple `[ $user_id, $email, $age ]`. + * + * @type int|false $user_id The WordPress user ID, or `false`. + * @type string $email The email address (or the empty string). + * @type int $age The seconds since the post or comment was first created, + * or 0 if $id_or_email was not one of these object types. + * } + * + * @throws Avatar_Comment_Type_Exception The function throws an + * `Avatar_Comment_Type_Exception` if `$id_or_email` is an instance of + * `WP_Comment` but its comment type is not one of the allowed avatar + * comment types. + * + * @phpstan-return IdentityTuple + */ + protected function parse_id_or_email_unfiltered( $id_or_email ) { + $user_id = false; + $email = ''; + $age = 0; + + if ( \is_numeric( $id_or_email ) ) { + $user_id = \absint( $id_or_email ); + } elseif ( \is_string( $id_or_email ) ) { + // E-mail address. + $email = $id_or_email; + } elseif ( $id_or_email instanceof \WP_User ) { + // User object. + $user_id = $id_or_email->ID; + $email = $id_or_email->user_email; + } elseif ( $id_or_email instanceof \WP_Post ) { + // Post object. + $user_id = (int) $id_or_email->post_author; + $age = $this->get_age( $id_or_email->post_date_gmt ); + } elseif ( $id_or_email instanceof \WP_Comment ) { + return $this->parse_comment( $id_or_email ); + } + + return [ $user_id, $email, $age ]; + } + + /** + * Parse a WP_Comment object. + * + * @since 2.1.0 Visibility changed to protected. + * @since 2.3.4 Throws an Avatar_Comment_Type_Exception for invalid comment types. + * + * @param \WP_Comment $comment A comment. + * + * @return array { + * The information parsed from $id_or_email. + * + * @type int|false $user_id The WordPress user ID, or false. + * @type string $email The email address. + * @type int $age The seconds since the post or comment was first created, or 0 if $id_or_email was not one of these object types. + * } + * + * @throws Avatar_Comment_Type_Exception The function throws an + * `Avatar_Comment_Type_Exception` if the comment type of `$comment` is + * not one of the allowed avatar comment types. + * + * @phpstan-return IdentityTuple + */ + protected function parse_comment( \WP_Comment $comment ) { + /** This filter is documented in wp-includes/pluggable.php */ + $allowed_comment_types = \apply_filters( 'get_avatar_comment_types', [ 'comment' ] ); // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedHooknameFound -- can be replaced with is_avatar_comment_type() once WordPress 5.1 is released. + + if ( ! \in_array( \get_comment_type( $comment ), (array) $allowed_comment_types, true ) ) { + // Abort. + throw new Avatar_Comment_Type_Exception(); + } + + $user_id = false; + $email = ''; + $age = $this->get_age( $comment->comment_date_gmt ); + if ( ! empty( $comment->user_id ) ) { + $user_id = (int) $comment->user_id; + } elseif ( ! empty( $comment->comment_author_email ) ) { + $email = $comment->comment_author_email; + } + + return [ $user_id, $email, $age ]; + } + + /** + * Calculates the age (seconds before now) from a GMT-based date/time string. + * + * @since 2.1.0 + * + * @param string $date_gmt A date/time string in the GMT time zone. + * + * @return int The age in seconds. + */ + protected function get_age( $date_gmt ) { + return \time() - (int) \mysql2date( 'U', $date_gmt ); + } + + /** + * Retrieves a URL pointing to the local avatar image of the appropriate size. + * + * @since 2.1.0 Visibility changed to protected. + * @since 2.4.0 Parameter $timestamp added. + * + * @param int $user_id The user ID. + * @param string $hash The hashed mail address. + * @param int $size The requested avatar size in pixels. + * @param bool $timestamp Optional. Whether a timestampe (`ts`) parameter + * should be added to the URL (for cache busting). + * + * @return string The URL, or '' if no local avatar has been set. + */ + protected function get_local_avatar_url( $user_id, $hash, $size, $timestamp = false ) { + // Bail if we haven't got a valid user ID. + if ( empty( $user_id ) ) { + return ''; + } + + // Fetch local avatar from meta and make sure it's properly stzed. + $url = ''; + $local_avatar = $this->registered_user->get_local_avatar( $user_id ); + if ( ! empty( $local_avatar['file'] ) && ! empty( $local_avatar['type'] ) ) { + // Prepare filter arguments. + $args = [ + 'user_id' => $user_id, + 'avatar' => $local_avatar['file'], + 'mimetype' => $local_avatar['type'], + 'timestamp' => $timestamp, + ]; + + /** + * Filters the uploaded avatar URL for the given user. + * + * @since 2.4.0 Optional 'timestamp' argument added. + * + * @param string $url The URL. Default empty. + * @param string $hash The hashed mail address. + * @param int $size The size of the avatar image in pixels. + * @param array $args { + * An array of arguments. + * + * @type int $user_id A WordPress user ID. + * @type string $avatar The full-size avatar image path. + * @type string $mimetype The expected MIME type of the avatar image. + * @type bool $timestamp Whether to add a timestamp for cache busting. + * } + */ + $url = \apply_filters( 'avatar_privacy_user_avatar_icon_url', '', $hash, $size, $args ); + } + + return $url; + } + + /** + * Retrieves the default icon URL for the given hash. + * + * @since 2.4.0 + * @since 2.7.0 Parameter `$default` renamed to `$type` to prevent conflict with reserved keyword. + * + * @param string $hash The hashed mail address. + * @param string $type The default icon type. + * @param int $size The size of the avatar image in pixels. + * + * @return string + */ + protected function get_default_icon_url( $hash, $type, $size ) { + // Prepare filter arguments. + $args = [ + 'default' => $type, + 'type' => $type, + ]; + + /** + * Filters the default icon URL for the given e-mail. + * + * @since 2.7.0 The argument key 'default' has been deprecated. Use 'type' instead. + * + * @param string $url The fallback icon URL (a blank GIF). + * @param string $hash The hashed mail address. + * @param int $size The size of the avatar image in pixels. + * @param array $args { + * An array of arguments. + * + * @type string $default Deprecated. + * @type string $type The default icon type. + * } + */ + return \apply_filters( 'avatar_privacy_default_icon_url', \includes_url( 'images/blank.gif' ), $hash, $size, $args ); + } + + /** + * Determines the gravatar use policy. + * + * @since 2.1.0 Visibility changed to protected. + * + * @param int|false $user_id A WordPress user ID (or false). + * @param string $email The email address. + * @param int|string|object $id_or_email The Gravatar to retrieve. Can be a user_id, user email, WP_User object, WP_Post object, or WP_Comment object. + * + * @return bool + */ + protected function determine_gravatar_policy( $user_id, $email, $id_or_email ) { + $show_gravatar = false; + $use_default = false; + + if ( ! empty( $user_id ) ) { + // For users get the value from the usermeta table. + $show_gravatar = $this->registered_user->allows_gravatar_use( $user_id ); + $use_default = ! $this->registered_user->has_gravatar_policy( $user_id ); + } else { + // For comments get the value from the plugin's table. + $show_gravatar = $this->comment_author->allows_gravatar_use( $email ); + + // Don't use the default policy for spam comments. + if ( ! $show_gravatar && ( ! $id_or_email instanceof \WP_Comment || ( 'spam' !== $id_or_email->comment_approved && 'trash' !== $id_or_email->comment_approved ) ) ) { + $use_default = ! $this->comment_author->has_gravatar_policy( $email ); + } + } + + if ( $use_default ) { + /** + * Filters the default policy for showing gravatars. + * + * The result only applies if a user or comment author has not + * explicitely set a value for `use_gravatar` (i.e. for comments + * created before the plugin was installed). + * + * @param bool $show Default false. + * @param int|string|object $id_or_email The Gravatar to retrieve. Can be a user_id, user email, WP_User object, WP_Post object, or WP_Comment object. + */ + $show_gravatar = \apply_filters( 'avatar_privacy_gravatar_use_default', false, $id_or_email ); + + if ( $show_gravatar && empty( $user_id ) ) { + // Create only the hash so that the gravatar can be regenerated. + $this->comment_author->update_hash( $email ); + } + } + + return $show_gravatar; + } + + /** + * Retrieves the Gravatar.com URL for the given e-mail. + * + * @since 2.4.0 + * + * @param int|false $user_id A WordPress user ID (or false). + * @param string $email The mail address used to generate the identity hash. + * @param string $hash The hashed e-mail address. + * @param int $size The size of the avatar image in pixels. + * @param string $rating The audience rating (e.g. 'g', 'pg', 'r', 'x'). + * @param string $mimetype The expected MIME type of the Gravatar image. + * + * @return string + */ + protected function get_gravatar_url( $user_id, $email, $hash, $size, $rating, $mimetype = null ) { + // Prepare filter arguments. + $args = [ + 'user_id' => $user_id, + 'email' => $email, + 'rating' => $rating, + 'mimetype' => empty( $mimetype ) ? Image_File::PNG_IMAGE : $mimetype, + ]; + + /** + * Filters the Gravatar.com URL for the given e-mail. + * + * @param string $url The fallback default icon URL (or ''). + * @param string $hash The hashed e-mail address. + * @param int $size The size of the avatar image in pixels. + * @param array $args { + * An array of arguments. + * + * @type int|false $user_id A WordPress user ID (or false). + * @type string $email The mail address used to generate the identity hash. + * @type string $rating The audience rating (e.g. 'g', 'pg', 'r', 'x'). + * @type string $mimetype The expected MIME type of the Gravatar image. + * } + */ + return \apply_filters( 'avatar_privacy_gravatar_icon_url', '', $hash, $size, $args ); + } + + /** + * Checks if an image URL is valid to use as a fallback avatar icon. + * + * @since 2.4.0 + * + * @deprecated 2.7.0 + * + * @param string $url The image URL. + * + * @return bool + */ + protected function is_valid_image_url( $url ) { + \_deprecated_function( __METHOD__, '2.7.0', 'Avatar_Privacy\Tools\Network\Remote_Image_Service::validate_image_url' ); + + return ( ! \strpos( $url, 'gravatar.com' ) && $this->remote_images->validate_image_url( $url, 'avatar' ) ); + } + + /** + * Retrieves a URL pointing to the legacy icon scaled to the appropriate size. + * + * @since 2.4.0 + * + * @param string $url A valid image URL. + * @param int $size The size of the avatar image in pixels. + * + * @return string + */ + protected function get_legacy_icon_url( $url, $size ) { + // Prepare filter arguments. + $hash = $this->remote_images->get_hash( $url ); + $args = []; + + /** + * Filters the legacy icon URL. + * + * @since 2.4.0 + * + * @param string $url The legacy image URL. + * @param string $hash The hashed URL. + * @param int $size The size of the avatar image in pixels. + * @param array $args { + * An array of arguments. Currently unused. + * } + */ + return \apply_filters( 'avatar_privacy_legacy_icon_url', $url, $hash, $size, $args ); + } +} diff --git a/includes/avatar-privacy/components/class-block-editor.php b/includes/avatar-privacy/components/class-block-editor.php new file mode 100644 index 0000000..31518af --- /dev/null +++ b/includes/avatar-privacy/components/class-block-editor.php @@ -0,0 +1,249 @@ + + * + * @phpstan-type FormBlockAttributes array{ avatar_size: int, className: string } + * @phpstan-type AvatarBlockAttributes array{ user_id: int, avatar_size: int, className: string } + */ +class Block_Editor implements Component { + + /** + * The script & style registration helper. + * + * @since 2.4.0 + * + * @var Dependencies + */ + private Dependencies $dependencies; + + /** + * The template helper. + * + * @since 2.4.0 + * + * @var Template + */ + private Template $template; + + /** + * The profile form helper. + * + * @var User_Form + */ + private User_Form $form; + + /** + * Initialize the class and set its properties. + * + * @param Dependencies $dependencies The script & style registration helper. + * @param Template $template The template helper. + * @param User_Form $form The profile form helper. + */ + public function __construct( Dependencies $dependencies, Template $template, User_Form $form ) { + $this->dependencies = $dependencies; + $this->template = $template; + $this->form = $form; + } + + /** + * Sets up the various hooks for the plugin component. + * + * @return void + */ + public function run() { + if ( ! \function_exists( 'register_block_type' ) ) { + // Block editor not installed. + return; + } + + // Initialize shortcodes after WordPress has loaded. + \add_action( 'init', [ $this, 'register_blocks' ] ); + + // Only process forms on the frontend. + if ( ! \is_admin() ) { + $this->form->register_form_submission(); + } + } + + /** + * Registers the Gutenberg blocks. + * + * @return void + */ + public function register_blocks() { + // Register the script containing all our block types. + $this->dependencies->register_block_script( 'avatar-privacy-gutenberg', 'admin/blocks/js/blocks' ); + + // Register the stylesheet for the blocks. + $this->dependencies->register_style( 'avatar-privacy-gutenberg-style', 'admin/css/blocks.css' ); + + // Register each individual block type: + // The frontend form block. + \register_block_type( + 'avatar-privacy/form', + [ + 'editor_script' => 'avatar-privacy-gutenberg', + 'editor_style' => 'avatar-privacy-gutenberg-style', + 'render_callback' => [ $this, 'render_frontend_form' ], + 'attributes' => [ + 'avatar_size' => [ + 'type' => 'integer', + 'default' => 96, + ], + 'show_descriptions' => [ + 'type' => 'boolean', + 'default' => true, + ], + 'className' => [ + 'type' => 'string', + 'default' => '', + ], + 'preview' => [ + 'type' => 'boolean', + 'default' => false, + ], + ], + ] + ); + + // The avatar block. + \register_block_type( + 'avatar-privacy/avatar', + [ + 'editor_script' => 'avatar-privacy-gutenberg', + 'editor_style' => 'avatar-privacy-gutenberg-style', + 'render_callback' => [ $this, 'render_avatar' ], + 'attributes' => [ + 'avatar_size' => [ + 'type' => 'integer', + 'default' => 96, + ], + 'user_id' => [ + 'type' => 'integer', + 'default' => 0, + ], + 'align' => [ + 'type' => 'string', + 'default' => '', + ], + 'className' => [ + 'type' => 'string', + 'default' => '', + ], + ], + ] + ); + + // Enable i18n. + \wp_set_script_translations( 'avatar-privacy-gutenberg', 'avatar-privacy' ); + } + + /** + * Renders the frontend form. + * + * @param array $attributes { + * The `avatar-privacy/form` block attributes. + * + * @type int $avatar_size The width/height of the avatar preview image (in pixels). + * @type string $className The additional classname defined in the Block Editor. + * } + * + * @return string + * + * @phpstan-param FormBlockAttributes $attributes + */ + public function render_frontend_form( array $attributes ) { + $user_id = \get_current_user_id(); + + // User not logged in. + if ( empty( $user_id ) ) { + return ''; + } + + // Include partial. + $markup = $this->form->get_form( 'public/partials/block/frontend-form.php', $user_id, [ 'attributes' => $attributes ] ); + + // As an additional precaution, remove some data if we are in preview mode. + if ( ! empty( $attributes['preview'] ) ) { + // Remove nonces and other hidden fields. + $markup = (string) \preg_replace( '/]+type=["\']hidden[^>]+>/Si', '', $markup ); + + // Also remove links. + $markup = (string) \preg_replace( '/(]+)href=("[^"]*"|\'[^\']*\')([^>]+>)/Si', '$1$3', $markup ); + } + + return $markup; + } + + /** + * Renders the avatar block. + * + * @param array $attributes { + * The `avatar-privacy/avatar` block attributes. + * + * @type int $user_id The ID of the user whose avatar should be displayed. + * @type int $avatar_size The width/height of the avatar preview image (in pixels). + * @type string $className The additional classname defined in the Block Editor. + * } + * + * @return string + * + * @phpstan-param AvatarBlockAttributes $attributes + */ + public function render_avatar( array $attributes ) { + // Attempt to retrieve user. + $user = \get_user_by( 'ID', $attributes['user_id'] ); + + // No valid user given. + if ( empty( $user ) ) { + return ''; + } + + // Set up variables used by the included partial. + $args = [ + 'user' => $user, + 'size' => $attributes['avatar_size'], + 'class_name' => $attributes['className'], + 'align' => ! empty( $attributes['align'] ) ? "align{$attributes['align']}" : '', + ]; + + // Include partial. + return $this->template->get_partial( 'public/partials/block/avatar.php', $args ); + } +} diff --git a/includes/avatar-privacy/components/class-command-line-interface.php b/includes/avatar-privacy/components/class-command-line-interface.php new file mode 100644 index 0000000..569dd4b --- /dev/null +++ b/includes/avatar-privacy/components/class-command-line-interface.php @@ -0,0 +1,76 @@ + + */ +class Command_Line_Interface implements Component { + + /** + * An array of CLI commands. + * + * @var Command[] + */ + private $commands; + + /** + * Initialize the class and set its properties. + * + * @param Command[] $commands An array of CLI commands to register. + */ + public function __construct( array $commands ) { + $this->commands = $commands; + } + + /** + * Sets up the various hooks for the plugin component. + * + * @return void + */ + public function run() { + \add_action( 'cli_init', [ $this, 'register_commands' ] ); + } + + /** + * Registeres all the different CLI commands. + * + * @return void + */ + public function register_commands() { + foreach ( $this->commands as $cmd ) { + $cmd->register(); + } + } +} diff --git a/includes/avatar-privacy/components/class-comments.php b/includes/avatar-privacy/components/class-comments.php new file mode 100644 index 0000000..85aab3d --- /dev/null +++ b/includes/avatar-privacy/components/class-comments.php @@ -0,0 +1,334 @@ + + */ +class Comments implements Component { + + /** + * The name of the checkbox field in the comment form. + */ + const CHECKBOX_FIELD_NAME = 'avatar-privacy-use-gravatar'; + + /** + * The prefix of the comment cookie (COOKIEHASH is added at the end). + * + * @var string + */ + const COOKIE_PREFIX = 'comment_use_gravatar_'; + + /** + * The core API. + * + * @since 2.4.0 + * + * @var Comment_Author_Fields + */ + private $comment_author; + + /** + * The templating handler. + * + * @since 2.4.0 + * + * @var Template + */ + private $template; + + /** + * Creates a new instance. + * + * @since 2.1.0 Parameter $plugin_file removed. + * @since 2.4.0 Parameter $core removed, $comment_author added. + * + * @param Comment_Author_Fields $comment_author The comment author fields API. + * @param Template $template The templating handler. + */ + public function __construct( Comment_Author_Fields $comment_author, Template $template ) { + $this->comment_author = $comment_author; + $this->template = $template; + } + + /** + * Sets up the various hooks for the plugin component. + * + * @return void + */ + public function run() { + \add_action( 'init', [ $this, 'init' ] ); + } + + /** + * Initialize additional plugin hooks. + * + * @return void + */ + public function init() { + // Add the checkbox to the comment form. + \add_filter( 'comment_form_fields', [ $this, 'comment_form_fields' ] ); + + // Handle the checkbox data upon saving the comment. + \add_action( 'comment_post', [ $this, 'comment_post' ], 10, 2 ); + + // Store gravatar use choice in cookie, if those are enabled in Core. + if ( \has_action( 'set_comment_cookies', 'wp_set_comment_cookies' ) ) { + \add_action( 'set_comment_cookies', [ $this, 'set_comment_cookies' ], 10, 3 ); + } + } + + /** + * Adds the 'use gravatar' checkbox to the comment form. The checkbox value + * is read from a cookie if available. + * + * @param string[] $fields The array of comment fields. + * + * @return string[] The modified array of comment fields. + */ + public function comment_form_fields( $fields ) { + // Don't change the form if a user is logged-in or the field already exists. + if ( \is_user_logged_in() || isset( $fields['use_gravatar'] ) ) { + return $fields; + } + + // Define the new checkbox field. + $new_field = $this->get_gravatar_checkbox_markup(); + + /** + * Filters the insert position for the `use_gravatar` checkbox. + * + * @since 1.1.0 + * + * @param string[] $position { + * Where to insert the checkbox. + * + * @type string $before_or_after Either 'before' or 'after'. + * @type string $insertion_point The index ('url', 'email', etc.) of the field where the checkbox should be inserted. + * } + */ + list( $before_or_after, $insertion_point ) = \apply_filters( 'avatar_privacy_use_gravatar_position', $this->get_position( $fields ) ); + + if ( isset( $fields[ $insertion_point ] ) ) { + $result = []; + foreach ( $fields as $key => $value ) { + if ( $key === $insertion_point ) { + if ( 'before' === $before_or_after ) { + $result['use_gravatar'] = $new_field; + $result[ $key ] = $value; + } else { + $result[ $key ] = $value; + $result['use_gravatar'] = $new_field; + } + } else { + $result[ $key ] = $value; + } + } + $fields = $result; + } else { + $fields['use_gravatar'] = $new_field; + } + + return $fields; + } + + /** + * Determines position for inserting the `use_gravatar` field. + * + * @since 2.1.0 + * + * @param string[] $fields The array of comment fields. + * + * @return string[] $position { + * Where to insert the checkbox. + * + * @type string $before_or_after Either 'before' or 'after'. + * @type string $field The index ('url', 'email', etc.) of the field where the checkbox should be inserted. + * } + */ + protected function get_position( array $fields ) { + if ( isset( $fields['cookies'] ) ) { + // If the `cookies` field exists, add the checkbox just before. + $before_or_after = 'before'; + $field = 'cookies'; + } elseif ( isset( $fields['url'] ) ) { + // Otherwise, if the `url` field exists, add our checkbox after it. + $before_or_after = 'after'; + $field = 'url'; + } elseif ( isset( $fields['email'] ) ) { + // Otherwise, look for the `email` field and add the checkbox after that. + $before_or_after = 'after'; + $field = 'email'; + } else { + // As a last ressort, add the checkbox after all the other fields. + \end( $fields ); + $before_or_after = 'after'; + $field = (string) \key( $fields ); + } + + return [ $before_or_after, $field ]; + } + + /** + * Retrieves the markup for the use_gravatar checkbox for the comment form. + * + * @since 2.1.0 Parameter $path removed. + * + * @return string + */ + public static function get_gravatar_checkbox() { + /** + * The share Comments component. + * + * @var Comments + */ + $comments = Factory::get()->create( self::class ); + + return $comments->get_gravatar_checkbox_markup(); + } + + /** + * Retrieves the markup for the use_gravatar checkbox for the comment form. + * + * @since 2.4.0 + * + * @param string $partial Optional. The partial to use. Default 'public/partials/comments/use-gravatar.php'. + * + * @return string + */ + public function get_gravatar_checkbox_markup( $partial = 'public/partials/comments/use-gravatar.php' ) { + // Determine if the checkbox should be checked. + $args = [ + 'template' => $this->template, + 'is_checked' => $this->is_gravatar_prechecked(), + ]; + + return $this->template->get_partial( $partial, $args ); + } + + /** + * Verifies whether the Use Gravatar checkbox should be pre-checked. + * + * @since 2.4.0 + * + * @global array $_POST Post request superglobal. + * @global array $_COOKIE Cookie superglobal. + * + * @return bool + */ + protected function is_gravatar_prechecked() { + // Default is unchecked. + $is_checked = false; + + if ( isset( $_POST[ self::CHECKBOX_FIELD_NAME ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Missing -- frontend form. + // Re-displaying the comment form with validation errors. + $is_checked = ! empty( $_POST[ self::CHECKBOX_FIELD_NAME ] ); // phpcs:ignore WordPress.Security.NonceVerification.Missing -- frontend form. + } elseif ( isset( $_COOKIE[ self::COOKIE_PREFIX . \COOKIEHASH ] ) ) { + // Read the value from the cookie, saved with previous comment. + $is_checked = ! empty( $_COOKIE[ self::COOKIE_PREFIX . \COOKIEHASH ] ); + } + + return $is_checked; + } + + /** + * Saves the value of the 'use gravatar' checkbox from the comment form in + * the database, but only for non-spam comments. + * + * @param int $comment_id The ID of the comment that has just been saved. + * @param string $comment_approved Whether the comment has been approved (1) + * or not (0) or is marked as spam (spam). + * + * @return void + */ + public function comment_post( $comment_id, $comment_approved ) { + // Don't save anything for spam comments, trackbacks/pingbacks, and registered user's comments. + if ( 'spam' === $comment_approved ) { + return; + } + $comment = \get_comment( $comment_id ); + if ( + ! $comment instanceof \WP_Comment || + ( '' !== $comment->comment_type && 'comment' !== $comment->comment_type ) || + ( '' === $comment->comment_author_email ) + ) { + return; + } + + // Make sure that the e-mail address does not belong to a registered user. + if ( \get_user_by( 'email', $comment->comment_author_email ) ) { + // This is either a comment with a fake identity or a user who didn't sign in + // and rather entered their details manually. Either way, don't save anything. + return; + } + + // Save the 'use gravatar' value. + $use_gravatar = ( isset( $_POST[ self::CHECKBOX_FIELD_NAME ] ) && ( 'true' === $_POST[ self::CHECKBOX_FIELD_NAME ] ) ) ? 1 : 0; // phpcs:ignore WordPress.Security.NonceVerification.Missing + $this->comment_author->update_gravatar_use( $comment->comment_author_email, $comment_id, $use_gravatar ); + } + + /** + * Sets the comment_use_gravatar_ cookie. Based on `wp_set_comment_cookies`. + * + * @param \WP_Comment $comment Comment object. + * @param \WP_User $user Comment author's user object. The user may not exist. + * @param bool $cookies_consent Optional. Comment author's consent to store cookies. Default true. + * + * @return void + */ + public function set_comment_cookies( \WP_Comment $comment, \WP_User $user, $cookies_consent = true ) { + // If the user already exists, or the user opted out of cookies, don't set cookies. + if ( $user->exists() ) { + return; + } + + if ( false === $cookies_consent ) { + // Remove any existing cookie. + \setcookie( self::COOKIE_PREFIX . \COOKIEHASH, '', time() - \YEAR_IN_SECONDS, \COOKIEPATH, \COOKIE_DOMAIN ); + return; + } + + // Does the author want to use gravatar? + $use_gravatar = $this->comment_author->allows_gravatar_use( $comment->comment_author_email ); + + // Set a cookie for the 'use gravatar' value. + /** This filter is documented in wp-includes/comment.php */ + $comment_cookie_lifetime = \apply_filters( 'comment_cookie_lifetime', 30000000 ); // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedHooknameFound + $secure = ( 'https' === \wp_parse_url( \home_url(), \PHP_URL_SCHEME ) ); + \setcookie( self::COOKIE_PREFIX . \COOKIEHASH, (string) $use_gravatar, \time() + $comment_cookie_lifetime, \COOKIEPATH, \COOKIE_DOMAIN, $secure ); + } +} diff --git a/includes/avatar-privacy/components/class-image-proxy.php b/includes/avatar-privacy/components/class-image-proxy.php new file mode 100644 index 0000000..8f7de5a --- /dev/null +++ b/includes/avatar-privacy/components/class-image-proxy.php @@ -0,0 +1,349 @@ + + * + * @phpstan-type HandlerHooks array + */ +class Image_Proxy implements Component { + + const CRON_JOB_LOCK_GRAVATARS = 'cron_job_lock_gravatars'; + const CRON_JOB_LOCK_ALL_IMAGES = 'cron_job_lock_all_images'; + + const CRON_JOB_ACTION = 'avatar_privacy_daily'; + + /** + * The site transients handler. + * + * @var Site_Transients + */ + private Site_Transients $site_transients; + + /** + * The file system caching handler. + * + * @var Filesystem_Cache + */ + private Filesystem_Cache $file_cache; + + /** + * The available avatar handlers. + * + * @var Avatar_Handler[] + */ + private array $handlers = []; + + /** + * A mapping from filter hook to avatar handler. + * + * @var array { + * @type Avatar_Handler $hook The handler instance. + * } + * + * @phpstan-var HandlerHooks + */ + private array $handler_hooks; + + /** + * The default icons handler. + * + * @var Default_Icons_Handler + */ + private Default_Icons_Handler $default_icons; + + /** + * Creates a new instance. + * + * @since 2.4.0 Parameters $gravatar and $user_avatar replaced with the + * generic $handler. Parameter $options removed. + * + * @param Site_Transients $site_transients The site transients handler. + * @param Filesystem_Cache $file_cache The filesystem cache handler. + * @param Avatar_Handler[] $handlers The avatar handlers indexed + * by their filter hook (including + * the $default_icons handler). + * @param Default_Icons_Handler $default_icons The default icons handler. + * + * @phpstan-param HandlerHooks $handlers + */ + public function __construct( Site_Transients $site_transients, Filesystem_Cache $file_cache, array $handlers, Default_Icons_Handler $default_icons ) { + $this->site_transients = $site_transients; + $this->file_cache = $file_cache; + + // Avatar handlers. + $this->handler_hooks = $handlers; + $this->default_icons = $default_icons; + + foreach ( $handlers as $avatar_handler ) { + $type = $avatar_handler->get_type(); + + // The default handler will be ignored. + if ( ! empty( $type ) ) { + $this->handlers[ $type ] = $avatar_handler; + } + } + } + + /** + * Sets up the various hooks for the plugin component. + * + * @return void + */ + public function run() { + // Add new default avatars. + \add_filter( 'avatar_defaults', [ $this->default_icons, 'avatar_defaults' ] ); + + // Generate the correct avatar images. + foreach ( $this->handler_hooks as $hook => $handler ) { + \add_filter( $hook, [ $handler, 'get_url' ], 10, 4 ); // @phpstan-ignore-line -- WordPress array syntax not supported (yet). + } + + // Automatically regenerate missing image files. + \add_action( 'init', [ $this, 'add_cache_rewrite_rules' ] ); + \add_action( 'parse_request', [ $this, 'load_cached_avatar' ] ); + + // Clean up cache once per day. + \add_action( 'init', [ $this, 'enable_image_cache_cleanup' ] ); + } + + /** + * Add rewrite rules for nice avatar caching. + * + * @return void + */ + public function add_cache_rewrite_rules() { + /** + * The global WordPress instance. + * + * @var \WP + */ + global $wp; + $wp->add_query_var( 'avatar-privacy-file' ); + + $basedir = \str_replace( \ABSPATH, '', $this->file_cache->get_base_dir() ); + \add_rewrite_rule( "^{$basedir}(.*)", [ 'avatar-privacy-file' => '$matches[1]' ], 'top' ); + } + + /** + * Short-circuits WordPress initialization and load displays the cached avatar image. + * + * @param \WP $wp The WordPress global object. + * + * @return void + */ + public function load_cached_avatar( \WP $wp ) { + if ( empty( $wp->query_vars['avatar-privacy-file'] ) || ! \preg_match( '#^([a-z]+)/((?:[0-9a-z]/)*)([a-f0-9]{64})(?:-([0-9]+))?\.(jpg|png|svg)$#i', $wp->query_vars['avatar-privacy-file'], $parts ) ) { + // Abort early. + return; + } + + list(, $type, $subdir, $hash, $size, $extension ) = $parts; + + $file = "{$this->file_cache->get_base_dir()}{$type}/" . ( $subdir ?: '' ) . $hash . ( empty( $size ) ? '' : "-{$size}" ) . ".{$extension}"; + + if ( ! \file_exists( $file ) ) { + // Default size (for SVGs mainly, which ignore it). + $size = (int) $size ?: 100; + + if ( isset( $this->handlers[ $type ] ) ) { + $success = $this->handlers[ $type ]->cache_image( $type, $hash, $size, $subdir, $extension ); + } else { + $success = $this->default_icons->cache_image( $type, $hash, $size, $subdir, $extension ); + } + + if ( ! $success ) { + /* translators: $file path */ + \wp_die( \esc_html( \sprintf( \__( 'Error generating avatar file %s.', 'avatar-privacy' ), $file ) ) ); + } + } + + $this->send_image( $file, \DAY_IN_SECONDS, Image_File::CONTENT_TYPE[ $extension ] ); + + // We're done. + $this->exit_request(); + } + + /** + * Sends an image file to the browser. + * + * @since 2.1.0 Visibility changed to protected. + * + * @param string $file The full path to the image. + * @param int $cache_time The time the image should be cached by the brwoser (in seconds). + * @param string $content_type The content MIME type. + * + * @return void + */ + protected function send_image( $file, $cache_time, $content_type ) { + $image = @\file_get_contents( $file ); // phpcs:ignore WordPress.WP.AlternativeFunctions.file_system_read_file_get_contents, WordPress.WP.AlternativeFunctions.file_get_contents_file_get_contents, Generic.PHP.NoSilencedErrors.Discouraged + + if ( ! empty( $image ) ) { + $length = \strlen( $image ); + $last_modified = (int) \filemtime( $file ); + + // Let's set some HTTP headers. + \header( "Content-Type: {$content_type}" ); + \header( "Content-Length: {$length}" ); + \header( 'Last-Modified: ' . \gmdate( 'D, d M Y H:i:s \G\M\T', $last_modified ) ); + \header( 'Expires: ' . \gmdate( 'D, d M Y H:i:s \G\M\T', \time() + $cache_time ) ); + + // Here comes the content. + echo $image; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + } else { + /* translators: $file path */ + \wp_die( \esc_html( \sprintf( \__( 'Error generating avatar file %s.', 'avatar-privacy' ), $file ) ) ); + } + } + + /** + * Schedules a cron job to clean up the image cache once per day. Otherwise the + * cache would grow unchecked and new avatar images uploaded to Gravatar.com + * would not be picked up. + * + * @return void + */ + public function enable_image_cache_cleanup() { + // Schedule our cron action. + if ( ! \wp_next_scheduled( self::CRON_JOB_ACTION ) ) { + \wp_schedule_event( \time(), 'daily', self::CRON_JOB_ACTION ); + } + + // Add separate jobs for gravatars other images. + \add_action( self::CRON_JOB_ACTION, [ $this, 'trim_gravatar_cache' ] ); + \add_action( self::CRON_JOB_ACTION, [ $this, 'trim_image_cache' ] ); + } + + /** + * Deletes cached gravatar images that are too old. Uses a site transient to ensure + * that the clean-up happens only once per day on multisite installations. + * + * @return void + */ + public function trim_gravatar_cache() { + if ( ! $this->site_transients->get( self::CRON_JOB_LOCK_GRAVATARS ) ) { + /** + * Filters how long cached gravatar images are kept. + * + * @param int $max_age The maximum age of the cached files (in seconds). Default 2 days. + */ + $max_age = \apply_filters( 'avatar_privacy_gravatars_max_age', 2 * \DAY_IN_SECONDS ); + + /** + * Filters how often the clean-up cron job for old gravatar images should run. + * + * @param int $interval Time until the cron job should run again (in seconds). Default 1 day. + */ + $interval = \apply_filters( 'avatar_privacy_gravatars_cleanup_interval', \DAY_IN_SECONDS ); + + $this->invalidate_cached_images( self::CRON_JOB_LOCK_GRAVATARS, 'gravatar', $interval, $max_age ); + } + } + + /** + * Deletes cached image files that are too old. Uses a site transient to ensure + * that the clean-up happens only once per day on multisite installations. + * + * @return void + */ + public function trim_image_cache() { + if ( ! $this->site_transients->get( self::CRON_JOB_LOCK_ALL_IMAGES ) ) { + /** + * Filters how long cached images are kept. + * + * Normally, generated default icons and local avatar images don't + * change, so they can be kept longer than gravatars. To keep cache + * size under control, the limit should be set approximately between + * a week and a month, depending on the number of commenters on your + * site. + * + * @param int $max_age The maximum age of the cached files (in seconds). Default 1 week. + */ + $max_age = \apply_filters( 'avatar_privacy_all_images_max_age', 7 * \DAY_IN_SECONDS ); + + /** + * Filters how often the clean-up cron job for old images should run. + * + * @param int $interval Time until the cron job should run again (in seconds). Default 1 week. + */ + $interval = \apply_filters( 'avatar_privacy_all_images_cleanup_interval', 7 * \DAY_IN_SECONDS ); + + $this->invalidate_cached_images( self::CRON_JOB_LOCK_ALL_IMAGES, '', $interval, $max_age ); + } + } + + /** + * Removes all files older than the maximum age from given subdirectory. + * + * @since 2.1.0 Visibility changed to protected. + * + * @param string $lock The site transient key for ensuring that the job is not run more often than necessary. + * @param string $subdir The subdirectory to clean. + * @param int $interval The cron job run interval in seconds. + * @param int $max_age The maximum age of the image files in seconds. + * + * @return void + */ + protected function invalidate_cached_images( $lock, $subdir, $interval, $max_age ) { + // Invalidate all files in the subdirectory older than the maximum age. + $this->file_cache->invalidate_files_older_than( $max_age, $subdir ); + + // Don't run the job again until the interval is up. + $this->site_transients->set( $lock, true, $interval ); + } + + /** + * Stops executing the current request early. + * + * @since 2.1.0 + * @codeCoverageIgnore + * + * @param int $status Optional. A status code in the range 0 to 254. Default 0. + * + * @return void + */ + protected function exit_request( $status = 0 ) { + exit( $status ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + } +} diff --git a/includes/avatar-privacy/components/class-integrations.php b/includes/avatar-privacy/components/class-integrations.php new file mode 100644 index 0000000..744617a --- /dev/null +++ b/includes/avatar-privacy/components/class-integrations.php @@ -0,0 +1,80 @@ + + */ +class Integrations implements Component { + + /** + * An array of plugin integration instances. + * + * @var Plugin_Integration[] + */ + private $integrations = []; + + /** + * Creates a new instance. + * + * @since 2.2.0 Parameter $core removed. + * + * @param Plugin_Integration[] $integrations An array of plugin integration instances. + */ + public function __construct( array $integrations ) { + $this->integrations = $integrations; + } + + /** + * Activate all applicable plugin integrations. + * + * @return void + */ + public function activate() { + foreach ( $this->integrations as $integration ) { + if ( $integration->check() ) { + $integration->run(); + } + } + } + + /** + * Start up enabled integrations. + * + * @return void + */ + public function run() { + \add_action( 'plugins_loaded', [ $this, 'activate' ], 1 ); + } +} diff --git a/includes/avatar-privacy/components/class-network-settings-page.php b/includes/avatar-privacy/components/class-network-settings-page.php new file mode 100644 index 0000000..7608a7e --- /dev/null +++ b/includes/avatar-privacy/components/class-network-settings-page.php @@ -0,0 +1,376 @@ + + * + * @phpstan-type SettingsSectionInfo array{ id: string, title: string, callback: callable } + */ +class Network_Settings_Page implements Component { + + const OPTION_GROUP = 'avatar-privacy-network-settings'; + const SECTION = 'general'; + const ACTION = 'edit-avatar-privacy-network-settings'; + + /** + * The options handler. + * + * @var Network_Options + */ + private Network_Options $network_options; + + /** + * The (standard) transietns handler. + * + * @var Transients + */ + private Transients $transients; + + /** + * The default settings. + * + * @var Settings + */ + private Settings $settings; + + /** + * The multisite tools. + * + * @var Multisite + */ + private Multisite $multisite; + + /** + * The UI controls for the settings. + * + * @var Control[] + */ + private array $controls; + + /** + * An array to keep track of triggered admin notices. + * + * @var bool[] + */ + private array $triggered_notice = []; + + /** + * The script & style registration helper. + * + * @since 2.4.0 + * + * @var Dependencies + */ + private Dependencies $dependencies; + + /** + * The templating handler. + * + * @since 2.4.0 + * + * @var Template + */ + private Template $template; + + /** + * Creates a new instance. + * + * @since 2.1.0 Parameter $plugin_file removed. + * @since 2.4.0 Parameter $core removed, parameters $dependencies, and $template + * added. + * + * @param Network_Options $network_options The network options handler. + * @param Transients $transients The transients handler. + * @param Settings $settings The default settings. + * @param Multisite $multisite The the multisite handler. + * @param Dependencies $dependencies The script & style registration helper. + * @param Template $template The templating handler. + */ + public function __construct( Network_Options $network_options, Transients $transients, Settings $settings, Multisite $multisite, Dependencies $dependencies, Template $template ) { + $this->network_options = $network_options; + $this->transients = $transients; + $this->settings = $settings; + $this->multisite = $multisite; + $this->dependencies = $dependencies; + $this->template = $template; + } + + /** + * Sets up the various hooks for the plugin component. + * + * @return void + */ + public function run() { + if ( \is_network_admin() ) { + // Load the field definitions. + $fields = $this->settings->get_network_fields(); + + // Initialize the controls. + $this->controls = Control_Factory::initialize( $fields, $this->network_options, '' ); + + // Add some actions. + \add_action( 'network_admin_menu', [ $this, 'register_network_settings' ] ); + \add_action( 'network_admin_edit_' . self::ACTION, [ $this, 'save_network_settings' ] ); + \add_action( 'network_admin_notices', 'settings_errors' ); + } + } + + /** + * Registers the settings with the settings API. This is only used to display + * an explanation of the wrong gravatar settings. + * + * @return void + */ + public function register_network_settings() { + // Create our options page. + $page = \add_submenu_page( 'settings.php', \__( 'Avatar Privacy Network Settings', 'avatar-privacy' ), \__( 'Avatar Privacy', 'avatar-privacy' ), 'manage_network_options', self::OPTION_GROUP, [ $this, 'print_settings_page' ] ); + + // Add the section(s). + \add_settings_section( self::SECTION, '', [ $this, 'print_settings_section' ], self::OPTION_GROUP ); + + // Register control render callbacks. + foreach ( $this->controls as $option => $control ) { + $option_name = $this->network_options->get_name( $option ); + $sanitize = [ $control, 'sanitize' ]; + + // Register the setting ... + \register_setting( self::OPTION_GROUP, $option_name, $sanitize ); + + // ... and the control. + $control->register( self::OPTION_GROUP ); + } + + // Trigger table migration if the settings are changed. + $use_global_table = $this->network_options->get_name( Network_Options::USE_GLOBAL_TABLE ); + \add_action( "update_site_option_{$use_global_table}", [ $this, 'start_migration_from_global_table' ], 10, 3 ); + + // Use the registered $page handle to hook stylesheet and script loading. + \add_action( "admin_print_styles-{$page}", [ $this, 'print_styles' ] ); + } + + /** + * Displays the network options page. + * + * @return void + */ + public function print_settings_page() { + // Load the settings page HTML. + $this->template->print_partial( 'admin/partials/network/settings-page.php' ); + } + + /** + * Saves the network settings. + * + * @global array $_POST Post request superglobal. + * @global array $new_whitelist_options The options whitelisted by the settings API. + * + * @return void + */ + public function save_network_settings() { + // Check if the user has the correct permissions. + if ( ! \current_user_can( 'manage_network_options' ) ) { + \wp_die( \esc_html( \__( 'Sorry, you are not allowed to access this page.', 'avatar-privacy' ) ), 403 ); + } + + // Make sure we are posting from our options page. + \check_admin_referer( self::OPTION_GROUP . '-options' ); + + // This is the list of registered options. + global $new_whitelist_options; + + // Go through the posted data and save only our options. + foreach ( $new_whitelist_options[ self::OPTION_GROUP ] as $option ) { + if ( isset( $_POST[ $option ] ) ) { + // The registered callback function to sanitize the option's value will be called here. + $this->network_options->set( $option, \wp_unslash( $_POST[ $option ] ), false, true ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized + } else { + // Set false for checkboxes and unset everything else. + $id = $this->network_options->remove_prefix( $option ); + if ( $this->controls[ $id ] instanceof Controls\Checkbox_Input ) { + $this->network_options->set( $option, false, false, true ); + } else { + $this->network_options->delete( $option, true ); + } + } + } + + $settings_errors = \get_settings_errors(); + if ( empty( $settings_errors ) ) { // @phpstan-ignore-line - $settings_errors array can be empty. + \add_settings_error( self::OPTION_GROUP, 'settings_updated', \__( 'Settings saved.', 'avatar-privacy' ), 'updated' ); + } + + // Save the settings errors until after the redirect. + $this->persist_settings_errors(); + + // At last we redirect back to our options page. + \wp_safe_redirect( + \add_query_arg( // @codeCoverageIgnoreStart + [ + 'page' => self::OPTION_GROUP, + 'settings-updated' => 'true', + ], + \network_admin_url( 'settings.php' ) + ) // @codeCoverageIgnoreEnd + ); + + // And we are done. + $this->exit_request(); + } + + /** + * Prints any additional markup for the given form section. + * + * @param array $section The section information. + * + * @return void + * + * @phpstan-param SettingsSectionInfo $section + */ + public function print_settings_section( $section ) { + // Set up variables used by the included partial. + $args = [ + 'section_id' => ! empty( $section['id'] ) ? $section['id'] : '', + 'description' => \__( 'General settings applying to all sites in the network.', 'avatar-privacy' ), + ]; + + // Load the settings page HTML. + $this->template->print_partial( 'admin/partials/network/section.php', $args ); + } + + /** + * Stops executing the current request early. + * + * @codeCoverageIgnore + * + * @param int $status Optional. A status code in the range 0 to 254. Default 0. + * + * @return void + */ + protected function exit_request( $status = 0 ) { + exit( $status ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + } + + /** + * Enqueue stylesheet for options page. + * + * @return void + */ + public function print_styles() { + $this->dependencies->register_style( 'avatar-privacy-settings', 'admin/css/settings.css' ); + $this->dependencies->enqueue_style( 'avatar-privacy-settings' ); + } + + /** + * Use sanitization callback to trigger an admin notice. + * + * @param string $setting_name The setting used to trigger the notice (without the prefix). + * @param string $notice_id HTML ID attribute for the notice. + * @param string $message Translated message string. + * @param string $notice_level 'updated', 'notice-info', etc. + * + * @return void + */ + protected function trigger_admin_notice( $setting_name, $notice_id, $message, $notice_level ) { + if ( empty( $this->triggered_notice[ $setting_name ] ) ) { + \add_settings_error( self::OPTION_GROUP, $notice_id, $message, $notice_level ); + + // Workaround for https://core.trac.wordpress.org/ticket/21989. + $this->triggered_notice[ $setting_name ] = true; + } + } + + /** + * Persists the settings errors across the redirect. + * + * Uses a regular transient to stay compatible with core. + * + * @return void + */ + protected function persist_settings_errors() { + // A regular transient is used here, since it is automatically cleared right after the redirect. + $this->transients->set( 'settings_errors', \get_settings_errors(), 30, true ); + } + + /** + * Triggers the migration from global to site specific tables when global table + * use is changed from enbled to disabled. + * + * @param string $option Name of the network option. + * @param mixed $value New value of the network option. + * @param mixed $old_value Old value of the network option. + * + * @return void + */ + public function start_migration_from_global_table( $option, $value, $old_value ) { + if ( $option !== $this->network_options->get_name( Network_Options::USE_GLOBAL_TABLE ) ) { + // This should never happen. + return; + } + + // Only trigger migration if USE_GLOBAL_TABLE was changed from "on" to "off". + if ( empty( $value ) && ! empty( $old_value ) ) { + // Add all sites in the current network to the queue. + $site_ids = $this->multisite->get_site_ids(); + $queue = (array) \array_combine( $site_ids, $site_ids ); + + // Remove the main site ID from the queue. + unset( $queue[ \get_main_site_id() ] ); + + // Store new queue, overwriting any existing queue (since this per + // network and we already got all sites currently in the network). + // If the new queue is empty, the next page load will clean up the + // network options. + $this->network_options->set( Network_Options::START_GLOBAL_TABLE_MIGRATION, $queue ); + + // Notify admins. + $this->trigger_admin_notice( Network_Options::USE_GLOBAL_TABLE, 'settings_updated', \__( 'Settings saved. Consent data will be migrated to site-specific tables.', 'avatar-privacy' ), 'updated' ); + } elseif ( ! empty( $value ) && empty( $old_value ) ) { + // Clean up any running migrations on the next page load. + $this->network_options->set( Network_Options::START_GLOBAL_TABLE_MIGRATION, [] ); + } + } +} diff --git a/includes/avatar-privacy/components/class-privacy-tools.php b/includes/avatar-privacy/components/class-privacy-tools.php new file mode 100644 index 0000000..a9c020f --- /dev/null +++ b/includes/avatar-privacy/components/class-privacy-tools.php @@ -0,0 +1,355 @@ + + * + * @phpstan-type PrivacyExportResult array{ data: mixed[], done: bool } + * @phpstan-type PrivacyEraseResult array{ items_removed: int, items_retained: int, messages: string[], done: bool } + * + * @phpstan-type PrivacyExporter array{ exporter_friendly_name: string, callback: callable } + * @phpstan-type PrivacyEraser array{ eraser_friendly_name: string, callback: callable } + */ +class Privacy_Tools implements Component { + + const PAGING = 500; + + /** + * The user fields API. + * + * @since 2.4.0 + * + * @var User_Fields + */ + private User_Fields $registered_user; + + /** + * The comment author API. + * + * @since 2.4.0 + * + * @var Comment_Author_Fields + */ + private Comment_Author_Fields $comment_author; + + /** + * Creates a new instance. + * + * @param User_Fields $registered_user The user fields API. + * @param Comment_Author_Fields $comment_author The comment author fields API. + */ + public function __construct( User_Fields $registered_user, Comment_Author_Fields $comment_author ) { + $this->registered_user = $registered_user; + $this->comment_author = $comment_author; + } + + /** + * Sets up the various hooks for the plugin component. + * + * @return void + */ + public function run() { + \add_action( 'admin_init', [ $this, 'admin_init' ] ); + } + + /** + * Initializes additional plugin hooks. + * + * @return void + */ + public function admin_init() { + // Add privacy notice suggestion. + $this->add_privacy_notice_content(); + + // Register data exporter. + \add_filter( 'wp_privacy_personal_data_exporters', [ $this, 'register_personal_data_exporter' ], 0 ); // Priority 0 to follow after the built-in exporters. Watch https://core.trac.wordpress.org/ticket/44151. + + // Register data eraser. + \add_filter( 'wp_privacy_personal_data_erasers', [ $this, 'register_personal_data_eraser' ] ); + } + + /** + * Adds a privacy notice snippet. + * + * @since 2.1.0 Visibility changed to protected. + * + * @return void + */ + protected function add_privacy_notice_content() { + // Don't crash on older versions of WordPress. + if ( ! function_exists( 'wp_add_privacy_policy_content' ) ) { + return; + } + + $suggested_text = '' . \__( 'Suggested text:' ) . ' '; // phpcs:ignore WordPress.WP.I18n.MissingArgDomain -- Missing text domain is intentional to use Core translation. + + $content = '

' . \__( 'Comments', 'avatar-privacy' ) . '

'; + $content .= '

' . \__( 'The information in this subsection supersedes the paragraph on Gravatar in the default "Comments" subsection provided by WordPress.', 'avatar-privacy' ) . '

'; + $content .= "

{$suggested_text}" . \__( 'At your option, an anonymized string created from your email address (also called a hash) may be provided to the Gravatar service to see if you are using it. The Gravatar service privacy policy is available here: https://automattic.com/privacy/. After approval of your comment, your profile picture is visible to the public in the context of your comment. Neither the hash nor your actual email address will be exposed to the public.', 'avatar-privacy' ) . '

'; + $content .= '

' . \__( 'Cookies', 'avatar-privacy' ) . '

'; + $content .= '

' . \__( 'The information in this subsection should be included in addition to the information about any other cookies set by either WordPress or another plugin.', 'avatar-privacy' ) . '

'; + $content .= "

{$suggested_text}" . \__( 'If you leave a comment on our site and opt-in to display your Gravatar image, your choice will be stored in a cookie. This is for your convenience so that you do not have to fill the checkbox again when you leave another comment. This cookie will last for one year.', 'avatar-privacy' ) . '

'; + + \wp_add_privacy_policy_content( \__( 'Avatar Privacy', 'avatar-privacy' ), $content ); + } + + /** + * Registers an exporter function for the personal data collected by this plugin. + * + * @param array $exporters The registered exporter callbacks. + * + * @return array + * + * @phpstan-param PrivacyExporter[] $exporters + * @phpstan-return PrivacyExporter[] + */ + public function register_personal_data_exporter( array $exporters ) { + $exporters['avatar-privacy-user'] = [ + 'exporter_friendly_name' => \__( 'Avatar Privacy Plugin User Data', 'avatar-privacy' ), + 'callback' => [ $this, 'export_user_data' ], + ]; + $exporters['avatar-privacy-comment-author'] = [ + 'exporter_friendly_name' => \__( 'Avatar Privacy Plugin Comment Author Data', 'avatar-privacy' ), + 'callback' => [ $this, 'export_comment_author_data' ], + ]; + + return $exporters; + } + + /** + * Registers an eraser function for the personal data collected by this plugin. + * + * @param array $erasers The registered eraser callbacks. + * + * @return array + * + * @phpstan-param PrivacyEraser[] $erasers + * @phpstan-return PrivacyEraser[] + */ + public function register_personal_data_eraser( array $erasers ) { + $erasers['avatar-privacy'] = [ + 'eraser_friendly_name' => \__( 'Avatar Privacy Plugin', 'avatar-privacy' ), + 'callback' => [ $this, 'erase_data' ], + ]; + + return $erasers; + } + + /** + * Exports the data associated with a user account. + * + * @since 2.5.0 Unused parameter $page removed. + * + * @param string $email The email address. + * + * @return array { + * @type mixed $data The exported data. + * @type bool $done True if there is no more data to export, false otherwise. + * } + * + * @phpstan-return PrivacyExportResult + */ + public function export_user_data( $email ) { + $user = \get_user_by( 'email', $email ); + if ( empty( $user ) ) { + return [ + 'data' => [], + 'done' => true, + ]; + } + + // Initialize export data. + $user_data = []; + + // Export the hashed email. + $user_data[] = [ + 'name' => \__( 'User Email Hash', 'avatar-privacy' ), + 'value' => $this->registered_user->get_hash( $user->ID ), + ]; + + // Export the `use_gravatar` setting. + if ( $this->registered_user->has_gravatar_policy( $user->ID ) ) { + $user_data[] = [ + 'name' => \__( 'Use Gravatar.com', 'avatar-privacy' ), + 'value' => $this->registered_user->allows_gravatar_use( $user->ID ), + ]; + } + + // Export the `allow_anonymous` setting. + if ( $this->registered_user->has_anonymous_commenting_policy( $user->ID ) ) { + $user_data[] = [ + 'name' => \__( 'Logged-out Commenting', 'avatar-privacy' ), + 'value' => $this->registered_user->allows_anonymous_commenting( $user->ID ), + ]; + } + + // Export the uploaded avatar. + // We don't want to use the filtered value here. + $local_avatar = $this->registered_user->get_local_avatar( $user->ID ); + if ( ! empty( $local_avatar['file'] ) ) { + $user_data[] = [ + 'name' => \__( 'User Profile Picture', 'avatar-privacy' ), + 'value' => \str_replace( \ABSPATH, \trailingslashit( \site_url() ), $local_avatar['file'] ), + ]; + } + + return [ + 'data' => [ + [ + 'group_id' => 'user', // Existing Core group. + 'group_label' => \__( 'User' ), // phpcs:ignore WordPress.WP.I18n.MissingArgDomain -- Missing text domain is intentional to use Core translation. + 'item_id' => "user-{$user->ID}", // Existing Core item ID. + 'data' => $user_data, // The personal data that should be exported. + ], + ], + 'done' => true, + ]; + } + + /** + * Exports the data associated with a comment author email address. + * + * @since 2.5.0 Unused parameter $page removed. + * + * @param string $email The email address. + * + * @return array { + * @type mixed $data The exported data. + * @type bool $done True if there is no more data to export, false otherwise. + * } + * + * @phpstan-return PrivacyExportResult + */ + public function export_comment_author_data( $email ) { + // Load raw data. + $raw_data = $this->comment_author->load( $email ); + if ( empty( $raw_data ) ) { + return [ + 'data' => [], + 'done' => true, + ]; + } + + // Export the avatar privacy ID. + $data = []; + $id = $raw_data->id; + $data[] = [ + 'name' => \__( 'Avatar Privacy Comment Author ID', 'avatar-privacy' ), + 'value' => $id, + ]; + + // Export the email. + $data[] = [ + 'name' => \__( 'Comment Author Email', 'avatar-privacy' ), + 'value' => $raw_data->email, + ]; + + // Export the hashed email. + $data[] = [ + 'name' => \__( 'Comment Author Email Hash', 'avatar-privacy' ), + 'value' => $raw_data->hash, + ]; + + // Export the `use_gravatar` setting. + $data[] = [ + 'name' => \__( 'Use Gravatar.com', 'avatar-privacy' ), + 'value' => $raw_data->use_gravatar, + ]; + + // Export the last modified date. + $data[] = [ + 'name' => \__( 'Last Updated', 'avatar-privacy' ), + 'value' => $raw_data->last_updated, + ]; + + // Export the log message. + $data[] = [ + 'name' => \__( 'Log Message', 'avatar-privacy' ), + 'value' => $raw_data->log_message, + ]; + + return [ + 'data' => [ + [ + 'group_id' => 'avatar-privacy', // An ID to identify this particular group of information. + 'group_label' => \__( 'Avatar Privacy', 'avatar-privacy' ), // A translatable string to label this group of information. + 'item_id' => "avatar-privacy-{$id}", // The item ID of what we're exporting. + 'data' => $data, // The personal data that should be exported. + ], + ], + 'done' => true, + ]; + } + + /** + * Erases the data collected by this plugin. + * + * @since 2.5.0 Unused parameter $page removed. + * + * @param string $email The email address. + * + * @return array { + * @type int $items_removed The number of removed items. + * @type int $items_retained The number of items that were retained and anonymized. + * @type array $messages Any additional information for the admin associated with the removal request. + * @type bool $done True if there is no more data to erase, false otherwise. + * } + * + * @phpstan-return PrivacyEraseResult + */ + public function erase_data( $email ) { + $items_removed = 0; + $items_retained = 0; // We currently don't track this information. + $messages = []; + + // Remove user data. + $user = \get_user_by( 'email', $email ); + if ( ! empty( $user ) ) { + $items_removed += $this->registered_user->delete( $user->ID ); + } + + // Remove comment author data. + $items_removed += $this->comment_author->delete( $email ); + + return [ + 'items_removed' => $items_removed, + 'items_retained' => $items_retained, + 'messages' => $messages, + 'done' => true, + ]; + } +} diff --git a/includes/avatar-privacy/components/class-settings-page.php b/includes/avatar-privacy/components/class-settings-page.php new file mode 100644 index 0000000..18144f9 --- /dev/null +++ b/includes/avatar-privacy/components/class-settings-page.php @@ -0,0 +1,229 @@ + + * + * @phpstan-import-type SettingsFields from Settings + */ +class Settings_Page implements Component { + + /** + * The options handler. + * + * @var Options + */ + private Options $options; + + /** + * The file upload handler. + * + * @var Upload + */ + private Upload $upload; + + /** + * The settings API. + * + * @var Settings + */ + private Settings $settings; + + /** + * The templating handler. + * + * @since 2.4.0 + * + * @var Template + */ + private Template $template; + + /** + * Indiciates whether the settings page is buffering its output. + * + * @var bool + */ + private bool $buffering; + + /** + * Creates a new instance. + * + * @since 2.1.0 Parameter $plugin_file removed. + * @since 2.4.0 Paraemter $core removed, parameter $template added. + * + * @param Options $options The options handler. + * @param Upload $upload The file upload handler. + * @param Settings $settings The settings API. + * @param Template $template The templating handler. + */ + public function __construct( Options $options, Upload $upload, Settings $settings, Template $template ) { + $this->options = $options; + $this->upload = $upload; + $this->settings = $settings; + $this->template = $template; + $this->buffering = false; + } + + /** + * Sets up the various hooks for the plugin component. + * + * @return void + */ + public function run() { + if ( \is_admin() ) { + // Register scripts. + \add_action( 'admin_init', [ $this, 'register_settings' ] ); + + // Add form encoding. + \add_action( 'admin_head-options-discussion.php', [ $this, 'settings_head' ] ); + + // Print scripts. + \add_action( 'admin_footer-options-discussion.php', [ $this, 'settings_footer' ] ); + } + } + + /** + * Run tasks in the settings header. + * + * @return void + */ + public function settings_head() { + if ( \ob_start( [ $this, 'add_form_encoding' ] ) ) { + $this->buffering = true; + } + } + + /** + * Run tasks in the settings footer. + * + * @return void + */ + public function settings_footer() { + // Add show/hide javascript. + if ( \wp_script_is( 'jquery', 'done' ) ) { + $this->template->print_partial( 'admin/partials/sections/avatars-disabled-script.php' ); + } + + // Clean up output buffering. + if ( $this->buffering && \ob_get_level() > 0 ) { + \ob_end_flush(); + $this->buffering = false; + } + } + + /** + * Registers the settings with the settings API. This is only used to display + * an explanation of the wrong gravatar settings. + * + * @return void + */ + public function register_settings() { + \register_setting( 'discussion', $this->options->get_name( Settings::OPTION_NAME ), [ $this, 'sanitize_settings' ] ); + + // Register control render callbacks. + $controls = Control_Factory::initialize( $this->settings->get_fields( $this->get_settings_header() ), $this->options, Settings::OPTION_NAME ); + foreach ( $controls as $control ) { + $control->register( 'discussion' ); + } + } + + /** + * Adds the enctype "multipart/form-data" to the form tag. + * + * @param string $content The captured HTML output. + * + * @return string + */ + public function add_form_encoding( $content ) { + return (string) \preg_replace( '#(
)#Usi', '\1 enctype="multipart/form-data" \2', $content ); + } + + /** + * Adds a short explanation on the discussion settings page. + * + * @return string + */ + public function get_settings_header() { + // Set up variables used by the included partial. + $args = [ + 'show_avatars' => $this->options->get( 'show_avatars', false, true ), + ]; + + return $this->template->get_partial( 'admin/partials/sections/avatars-disabled.php', $args ) . + $this->template->get_partial( 'admin/partials/sections/avatars-enabled.php', $args ); + } + + /** + * Sanitize plugin settings array. + * + * @param array $input The plugin settings. + * + * @return array The sanitized plugin settings. + * + * @phpstan-param array, mixed> $input + * @phpstan-return SettingsFields + */ + public function sanitize_settings( $input ) { + foreach ( $this->settings->get_fields() as $key => $info ) { + if ( Controls\Checkbox_Input::class === $info['ui'] ) { + $input[ $key ] = ! empty( $input[ $key ] ); + } + } + + if ( ! isset( $input[ Settings::UPLOAD_CUSTOM_DEFAULT_AVATAR ] ) ) { + $input[ Settings::UPLOAD_CUSTOM_DEFAULT_AVATAR ] = $this->settings->get( Settings::UPLOAD_CUSTOM_DEFAULT_AVATAR ); + } + + $this->upload->save_uploaded_default_icon( \get_current_blog_id(), $input[ Settings::UPLOAD_CUSTOM_DEFAULT_AVATAR ] ); + + /** + * PHPStan type. + * + * @phpstan-var SettingsFields $input + */ + return $input; + } +} diff --git a/includes/avatar-privacy/components/class-setup.php b/includes/avatar-privacy/components/class-setup.php new file mode 100644 index 0000000..1f68dda --- /dev/null +++ b/includes/avatar-privacy/components/class-setup.php @@ -0,0 +1,485 @@ + + * + * @phpstan-import-type SettingsFields from \Avatar_Privacy\Core\Settings + * + * @phpstan-type ObsoleteSettingsFields array + */ +class Setup implements Component { + + /** + * Obsolete settings keys. + * + * @var string[] + */ + const OBSOLETE_SETTINGS = [ + 'mode_optin', + 'use_gravatar', + 'mode_checkforgravatar', + 'default_show', + 'checkbox_default', + ]; + + /** + * Obsolete avatar defaults and replacement values. + * + * @var string[] + */ + const OBSOLETE_AVATAR_DEFAULTS = [ + 'comment' => 'bubble', + 'im-user-offline' => 'bowling-pin', + 'view-media-artist' => 'silhouette', + ]; + + /** + * The options handler. + * + * @var Options + */ + private Options $options; + + /** + * The options handler. + * + * @var Network_Options + */ + private Network_Options $network_options; + + /** + * The transients handler. + * + * @var Transients + */ + private Transients $transients; + + /** + * The site transients handler. + * + * @var Site_Transients + */ + private Site_Transients $site_transients; + + /** + * The database table handlers. + * + * @var Table[] + */ + private array $tables; + + /** + * The multisite tools. + * + * @var Multisite + */ + private Multisite $multisite; + + /** + * The settings API. + * + * @since 2.4.0 + * + * @var Settings + */ + private Settings $settings; + + /** + * The user fields API. + * + * @since 2.4.0 + * + * @var User_Fields + */ + private User_Fields $registered_user; + + /** + * The comment author fields API. + * + * @since 2.4.0 + * + * @var Comment_Author_Fields + */ + private Comment_Author_Fields $comment_author; + + /** + * Creates a new Setup instance. + * + * @since 2.1.0 Parameter $plugin_file removed. + * @since 2.4.0 Parameters $settings, $registered_user, $comment_author, and + * $tables added, parameters $core and $database removed. + * + * @param Settings $settings The settings API. + * @param User_Fields $registered_user The user fields API. + * @param Comment_Author_Fields $comment_author The comment author fields API. + * @param Transients $transients The transients handler. + * @param Site_Transients $site_transients The site transients handler. + * @param Options $options The options handler. + * @param Network_Options $network_options The network options handler. + * @param Table[] $tables The database table handlers, indexed by their base name. + * @param Multisite $multisite The the multisite handler. + */ + public function __construct( Settings $settings, User_Fields $registered_user, Comment_Author_Fields $comment_author, Transients $transients, Site_Transients $site_transients, Options $options, Network_Options $network_options, array $tables, Multisite $multisite ) { + $this->settings = $settings; + $this->registered_user = $registered_user; + $this->comment_author = $comment_author; + $this->transients = $transients; + $this->site_transients = $site_transients; + $this->options = $options; + $this->network_options = $network_options; + $this->tables = $tables; + $this->multisite = $multisite; + } + + /** + * Sets up the various hooks for the plugin component. + * + * @return void + */ + public function run() { + // Register deactivation hook. Activation is handled by the update check instead. + \register_deactivation_hook( \AVATAR_PRIVACY_PLUGIN_FILE, [ $this, 'deactivate' ] ); + + // Update settings and database if necessary. + \add_action( 'plugins_loaded', [ $this, 'update_check' ] ); + + // Clean up uploaded files after deleting the refering metadata. + \add_action( 'deleted_user_meta', [ $this->registered_user, 'remove_orphaned_local_avatar' ], 10, 4 ); + } + + /** + * Checks if the default settings or database schema need to be upgraded. + * + * @return void + */ + public function update_check() { + // Force reading the settings from the DB, but do not cache the result. + $current_settings = $this->settings->get_all_settings( true ); + + // We can ignore errors here, just carry on as if for a new installation. + if ( ! empty( $current_settings[ Options::INSTALLED_VERSION ] ) ) { + $installed_version = $current_settings[ Options::INSTALLED_VERSION ]; + } elseif ( ! empty( $current_settings ) && ! isset( $current_settings[ Options::INSTALLED_VERSION ] ) ) { + // Plugin releases before 1.0 did not store the installed version. + $installed_version = '0.4-or-earlier'; + } else { + // The plugins was not installed previously. + $installed_version = ''; + } + + // Check if the plugin data needs to be updated. + $version = $this->settings->get_version(); + $update_needed = $version !== $installed_version; + $new_install = empty( $installed_version ); + + if ( $update_needed ) { + if ( ! $new_install ) { + // Update plugin settings if necessary. + $current_settings = $this->update_settings( $installed_version, $current_settings ); + + // Preserve previous multisite behavior. + // This needs to happen before the database tables are set up. + if ( \is_multisite() && \version_compare( $installed_version, '0.5', '<' ) ) { + $this->network_options->set( Network_Options::USE_GLOBAL_TABLE, true ); + } + } + + // Clear transients. + $this->transients->invalidate(); + $this->site_transients->invalidate(); + + // To be safe, let's always flush the rewrite rules if there has been an update. + $this->flush_rewrite_rules_soon(); + } + + // Check if our database tables need to created or updated. + // This also sets up the `$wpdb->avatar_privacy*` properties, so we have + // to check on every page load. + foreach ( $this->tables as $table ) { + $table->setup( $installed_version ); + } + + // Run additional upgrade routines now that the tables are set up, but + // only if this plugin has been previously installed. + if ( $update_needed && ! $new_install ) { + $this->update_plugin_data( $installed_version ); + } + + // Update installed version. + $current_settings[ Options::INSTALLED_VERSION ] = $version; + $this->options->set( Settings::OPTION_NAME, $current_settings ); + } + + /** + * Updates the plugin settings. + * + * @since 2.1.0 Visibility changed to protected. + * @since 2.4.0 Renamed to update_settings. Parameter $settings passed by value + * and returned as the result of of the function. + * + * @param string $previous_version The version we are upgrading from. + * @param array $settings The settings array. + * + * @return array The updated settings array. + * + * @phpstan-param ObsoleteSettingsFields $settings + * @phpstan-return mixed[] + */ + protected function update_settings( $previous_version, array $settings ) { + // Upgrade from version 0.4 or lower. + if ( \version_compare( $previous_version, '0.5', '<' ) ) { + // Drop old settings. + foreach ( self::OBSOLETE_SETTINGS as $key ) { + unset( $settings[ $key ] ); + } + } + + return $settings; + } + + /** + * Upgrades existing plugin data. + * + * @since 2.4.0 + * + * @param string $previous_version The version we are upgrading from. + * + * @return void + */ + protected function update_plugin_data( $previous_version ) { + // Upgrade from version 0.4 or lower. + if ( \version_compare( $previous_version, '0.5', '<' ) ) { + $this->maybe_update_user_hashes(); + } + + // Upgrade from anything below 1.0-rc.1. + if ( \version_compare( $previous_version, '1.0-rc.1', '<' ) ) { + $this->upgrade_old_avatar_defaults(); + } + + // Upgrade from anything below 2.1.0-alpha.3. + if ( \version_compare( $previous_version, '2.1.0-alpha.3', '<' ) ) { + $this->prefix_usermeta_keys(); + } + + // Upgrade from anything below 2.4.0. + if ( \version_compare( $previous_version, '2.4.0', '<' ) ) { + $this->maybe_add_email_hashes(); + } + } + + /** + * Handles plugin deactivation. + * + * @since 2.1.0 Parameter `$network_wide` added. + * + * @param bool $network_wide A flag indicating if the plugin was network-activated. + * + * @return void + */ + public function deactivate( $network_wide ) { + if ( ! $network_wide ) { + // We've only been activated on this site, all good. + $this->deactivate_plugin(); + } elseif ( ! \wp_is_large_network() ) { + // This is a "small" multisite network, so get WordPress to rebuild the rewrite rules. + $this->multisite->do_for_all_sites_in_network( [ $this, 'deactivate_plugin' ] ); + } else { + // OK, let's try not to break anything. + $this->multisite->do_for_all_sites_in_network( + // We still need to disable our cron jobs, though. + function() { + \wp_unschedule_hook( Image_Proxy::CRON_JOB_ACTION ); + } + ); + } + } + + /** + * Triggers a rebuild of the rewrite rules on the next page load. + * + * @since 2.1.0 + * + * @return void + */ + public function flush_rewrite_rules_soon() { + // Deleting the option forces a rebuild in the proper context on the next load. + $this->options->delete( 'rewrite_rules', true ); + } + + /** + * Adds a prefix to the GRAVATAR_USE_META_KEY. + * + * This migration method will not work if the standard `wp_usermeta` table is + * replaced with something else, but there does not seem to be a good way to + * use the `get_user_metadata` filter hook and fulfill the goal of not breaking + * future Core use of `use_gravatar` as a meta key. + * + * @since 2.1.0 + * + * @global wpdb $wpdb The WordPress Database Access Abstraction. + * + * @return void + */ + public function prefix_usermeta_keys() { + global $wpdb; + + // Get all users with the `use_gravatar` meta key. + $affected_users = $wpdb->get_col( $wpdb->prepare( "SELECT DISTINCT user_id FROM {$wpdb->usermeta} WHERE meta_key = %s", 'use_gravatar' ) ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching + + if ( \count( $affected_users ) > 0 ) { + // Update the database table. + $rows = $wpdb->update( $wpdb->usermeta, [ 'meta_key' => User_Fields::GRAVATAR_USE_META_KEY ], [ 'meta_key' => 'use_gravatar' ] ); // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key,WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching + + // If there were any keys to update, we also have to clear the user_meta cache group. + if ( false !== $rows && $rows > 0 ) { + + // Clear user_meta cache for all affected users. + foreach ( $affected_users as $user_id ) { + \wp_cache_delete( $user_id, 'user_meta' ); + } + } + } + } + + /** + * The deactivation tasks for a single site. + * + * @since 2.1.0 + * + * @return void + */ + public function deactivate_plugin() { + // Disable cron jobs. + \wp_unschedule_hook( Image_Proxy::CRON_JOB_ACTION ); + + // Reset avatar defaults. + $this->options->reset_avatar_default(); + + // Flush rewrite rules on next page load. + $this->flush_rewrite_rules_soon(); + } + + /** + * Tries to upgrade the `avatar_defaults` option. + * + * @since 2.1.0 Visibility changed to protected, $options parameter removed. + * + * @return void + */ + protected function upgrade_old_avatar_defaults() { + $obsolete_avatar_defaults = self::OBSOLETE_AVATAR_DEFAULTS; + $old_default = $this->options->get( 'avatar_default', 'mystery', true ); + + if ( ! empty( $obsolete_avatar_defaults[ $old_default ] ) ) { + $this->options->set( 'avatar_default', $obsolete_avatar_defaults[ $old_default ], true, true ); + } + } + + /** + * Updates user hashes where they don't exist yet. + * + * @since 2.1.0 Visibility changed to protected. + * + * @return void + */ + protected function maybe_update_user_hashes() { + $args = [ + 'meta_key' => User_Fields::EMAIL_HASH_META_KEY, // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key + 'meta_compare' => 'NOT EXISTS', + ]; + + foreach ( \get_users( $args ) as $user ) { + // Ensure that there is a user hash - retrieving the hash updates the meta field. + $this->registered_user->get_hash( $user->ID ); + } + } + + /** + * Adds hashes for stored e-mail addresses if necessary. + * + * @since 2.4.0 + * + * @global \wpdb $wpdb The WordPress Database Access Abstraction. + * + * @return int The number of upgraded rows. + */ + protected function maybe_add_email_hashes() { + global $wpdb; + + // Add hashes when they are missing. + $emails = $wpdb->get_col( // phpcs:ignore WordPress.DB.DirectDatabaseQuery + $wpdb->prepare( + // phpcs:ignore WordPress.DB.PreparedSQLPlaceholders.UnquotedComplexPlaceholder -- DB and column name. + 'SELECT c.email FROM `%1$s` c LEFT OUTER JOIN `%2$s` h ON c.email = h.identifier AND h.type = "comment" AND h.hash IS NULL', + $wpdb->avatar_privacy, + $wpdb->avatar_privacy_hashes + ) + ); + $email_count = \count( $emails ); + + if ( $email_count > 0 ) { + // Add hashes for all retrieved rows. + $rows = []; + foreach ( $emails as $email ) { + $rows[] = [ + 'identifier' => $email, + 'hash' => $this->comment_author->get_hash( $email ), + 'type' => 'comment', + ]; + } + + return (int) $this->tables[ Hashes_Table::TABLE_BASENAME ]->insert_or_update( [ 'identifier', 'hash', 'type' ], $rows ); + } + + return 0; + } +} diff --git a/includes/avatar-privacy/components/class-shortcodes.php b/includes/avatar-privacy/components/class-shortcodes.php new file mode 100644 index 0000000..7ae3f74 --- /dev/null +++ b/includes/avatar-privacy/components/class-shortcodes.php @@ -0,0 +1,151 @@ + + * + * @phpstan-type FrontendFormAttributes array{ avatar_size?: int } + */ +class Shortcodes implements Component { + + /** + * The shortcode attributes for `[avatar-privacy-form]`. + * + * @var array + */ + const FRONTEND_FORM_ATTRIBUTES = [ + 'avatar_size' => 96, + ]; + + /** + * The profile form helper. + * + * @var User_Form + */ + private User_Form $form; + + /** + * Initialize the class and set its properties. + * + * @param User_Form $form The profile form helper. + */ + public function __construct( User_Form $form ) { + $this->form = $form; + } + + /** + * Sets up the various hooks for the plugin component. + * + * @return void + */ + public function run() { + // Initialize shortcodes after WordPress has loaded. + \add_action( 'init', [ $this, 'add_shortcodes' ] ); + + // Only process forms on the frontend. + if ( ! \is_admin() ) { + $this->form->register_form_submission(); + } + } + + /** + * Adds our shortcode and overrdies the WordPress caption shortcodes to allow nesting. + * + * @return void + */ + public function add_shortcodes() { + // Add new media credit shortcode. + \add_shortcode( 'avatar-privacy-form', [ $this, 'render_frontend_form_shortcode' ] ); + } + + /** + * Renders the frontend form shortcode to allow avatar uploads et al. + * + * Usage: `[avatar-privacy-form]` + * + * @since 2.4.0 Unused parameter $content removed. + * + * @param array $atts { + * An array of shortcode attributes. + * + * @type int $avatar_size Optional. The width/height of the avatar preview image (in pixels). Default 96. + * } + * + * @return string The HTML markup for the upload form. + * + * @phpstan-param FrontendFormAttributes $atts + */ + public function render_frontend_form_shortcode( $atts ) { + $user_id = \get_current_user_id(); + + // User not logged in. + if ( empty( $user_id ) ) { + return ''; + } + + // Set up variables used by the included partial. + $args = [ + // Make sure that $atts really is an array, might be an empty string in some edge cases. + 'atts' => $this->sanitize_frontend_form_attributes( empty( $atts ) ? [] : $atts ), + ]; + + // Include partials. + return $this->form->get_form( 'public/partials/shortcode/avatar-upload.php', $user_id, $args ); + } + + /** + * Ensures all required attributes are present and sanitized. + * + * @param array $atts { + * The `[avatar-privacy-form]` shortcode attributes. + * + * @type int $avatar_size Optional. The width/height of the avatar preview image (in pixels). Default 96. + * } + * + * @return array + * + * @phpstan-param FrontendFormAttributes $atts + * @phpstan-return FrontendFormAttributes + */ + protected function sanitize_frontend_form_attributes( array $atts ) { + // Merge default shortcode attributes. + $atts = \shortcode_atts( self::FRONTEND_FORM_ATTRIBUTES, $atts, 'avatar-privacy-form' ); + + // Sanitize attribute values. + $atts['avatar_size'] = \absint( $atts['avatar_size'] ); + + return $atts; + } +} diff --git a/includes/avatar-privacy/components/class-uninstallation.php b/includes/avatar-privacy/components/class-uninstallation.php new file mode 100644 index 0000000..e41da5f --- /dev/null +++ b/includes/avatar-privacy/components/class-uninstallation.php @@ -0,0 +1,288 @@ + + */ +class Uninstallation implements Component { + + /** + * The options handler. + * + * @var Options + */ + private $options; + + /** + * The options handler. + * + * @var Network_Options + */ + private $network_options; + + /** + * The transients handler. + * + * @var Transients + */ + private $transients; + + /** + * The site transients handler. + * + * @var Site_Transients + */ + private $site_transients; + + /** + * The DB handler. + * + * @var Database + */ + private $database; + + /** + * The filesystem cache handler. + * + * @var Filesystem_Cache + */ + private $file_cache; + + /** + * Creates a new Setup instance. + * + * @since 2.1.0 Parameter $plugin_file removed. + * + * @param Options $options The options handler. + * @param Network_Options $network_options The network options handler. + * @param Transients $transients The transients handler. + * @param Site_Transients $site_transients The site transients handler. + * @param Database $database The database handler. + * @param Filesystem_Cache $file_cache The filesystem cache handler. + */ + public function __construct( Options $options, Network_Options $network_options, Transients $transients, Site_Transients $site_transients, Database $database, Filesystem_Cache $file_cache ) { + $this->options = $options; + $this->network_options = $network_options; + $this->transients = $transients; + $this->site_transients = $site_transients; + $this->database = $database; + $this->file_cache = $file_cache; + } + + /** + * Sets up the various hooks for the plugin component. + * + * @return void + */ + public function run() { + // Enqueue necessary tasks. + $this->enqueue_cleanup_tasks(); + + // Clean up the site-specific artifacts. + $this->do_site_cleanups(); + + /** + * Cleans up any remaining global artifacts. + */ + \do_action( 'avatar_privacy_uninstallation_global' ); + } + + /** + * Enqeueus the necessary uninstallation tasks to the `avatar_privacy_uninstallation_site` + * and `avatar_privacy_uninstallation_global` actions. + * + * @since 2.3.0 + * + * @return void + */ + public function enqueue_cleanup_tasks() { + // Delete cached files. + \add_action( 'avatar_privacy_uninstallation_global', [ $this->file_cache, 'invalidate' ], 10, 0 ); + + // Delete uploaded user avatars. + \add_action( 'avatar_privacy_uninstallation_global', [ $this, 'delete_uploaded_avatars' ], 11, 0 ); + + // Delete usermeta for all users. + \add_action( 'avatar_privacy_uninstallation_global', [ $this, 'delete_user_meta' ], 12, 0 ); + + // Delete/change options (from all sites in case of a multisite network). + \add_action( 'avatar_privacy_uninstallation_site', [ $this, 'delete_options' ], 10, 0 ); + \add_action( 'avatar_privacy_uninstallation_global', [ $this, 'delete_network_options' ], 13, 0 ); + + // Delete transients from sitemeta or options table. + \add_action( 'avatar_privacy_uninstallation_site', [ $this, 'delete_transients' ], 11, 0 ); + \add_action( 'avatar_privacy_uninstallation_global', [ $this, 'delete_network_transients' ], 14, 0 ); + + // Drop all our tables. + \add_action( 'avatar_privacy_uninstallation_site', [ $this->database, 'drop_table' ], 12, 1 ); + } + + /** + * Executes all the registered site clean-ups (for all sites if on multisite). + * + * @since 2.1.0 + * + * @return void + */ + protected function do_site_cleanups() { + if ( \is_multisite() ) { + // We want all the sites across all networks. + $query = [ + 'fields' => 'ids', + 'number' => '', + ]; + foreach ( \get_sites( $query ) as $site_id ) { // @phpstan-ignore-line -- get_sites() always returns a list with the 'ids' argument. + \switch_to_blog( $site_id ); + + /** + * Do the registered site clean-ups for the current site. + * + * @param int|null $site_id Optional. The site (blog) ID or null if not a multisite installation. + */ + \do_action( 'avatar_privacy_uninstallation_site', $site_id ); + + \restore_current_blog(); + } + } else { + /** This action is documented in class-uninstallation.php */ + \do_action( 'avatar_privacy_uninstallation_site', null ); + } + } + + /** + * Deletes uploaded avatar images. + * + * @since 2.1.0 Visibility changed to public, made non-static. + * + * @return void + */ + public function delete_uploaded_avatars() { + $user_avatar = User_Fields::USER_AVATAR_META_KEY; + $query = [ + 'meta_key' => $user_avatar, // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key + 'meta_compare' => 'EXISTS', + ]; + + foreach ( \get_users( $query ) as $user ) { + $avatar = $user->$user_avatar; + + if ( ! empty( $avatar['file'] ) && \file_exists( $avatar['file'] ) ) { + delete_file( $avatar['file'] ); + } + } + } + + /** + * Deletes all user meta data added by the plugin. + * + * @since 2.1.0 Visibility changed to public, made non-static. + * + * @return void + */ + public function delete_user_meta() { + \delete_metadata( 'user', 0, User_Fields::GRAVATAR_USE_META_KEY, null, true ); + \delete_metadata( 'user', 0, User_Fields::ALLOW_ANONYMOUS_META_KEY, null, true ); + \delete_metadata( 'user', 0, User_Fields::USER_AVATAR_META_KEY, null, true ); + \delete_metadata( 'user', 0, User_Fields::EMAIL_HASH_META_KEY, null, true ); + } + + /** + * Deletes the site-specific plugin options. + * + * @since 2.1.0 Visibility changed to public, made non-static. + * + * @return void + */ + public function delete_options() { + // Delete our settings. + $this->options->delete( Settings::OPTION_NAME ); + + // Reset avatar_default to working value if necessary. + $this->options->reset_avatar_default(); + } + + /** + * Deletes the global plugin options (except for the salt). + * + * @since 2.1.0 + * + * @return void + */ + public function delete_network_options() { + $this->network_options->delete( Network_Options::USE_GLOBAL_TABLE ); + $this->network_options->delete( Network_Options::GLOBAL_TABLE_MIGRATION ); + $this->network_options->delete( Network_Options::START_GLOBAL_TABLE_MIGRATION ); + } + + /** + * Deletes all the plugin's site-specific transients. + * + * @since 2.1.0 Visibility changed to public, made non-static. + * + * @return void + */ + public function delete_transients() { + // Remove regular transients. + foreach ( $this->transients->get_keys_from_database() as $key ) { + $this->transients->delete( $key, true ); + } + } + + /** + * Deletes all the plugin's global transients ("site transients"). + * + * @since 2.1.0 + * + * @return void + */ + public function delete_network_transients() { + // Remove site transients. + foreach ( $this->site_transients->get_keys_from_database() as $key ) { + $this->site_transients->delete( $key, true ); + } + } +} diff --git a/includes/avatar-privacy/components/class-user-profile.php b/includes/avatar-privacy/components/class-user-profile.php new file mode 100644 index 0000000..f9490bf --- /dev/null +++ b/includes/avatar-privacy/components/class-user-profile.php @@ -0,0 +1,171 @@ + + */ +class User_Profile implements Component { + + /** + * The markup to inject. + * + * @var string + */ + private $markup; + + /** + * The profile form helper. + * + * @var User_Form + */ + private $form; + + /** + * Indiciates whether the settings page is buffering its output. + * + * @var bool + */ + private $buffering; + + /** + * Creates a new instance. + * + * @since 2.1.0 Parameter $plugin_file removed. + * @since 2.3.0 Parameter $upload removed, parameter $form added. + * + * @param User_Form $form The profile form helper. + */ + public function __construct( User_Form $form ) { + $this->form = $form; + $this->buffering = false; + } + + /** + * Sets up the various hooks for the plugin component. + * + * @return void + */ + public function run() { + if ( \is_admin() ) { + \add_action( 'admin_init', [ $this, 'admin_init' ] ); + } + } + + /** + * Initialize additional plugin hooks. + * + * @return void + */ + public function admin_init() { + // Add the checkbox to the user profile form if we're in the WP backend. + \add_action( 'user_edit_form_tag', [ $this, 'print_form_encoding' ] ); + \add_action( 'show_user_profile', [ $this, 'add_user_profile_fields' ] ); + \add_action( 'edit_user_profile', [ $this, 'add_user_profile_fields' ] ); + \add_action( 'personal_options_update', [ $this->form, 'save' ] ); + \add_action( 'edit_user_profile_update', [ $this->form, 'save' ] ); + + // Replace profile picture setting with our own settings. + \add_action( 'admin_head-profile.php', [ $this, 'admin_head' ] ); + \add_action( 'admin_head-user-edit.php', [ $this, 'admin_head' ] ); + \add_action( 'admin_footer-profile.php', [ $this, 'admin_footer' ] ); + \add_action( 'admin_footer-user-edit.php', [ $this, 'admin_footer' ] ); + } + + /** + * Enables output buffering. + * + * @return void + */ + public function admin_head() { + if ( \ob_start( [ $this, 'replace_profile_picture_section' ] ) ) { + $this->buffering = true; + } + } + + /** + * Cleans up any output buffering. + * + * @return void + */ + public function admin_footer() { + // Clean up output buffering. + if ( $this->buffering && \ob_get_level() > 0 ) { + \ob_end_flush(); + $this->buffering = false; + } + } + + /** + * Prints the enctype "multipart/form-data". + * + * @return void + */ + public function print_form_encoding() { + echo ' enctype="multipart/form-data"'; + } + + /** + * Remove the profile picture section from the user profile screen. + * + * @param string $content The captured HTML output. + * + * @return string + */ + public function replace_profile_picture_section( $content ) { + if ( ! empty( $this->markup ) ) { + return (string) \preg_replace( '#.*#Usi', $this->markup, $content ); + } + + return $content; + } + + /** + * Stores the profile fields markup for later use. + * + * @param \WP_User $user The current user whose profile to modify. + * + * @return void + */ + public function add_user_profile_fields( \WP_User $user ) { + $this->markup = + $this->form->get_avatar_uploader( $user->ID ) . + $this->form->get_use_gravatar_checkbox( $user->ID ) . + $this->form->get_allow_anonymous_checkbox( $user->ID ); + } +} diff --git a/includes/avatar-privacy/core/class-api.php b/includes/avatar-privacy/core/class-api.php new file mode 100644 index 0000000..b2dc025 --- /dev/null +++ b/includes/avatar-privacy/core/class-api.php @@ -0,0 +1,36 @@ + + */ +interface API {} diff --git a/includes/avatar-privacy/core/class-comment-author-fields.php b/includes/avatar-privacy/core/class-comment-author-fields.php new file mode 100644 index 0000000..1d73a61 --- /dev/null +++ b/includes/avatar-privacy/core/class-comment-author-fields.php @@ -0,0 +1,413 @@ + + * @author Johannes Freudendahl + * + * @phpstan-import-type ColumnValueTuples from \Avatar_Privacy\Data_Storage\Database\Table + */ +class Comment_Author_Fields implements API { + + /** + * Prefix for caching avatar privacy for non-logged-in users. + */ + const EMAIL_CACHE_PREFIX = 'email_'; + + /** + * The cache handler. + * + * @var Cache + */ + private Cache $cache; + + /** + * The hashing helper. + * + * @var Hasher + */ + private Hasher $hasher; + + /** + * The comment author table handler. + * + * @var Comment_Author_Table + */ + private Comment_Author_Table $comment_author_table; + + /** + * The comment author table handler. + * + * @var Hashes_Table + */ + private Hashes_Table $hashes_table; + + /** + * A cache to prevent multiple hash updates. + * + * @since 2.6.0 + * + * @var array + */ + private array $updated_hashes = []; + + /** + * Creates a new instance. + * + * @param Cache $cache Required. + * @param Hasher $hasher Required. + * @param Comment_Author_Table $comment_author_table The comment author database table. + * @param Hashes_Table $hashes_table The hashes database table. + */ + public function __construct( Cache $cache, Hasher $hasher, Comment_Author_Table $comment_author_table, Hashes_Table $hashes_table ) { + $this->cache = $cache; + $this->hasher = $hasher; + $this->comment_author_table = $comment_author_table; + $this->hashes_table = $hashes_table; + } + + /** + * Retrieves the hash for the given comment author e-mail address. + * + * @param string $email The comment author's e-mail address. + * + * @return string + */ + public function get_hash( $email ) { + return $this->hasher->get_hash( $email ); + } + + /** + * Checks whether an anonymous comment author has opted-in to Gravatar usage. + * + * @param string $email_or_hash The comment author's e-mail address or the unique hash. + * + * @return bool + */ + public function allows_gravatar_use( $email_or_hash ) { + $data = $this->load( $email_or_hash ); + + return ! empty( $data ) && ! empty( $data->use_gravatar ); + } + + /** + * Checks whether an anonymous comment author is in our Gravatar policy database. + * + * @param string $email_or_hash The comment author's e-mail address or the unique hash. + * + * @return bool + */ + public function has_gravatar_policy( $email_or_hash ) { + $data = $this->load( $email_or_hash ); + + return ! empty( $data ) && isset( $data->use_gravatar ); + } + + /** + * Retrieves the database primary key for the given email address. + * + * @param string $email_or_hash The comment author's e-mail address or the unique hash. + * + * @return int The database key for the given email address (or 0). + */ + public function get_key( $email_or_hash ) { + $data = $this->load( $email_or_hash ); + + if ( isset( $data->id ) ) { + return $data->id; + } + + return 0; + } + + /** + * Returns the dataset from the 'use gravatar' table for the given e-mail + * address. + * + * @internal + * + * @param string $email_or_hash The comment author's e-mail address or the unique hash. + * + * @return \stdClass|null The dataset as an object or null. + */ + public function load( $email_or_hash ) { + global $wpdb; + + // Won't change valid hashes. + $email_or_hash = \strtolower( \trim( $email_or_hash ) ); + if ( empty( $email_or_hash ) ) { + return null; + } + + // Check cache. + $type = ( false === \strpos( $email_or_hash, '@' ) ) ? 'hash' : 'email'; + $key = $this->get_cache_key( $email_or_hash, $type ); + $data = $this->cache->get( $key ); + + if ( false === $data ) { + // We need to query the database. + $data = $wpdb->get_row( // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching + $wpdb->prepare( + // phpcs:ignore WordPress.DB.PreparedSQLPlaceholders.UnquotedComplexPlaceholder -- DB and column name. + 'SELECT c.*, h.hash FROM `%1$s` c LEFT OUTER JOIN `%2$s` h ON c.email = h.identifier AND h.type = "comment" WHERE `%3$s` = "%4$s"', + $wpdb->avatar_privacy, + $wpdb->avatar_privacy_hashes, + $type, + $email_or_hash + ), + \OBJECT + ); + + $this->cache->set( $key, $data, 5 * MINUTE_IN_SECONDS ); + } + + return $data; + } + + /** + * Retrieves the email for the given comment author database key. + * + * @param string $hash The hashed mail address. + * + * @return string + */ + public function get_email( $hash ) { + $data = $this->load( $hash ); + + return ! empty( $data->email ) ? $data->email : ''; + } + + /** + * Updates the comment author information. Also clears the cache. + * + * @param int $id The row ID. + * @param string $email The mail address. + * @param array $columns An array of values index by column name. + * + * @return int|false The number of rows updated, or false on error. + * + * @throws \RuntimeException A \RuntimeException is raised when invalid + * column names are used. + * + * @phpstan-param ColumnValueTuples $columns + */ + protected function update( $id, $email, array $columns ) { + $result = $this->comment_author_table->update( $columns, [ 'id' => $id ] ); + + if ( false !== $result && $result > 0 ) { + // Clear any previously cached value. + $this->clear_cache( $email ); + } + + return $result; + } + + /** + * Inserts data into the comment author table (and the supplementary hashes + * table). Also clears the cache if successful. + * + * @param string $email The mail address. + * @param int|null $use_gravatar A flag indicating if gravatar use is allowed. `null` indicates the default policy (i.e. not set). + * @param string $log_message The log message. + * + * @return int|false The number of rows updated, or false on error. + */ + protected function insert( $email, $use_gravatar, $log_message ) { + $columns = [ + 'email' => $email, + 'use_gravatar' => $use_gravatar, + 'log_message' => $log_message, + ]; + + // Update database. + $result = $this->comment_author_table->insert( $columns ); + if ( ! empty( $result ) ) { + // Clear any previously cached value, just in case. + $this->update_hash( $email, true ); + } + + return $result; + } + + /** + * Ensures that the comment author gravatar policy is updated. + * + * @param string $email The comment author's mail address. + * @param int $comment_id The comment ID. + * @param int $use_gravatar 1 if Gravatar.com is enabled, 0 otherwise. + * + * @return void + */ + public function update_gravatar_use( $email, $comment_id, $use_gravatar ) { + $data = $this->load( $email ); + if ( empty( $data ) ) { + // Nothing found in the database, insert the dataset. + $this->insert( $email, $use_gravatar, $this->get_log_message( $comment_id ) ); + } else { + if ( $data->use_gravatar !== $use_gravatar ) { + // Dataset found but with different value, update it. + $new_values = [ + 'use_gravatar' => $use_gravatar, + 'log_message' => $this->get_log_message( $comment_id ), + ]; + $this->update( $data->id, $data->email, $new_values ); + } + + // We might also need to update the hash. + if ( empty( $data->hash ) ) { + $this->update_hash( $data->email ); + } + } + } + + /** + * Updates the hash for the comment author email. Also clears the cache if + * necessary. + * + * @param string $email The email. + * @param bool $clear_cache Optional. Force the cache to be cleared. Default false. + * + * @return int|false The number of rows updated, or false on error. + */ + public function update_hash( $email, $clear_cache = false ) { + $result = 0; + $hash = $this->get_hash( $email ); + + // Let's check the update cache first. + if ( ! isset( $this->updated_hashes[ $email ] ) || $hash !== $this->updated_hashes[ $email ] ) { + $data = [ + 'identifier' => $email, + 'hash' => $hash, + 'type' => 'comment', + ]; + + // Actually update database. + $result = $this->hashes_table->insert_or_update_row( $data ); + + // Mark hash as updated. + $this->updated_hashes[ $email ] = $hash; + } + + // Check whether we need to clear the cache. + if ( $clear_cache || ! empty( $result ) ) { + $this->clear_cache( $hash, 'hash' ); + } + + return $result; + } + + /** + * Returns a formatted log message for comment author data. + * + * @param int $comment_id A valid comment ID. + * + * @return string + */ + protected function get_log_message( $comment_id ) { + $log_message = 'set with comment %d'; + $parameters = [ $comment_id ]; + + if ( \is_multisite() ) { + global $wpdb; + + $log_message .= ' (site: %d, blog: %d)'; + $parameters[] = $wpdb->siteid; + $parameters[] = $wpdb->blogid; + } + + return \vsprintf( $log_message, $parameters ); + } + + /** + * Clears the cache for the given comment author e-mail address or hash. + * + * @param string $email_or_hash The comment author's e-mail address or the unique hash. + * @param string $type Optional. The identifier type ('email' or 'hash'). Default 'email'. + * + * @return void + */ + public function clear_cache( $email_or_hash, $type = 'email' ) { + $this->cache->delete( $this->get_cache_key( $email_or_hash, $type ) ); + } + + /** + * Calculates the cache key for the given identifier. + * + * @param string $email_or_hash The comment author's e-mail address or the unique hash. + * @param string $type Optional. The identifier type ('email' or 'hash'). Default 'email'. + * + * @return string + */ + protected function get_cache_key( $email_or_hash, $type = 'email' ) { + if ( 'email' === $type ) { + // We only need the hash here. + $email_or_hash = $this->get_hash( $email_or_hash ); + } + + return self::EMAIL_CACHE_PREFIX . $email_or_hash; + } + + /** + * Deletes the data for the comment author identified by an email address. + * + * @param string $email The comment author's e-mail address or the unique hash. + * + * @return int|false The number of rows deleted, or false on error. + */ + public function delete( $email ) { + $comment_author_rows = $this->comment_author_table->delete( [ 'email' => $email ] ); + $hashes_rows = $this->hashes_table->delete( + [ + 'identifier' => $email, + 'type' => 'comment', + ] + ); + + if ( ! empty( $comment_author_rows ) || ! empty( $hashes_rows ) ) { + $this->clear_cache( $email ); + + return \max( (int) $comment_author_rows, (int) $hashes_rows ); + } + + return false; + } +} diff --git a/includes/avatar-privacy/core/class-default-avatars.php b/includes/avatar-privacy/core/class-default-avatars.php new file mode 100644 index 0000000..f5a8f2c --- /dev/null +++ b/includes/avatar-privacy/core/class-default-avatars.php @@ -0,0 +1,270 @@ + + * + * @phpstan-import-type AvatarDefinition from User_Fields + */ +class Default_Avatars implements API { + + /** + * The settings API. + * + * @var Settings + */ + private Settings $settings; + + /** + * The options handler. + * + * @var Options + */ + private Options $options; + + /** + * The hashing helper. + * + * @var Hasher + */ + private Hasher $hasher; + + /** + * The filesystem cache handler. + * + * @var Filesystem_Cache + */ + private Filesystem_Cache $file_cache; + + /** + * The image file handler. + * + * @var Image_File + */ + private Image_File $image_file; + + /** + * Creates a new instance. + * + * @param Settings $settings The settings API. + * @param Options $options The options handler. + * @param Hasher $hasher The hashing helper.. + * @param Filesystem_Cache $file_cache The file cache handler. + * @param Image_File $image_file The image file handler. + */ + public function __construct( Settings $settings, Options $options, Hasher $hasher, Filesystem_Cache $file_cache, Image_File $image_file ) { + $this->settings = $settings; + $this->options = $options; + $this->hasher = $hasher; + $this->file_cache = $file_cache; + $this->image_file = $image_file; + } + + /** + * Retrieves the hash for the custom default avatar for the given site. + * + * @param int $site_id The site ID. + * + * @return string + */ + public function get_hash( $site_id ) { + return $this->hasher->get_hash( "custom-default-{$site_id}" ); + } + + /** + * Retrieves the full-size custom default avatar for a site (if one exists). + * + * @return array { + * An avatar definition, or the empty array. + * + * @type string $file The local filename. + * @type string $type The MIME type. + * } + * + * @phpstan-return AvatarDefinition|array{} + */ + public function get_custom_default_avatar() { + $avatar = $this->settings->get( Settings::UPLOAD_CUSTOM_DEFAULT_AVATAR ); + if ( ! \is_array( $avatar ) || empty( $avatar['file'] ) ) { + $avatar = []; + } + + return $avatar; + } + + // phpcs:disable Squiz.Commenting.FunctionCommentThrowTag.WrongNumber -- until PHPCS bug is fixed. + /** + * Sets the custom default avatar for the current site. + * + * Please note that the calling function is responsible for cleaning up the + * provided image if it is a temporary file (i.e the image is copied before + * being used as the new avatar). + * + * @param string $image_url The image URL or filename. + * + * @return void + * + * @throws \InvalidArgumentException An exception is thrown if the image URL + * is invalid. + * @throws Upload_Handling_Exception An exception is thrown if there was an + * while processing the image sideloading. + * @throws File_Deletion_Exception An exception is thrown if the previously + * set image could not be deleted. + */ + public function set_custom_default_avatar( $image_url ) { + $filename = \parse_url( $image_url, \PHP_URL_PATH ); // phpcs:ignore WordPress.WP.AlternativeFunctions.parse_url_parse_url -- we only support PHP 7.0 and higher. + if ( empty( $filename ) ) { + throw new \InvalidArgumentException( "Malformed URL {$image_url}" ); + } + + // Prepare arguments. + $overrides = [ + 'global_upload' => false, + 'upload_dir' => Upload_Handler::UPLOAD_DIR, + 'filename' => $this->get_custom_default_avatar_filename( $filename ), + ]; + + // Sideload file and validate result. + $sideloaded_avatar = $this->image_file->handle_sideload( $image_url, $overrides ); + if ( empty( $sideloaded_avatar['file'] ) ) { + throw new Upload_Handling_Exception( 'Missing upload file path' ); + } elseif ( empty( $sideloaded_avatar['type'] ) ) { + throw new Upload_Handling_Exception( "Could not determine MIME type for {$image_url}" ); + } elseif ( ! isset( Image_File::FILE_EXTENSION[ $sideloaded_avatar['type'] ] ) ) { + throw new Upload_Handling_Exception( "Invalid MIME type {$sideloaded_avatar['type']}" ); + } + + $this->store_custom_default_avatar_data( $sideloaded_avatar ); + } + // phpcs:enable Squiz.Commenting.FunctionCommentThrowTag.WrongNumber -- until PHPCS bug is fixed. + + /** + * Deletes the custom default avatar set for the current site (including the setting). + * + * @return void + * + * @throws File_Deletion_Exception An exception is thrown if the previously + * set image could not be deleted. + */ + public function delete_custom_default_avatar() { + $this->store_custom_default_avatar_data( [] ); + } + + /** + * Stores the given avatar data and cleans up existing image files. + * + * @param string[] $avatar_data The avatar data. May be empty. + * + * @return void + * + * @throws File_Deletion_Exception An exception is thrown if the previously + * set image could not be deleted. + */ + protected function store_custom_default_avatar_data( array $avatar_data ) { + // Delete old images. + if ( ! $this->delete_custom_default_avatar_image_file() ) { + throw new File_Deletion_Exception( 'Could not delete previous avatar image.' ); + } + + // Invalidate cached thumbnails. + $this->invalidate_custom_default_avatar_cache( \get_current_blog_id() ); + + // Save the sideloaded default avatar. + $this->settings->set( Settings::UPLOAD_CUSTOM_DEFAULT_AVATAR, $avatar_data ); + } + + /** + * Deletes the custom default avatar image file for the current site (but not + * cached thumbnails). + * + * @internal + * + * @return bool + */ + public function delete_custom_default_avatar_image_file() { + // Delete original upload if it exists. + $icon = $this->get_custom_default_avatar(); + if ( empty( $icon['file'] ) || \file_exists( $icon['file'] ) && delete_file( $icon['file'] ) ) { + return true; + } + + return false; + } + + /** + * Invalidates cached avatar images. + * + * @internal + * + * @param int $site_id The site ID. + * + * @return void + */ + public function invalidate_custom_default_avatar_cache( $site_id ) { + $this->file_cache->invalidate( 'custom', "#/{$this->get_hash( $site_id )}-[1-9][0-9]*\.[a-z]{3}\$#" ); + } + + /** + * Retrieves the base filename (without the extension) for the custom avatar + * image for the current site. + * + * @internal + * + * @param string $filename The original filename. + * + * @return string + */ + public function get_custom_default_avatar_filename( $filename ) { + $extension = \pathinfo( $filename, \PATHINFO_EXTENSION ); + $filename = 'custom-default-icon'; + + $blogname = $this->options->get( 'blogname', '', true ); + if ( \is_string( $blogname ) && ! empty( $blogname ) ) { + $filename = \htmlspecialchars_decode( $blogname ); + } + + return \sanitize_file_name( "{$filename}.{$extension}" ); + } +} diff --git a/includes/avatar-privacy/core/class-settings.php b/includes/avatar-privacy/core/class-settings.php new file mode 100644 index 0000000..ef86d1f --- /dev/null +++ b/includes/avatar-privacy/core/class-settings.php @@ -0,0 +1,449 @@ + + * + * @phpstan-import-type AvatarDefinition from User_Fields + * + * @phpstan-type SettingsFieldMeta array{ + * ui: class-string<\Avatar_Privacy\Vendor\Mundschenk\UI\Control>, + * tab_id: string, + * section: string, + * help_no_file?: string, + * help_no_upload?: string, + * help_text?: string, + * short?: string, + * label?: string, + * erase_checkbox?: string, + * action?: string, + * nonce?: string, + * default?: mixed, + * attributes?: mixed[], + * settings_args?: mixed[], + * elements?: mixed[], + * grouped_with?: string, + * outer_attributes?: mixed[], + * } + * @phpstan-type SettingsFieldDefinitions array{ + * custom_default_avatar: SettingsFieldMeta, + * display: SettingsFieldMeta, + * gravatar_use_default: SettingsFieldMeta, + * } + * @phpstan-type SettingsFields array{ + * custom_default_avatar: AvatarDefinition|array{}, + * gravatar_use_default: bool, + * installed_version: string + * } + */ +class Settings implements API { + + /** + * The name of the combined settings in the database. + * + * @since 2.4.0 Moved from Avatar_Privacy\Core and renamed from SETTINGS_NAME. + * + * @var string + */ + const OPTION_NAME = 'settings'; + + /** + * The options array index of the custom default avatar image. + * + * @var string + */ + const UPLOAD_CUSTOM_DEFAULT_AVATAR = 'custom_default_avatar'; + + /** + * The defaults array index of the information headers. + * + * @var string + */ + const INFORMATION_HEADER = 'display'; + + /** + * The options array index of the default gravatar policy. + * + * @var string + */ + const GRAVATAR_USE_DEFAULT = 'gravatar_use_default'; + + /** + * The defaults array. + * + * @var array + * + * @phpstan-var SettingsFields + */ + private array $defaults; + + /** + * The fields definition array. + * + * @var array + * + * @phpstan-var SettingsFieldDefinitions + */ + private array $fields; + + /** + * The fields definition array for the network settings. + * + * @var array + * + * @phpstan-var array + */ + private array $network_fields; + + /** + * The cached information header markup. + * + * @var string + */ + private string $information_header; + + /** + * The plugin version. + * + * @since 2.4.0 + * + * @var string + */ + private string $version; + + /** + * The user's settings (indexed by site ID to be multisite-safe). + * + * @since 2.4.0 + * + * @var array { + * @type array $site_settings The plugin settings for the site. + * } + * + * @phpstan-var array + */ + private array $settings = []; + + /** + * The options handler. + * + * @since 2.4.0 + * + * @var Options + */ + private Options $options; + + /** + * Creates a new instance. + * + * @since 2.4.0 + * + * @param string $version The plugin version string (e.g. "3.0.0-beta.2"). + * @param Options $options The options handler. + */ + public function __construct( $version, Options $options ) { + $this->version = $version; + $this->options = $options; + } + + /** + * Retrieves the plugin version. + * + * @since 2.4.0 + * + * @return string + */ + public function get_version() { + return $this->version; + } + + /** + * Retrieves the complete plugin settings array. + * + * @since 2.0.0 Parameter $force added. + * @since 2.4.0 Moved to Avatar_Privacy\Core\Settings::get_all_settings. + * + * @param bool $force Optional. Forces retrieval of settings from database. Default false. + * + * @return array + * + * @phpstan-return SettingsFields + */ + public function get_all_settings( $force = false ) { + $site_id = \get_current_blog_id(); + + // Force a re-read if the cached settings do not appear to be from the current version. + if ( empty( $this->settings[ $site_id ] ) || + empty( $this->settings[ $site_id ][ Options::INSTALLED_VERSION ] ) || + $this->version !== $this->settings[ $site_id ][ Options::INSTALLED_VERSION ] || + $force + ) { + $this->settings[ $site_id ] = $this->load_settings(); + } + + return $this->settings[ $site_id ]; + } + + /** + * Load settings from the database and set defaults if necessary. + * + * @since 2.4.1 + * + * @return array + * + * @phpstan-return SettingsFields + */ + protected function load_settings() { + $_settings = $this->options->get( self::OPTION_NAME ); + $_defaults = $this->get_defaults(); + $modified = false; + + if ( \is_array( $_settings ) ) { + foreach ( $_defaults as $name => $default_value ) { + if ( ! isset( $_settings[ $name ] ) ) { + $_settings[ $name ] = $default_value; + $modified = true; + } + } + + /** + * PHPStan type. + * + * @phpstan-var SettingsFields $_settings + */ + } else { + $_settings = $_defaults; + $modified = true; + } + + if ( $modified ) { + $this->options->set( self::OPTION_NAME, $_settings ); + } + + return $_settings; + } + + /** + * Retrieves a single setting. + * + * @since 2.4.0 + * + * @param string $setting The setting name (index). + * @param bool $force Optional. Forces retrieval of settings from + * database. Default false. + * + * @return string|int|bool|array The requested setting value. + * + * @throws \UnexpectedValueException Thrown when the setting name is invalid. + * + * @phpstan-param key-of $setting + * @phpstan-return value-of + */ + public function get( $setting, $force = false ) { + $all_settings = $this->get_all_settings( $force ); + + if ( ! isset( $all_settings[ $setting ] ) ) { + throw new \UnexpectedValueException( "Invalid setting name '{$setting}'." ); + } + + return $all_settings[ $setting ]; + } + + /** + * Sets a single setting. + * + * @since 2.4.0 + * + * @internal + * + * @param string $setting The setting name (index). + * @param string|int|bool|array $value The setting value. + * + * @return bool + * + * @throws \UnexpectedValueException Thrown when the setting name is invalid. + * + * @phpstan-param key-of $setting + * @phpstan-param value-of $value + */ + public function set( $setting, $value ) { + $site_id = \get_current_blog_id(); + $all_settings = $this->get_all_settings(); + + if ( ! isset( $all_settings[ $setting ] ) ) { + throw new \UnexpectedValueException( "Invalid setting name '{$setting}'." ); + } + + // Update DB. + $all_settings[ $setting ] = $value; + $result = $this->options->set( self::OPTION_NAME, $all_settings ); + + // Update cached settings only if DB the DB write was successful. + if ( $result ) { + /** + * PHPStan type. + * + * @phpstan-var SettingsFields $all_settings + */ + $this->settings[ $site_id ] = $all_settings; + } + + return $result; + } + + /** + * Retrieves the settings field definitions. + * + * @param string $information_header Optional. The HTML markup for the informational header in the settings. Default ''. + * + * @return array + * + * @phpstan-return SettingsFieldDefinitions + */ + public function get_fields( $information_header = '' ) { + if ( ! isset( $this->fields ) ) { + $this->fields = [ // @codeCoverageIgnoreStart + self::UPLOAD_CUSTOM_DEFAULT_AVATAR => [ + 'ui' => \Avatar_Privacy\Upload_Handlers\UI\File_Upload_Input::class, + 'tab_id' => '', // Will be added to the 'discussions' page. + 'section' => 'avatars', + 'help_no_file' => \__( 'No custom default avatar is set. Use the upload field to add a custom default avatar image.', 'avatar-privacy' ), + 'help_no_upload' => \__( 'You do not have media management permissions. To change your custom default avatar, contact the site administrator.', 'avatar-privacy' ), + 'help_text' => \__( 'Replace the custom default avatar by uploading a new image, or erase it by checking the delete option.', 'avatar-privacy' ), + 'erase_checkbox' => Custom_Default_Icon_Upload_Handler::CHECKBOX_ERASE, + 'action' => Custom_Default_Icon_Upload_Handler::ACTION_UPLOAD, + 'nonce' => Custom_Default_Icon_Upload_Handler::NONCE_UPLOAD, + 'default' => 0, + 'attributes' => [ 'accept' => 'image/*' ], + 'settings_args' => [ 'class' => 'avatar-settings' ], + ], + self::INFORMATION_HEADER => [ + 'ui' => Controls\Display_Text::class, + 'tab_id' => '', // Will be added to the 'discussions' page. + 'section' => 'avatars', + 'elements' => [], // Will be updated below. + 'short' => \__( 'Avatar Privacy', 'avatar-privacy' ), + ], + self::GRAVATAR_USE_DEFAULT => [ + 'ui' => Controls\Checkbox_Input::class, + 'tab_id' => '', + 'section' => 'avatars', + /* translators: 1: checkbox HTML */ + 'label' => \__( '%1$s Display Gravatar images by default.', 'avatar-privacy' ), + 'help_text' => \__( 'Checking will ensure that gravatars are displayed when there is no explicit setting for the user or mail address (e.g. for comments made before installing Avatar Privacy). Please only enable this setting after careful consideration of the privacy implications.', 'avatar-privacy' ), + 'default' => 0, + 'grouped_with' => self::INFORMATION_HEADER, + 'outer_attributes' => [ 'class' => 'avatar-settings-enabled' ], + ], // @codeCoverageIgnoreEnd + ]; + } + + // Allow calls where the information header is not relevant by caching it separately. + if ( ! empty( $information_header ) && + ( ! isset( $this->information_header ) || $information_header !== $this->information_header ) ) { + $this->fields[ self::INFORMATION_HEADER ]['elements'] = [ $information_header ]; + $this->information_header = $information_header; + } + + return $this->fields; + } + + /** + * Retrieves the default settings. + * + * @return array + * + * @phpstan-return SettingsFields + */ + public function get_defaults() { + if ( ! isset( $this->defaults ) ) { + $_defaults = []; + foreach ( $this->get_fields() as $index => $field ) { + if ( isset( $field['default'] ) ) { + $_defaults[ $index ] = $field['default']; + } + } + + // Allow detection of new installations. + $_defaults[ Options::INSTALLED_VERSION ] = ''; + + /** + * PHPStan type. + * + * @phpstan-var SettingsFields $_defaults + */ + $this->defaults = $_defaults; + } + + return $this->defaults; + } + + /** + * Retrieves the network settings field definitions. + * + * @since 2.1.0 + * + * @return array + * + * @phpstan-return array + */ + public function get_network_fields() { + if ( ! isset( $this->network_fields ) ) { + $this->network_fields = [ // @codeCoverageIgnoreStart + Network_Options::USE_GLOBAL_TABLE => [ + 'ui' => Controls\Checkbox_Input::class, + 'tab_id' => '', + 'section' => Network_Settings_Page::SECTION, + /* translators: 1: checkbox HTML */ + 'label' => \__( '%1$s Use global table.', 'avatar-privacy' ), + 'short' => \__( 'Global Table', 'avatar-privacy' ), + 'help_text' => \__( 'Checking will make Avatar Privacy use a single table for each network (instead of for each site) for storing anonymous comment author consent. (Do not enable this setting unless you are sure about the privacy implications.)', 'avatar-privacy' ), + 'default' => 0, + ], // @codeCoverageIgnoreEnd + ]; + } + + return $this->network_fields; + } +} diff --git a/includes/avatar-privacy/core/class-user-fields.php b/includes/avatar-privacy/core/class-user-fields.php new file mode 100644 index 0000000..84202b1 --- /dev/null +++ b/includes/avatar-privacy/core/class-user-fields.php @@ -0,0 +1,525 @@ + + * + * @phpstan-type AvatarDefinition array{ file: string, type: string } + */ +class User_Fields implements API { + + /** + * The user meta key for the hashed email. + * + * @var string + */ + const EMAIL_HASH_META_KEY = 'avatar_privacy_hash'; + + /** + * The user meta key for the gravatar use flag. + * + * @var string + */ + const GRAVATAR_USE_META_KEY = 'avatar_privacy_use_gravatar'; + + /** + * The user meta key for the gravatar use flag. + * + * @var string + */ + const ALLOW_ANONYMOUS_META_KEY = 'avatar_privacy_allow_anonymous'; + + /** + * The user meta key for the local avatar. + * + * @var string + */ + const USER_AVATAR_META_KEY = 'avatar_privacy_user_avatar'; + + /** + * The hashing helper. + * + * @var Hasher + */ + private Hasher $hasher; + + /** + * The filesystem cache handler. + * + * @var Filesystem_Cache + */ + private Filesystem_Cache $file_cache; + + /** + * The image file handler. + * + * @var Image_File + */ + private Image_File $image_file; + + /** + * A request-level cache for user lookups. + * + * @var array + */ + private array $user_by_email = []; + + /** + * Creates a new instance. + * + * @param Hasher $hasher The hashing helper.. + * @param Filesystem_Cache $file_cache The file cache handler. + * @param Image_File $image_file The image file handler. + */ + public function __construct( Hasher $hasher, Filesystem_Cache $file_cache, Image_File $image_file ) { + $this->hasher = $hasher; + $this->file_cache = $file_cache; + $this->image_file = $image_file; + } + + /** + * Retrieves the hash for the given user ID. If there currently is no hash, + * a new one is generated. + * + * @param int $user_id The user ID. + * + * @return string|false The hashed email, or `false` on failure. + */ + public function get_hash( $user_id ) { + $hash = \get_user_meta( $user_id, self::EMAIL_HASH_META_KEY, true ); + + if ( ! \is_string( $hash ) || empty( $hash ) ) { + $user = \get_user_by( 'ID', $user_id ); + if ( empty( $user->user_email ) ) { + return false; + } + + $hash = $this->hasher->get_hash( $user->user_email ); + \update_user_meta( $user_id, self::EMAIL_HASH_META_KEY, $hash ); + } + + return $hash; + } + + /** + * Retrieves a user by email hash. + * + * @param string $hash The user's email hash. + * + * @return \WP_User|null + */ + public function get_user_by_hash( $hash ) { + // No extra caching necessary, WP Core already does that for us. + $args = [ + 'number' => 1, + 'meta_key' => self::EMAIL_HASH_META_KEY, // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key + 'meta_value' => $hash, // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_value + 'meta_compare' => '=', + ]; + $users = \get_users( $args ); + + if ( empty( $users ) ) { + return null; + } + + return $users[0]; + } + + /** + * Retrieves a user by email. + * + * This method differs from `get_user_by` in that it caches the result even + * if no user is found for the duration of the request. + * + * @since 2.6.0 + * + * @param string $email The email to query. + * + * @return \WP_User|null + */ + public function get_user_by_email( $email ) { + if ( isset( $this->user_by_email[ $email ] ) || \array_key_exists( $email, $this->user_by_email ) ) { + return $this->user_by_email[ $email ]; + } + + $user = \get_user_by( 'email', $email ); + if ( empty( $user ) ) { + $user = null; + } + + // Cache lookup result. + $this->user_by_email[ $email ] = $user; + + return $user; + } + + /** + * Retrieves the full-size local avatar for a user (if one exists). + * + * @param int $user_id The user ID. + * + * @return array { + * An avatar definition, or the empty array. + * + * @type string $file The local filename. + * @type string $type The MIME type. + * } + * + * @phpstan-return AvatarDefinition|array{} + */ + public function get_local_avatar( $user_id ) { + /** + * Filters whether to retrieve the user avatar early. If the filtered result + * contains both a filename and a MIME type, those will be returned immediately. + * + * @since 2.2.0 + * + * @param array|null $avatar { + * Optional. The user avatar information. Default null. + * + * @type string $file The local filename. + * @type string $type The MIME type. + * } + * @param int $user_id The user ID. + */ + $avatar = \apply_filters( 'avatar_privacy_pre_get_user_avatar', null, $user_id ); + if ( ! empty( $avatar ) && ! empty( $avatar['file'] ) && ! empty( $avatar['type'] ) ) { + return $avatar; + } + + $avatar = \get_user_meta( $user_id, self::USER_AVATAR_META_KEY, true ); + if ( ! \is_array( $avatar ) ) { + $avatar = []; + } + + return $avatar; + } + + // phpcs:disable Squiz.Commenting.FunctionCommentThrowTag.WrongNumber -- until PHPCS bug is fixed. + /** + * Sets the local avatar for the given user. + * + * Please note that the calling function is responsible for cleaning up the + * provided image if it is a temporary file (i.e the image is copied before + * being used as the new avatar). + * + * @param int $user_id The user ID. + * @param string $image_url The image URL or filename. + * + * @return void + * + * @throws \InvalidArgumentException An exception is thrown if the user ID does + * not exist or the upload result does not + * contain the 'file' key. + * @throws Upload_Handling_Exception An exceptions is thrown if the sideloading + * fails for some reason. + */ + public function set_local_avatar( $user_id, $image_url ) { + $filename = \parse_url( $image_url, \PHP_URL_PATH ); // phpcs:ignore WordPress.WP.AlternativeFunctions.parse_url_parse_url -- we only support PHP 7.0 and higher. + if ( empty( $filename ) ) { + throw new \InvalidArgumentException( "Malformed URL {$image_url}" ); + } + + // Prepare arguments. + $overrides = [ + 'global_upload' => true, + 'upload_dir' => User_Avatar_Upload_Handler::UPLOAD_DIR, + 'filename' => $this->get_local_avatar_filename( $user_id, $filename ), + ]; + + $sideloaded_avatar = $this->image_file->handle_sideload( $image_url, $overrides ); + + $this->set_uploaded_local_avatar( $user_id, $sideloaded_avatar ); + } + // phpcs:enable Squiz.Commenting.FunctionCommentThrowTag.WrongNumber -- until PHPCS bug is fixed. + + /** + * Sets the local avatar to the uploaded image. + * + * @internal + * + * @param int $user_id The user ID. + * @param string[] $uploaded_avatar { + * The uploaded avatar information (the result of Image_File::handle_upload()). + * + * @type string $file The image file path. + * @type string $type The MIME type of the uploaded image. + * } + * + * @return void + * + * @throws \InvalidArgumentException An exception is thrown if the user ID does + * not exist or the upload result does not + * contain the 'file' key. + */ + public function set_uploaded_local_avatar( $user_id, $uploaded_avatar ) { + if ( ! $this->user_exists( $user_id ) ) { + throw new \InvalidArgumentException( "Invalid user ID {$user_id}" ); + } elseif ( empty( $uploaded_avatar['file'] ) ) { + throw new \InvalidArgumentException( 'Missing upload file path' ); + } elseif ( empty( $uploaded_avatar['type'] ) ) { + throw new \InvalidArgumentException( 'Missing image MIME type' ); + } elseif ( ! isset( Image_File::FILE_EXTENSION[ $uploaded_avatar['type'] ] ) ) { + throw new \InvalidArgumentException( "Invalid MIME type {$uploaded_avatar['type']}" ); + } + + // Delete old images. + $this->delete_local_avatar( $user_id ); + + // Save user information (overwriting previous). + \update_user_meta( $user_id, self::USER_AVATAR_META_KEY, $uploaded_avatar ); + } + + /** + * Checks whether the given user ID is valid. + * + * @param int $user_id The user ID. + * + * @return bool + */ + protected function user_exists( $user_id ) { + $args = [ + 'include' => [ $user_id ], + 'fields' => 'ID', + ]; + + if ( \is_network_admin() ) { + $args['blog_id'] = 0; + } + + return (bool) \get_users( $args ); + } + + /** + * Deletes the local avatar of the given user. + * + * @param int $user_id The user ID. + * + * @return bool + */ + public function delete_local_avatar( $user_id ) { + // Invalidate cached avatar images. + $this->invalidate_local_avatar_cache( $user_id ); + + // Delete original upload. + $avatar = \get_user_meta( $user_id, self::USER_AVATAR_META_KEY, true ); + if ( \is_array( $avatar ) && ! empty( $avatar['file'] ) && \is_string( $avatar['file'] ) && \file_exists( $avatar['file'] ) && delete_file( $avatar['file'] ) ) { + return \delete_user_meta( $user_id, self::USER_AVATAR_META_KEY ); + } + + return false; + } + + /** + * Invalidates cached avatar images. + * + * @param int $user_id The user ID. + * + * @return void + */ + public function invalidate_local_avatar_cache( $user_id ) { + $hash = $this->get_hash( $user_id ); + if ( ! empty( $hash ) ) { + $this->file_cache->invalidate( 'user', "#/{$hash}-[1-9][0-9]*\.[a-z]{3}\$#" ); + } + } + + /** + * Retrieves the base filename (without the extension) for a local avatar image + * for the given user. + * + * @internal + * + * @param int $user_id The user ID. + * @param string $filename The original filename. + * + * @return string + */ + public function get_local_avatar_filename( $user_id, $filename ) { + $user = \get_user_by( 'id', $user_id ); + if ( ! $user instanceof \WP_User ) { + return $filename; + } + + $extension = \pathinfo( $filename, \PATHINFO_EXTENSION ); + + return \sanitize_file_name( "{$user->display_name}_avatar.{$extension}" ); + } + + /** + * Checks whether a user has opted-in to Gravatar usage. + * + * @param int $user_id The user ID. + * + * @return bool + */ + public function allows_gravatar_use( $user_id ) { + return 'true' === \get_user_meta( $user_id, self::GRAVATAR_USE_META_KEY, true ); + } + + /** + * Checks whether a user has set a Gravatar usage policy. + * + * @param int $user_id The user ID. + * + * @return bool + */ + public function has_gravatar_policy( $user_id ) { + return ! empty( \get_user_meta( $user_id, self::GRAVATAR_USE_META_KEY, true ) ); + } + + /** + * Updates a user's gravatar policy. + * + * @param int $user_id The user ID. + * @param bool $use_gravatar Whether using Gravatar should be allowed or not. + * + * @return void + */ + public function update_gravatar_use( $user_id, $use_gravatar ) { + // Use true/false instead of 1/0 since a '0' value is removed from + // the database and then we can't differentiate between "has opted-out" + // and "never saved a value". + \update_user_meta( $user_id, self::GRAVATAR_USE_META_KEY, $use_gravatar ? 'true' : 'false' ); + } + + /** + * Checks whether a user has opted-in to anonymous commenting. + * + * @param int $user_id The user ID. + * + * @return bool + */ + public function allows_anonymous_commenting( $user_id ) { + return 'true' === \get_user_meta( $user_id, self::ALLOW_ANONYMOUS_META_KEY, true ); + } + + /** + * Checks whether a user has set an anonymous commenting policy. + * + * @param int $user_id The user ID. + * + * @return bool + */ + public function has_anonymous_commenting_policy( $user_id ) { + return ! empty( \get_user_meta( $user_id, self::ALLOW_ANONYMOUS_META_KEY, true ) ); + } + + /** + * Updates a user's anonymous commenting policy. + * + * @param int $user_id The user ID. + * @param bool $anonymous Whether anonymous commenting should be allowed or not. + * + * @return void + */ + public function update_anonymous_commenting( $user_id, $anonymous ) { + // Use true/false instead of 1/0 since a '0' value is removed from + // the database and then we can't differentiate between "has opted-out" + // and "never saved a value". + \update_user_meta( $user_id, self::ALLOW_ANONYMOUS_META_KEY, $anonymous ? 'true' : 'false' ); + } + + /** + * Deletes the stored metadata for a user. + * + * Currently this includes: + * - the email hash, + * - the Gravatar usage policy, + * - the anonymous commenting policy, and + * - the local avatar. + * + * @internal + * + * @param int $user_id The user ID. + * + * @return int The number of removed metadata fields. + */ + public function delete( $user_id ) { + $count = 0; + + // Delete the "simple" meta fields. + $count += (int) \delete_user_meta( $user_id, self::EMAIL_HASH_META_KEY ); + $count += (int) \delete_user_meta( $user_id, self::GRAVATAR_USE_META_KEY ); + $count += (int) \delete_user_meta( $user_id, self::ALLOW_ANONYMOUS_META_KEY ); + + // Also delete a local avatar if one has been set (including all image files). + $count += (int) $this->delete_local_avatar( $user_id ); + + return $count; + } + + /** + * Removes local avatar files "orphaned" by the deletion of the referencing + * user meta data (e.g. when a user is deleted). + * + * @internal + * + * @since 2.5.2 + * + * @param string[] $meta_ids An array of metadata entry IDs to delete. + * @param int $object_id ID of the object metadata is for. + * @param string $meta_key Metadata key. + * @param mixed $meta_value Metadata value. + * + * @return void + */ + public function remove_orphaned_local_avatar( array $meta_ids, $object_id, $meta_key, $meta_value ) { + if ( self::USER_AVATAR_META_KEY !== $meta_key ) { + return; + } + + /** + * The filter provides inconsistent data depending on whether it is called + * by `delete_metadata` or `delete_metadata_by_mid` (@see https://core.trac.wordpress.org/ticket/53102). + * When run through `delete_metadata`, `$meta_value` is equal to the optional + * argument of the same name, not the actual metadata value. + * + * Fortunately, both `wp_delete_user` and `wpmu_delete_user` use `delete_metadata_by_mid`, + * so we can use `$meta_value`. Contrary to the documentation, non-scalar + * values are not serialized. + */ + if ( \is_array( $meta_value ) && ! empty( $meta_value['file'] ) && \is_string( $meta_value['file'] ) && \file_exists( $meta_value['file'] ) ) { + delete_file( $meta_value['file'] ); + } + } +} diff --git a/includes/avatar-privacy/data-storage/class-cache.php b/includes/avatar-privacy/data-storage/class-cache.php new file mode 100644 index 0000000..883cb95 --- /dev/null +++ b/includes/avatar-privacy/data-storage/class-cache.php @@ -0,0 +1,46 @@ + + */ +class Cache extends \Avatar_Privacy\Vendor\Mundschenk\Data_Storage\Cache { + const PREFIX = 'avatar_privacy_'; + const GROUP = 'avatar_privacy'; + + /** + * Creates a new instance. + */ + public function __construct() { + parent::__construct( self::PREFIX, self::GROUP ); + } +} diff --git a/includes/avatar-privacy/data-storage/class-filesystem-cache.php b/includes/avatar-privacy/data-storage/class-filesystem-cache.php new file mode 100644 index 0000000..4cdc1f1 --- /dev/null +++ b/includes/avatar-privacy/data-storage/class-filesystem-cache.php @@ -0,0 +1,278 @@ + + * + * @phpstan-type UploadDir array{ + * path: string, + * url: string, + * subdir: string, + * basedir: string, + * baseurl: string, + * error: string|false + * } + */ +class Filesystem_Cache { + + const CACHE_DIR = 'avatar-privacy/cache/'; + + /** + * The base directory for the filesystem cache. + * + * @var string + */ + private string $base_dir; + + /** + * The base URL for accessing cached files. + * + * @var string + */ + private string $base_url; + + /** + * Information about the uploads directory. + * + * @var array + * + * @phpstan-var UploadDir + */ + private array $upload_dir; + + /** + * Creates a new instance. + */ + public function __construct() { + $this->get_base_dir(); + } + + /** + * Retrieves the base directory for caching files. + * + * @since 2.4.0 A Filesystem_Exception is thrown instead of a generic \RuntimeException. + * + * @throws Filesystem_Exception An exception is thrown if the cache directory + * does not exist and can't be created. + * + * @return string + */ + public function get_base_dir() { + if ( empty( $this->base_dir ) ) { + $this->base_dir = "{$this->get_upload_dir()['basedir']}/" . self::CACHE_DIR; + + if ( ! \wp_mkdir_p( $this->base_dir ) ) { + throw new Filesystem_Exception( "The cache directory {$this->base_dir} could not be created." ); + } + } + + return $this->base_dir; + } + + /** + * Retrieves the base URL for accessing cached files. + * + * @return string + */ + public function get_base_url() { + if ( empty( $this->base_url ) ) { + $this->base_url = "{$this->get_upload_dir()['baseurl']}/" . self::CACHE_DIR; + } + + return $this->base_url; + } + + /** + * Retrieves information about the upload directory. + * + * @since 2.1.0 Visibility changed to protected. + * + * @return array + * + * @phpstan-return UploadDir + */ + protected function get_upload_dir() { + if ( ! isset( $this->upload_dir ) ) { + $multisite = \is_multisite(); + + if ( $multisite ) { + \switch_to_blog( \get_main_site_id() ); + } + + // We only need the basedir, so don't create the monthly sub-directory. + $this->upload_dir = \wp_upload_dir( null, false ); + + if ( $multisite ) { + \restore_current_blog(); + } + } + + return $this->upload_dir; + } + + /** + * Stores data in the filesystem cache. + * + * @since 2.6.0 The type of the `$data` parameter has been corrected to `string`. + * + * @param string $filename The filename (including any sub directory). + * @param string $data The (possibly binary) data. Will not be cached if empty. + * @param bool $force Optional. The cached file will only be overwritten if set to true. Default false. + * + * @return bool True if the file was successfully stored in the cache, false otherwise. + */ + public function set( $filename, $data, $force = false ) { + $file = $this->get_base_dir() . $filename; + + if ( \file_exists( $file ) && ! $force ) { + return true; + } + + return ! ( + // Don't create empty files. + 0 === \strlen( $data ) || + // Make sure that the file path is valid. + ! \wp_mkdir_p( \dirname( $file ) ) || + // Check if the file has been stored successfully. + false === \file_put_contents( $file, $data, \LOCK_EX ) // phpcs:ignore WordPress.WP.AlternativeFunctions.file_system_operations_file_put_contents + ); + } + + /** + * Retrieves the URL for the cached file. + * + * @param string $filename The filename (including any sub directory). + * + * @return string + */ + public function get_url( $filename ) { + return $this->get_base_url() . $filename; + } + + /** + * Removes a file from the cache. + * + * @param string $filename The filename (including any sub directory). + * + * @return bool True if the file was successfully removed from the cache, false otherwise. + */ + public function delete( $filename ) { + $file = $this->get_base_dir() . $filename; + + return \wp_is_writable( $file ) && delete_file( $file ); + } + + /** + * Invalidate all cached elements by recursively deleting all files and directories. + * + * @param string $subdir Optional. Limit invalidation to the given subdirectory. Default ''. + * @param string $regex Optional. Limit invalidation to files matching the given regular expression. Default ''. + * + * @return void + */ + public function invalidate( $subdir = '', $regex = '' ) { + try { + $iterator = $this->get_recursive_file_iterator( $subdir, $regex ); + } catch ( \UnexpectedValueException $e ) { + // Ignore non-existing subdirectories. + return; + } + + foreach ( $iterator as $path => $file ) { + if ( $file->isWritable() ) { + + if ( $file->isDir() ) { + \rmdir( $path ); // phpcs:ignore WordPress.WP.AlternativeFunctions.file_system_operations_rmdir -- Useing the WP_Filesystem API is not an option on the frontend. + } else { + delete_file( $path ); + } + } + } + } + + /** + * Invalidate all cached files older than the given age. + * + * @param int $age The maximum file age in seconds. + * @param string $subdir Optional. Limit invalidation to the given subdirectory. Default ''. + * @param string $regex Optional. Limit invalidation to files matching the given regular expression. Default ''. + * + * @return void + */ + public function invalidate_files_older_than( $age, $subdir = '', $regex = '' ) { + try { + $now = \time(); + $iterator = $this->get_recursive_file_iterator( $subdir, $regex ); + } catch ( \UnexpectedValueException $e ) { + // Ignore non-existing subdirectories. + return; + } + + foreach ( $iterator as $path => $file ) { + if ( $file->isWritable() && ! $file->isDir() && $now - $file->getMTime() > $age ) { + delete_file( $path ); + } + } + } + + /** + * Retrieves a recursive iterator for all files in the cache. + * + * @since 2.1.0 Visibility changed to protected. + * + * @param string $subdir Optional. Limit invalidation to the given subdirectory. Default ''. + * @param string $regex Optional. Limit invalidation to files matching the given regular expression. Default ''. + * + * @return \OuterIterator + */ + protected function get_recursive_file_iterator( $subdir = '', $regex = '' ) { + $files = new \RecursiveIteratorIterator( + new \RecursiveDirectoryIterator( "{$this->get_base_dir()}{$subdir}", \FilesystemIterator::KEY_AS_PATHNAME | \FilesystemIterator::CURRENT_AS_FILEINFO | \FilesystemIterator::SKIP_DOTS ), + \RecursiveIteratorIterator::CHILD_FIRST + ); + + if ( ! empty( $regex ) ) { + /** + * Further filter the collected files using the given regular expression. + * + * @phpstan-var \RegexIterator>> $files + */ + $files = new \RegexIterator( $files, $regex, \RecursiveRegexIterator::MATCH ); + } + + return $files; + } +} diff --git a/includes/avatar-privacy/data-storage/class-network-options.php b/includes/avatar-privacy/data-storage/class-network-options.php new file mode 100644 index 0000000..56df211 --- /dev/null +++ b/includes/avatar-privacy/data-storage/class-network-options.php @@ -0,0 +1,134 @@ + + */ +class Network_Options extends \Avatar_Privacy\Vendor\Mundschenk\Data_Storage\Network_Options { + const PREFIX = 'avatar_privacy_'; + + /** + * The network option key (without the prefix) for using a global table in + * multisite installations. + * + * @var string + */ + const USE_GLOBAL_TABLE = 'use_global_table'; + + /** + * The network option key (without the prefix) for the queue of site IDs to migrate from + * global table usage in multisite installations. + * + * @since 2.1.0 + * + * @var string + */ + const GLOBAL_TABLE_MIGRATION = 'migrate_from_global_table'; + + /** + * The network option key (without the prefix) serving as temporary storagen when + * the the site ID queue is locked. + * + * @since 2.1.0 + * + * @var string + */ + const START_GLOBAL_TABLE_MIGRATION = 'start_global_table_migration'; + + /** + * The network option key (without the prefix) for storing the network-wide salt. + * + * @var string + */ + const SALT = 'salt'; + + /** + * Creates a new instance. + */ + public function __construct() { + parent::__construct( self::PREFIX ); + } + + /** + * Removes the prefix from an option name. + * + * @since 2.1.0 + * + * @param string $name The option name including the prefix. + * + * @return string The option name without the prefix, or '' if an invalid name was given. + */ + public function remove_prefix( $name ) { + $parts = \explode( self::PREFIX, $name, 2 ); + if ( '' === $parts[0] ) { + return $parts[1]; + } + + return ''; + } + + /** + * Tries to write-lock the given option (using a secondary option with the '_lock' + * suffix). + * + * @since 2.1.0 + * + * @param string $option The option name (without the plugin-specific prefix). + * + * @return bool True if the option can be safely set, false otherwise. + */ + public function lock( $option ) { + $now = \microtime( true ); + $secret = \wp_hash( "{$option}|{$now}", 'nonce' ); + $lock = "{$option}_lock"; + + return ! $this->get( $lock ) && $this->set( $lock, $secret ) && $secret === $this->get( $lock ); + } + + /** + * Tries to write-unlock the given option (using a secondary option with the '_lock' + * suffix). + * + * @since 2.1.0 + * + * @param string $option The option name (without the plugin-specific prefix). + * + * @return bool True if the option is now unlocked (either because + * it was not lockedor because unlock was successful), + * false otherwise. + */ + public function unlock( $option ) { + $lock = "{$option}_lock"; + + return ! $this->get( $lock ) || $this->delete( $lock ); + } +} diff --git a/includes/avatar-privacy/data-storage/class-options.php b/includes/avatar-privacy/data-storage/class-options.php new file mode 100644 index 0000000..962343c --- /dev/null +++ b/includes/avatar-privacy/data-storage/class-options.php @@ -0,0 +1,82 @@ + + */ +class Options extends \Avatar_Privacy\Vendor\Mundschenk\Data_Storage\Options { + /** + * The prefix for the plugin options. + * + * @var string + */ + const PREFIX = 'avatar_privacy_'; + + /** + * The name of the option containing the installed plugin version. + * + * @var string + */ + const INSTALLED_VERSION = 'installed_version'; + + /** + * Creates a new instance. + */ + public function __construct() { + parent::__construct( self::PREFIX ); + } + + /** + * Resets the `avatar_default` option to a safe value. + * + * @since 2.1.0 Moved from \Avatar_Privacy\Components\Setup and made non-static. + * + * @return void + */ + public function reset_avatar_default() { + switch ( $this->get( 'avatar_default', null, true ) ) { + case 'rings': + case 'comment': + case 'bubble': + case 'im-user-offline': + case 'bowling-pin': + case 'view-media-artist': + case 'silhouette': + case 'custom': + $this->set( 'avatar_default', 'mystery', true, true ); + break; + + default: + return; + } + } +} diff --git a/includes/avatar-privacy/data-storage/class-site-transients.php b/includes/avatar-privacy/data-storage/class-site-transients.php new file mode 100644 index 0000000..027808b --- /dev/null +++ b/includes/avatar-privacy/data-storage/class-site-transients.php @@ -0,0 +1,45 @@ + + */ +class Site_Transients extends \Avatar_Privacy\Vendor\Mundschenk\Data_Storage\Site_Transients { + const PREFIX = 'avatar_privacy_'; + + /** + * Creates a new instance. + */ + public function __construct() { + parent::__construct( self::PREFIX ); + } +} diff --git a/includes/avatar-privacy/data-storage/class-transients.php b/includes/avatar-privacy/data-storage/class-transients.php new file mode 100644 index 0000000..e9985c1 --- /dev/null +++ b/includes/avatar-privacy/data-storage/class-transients.php @@ -0,0 +1,45 @@ + + */ +class Transients extends \Avatar_Privacy\Vendor\Mundschenk\Data_Storage\Transients { + const PREFIX = 'avatar_privacy_'; + + /** + * Creates a new instance. + */ + public function __construct() { + parent::__construct( self::PREFIX ); + } +} diff --git a/includes/avatar-privacy/data-storage/database/class-comment-author-table.php b/includes/avatar-privacy/data-storage/database/class-comment-author-table.php new file mode 100644 index 0000000..d800aa8 --- /dev/null +++ b/includes/avatar-privacy/data-storage/database/class-comment-author-table.php @@ -0,0 +1,454 @@ + + */ +class Comment_Author_Table extends Table { + + /** + * The table basename without the prefix. + * + * @var string + */ + const TABLE_BASENAME = 'avatar_privacy'; + + /** + * The minimum version not needing a table update. + * + * @var string + */ + const LAST_UPDATED = '2.4.0'; + + /** + * A column/field to placeholder mapping. + * + * @since 2.3.0 + * + * @var string[] + */ + const COLUMN_FORMATS = [ + 'id' => '%d', + 'email' => '%s', + 'use_gravatar' => '%d', + 'last_updated' => '%s', + 'log_message' => '%s', + ]; + + /** + * A list auto-update columns (e.g. date-/timestamps). + * + * @since 2.6.0 + * + * @var string[] + */ + const AUTO_UPDATE_COLS = [ + 'last_updated', + ]; + + /** + * The options handler. + * + * @var Network_Options + */ + private $network_options; + + /** + * Creates a new instance. + * + * @since 2.3.0 Parameter $core added. + * @since 2.4.0 Parameter $core removed. + * + * @param Network_Options $network_options The network options handler. + */ + public function __construct( Network_Options $network_options ) { + parent::__construct( self::TABLE_BASENAME, self::LAST_UPDATED, self::COLUMN_FORMATS, self::AUTO_UPDATE_COLS ); + + $this->network_options = $network_options; + } + + /** + * Sets up the table, including necessary data upgrades. The method is called + * on every page load. + * + * @since 2.4.0 + * + * @param string $previous_version The previously installed plugin version. + * + * @return void + */ + public function setup( $previous_version ) { + parent::setup( $previous_version ); + + // The table is set up correctly, but maybe we need to migrate some data + // from the global table on network installations. + $this->maybe_prepare_migration_queue(); + $this->maybe_migrate_from_global_table(); + } + + /** + * Determines whether this (multisite) installation uses the global table. + * Result is ignored for single-site installations. + * + * @since 2.3.0 Visibility changed to public. + * + * @return bool + */ + public function use_global_table() { + $global_table = (bool) $this->network_options->get( Network_Options::USE_GLOBAL_TABLE, false ); + + /** + * Filters whether a global table should be enabled for multisite installations. + * + * @since 1.0.0 + * + * @param bool $enable Default false, unless this is a multisite installation + * upgraded from version 0.4 or earlier. + */ + return \apply_filters( 'avatar_privacy_enable_global_table', $global_table ); + } + + /** + * Retrieves the CREATE TABLE definition formatted for use by \db_delta(), + * without the charset collate clause. + * + * Example: + * `CREATE TABLE some_table ( + * id mediumint(9) NOT NULL AUTO_INCREMENT, + * some_column varchar(100) NOT NULL, + * PRIMARY KEY (id) + * )` + * + * @since 2.4.0 + * + * @param string $table_name The table name including any prefixes. + * + * @return string + */ + protected function get_table_definition( $table_name ) { + return "CREATE TABLE {$table_name} ( + id mediumint(9) NOT NULL AUTO_INCREMENT, + email varchar(100) NOT NULL, + use_gravatar tinyint(1) DEFAULT NULL, + last_updated datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP NOT NULL, + log_message varchar(255), + PRIMARY KEY (id), + UNIQUE KEY email (email) + )"; + } + + /** + * Tries set up the migration queue if the trigger is set. + * + * @since 2.4.0 Moved to class Comment_Author_Table. + * + * @return void + */ + protected function maybe_prepare_migration_queue() { + $queue = $this->network_options->get( Network_Options::START_GLOBAL_TABLE_MIGRATION ); + + if ( \is_array( $queue ) && $this->network_options->lock( Network_Options::GLOBAL_TABLE_MIGRATION ) ) { + if ( ! empty( $queue ) ) { + // Store new queue, overwriting any existing queue (since this per network + // and we already got all sites currently in the network). + $this->network_options->set( Network_Options::GLOBAL_TABLE_MIGRATION, $queue ); + } else { + // The "start queue" is empty, which means we should cease the migration efforts. + $this->network_options->delete( Network_Options::GLOBAL_TABLE_MIGRATION ); + } + + // Unlock queue and delete trigger. + $this->network_options->unlock( Network_Options::GLOBAL_TABLE_MIGRATION ); + $this->network_options->delete( Network_Options::START_GLOBAL_TABLE_MIGRATION ); + } + } + + /** + * Tries to migrate global table data if the current site is queued. + * + * @since 2.4.0 Moved to class Comment_Author_Table. + * + * @return void + */ + protected function maybe_migrate_from_global_table() { + if ( + // The plugin is not network-activated (or not on a multisite installation). + ! \is_plugin_active_for_network( \plugin_basename( \AVATAR_PRIVACY_PLUGIN_FILE ) ) || + // The queue is empty. + ! $this->network_options->get( Network_Options::GLOBAL_TABLE_MIGRATION ) || + // The queue is locked. Try again next time. + ! $this->network_options->lock( Network_Options::GLOBAL_TABLE_MIGRATION ) + ) { + // Nothing to see here. + return; + } + + // Check if we are scheduled to migrate data from the global table. + $site_id = \get_current_blog_id(); + $queue = $this->network_options->get( Network_Options::GLOBAL_TABLE_MIGRATION, [] ); + + if ( \is_array( $queue ) && ! empty( $queue[ $site_id ] ) ) { + // Migrate the data. + $this->migrate_from_global_table( $site_id ); + + // Mark this site as done. + unset( $queue[ $site_id ] ); + + if ( ! empty( $queue ) ) { + // Save the new queue. + $this->network_options->set( Network_Options::GLOBAL_TABLE_MIGRATION, $queue ); + } else { + // Delete it. + $this->network_options->delete( Network_Options::GLOBAL_TABLE_MIGRATION ); + } + } + + // Unlock the queue again. + $this->network_options->unlock( Network_Options::GLOBAL_TABLE_MIGRATION ); + } + + /** + * Migrates data from the global database to the given site database. + * + * @since 2.4.0 Parameter $site_id made mandatory. + * + * @global \wpdb $wpdb The WordPress Database Access Abstraction. + * + * @param int|null $site_id The site ID. Null means the current $blog_id. + * + * @return int|false The number of migrated rows or false on error. + */ + public function migrate_from_global_table( $site_id ) { + global $wpdb; + + // Get table names. + $global_table_name = $this->get_table_name( \get_main_site_id() ); + $site_table_name = $this->get_table_name( $site_id ); + + // Either we are on the main site or the "use global table" option is enabled. + if ( $global_table_name === $site_table_name ) { + return false; + } + + // Select the rows to migrate. + + /** + * Rows to delete indexed by the ID column in the global table. + * + * @var \stdClass[] + */ + $rows_to_delete = []; + /** + * Rows to migrate indexed by the ID column in the global table. + * + * @var \stdClass[] + */ + $rows_to_migrate = $wpdb->get_results( // phpcs:ignore WordPress.DB.DirectDatabaseQuery + $wpdb->prepare( + "SELECT * FROM `{$global_table_name}` WHERE log_message LIKE %s", // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared + "set with comment % (site: %, blog: {$wpdb->esc_like( $site_id )})" + ), + \OBJECT_K + ); + + // Check for existing rows for the same email addresses. + $emails = \wp_list_pluck( $rows_to_migrate, 'email', 'id' ); + $emails_to_ids = \array_flip( $emails ); + $existing_rows = (array) $wpdb->get_results( $this->prepare_email_query( $emails, $site_table_name ) ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared, WordPress.DB.DirectDatabaseQuery + foreach ( $existing_rows as $row ) { + $global_row_id = $emails_to_ids[ $row->email ]; + + if ( ! empty( $rows_to_migrate[ $global_row_id ] ) ) { + $global_row = $rows_to_migrate[ $global_row_id ]; + + if ( (int) \strtotime( $row->last_updated ) >= (int) \strtotime( $global_row->last_updated ) ) { + unset( $rows_to_migrate[ $global_row_id ] ); + + // Just delete this row. + $rows_to_delete[ $global_row_id ] = $global_row; + } + } + } + + // Migrated rows need to be deleted, too. + $rows_to_delete = $rows_to_delete + $rows_to_migrate; + + // Do INSERTs and UPDATEs in one query. + $migrated = $this->insert_or_update( [ 'email', 'hash', 'use_gravatar', 'last_updated', 'log_message' ], $rows_to_migrate, $site_id ); + if ( false !== $migrated ) { + // Do DELETEs in one query. + $deleted = 0; + $delete_query = $this->prepare_delete_query( \array_keys( $rows_to_delete ), $global_table_name ); + if ( false !== $delete_query ) { + $deleted = $wpdb->query( $delete_query ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared, WordPress.DB.DirectDatabaseQuery + } + + if ( false !== $deleted ) { + // Count the deleted rows if they were not included in the migrated + // rows because they were too old. + return \max( $migrated, $deleted ); + } + } + + return false; + } + + /** + * Prepares the query for selecting existing rows by email. + * + * @global \wpdb $wpdb The WordPress Database Access Abstraction. + * + * @param string[] $emails An array of email adresses. + * @param string $table The table name. + * + * @return string|false The prepared query, or false. + */ + protected function prepare_email_query( array $emails, $table ) { + global $wpdb; + + if ( empty( $emails ) || empty( $table ) ) { + return false; + } + + $placeholders = \join( ',', \array_fill( 0, \count( $emails ), '%s' ) ); + + // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared,WordPress.DB.PreparedSQLPlaceholders.UnfinishedPrepare + return $wpdb->prepare( "SELECT * FROM `{$table}` WHERE email IN ({$placeholders})", $emails ); + } + + /** + * Prepares the query for deleting obsolete rows from the database. + * + * @global \wpdb $wpdb The WordPress Database Access Abstraction. + * + * @param int[] $ids_to_delete The IDs to delete. + * @param string $table The table name. + * + * @return string|false The prepared query, or false. + */ + protected function prepare_delete_query( array $ids_to_delete, $table ) { + global $wpdb; + + if ( empty( $ids_to_delete ) || empty( $table ) ) { + return false; + } + + $placeholders = \join( ',', \array_fill( 0, \count( $ids_to_delete ), '%d' ) ); + + // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared,WordPress.DB.PreparedSQLPlaceholders.UnfinishedPrepare + return $wpdb->prepare( "DELETE FROM `{$table}` WHERE id IN ({$placeholders})", $ids_to_delete ); + } + + /** + * Fixes the table schema when dbDelta cannot cope with the changes. + * + * The table itself is already guaranteed to exist. + * + * @since 2.4.0 + * + * @param string $previous_version The previously installed plugin version. + * + * @return bool True if the schema was modified, false otherwise. + */ + public function maybe_upgrade_schema( $previous_version ) { + $result = false; + + if ( \version_compare( $previous_version, '2.4.0', '<' ) ) { + $result = $this->maybe_drop_hash_column() || $result; // @phpstan-ignore-line -- to make copy & paste less error prone. + $result = $this->maybe_fix_last_updated_column_default() || $result; + } + + return $result; + } + + /** + * Drops the obsolete 'hash' column from the table (if it exists). + * + * @since 2.4.0 + * + * @return bool + */ + protected function maybe_drop_hash_column() { + global $wpdb; + + $table_name = $this->get_table_name(); + + // phpcs:disable WordPress.DB.DirectDatabaseQuery, WordPress.DB.PreparedSQLPlaceholders + if ( 'hash' === $wpdb->get_var( $wpdb->prepare( 'SHOW COLUMNS FROM `%1$s` LIKE \'hash\'', $table_name ) ) ) { + return (bool) $wpdb->query( $wpdb->prepare( 'ALTER TABLE `%1$s` DROP COLUMN hash', $table_name ) ); + } + // phpcs:enable WordPress.DB + + return false; + } + + /** + * Drops the obsolete 'hash' column from the table. + * + * @since 2.4.0 + * + * @return bool + */ + protected function maybe_fix_last_updated_column_default() { + global $wpdb; + + $table_name = $this->get_table_name(); + + // phpcs:disable WordPress.DB.DirectDatabaseQuery, WordPress.DB.PreparedSQLPlaceholders + $column_definition = $wpdb->get_row( $wpdb->prepare( 'SHOW COLUMNS FROM `%1$s` LIKE \'last_updated\'', $table_name ), \ARRAY_A ); + if ( 'CURRENT_TIMESTAMP' !== $column_definition['Default'] ) { + return (bool) $wpdb->query( $wpdb->prepare( 'ALTER TABLE `%1$s` MODIFY COLUMN `last_updated` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP NOT NULL', $table_name ) ); + } + // phpcs:enable WordPress.DB + + return false; + } + + /** + * Upgrades the table data if necessary. + * + * @since 2.3.0 + * @since 2.4.0 Renamed to maybe_upgrade_data. Parameter $previous_version added. + * + * @global \wpdb $wpdb The WordPress Database Access Abstraction. + * + * @param string $previous_version The previously installed plugin version. + * + * @return int The number of upgraded rows. + */ + public function maybe_upgrade_data( $previous_version ) { + return 0; + } +} diff --git a/includes/avatar-privacy/data-storage/database/class-hashes-table.php b/includes/avatar-privacy/data-storage/database/class-hashes-table.php new file mode 100644 index 0000000..542bbdc --- /dev/null +++ b/includes/avatar-privacy/data-storage/database/class-hashes-table.php @@ -0,0 +1,162 @@ + + */ +class Hashes_Table extends Table { + + /** + * The table basename without the prefix. + * + * @var string + */ + const TABLE_BASENAME = 'avatar_privacy_hashes'; + + /** + * The minimum version not needing a table update. + * + * @var string + */ + const LAST_UPDATED = '2.7.0'; + + /** + * A column/field to placeholder mapping. + * + * @var string[] + */ + const COLUMN_FORMATS = [ + 'identifier' => '%s', + 'hash' => '%s', + 'type' => '%s', + 'last_updated' => '%s', + ]; + + /** + * A list auto-update columns (e.g. date-/timestamps). + * + * @since 2.6.0 + * + * @var string[] + */ + const AUTO_UPDATE_COLS = [ + 'last_updated', + ]; + + /** + * Creates a new instance. + */ + public function __construct() { + parent::__construct( self::TABLE_BASENAME, self::LAST_UPDATED, self::COLUMN_FORMATS, self::AUTO_UPDATE_COLS ); + } + + /** + * Determines whether this (multisite) installation uses the global table. + * Result is ignored for single-site installations. + * + * @return bool + */ + public function use_global_table() { + return false; + } + + /** + * Retrieves the CREATE TABLE definition formatted for use by \db_delta(), + * without the charset collate clause. + * + * Example: + * `CREATE TABLE some_table ( + * id mediumint(9) NOT NULL AUTO_INCREMENT, + * some_column varchar(100) NOT NULL, + * PRIMARY KEY (id) + * )` + * + * @param string $table_name The table name including any prefixes. + * + * @return string + */ + protected function get_table_definition( $table_name ) { + $identifier_length = $this->database_supports_large_index() ? 256 : 175; + + return "CREATE TABLE {$table_name} ( + identifier varchar({$identifier_length}) NOT NULL, + hash char(64) CHARACTER SET ascii NOT NULL, + type varchar(20) CHARACTER SET ascii NOT NULL, + last_updated datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP NOT NULL, + PRIMARY KEY (hash, type), + UNIQUE KEY identifier (identifier, type) + )"; + } + + /** + * Checks if the database server supports large indices (determined by InnoDB version being at least 5.7.0). + * + * @since 2.7.0 + */ + protected function database_supports_large_index(): bool { + global $wpdb; + + $innodb_version = $wpdb->get_var( 'SHOW VARIABLES LIKE "innodb_version"', 1 ) ?? ''; // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching -- No caching necessary, no actual wildcards used. + + return \version_compare( $innodb_version, '5.7', '>=' ); + } + + /** + * Fixes the table schema when dbDelta cannot cope with the changes. + * + * The table itself is already guaranteed to exist. + * + * @param string $previous_version The previously installed plugin version. + * + * @return bool True if the schema was modified, false otherwise. + */ + public function maybe_upgrade_schema( $previous_version ) { + return false; + } + + /** + * Sometimes, the table data needs to updated when upgrading. + * + * The table itself is already guarantueed to exist. + * + * @param string $previous_version The previously installed plugin version. + * + * @return int The number of upgraded rows. + */ + public function maybe_upgrade_data( $previous_version ) { + return 0; + } +} diff --git a/includes/avatar-privacy/data-storage/database/class-table.php b/includes/avatar-privacy/data-storage/database/class-table.php new file mode 100644 index 0000000..7553257 --- /dev/null +++ b/includes/avatar-privacy/data-storage/database/class-table.php @@ -0,0 +1,694 @@ + + * + * @phpstan-type SQLValue int|string|null + * @phpstan-type ColumnValueTuples array + * @phpstan-type ColumnFormats array + */ +abstract class Table { + + /** + * The basename (without site prefix) of the table. + * + * @since 2.4.0 + * + * @var string + */ + private string $table_basename; + + /** + * The minimum version number for which the table does not need to be updated. + * + * @since 2.4.0 + * + * @var string + */ + private string $update_threshold; + + /** + * A column/field to placeholder mapping. + * + * @since 2.3.0 + * + * @var string[] + * + * @phpstan-var ColumnFormats + */ + private array $column_formats; + + /** + * A list auto-update columns (e.g. date-/timestamps), stored in reverse format + * for fast read access (i.e as array). + * + * @since 2.6.0 + * + * @var array + */ + private array $auto_update_cols; + + /** + * Creates a new instance. + * + * @since 2.3.0 Parameter $core added. + * @since 2.4.0 Parameters replaced with $table_basename, $update_threshold, + * and $column_formats. + * @since 2.6.0 Parameter $auto_update_cols added. + * + * @param string $table_basename The basename (without site prefix) of the table. + * @param string $update_threshold The minimum version number for which the table does not need to be updated. + * @param array $column_formats A mapping from column to placeholder characters. + * @param string[] $auto_update_cols A list of auto-update columns. + * + * @phpstan-param ColumnFormats $column_formats + */ + public function __construct( $table_basename, $update_threshold, array $column_formats, array $auto_update_cols ) { + $this->table_basename = $table_basename; + $this->update_threshold = $update_threshold; + $this->column_formats = $column_formats; + $this->auto_update_cols = \array_flip( $auto_update_cols ); + } + + /** + * Sets up the table, including necessary data upgrades. The method is called + * on every page load. + * + * @since 2.4.0 + * + * @param string $previous_version The previously installed plugin version. + * + * @return void + */ + public function setup( $previous_version ) { + if ( $this->maybe_create_table( $previous_version ) ) { + // We may need to fix the schema manually. + $this->maybe_upgrade_schema( $previous_version ); + + // We may need to update the contents as well. + $this->maybe_upgrade_data( $previous_version ); + } + } + + /** + * Retrieves the table prefix to use (for a given site or the current site). + * + * @global \wpdb $wpdb The WordPress Database Access Abstraction. + * + * @param int|null $site_id Optional. The site ID. Null means the current $blog_id. Default null. + * + * @return string + */ + protected function get_table_prefix( $site_id = null ) { + global $wpdb; + + if ( ! $this->use_global_table() ) { + return $wpdb->get_blog_prefix( $site_id ); + } else { + return $wpdb->base_prefix; + } + } + + /** + * Retrieves the table name to use (for a given site or the current site). + * + * @since 2.3.0 Visibility changed to public. + * + * @param int|null $site_id Optional. The site ID. Null means the current $blog_id. Default null. + * + * @return string + */ + public function get_table_name( $site_id = null ) { + return $this->get_table_prefix( $site_id ) . $this->table_basename; + } + + /** + * Checks if the given table exists. + * + * @since 2.3.0 Visibility changed to public. + * + * @global \wpdb $wpdb The WordPress Database Access Abstraction. + * + * @param string $table_name A table name. + * + * @return bool + */ + public function table_exists( $table_name ) { + global $wpdb; + + return $table_name === $wpdb->get_var( $wpdb->prepare( 'SHOW TABLES LIKE %s', $table_name ) ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching + } + + /** + * Determines whether this (multisite) installation uses the global table. + * Result is ignored for single-site installations. + * + * @since 2.3.0 Visibility changed to public. + * @since 2.4.0 Made abstract. + * + * @return bool + */ + abstract public function use_global_table(); + + /** + * Creates the plugin's database table if it doesn't already exist. The + * table may be created as a global table for legacy multisite installations. + * Makes the name of the table available through $wpdb->avatar_privacy. + * + * @global \wpdb $wpdb The WordPress Database Access Abstraction. + * + * @param string $previous_version The previously installed plugin version. + * + * @return bool Returns true if the table was created/updated. + */ + public function maybe_create_table( $previous_version ) { + global $wpdb; + + // Force DB update? + $db_needs_update = \version_compare( $previous_version, $this->update_threshold, '<' ); + + // Check if the table has already been registered. + if ( ! $db_needs_update && \property_exists( $wpdb, $this->table_basename ) ) { + return false; + } + + // Set up table name and result status. + $table_name = $this->get_table_name(); + $updated = false; + + // Just fix $wpdb object if table already exists, unless we need an update. + if ( ! $db_needs_update && $this->table_exists( $table_name ) ) { + $this->register_table( $wpdb, $table_name ); + } else { + // Create/update the table. + $this->db_delta( $this->get_table_definition( $table_name ) . " {$wpdb->get_charset_collate()};" ); + + if ( ! $this->table_exists( $table_name ) ) { + // There was an error creating the table. + // TODO: Signal catastrophic error to the adminstrator. + return false; + } + + $this->register_table( $wpdb, $table_name ); + $updated = true; + } + + // We may need to update the charset/collation. + return $this->maybe_upgrade_charset_and_collation( $table_name ) || $updated; + } + + /** + * Retrieves the CREATE TABLE definition formatted for use by \db_delta(), + * without the charset collate clause. + * + * Example: + * `CREATE TABLE some_table ( + * id mediumint(9) NOT NULL AUTO_INCREMENT, + * some_column varchar(100) NOT NULL, + * PRIMARY KEY (id) + * )` + * + * @since 2.4.0 + * + * @param string $table_name The table name including any prefixes. + * + * @return string + */ + abstract protected function get_table_definition( $table_name ); + + /** + * Fixes the table schema when dbDelta cannot cope with the changes. + * + * The table itself is already guaranteed to exist. + * + * @since 2.4.0 + * + * @param string $previous_version The previously installed plugin version. + * + * @return bool True if the schema was modified, false otherwise. + */ + abstract public function maybe_upgrade_schema( $previous_version ); + + /** + * Sometimes, the table data needs to updated when upgrading. + * + * The table itself is already guaranteed to exist and have the correct schema. + * + * @param string $previous_version The previously installed plugin version. + * + * @return int The number of upgraded rows. + */ + abstract public function maybe_upgrade_data( $previous_version ); + + /** + * Registers the table with the given \wpdb instance. + * + * @param \wpdb $db The database instance. + * @param string $table_name The table name (with prefix). + * + * @return void + */ + protected function register_table( \wpdb $db, $table_name ) { + $basename = $this->table_basename; + + // Make sure that $wpdb knows about our table. + if ( \is_multisite() && $this->use_global_table() ) { + $db->ms_global_tables[] = $basename; + } else { + $db->tables[] = $basename; + } + + // Also register the "shortcut" property. + $db->$basename = $table_name; + } + + /** + * Fixes the table's charset and/or collation if the WordPress default has + * changed since the table was created (to prevent "Illegal mix of collations" + * errors in joins). Unfortunately, `dbDelta()` does not do that for us (viz. + * [Trac ticket #45697](https://core.trac.wordpress.org/ticket/45697)). + * + * The table itself is already guaranteed to exist. + * + * @since 2.4.4 + * + * @global \wpdb $wpdb The WordPress Database Access Abstraction. + * + * @param string $table_name The table name (with prefix). + * + * @return bool True if the collation was modified, false otherwise. + */ + protected function maybe_upgrade_charset_and_collation( $table_name ) { + global $wpdb; + + // Check if the charset and collation set for the table are the same as + // WordPress' default. + $collation = $wpdb->get_var( $wpdb->prepare( 'SELECT table_collation FROM INFORMATION_SCHEMA.TABLES WHERE table_schema = DATABASE() AND table_name = %s', $table_name ) ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery + if ( $wpdb->collate === $collation ) { + return false; + } + + $columns_clause = ''; + $query_args = [ $table_name ]; + + // Update existing columns first. + $columns = $wpdb->get_results( $wpdb->prepare( "SELECT column_name AS 'name', character_set_name AS 'charset', collation_name AS 'collate', column_type AS 'type', is_nullable AS 'nullable', column_default AS 'default' FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema = DATABASE() AND table_name = %s AND collation_name = %s", $table_name, $collation ), \ARRAY_A ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery, WordPress.DB.PreparedSQLPlaceholders + if ( ! empty( $columns ) ) { + $alter_table = []; + foreach ( $columns as $c ) { + $default = 'YES' !== $c['nullable'] ? 'NOT NULL ' : ''; + if ( isset( $c['default'] ) ) { + $default .= 'DEFAULT %s'; + $query_args[] = $c['default']; + } + $alter_table[] = "MODIFY `{$c['name']}` {$c['type']} CHARACTER SET {$wpdb->charset} COLLATE {$wpdb->collate} {$default}"; + } + + $columns_clause = ', ' . \join( ', ', $alter_table ); + } + + // Then set the default charset and collation for the table. + return (bool) $wpdb->query( $wpdb->prepare( "ALTER TABLE `%1s` CHARSET {$wpdb->charset} COLLATE {$wpdb->collate}" . $columns_clause, $query_args ) ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery, WordPress.DB.PreparedSQL, WordPress.DB.PreparedSQLPlaceholders + } + + /** + * Applies the `dbDelta` function to the given queries. + * + * @param string|string[] $queries The query to run. Can be multiple queries in an array, or a string of queries separated by semicolons. + * @param bool $execute Optional. Whether or not to execute the query right away. Default `true`. + * + * @return string[] Strings containing the results of the various update queries. + */ + protected function db_delta( $queries, $execute = true ) { + if ( ! function_exists( 'dbDelta' ) ) { + // Load upgrade.php for the dbDelta function. + require_once \ABSPATH . 'wp-admin/includes/upgrade.php'; + } + + return \dbDelta( $queries, $execute ); + } + + /** + * Drops the table for the given site. + * + * @global \wpdb $wpdb The WordPress Database Access Abstraction. + * + * @param int|null $site_id Optional. The site ID. Null means the current $blog_id. Ddefault null. + * + * @return void + */ + public function drop_table( $site_id = null ) { + global $wpdb; + + $table_name = $this->get_table_name( $site_id ); + $wpdb->query( "DROP TABLE IF EXISTS {$table_name};" ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery,WordPress.DB.PreparedSQL.InterpolatedNotPrepared + } + + /** + * Retrieves the correct format strings for the given columns. + * + * @since 2.4.0 Moved from Avatar_Privacy\Core\Comment_Author_Fields and renamed to get_format. + * + * @param array $columns An array of values index by column name. + * + * @return string[] + * + * @throws Database_Exception An exception is raised when invalid column names are used. + * + * @phpstan-param ColumnValueTuples $columns + */ + protected function get_format( array $columns ) { + $format_strings = []; + + foreach ( $columns as $key => $value ) { + if ( ! empty( $this->column_formats[ $key ] ) ) { + $format_strings[] = null === $value ? 'NULL' : $this->column_formats[ $key ]; + } else { + throw new Database_Exception( "Invalid column name '{$key}'." ); + } + } + + return $format_strings; + } + + /** + * Inserts a row into the table. + * + * @since 2.4.0 + * + * @global \wpdb $wpdb The WordPress Database Access Abstraction. + * + * @param array $data The data to insert (in column => value pairs). + * Both $data columns and $data values should be + * "raw" (neither should be SQL escaped). Sending + * a null value will cause the column to be set to + * NULL - the corresponding format is ignored in + * this case. + * @param int|null $site_id Optional. The site ID. Null means the current + * $blog_id. Default null. + * + * @return int|false The number of rows inserted, or false on error. + * + * @phpstan-param ColumnValueTuples $data + */ + public function insert( array $data, $site_id = null ) { + try { + global $wpdb; + + // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery + return $wpdb->insert( $this->get_table_name( $site_id ), $data, $this->get_format( $data ) ); + } catch ( \RuntimeException $e ) { + return false; + } + } + + /** + * Replaces a row into the table (i.e. it inserts the row if it does not exist + * or deletes and existing row and then inserts the new data). + * + * @since 2.4.0 + * + * @global \wpdb $wpdb The WordPress Database Access Abstraction. + * + * @param array $data The data to insert (in column => value pairs). + * Both $data columns and $data values should be + * "raw" (neither should be SQL escaped). Sending + * a null value will cause the column to be set to + * NULL - the corresponding format is ignored in + * this case. + * @param int|null $site_id Optional. The site ID. Null means the current + * $blog_id. Default null. + * + * @return int|false The number of rows updated, or false on error. + * + * @phpstan-param ColumnValueTuples $data + */ + public function replace( array $data, $site_id = null ) { + try { + global $wpdb; + + // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching + return $wpdb->replace( $this->get_table_name( $site_id ), $data, $this->get_format( $data ) ); + } catch ( \RuntimeException $e ) { + return false; + } + } + + /** + * Updates a row in the table. + * + * @since 2.4.0 + * + * @global \wpdb $wpdb The WordPress Database Access Abstraction. + * + * @param array $data The data to insert (in column => value pairs). + * Both $data columns and $data values should be + * "raw" (neither should be SQL escaped). Sending + * a null value will cause the column to be set to + * NULL - the corresponding format is ignored in + * this case. + * @param array $where A named array of WHERE clauses (in column => value + * pairs). Multiple clauses will be joined with ANDs. + * Both $where columns and $where values should be + * "raw". Sending a null value will create an IS NULL + * comparison - the corresponding format will be + * ignored in this case. + * @param int|null $site_id Optional. The site ID. Null means the current + * $blog_id. Default null. + * + * @return int|false The number of rows updated, or false on error. + * + * @phpstan-param ColumnValueTuples $data + * @phpstan-param ColumnValueTuples $where + */ + public function update( array $data, array $where, $site_id = null ) { + try { + global $wpdb; + + return $wpdb->update( // phpcs:ignore WordPress.DB.DirectDatabaseQuery + $this->get_table_name( $site_id ), + $data, + $where, + $this->get_format( $data ), + $this->get_format( $where ) + ); + } catch ( \RuntimeException $e ) { + return false; + } + } + + /** + * Deletes a row from the table. + * + * @since 2.4.0 + * + * @global \wpdb $wpdb The WordPress Database Access Abstraction. + * + * @param array $where A named array of WHERE clauses (in column => value + * pairs). Multiple clauses will be joined with ANDs. + * Both $where columns and $where values should be + * "raw". Sending a null value will create an IS NULL + * comparison - the corresponding format will be + * ignored in this case. + * @param int|null $site_id Optional. The site ID. Null means the current + * $blog_id. Default null. + * + * @return int|false The number of rows deleted, or false on error. + * + * @phpstan-param ColumnValueTuples $where + */ + public function delete( array $where, $site_id = null ) { + try { + global $wpdb; + + // phpcs:ignore WordPress.DB.DirectDatabaseQuery + return $wpdb->delete( $this->get_table_name( $site_id ), $where, $this->get_format( $where ) ); + } catch ( \RuntimeException $e ) { + return false; + } + } + + /** + * Inserts or updates multiple rows, as required. + * + * @param string[] $fields An array of database columns. + * @param array $rows An array of row objects or arrays (containing + * field => value tuples). + * @param int|null $site_id Optional. The site ID. Null means the current + * $blog_id. Default null. + * + * @return int|false The number of rows inserted or updated, or false + * on error. + * + * @phpstan-param \stdClass[]|ColumnValueTuples[] $rows + */ + public function insert_or_update( array $fields, array $rows, $site_id = null ) { + try { + global $wpdb; + + // Allow only valid fields. + $fields = \array_intersect( $fields, \array_keys( $this->column_formats ) ); + + if ( empty( $rows ) || empty( $fields ) ) { + return false; + } + + $rows = $this->prepare_rows( $rows, $fields ); + $columns = \join( ',', $fields ); + $values_clause = \join( ',', \array_map( function( $data ) { + return '(' . \join( ',', $this->get_format( $data ) ) . ')'; + }, $rows ) ); + + return $wpdb->query( // phpcs:ignore WordPress.DB.DirectDatabaseQuery + $wpdb->prepare( // phpcs:disable WordPress.DB.PreparedSQL.InterpolatedNotPrepared,WordPress.DB.PreparedSQLPlaceholders.UnfinishedPrepare + "INSERT INTO `{$this->get_table_name( $site_id )}` ( {$columns} ) + VALUES {$values_clause} + ON DUPLICATE KEY UPDATE {$this->get_update_clause( $fields )}", + $this->prepare_values( $rows ) + ) + ); // phpcs:enable WordPress.DB + } catch ( \RuntimeException $e ) { + return false; + } + } + + /** + * Inserts or updates a single row, as required. + * + * @since 2.6.0 + * + * @param array $data The data to insert (in column => value pairs). + * Both $data columns and $data values should be + * "raw" (neither should be SQL escaped). Sending + * a null value will cause the column to be set to + * NULL - the corresponding format is ignored in + * this case. + * @param int|null $site_id Optional. The site ID. Null means the current + * $blog_id. Default null. + * + * @return int|false The number of rows inserted or updated, or false + * on error. + * + * @phpstan-param ColumnValueTuples $data + */ + public function insert_or_update_row( array $data, $site_id = null ) { + return $this->insert_or_update( \array_keys( $data ), [ $data ], $site_id ); + } + + /** + * Retrieves the update clause based on the updated fields. + * + * @since 2.3.0 + * + * @param string[] $fields An array of database columns. + * + * @return string + */ + protected function get_update_clause( array $fields ) { + + $updated_fields = \array_flip( $fields ); + $update_clause_parts = []; + + foreach ( \array_keys( $this->column_formats ) as $field ) { + if ( isset( $updated_fields[ $field ] ) ) { + $update_clause_parts[] = "{$field} = VALUES({$field})"; + } elseif ( ! isset( $this->auto_update_cols[ $field ] ) ) { + $update_clause_parts[] = "{$field} = {$field}"; + } + } + + return \join( ",\n", $update_clause_parts ); + } + + /** + * Prepares an array of rows for use in queries (i.e. add missing values and + * correctly sort the columns). + * + * @since 2.4.0 + * + * @param array $rows An array of row objects or arrays (containing + * field => value tuples). + * @param string[] $fields An array of database columns. + * + * @return array + * + * @phpstan-param \stdClass[]|ColumnValueTuples[] $rows + * @phpstan-return ColumnValueTuples[] + */ + protected function prepare_rows( array $rows, array $fields ) { + $result = []; + + foreach ( $rows as $data ) { + // Force array syntax (in case we were given an array of row objects). + $data = (array) $data; + $row = []; + foreach ( $fields as $column ) { + $row[ $column ] = isset( $data[ $column ] ) ? $data[ $column ] : null; + } + + $result[] = $row; + } + + return $result; + } + + /** + * Filters non-null values from a prepared database rows array. + * + * @since 2.4.0 + * + * @param array $prepared_rows An array of arrays containing $field => $value tuples. + * + * @return array A flat array containing all non-null values. + * + * @phpstan-param ColumnValueTuples[] $prepared_rows + * @phpstan-return array + */ + protected function prepare_values( array $prepared_rows ) { + $values = []; + + foreach ( $prepared_rows as $row ) { + foreach ( $row as $value ) { + if ( null !== $value ) { + $values[] = $value; + } + } + } + + return $values; + } +} diff --git a/includes/avatar-privacy/exceptions/class-avatar-comment-type-exception.php b/includes/avatar-privacy/exceptions/class-avatar-comment-type-exception.php new file mode 100644 index 0000000..7b696bd --- /dev/null +++ b/includes/avatar-privacy/exceptions/class-avatar-comment-type-exception.php @@ -0,0 +1,38 @@ + + */ +class Avatar_Comment_Type_Exception extends \RuntimeException { +} diff --git a/includes/avatar-privacy/exceptions/class-database-exception.php b/includes/avatar-privacy/exceptions/class-database-exception.php new file mode 100644 index 0000000..16114fa --- /dev/null +++ b/includes/avatar-privacy/exceptions/class-database-exception.php @@ -0,0 +1,37 @@ + + */ +class Database_Exception extends \RuntimeException { +} diff --git a/includes/avatar-privacy/exceptions/class-file-deletion-exception.php b/includes/avatar-privacy/exceptions/class-file-deletion-exception.php new file mode 100644 index 0000000..fd7d7bd --- /dev/null +++ b/includes/avatar-privacy/exceptions/class-file-deletion-exception.php @@ -0,0 +1,39 @@ + + */ +class File_Deletion_Exception extends Filesystem_Exception { +} diff --git a/includes/avatar-privacy/exceptions/class-filesystem-exception.php b/includes/avatar-privacy/exceptions/class-filesystem-exception.php new file mode 100644 index 0000000..acb96d3 --- /dev/null +++ b/includes/avatar-privacy/exceptions/class-filesystem-exception.php @@ -0,0 +1,37 @@ + + */ +class Filesystem_Exception extends \RuntimeException { +} diff --git a/includes/avatar-privacy/exceptions/class-form-field-not-found-exception.php b/includes/avatar-privacy/exceptions/class-form-field-not-found-exception.php new file mode 100644 index 0000000..25b82dd --- /dev/null +++ b/includes/avatar-privacy/exceptions/class-form-field-not-found-exception.php @@ -0,0 +1,39 @@ + + */ +class Form_Field_Not_Found_Exception extends \RuntimeException { +} diff --git a/includes/avatar-privacy/exceptions/class-invalid-nonce-exception.php b/includes/avatar-privacy/exceptions/class-invalid-nonce-exception.php new file mode 100644 index 0000000..905c2ed --- /dev/null +++ b/includes/avatar-privacy/exceptions/class-invalid-nonce-exception.php @@ -0,0 +1,38 @@ + + */ +class Invalid_Nonce_Exception extends \RuntimeException { +} diff --git a/includes/avatar-privacy/exceptions/class-object-factory-exception.php b/includes/avatar-privacy/exceptions/class-object-factory-exception.php new file mode 100644 index 0000000..d055569 --- /dev/null +++ b/includes/avatar-privacy/exceptions/class-object-factory-exception.php @@ -0,0 +1,37 @@ + + */ +class Object_Factory_Exception extends \RuntimeException { +} diff --git a/includes/avatar-privacy/exceptions/class-part-files-not-found-exception.php b/includes/avatar-privacy/exceptions/class-part-files-not-found-exception.php new file mode 100644 index 0000000..bbe938a --- /dev/null +++ b/includes/avatar-privacy/exceptions/class-part-files-not-found-exception.php @@ -0,0 +1,38 @@ + + */ +class Part_Files_Not_Found_Exception extends \RuntimeException { +} diff --git a/includes/avatar-privacy/exceptions/class-png-image-exception.php b/includes/avatar-privacy/exceptions/class-png-image-exception.php new file mode 100644 index 0000000..a77235d --- /dev/null +++ b/includes/avatar-privacy/exceptions/class-png-image-exception.php @@ -0,0 +1,37 @@ + + */ +class PNG_Image_Exception extends \RuntimeException { +} diff --git a/includes/avatar-privacy/exceptions/class-upload-handling-exception.php b/includes/avatar-privacy/exceptions/class-upload-handling-exception.php new file mode 100644 index 0000000..5112677 --- /dev/null +++ b/includes/avatar-privacy/exceptions/class-upload-handling-exception.php @@ -0,0 +1,37 @@ + + */ +class Upload_Handling_Exception extends \RuntimeException { +} diff --git a/includes/avatar-privacy/functions.php b/includes/avatar-privacy/functions.php new file mode 100644 index 0000000..9ebe274 --- /dev/null +++ b/includes/avatar-privacy/functions.php @@ -0,0 +1,59 @@ + + */ +class BBPress_Integration implements Plugin_Integration { + + /** + * The form helper. + * + * @var User_Form + */ + private User_Form $form; + + /** + * Creates a new instance. + * + * @since 2.1.0 Parameter $plugin_file removed. + * @since 2.3.0 Parameter $user_profile replaced by $form. + * + * @param User_Form $form The form handling helper. + */ + public function __construct( User_Form $form ) { + $this->form = $form; + } + + /** + * Check if the bbPress integration should be activated. + * + * @return bool + */ + public function check() { + return \function_exists( 'is_bbpress' ); + } + + /** + * Activate the integration. + * + * @@return void + */ + public function run() { + if ( ! \is_admin() ) { + \add_action( 'init', [ $this, 'init' ] ); + } + } + + /** + * Init action handler. + * + * @return void + */ + public function init() { + // Load user data from email for bbPress. + \add_filter( 'avatar_privacy_parse_id_or_email', [ $this, 'parse_id_or_email' ] ); + + // Add profile picture upload and `use_gravatar` checkbox to frontend profile editor. + \add_action( 'bbp_user_edit_after', [ $this, 'add_user_profile_fields' ] ); + \add_action( 'personal_options_update', [ $this->form, 'save' ] ); + \add_action( 'edit_user_profile_update', [ $this->form, 'save' ] ); + } + + /** + * Loads user ID from email if using bbPress. + * + * @param array $data { + * The information parsed from $id_or_email. + * + * @type int|false $user_id The WordPress user ID, or false. + * @type string $email The email address. + * @type int $age The seconds since the post or comment was first created, or 0 if $id_or_email was not one of these object types. + * } + * + * @return array { + * The filtered data. + * + * @type int|false $user_id The WordPress user ID, or false. + * @type string $email The email address. + * @type int $age The seconds since the post or comment was first created, or 0 if $id_or_email was not one of these object types. + * } + * + * @phpstan-param array{0: int|false, 1: string, 2: int} $data + * @phpstan-return array{0: int|false, 1: string, 2: int} + */ + public function parse_id_or_email( $data ) { + list( $user_id, $email, $age ) = $data; + + if ( \is_bbpress() && false === $user_id ) { + $user = \get_user_by( 'email', $email ); + + if ( ! empty( $user ) ) { + $user_id = $user->ID; + } + } + + return [ $user_id, $email, $age ]; + } + + /** + * Add user profile fields for bbPress. + * + * @return void + */ + public function add_user_profile_fields() { + // Get user ID from bbPress. + $user_id = \bbp_get_user_id( 0, true, false ); + if ( empty( $user_id ) ) { + return; + } + + // Include partial. + $this->form->print_form( 'public/partials/bbpress/user-profile-picture.php', $user_id ); + } +} diff --git a/includes/avatar-privacy/integrations/class-buddypress-integration.php b/includes/avatar-privacy/integrations/class-buddypress-integration.php new file mode 100644 index 0000000..36671cd --- /dev/null +++ b/includes/avatar-privacy/integrations/class-buddypress-integration.php @@ -0,0 +1,275 @@ + + * + * @phpstan-import-type AvatarDefinition from User_Fields + * + * @phpstan-type BuddyPressAvatarParams array{ + * item_id: int|false, + * object: string, + * type: string, + * avatar_dir: string|false, + * width: int|false, + * height: int|false, + * class: string, + * css_id: string|false, + * title: string, + * alt: string, + * email: string|false, + * no_grav: bool, + * html: bool, + * extra_attr: string, + * scheme: string, + * rating: string, + * force_default: bool + * } + */ +class BuddyPress_Integration implements Plugin_Integration { + + /** + * The user data helper. + * + * @since 2.4.0 + * + * @var User_Fields + */ + private User_Fields $user_fields; + + /** + * Creates a new instance. + * + * @since 2.4.0 Parameter $uploads removed, $user_fields added. + * + * @param User_Fields $user_fields The user data API. + */ + public function __construct( User_Fields $user_fields ) { + $this->user_fields = $user_fields; + } + + /** + * Check if the BuddyPress integration should be activated. + * + * @return bool + */ + public function check() { + return \class_exists( \BuddyPress::class ); + } + + /** + * Activate the integration. + * + * @return void + */ + public function run() { + // Integrate with BuddyPress's avatar handling. + \add_action( 'init', [ $this, 'integrate_with_buddypress_avatars' ] ); + } + + /** + * Removes the BuddyPress avatar filter and disables Avatar Privacy + * profile image upload. + * + * @return void + */ + public function integrate_with_buddypress_avatars() { + if ( ! \function_exists( 'bp_get_version' ) ) { + return; + } + + // Set version dependent hooks. + $version = \bp_get_version(); + if ( \version_compare( $version, '6.0.0', '<' ) ) { + $avatar_uploaded_hook = 'xprofile_avatar_uploaded'; + } else { + $avatar_uploaded_hook = 'bp_members_avatar_uploaded'; + } + + // Remove BuddyPress avatar filter. + \remove_filter( 'get_avatar_url', 'bp_core_get_avatar_data_url_filter', 10 ); + + // Disable BuddyPress Gravatar usage. + \add_filter( 'bp_core_fetch_avatar_no_grav', '__return_true', 10, 0 ); + + // Disable profile image uploading. + \add_filter( 'avatar_privacy_profile_picture_upload_disabled', '__return_true', 10, 0 ); + + // Serve BuddyPress profile pictures via the filesystem cache. + \add_filter( 'avatar_privacy_pre_get_user_avatar', [ $this, 'enable_buddypress_user_avatars' ], 10, 2 ); + + // Add our own default avatars instead (for users). + \add_filter( 'bp_core_default_avatar_user', [ $this, 'add_default_avatars_to_buddypress' ], 10, 2 ); + \add_filter( 'bp_get_user_has_avatar', [ $this, 'has_buddypress_avatar' ], 10, 2 ); + + // Invalidate cache when a new image is uploaded or deleted. + \add_action( $avatar_uploaded_hook, [ $this, 'invalidate_cache_after_avatar_upload' ], 10, 3 ); + \add_action( 'bp_core_delete_existing_avatar', [ $this, 'invalidate_cache_after_avatar_deletion' ], 10, 1 ); + } + + /** + * Retrieves the user avatar from BuddyPress. + * + * @param array|null $avatar Optional. The user avatar information. Default null. + * @param int $user_id The user ID. + * + * @return array|null { + * Optional. The user avatar information. Default null. + * + * @type string $file The local filename. + * @type string $type The MIME type. + * } + * + * @phpstan-param AvatarDefinition|null $avatar + * @phpstan-return AvatarDefinition|null + */ + public function enable_buddypress_user_avatars( array $avatar = null, $user_id ) { + // Prevent loops. + if ( \doing_filter( 'bp_core_default_avatar_user' ) ) { + return $avatar; + } + + // Retrieve BuddyPress user data. + $avatar = $this->get_buddypress_avatar( $user_id ); + + if ( ! empty( $avatar ) ) { + $file = \ABSPATH . \wp_make_link_relative( $avatar ); + $type = \wp_check_filetype( $file )['type']; + + if ( ! empty( $type ) ) { + return [ + 'file' => $file, + 'type' => $type, + ]; + } + } + + return null; + } + + /** + * Invalidates the file cache after a new BuddyPress avatar has been uploaded. + * + * @param int $item_id The user ID (if `$args['object']` is `user` ). + * @param string $type Information about the capture method for the avatar. + * @param array $args Arguments for the avatar function. + * + * @return void + * + * @phpstan-param BuddyPressAvatarParams $args + */ + public function invalidate_cache_after_avatar_upload( $item_id, $type, array $args ) { + if ( ! empty( $args['object'] ) && 'user' === $args['object'] && ! empty( $item_id ) ) { + $this->user_fields->invalidate_local_avatar_cache( $item_id ); + } + } + + /** + * Invalidates the file cache after a new BuddyPress avatar has been deleted. + * + * @since 2.4.0 + * + * @param array $args Array of arguments used for avatar deletion. + * + * @return void + * + * @phpstan-param BuddyPressAvatarParams $args + */ + public function invalidate_cache_after_avatar_deletion( array $args ) { + if ( ! empty( $args['item_id'] ) ) { + $this->invalidate_cache_after_avatar_upload( $args['item_id'], 'delete', $args ); + } + } + + /** + * Adds Avatar Privacy's default avatars to BuddyPress. + * + * @since 2.4.0 + * @since 2.7.0 Parameter `$default` renamed to `$original_default` to prevent conflict with reserved keyword. + * + * @param string $original_default Default avatar for non-gravatar requests. + * @param array $params Array of parameters for the avatar request. + * + * @return string + * + * @phpstan-param BuddyPressAvatarParams $params + */ + public function add_default_avatars_to_buddypress( $original_default, array $params ) { + // Retrieve default avatar URL (Gravatar or local default avatar). + $args = [ + 'rating' => $params['rating'], + 'size' => (int) $params['width'], + ]; + $default_avatar = \get_avatar_url( $params['item_id'], $args ); + + return $default_avatar ?: $original_default; + } + + /** + * Determines whether a user has an avatar that has been uploaded in BuddyPress. + * + * @since 2.4.0 + * + * @param bool $retval The return value calculated by BuddyPress (ignored). + * @param int $user_id The user ID. + * + * @return bool + */ + public function has_buddypress_avatar( $retval, $user_id ) { + return ! empty( $this->get_buddypress_avatar( $user_id ) ); + } + + /** + * Retrieves the user avatar uploaded in BuddyPress (if any). + * + * @since 2.4.0 + * + * @param int $user_id The user ID. + * + * @return string + */ + protected function get_buddypress_avatar( $user_id ) { + \add_filter( 'bp_core_default_avatar_user', '__return_empty_string' ); + $avatar = \bp_core_fetch_avatar( [ + 'item_id' => $user_id, + 'object' => 'user', + 'type' => 'full', + 'html' => false, + 'no_grav' => true, + ] ); + \remove_filter( 'bp_core_default_avatar_user', '__return_empty_string' ); + + return $avatar; + } +} diff --git a/includes/avatar-privacy/integrations/class-plugin-integration.php b/includes/avatar-privacy/integrations/class-plugin-integration.php new file mode 100644 index 0000000..4ad0b65 --- /dev/null +++ b/includes/avatar-privacy/integrations/class-plugin-integration.php @@ -0,0 +1,45 @@ + + */ +interface Plugin_Integration extends \Avatar_Privacy\Component { + + /** + * Check if the ACF integration should be activated. + * + * @return bool + */ + public function check(); +} diff --git a/includes/avatar-privacy/integrations/class-simple-author-box-integration.php b/includes/avatar-privacy/integrations/class-simple-author-box-integration.php new file mode 100644 index 0000000..208b794 --- /dev/null +++ b/includes/avatar-privacy/integrations/class-simple-author-box-integration.php @@ -0,0 +1,170 @@ + + * + * @phpstan-import-type AvatarDefinition from User_Fields + */ +class Simple_Author_Box_Integration implements Plugin_Integration { + + const USER_META_KEY = 'sabox-profile-image'; + + /** + * The user data helper. + * + * @var User_Fields + */ + private User_Fields $user_fields; + + /** + * Creates a new instance. + * + * @param User_Fields $user_fields The user data API. + */ + public function __construct( User_Fields $user_fields ) { + $this->user_fields = $user_fields; + } + + /** + * Check if the bbPress integration should be activated. + * + * @return bool + */ + public function check() { + return \class_exists( Simple_Author_Box::class ); + } + + /** + * Activate the integration. + * + * @return void + */ + public function run() { + \add_action( 'init', [ $this, 'init' ] ); + } + + /** + * Init action handler. + * + * @return void + */ + public function init() { + $simple_author_box = Simple_Author_Box::get_instance(); + + // Disable profile image uploading. + \add_filter( 'avatar_privacy_profile_picture_upload_disabled', '__return_true', 10, 0 ); + + // Disable Simple Author Box' avatar integration. + \remove_filter( 'get_avatar', [ $simple_author_box, 'replace_gravatar_image' ], 10 ); + + // Serve Simple Author Box profile pictures via the filesystem cache. + \add_filter( 'avatar_privacy_pre_get_user_avatar', [ $this, 'enable_user_avatars' ], 10, 2 ); + + // Invalidate cache when a new image is uploaded or deleted. + \add_action( 'added_user_meta', [ $this, 'invalidate_cache_after_avatar_change' ], 10, 3 ); + \add_action( 'updated_user_meta', [ $this, 'invalidate_cache_after_avatar_change' ], 10, 3 ); + \add_action( 'deleted_user_meta', [ $this, 'invalidate_cache_after_avatar_change' ], 10, 3 ); + } + + /** + * Retrieves the user avatar from Simple Author Box. + * + * @param array|null $avatar Optional. The user avatar information. Default null. + * @param int $user_id The user ID. + * + * @return array|null { + * Optional. The user avatar information. Default null. + * + * @type string $file The local filename. + * @type string $type The MIME type. + * } + * + * @phpstan-param AvatarDefinition|null $avatar + * @phpstan-return AvatarDefinition|null + */ + public function enable_user_avatars( array $avatar = null, $user_id ) { + // Retrieve Simple Author Box image. + $local_avatar = $this->get_simple_author_box_avatar( $user_id ); + + if ( ! empty( $local_avatar ) ) { + $file = \ABSPATH . \wp_make_link_relative( $local_avatar ); + $type = \wp_check_filetype( $file )['type']; + if ( ! empty( $type ) ) { + return [ + 'file' => $file, + 'type' => $type, + ]; + } + } + + return $avatar; + } + + /** + * Retrieves the user avatar uploaded in Simple Author Box (if any). + * + * @param int $user_id The user ID. + * + * @return string + */ + protected function get_simple_author_box_avatar( $user_id ) { + $avatar = \get_user_meta( $user_id, self::USER_META_KEY, true ); + if ( \is_string( $avatar ) ) { + return $avatar; + } + + return ''; + } + + /** + * Invalidates the file cache after a new Simple Author Box avatar has been + * uploaded or deleted. + * + * @param int $meta_id ID of updated metadata entry. + * @param int $user_id The user ID. + * @param string $meta_key Metadata key. + * + * @return void + */ + public function invalidate_cache_after_avatar_change( $meta_id, $user_id, $meta_key ) { + if ( self::USER_META_KEY !== $meta_key ) { + return; + } + + $this->user_fields->invalidate_local_avatar_cache( $user_id ); + } +} diff --git a/includes/avatar-privacy/integrations/class-simple-local-avatars-integration.php b/includes/avatar-privacy/integrations/class-simple-local-avatars-integration.php new file mode 100644 index 0000000..c1f0225 --- /dev/null +++ b/includes/avatar-privacy/integrations/class-simple-local-avatars-integration.php @@ -0,0 +1,173 @@ + + * + * @phpstan-import-type AvatarDefinition from User_Fields + */ +class Simple_Local_Avatars_Integration implements Plugin_Integration { + + const USER_META_KEY = 'simple_local_avatar'; + + /** + * The user data helper. + * + * @var User_Fields + */ + private User_Fields $user_fields; + + /** + * Creates a new instance. + * + * @param User_Fields $user_fields The user data API. + */ + public function __construct( User_Fields $user_fields ) { + $this->user_fields = $user_fields; + } + + /** + * Check if the bbPress integration should be activated. + * + * @return bool + */ + public function check() { + return \class_exists( Simple_Local_Avatars::class ) && \method_exists( Simple_Local_Avatars::class, 'get_avatar_rest' ); + } + + /** + * Activate the integration. + * + * @return void + */ + public function run() { + \add_action( 'init', [ $this, 'init' ] ); + } + + /** + * Init action handler. + * + * @global Simple_Local_Avatars $simple_local_avatars The Simple Local Avatars singleton. + * + * @return void + */ + public function init() { + global $simple_local_avatars; + + // Disable profile image uploading. + \add_filter( 'avatar_privacy_profile_picture_upload_disabled', '__return_true', 10, 0 ); + + // Disable Simple Local Avatars' avatar integration. + \remove_filter( 'pre_get_avatar_data', [ $simple_local_avatars, 'get_avatar_data' ], 10 ); + + // Serve Simple Local Avatars profile pictures via the filesystem cache. + \add_filter( 'avatar_privacy_pre_get_user_avatar', [ $this, 'enable_user_avatars' ], 10, 2 ); + + // Invalidate cache when a new image is uploaded or deleted. + \add_action( 'added_user_meta', [ $this, 'invalidate_cache_after_avatar_change' ], 10, 3 ); + \add_action( 'updated_user_meta', [ $this, 'invalidate_cache_after_avatar_change' ], 10, 3 ); + \add_action( 'deleted_user_meta', [ $this, 'invalidate_cache_after_avatar_change' ], 10, 3 ); + } + + /** + * Retrieves the user avatar from Simple Local Avatars. + * + * @param array|null $avatar Optional. The user avatar information. Default null. + * @param int $user_id The user ID. + * + * @return array|null { + * Optional. The user avatar information. Default null. + * + * @type string $file The local filename. + * @type string $type The MIME type. + * } + * + * @phpstan-param AvatarDefinition|null $avatar + * @phpstan-return AvatarDefinition|null + */ + public function enable_user_avatars( array $avatar = null, $user_id ) { + // Retrieve Simple Local Avatars image. + $local_avatar = $this->get_simple_local_avatars_avatar( $user_id ); + + if ( ! empty( $local_avatar ) ) { + $type = \wp_check_filetype( $local_avatar )['type']; + if ( ! empty( $type ) ) { + return [ + 'file' => $local_avatar, + 'type' => $type, + ]; + } + } + + return $avatar; + } + + /** + * Retrieves the user avatar uploaded in Simple Local Avatars (if any). + * + * @param int $user_id The user ID. + * + * @return string + */ + protected function get_simple_local_avatars_avatar( $user_id ) { + global $simple_local_avatars; + + $local_avatar = $simple_local_avatars->get_avatar_rest( [ 'id' => $user_id ] ); + if ( ! \is_array( $local_avatar ) || empty( $local_avatar['full'] ) || ! \is_string( $local_avatar['full'] ) ) { + return ''; + } + + return $local_avatar['full']; + } + + /** + * Invalidates the file cache after a new Simple Local Avatars avatar has been + * uploaded or deleted. + * + * @param int|string[] $meta_id The ID(s) of the modified metadata entries. + * @param int $user_id The user ID. + * @param string $meta_key The metadata key. + * + * @return void + */ + public function invalidate_cache_after_avatar_change( $meta_id, $user_id, $meta_key ) { + if ( self::USER_META_KEY !== $meta_key || empty( $meta_id ) ) { + return; + } + + $this->user_fields->invalidate_local_avatar_cache( $user_id ); + } +} diff --git a/includes/avatar-privacy/integrations/class-simple-user-avatar-integration.php b/includes/avatar-privacy/integrations/class-simple-user-avatar-integration.php new file mode 100644 index 0000000..55a3891 --- /dev/null +++ b/includes/avatar-privacy/integrations/class-simple-user-avatar-integration.php @@ -0,0 +1,164 @@ + + * + * @phpstan-import-type AvatarDefinition from User_Fields + */ +class Simple_User_Avatar_Integration implements Plugin_Integration { + + /** + * The user data helper. + * + * @var User_Fields + */ + private User_Fields $user_fields; + + /** + * Creates a new instance. + * + * @param User_Fields $user_fields The user data API. + */ + public function __construct( User_Fields $user_fields ) { + $this->user_fields = $user_fields; + } + + /** + * Check if the bbPress integration should be activated. + * + * @return bool + */ + public function check() { + return \defined( 'SUA_USER_META_KEY' ) && \class_exists( SimpleUserAvatar_Public::class ); + } + + /** + * Activate the integration. + * + * @return void + */ + public function run() { + // Remove "hardcoded" Simple User Avatar frontend integration. + \remove_action( 'plugins_loaded', [ 'SimpleUserAvatar_Public', 'init' ] ); + + // Add our own stuff. + \add_action( 'init', [ $this, 'init' ] ); + } + + /** + * Init action handler. + * + * @return void + */ + public function init() { + // Disable profile image uploading. + \add_filter( 'avatar_privacy_profile_picture_upload_disabled', '__return_true', 10, 0 ); + + // Serve Simple User Avatar profile pictures via the filesystem cache. + \add_filter( 'avatar_privacy_pre_get_user_avatar', [ $this, 'enable_user_avatars' ], 10, 2 ); + + // Invalidate cache when a new image is uploaded or deleted. + \add_action( 'deleted_user_meta', [ $this, 'invalidate_cache_after_avatar_change' ], 10, 3 ); + } + + /** + * Retrieves the user avatar from Simple Author Box. + * + * @param array|null $avatar Optional. The user avatar information. Default null. + * @param int $user_id The user ID. + * + * @return array|null { + * Optional. The user avatar information. Default null. + * + * @type string $file The local filename. + * @type string $type The MIME type. + * } + * + * @phpstan-param AvatarDefinition|null $avatar + * @phpstan-return AvatarDefinition|null + */ + public function enable_user_avatars( array $avatar = null, $user_id ) { + // Retrieve Simple Author Box image. + $local_avatar = $this->get_simple_user_avatar_avatar( $user_id ); + + if ( ! empty( $local_avatar ) ) { + $type = \wp_check_filetype( $local_avatar )['type']; + if ( ! empty( $type ) ) { + return [ + 'file' => $local_avatar, + 'type' => $type, + ]; + } + } + + return $avatar; + } + + /** + * Retrieves the user avatar uploaded in Simple User Avatar (if any). + * + * @param int $user_id The user ID. + * + * @return string + */ + protected function get_simple_user_avatar_avatar( $user_id ) { + $attachment_id = \get_user_meta( $user_id, \SUA_USER_META_KEY, true ); + if ( \is_numeric( $attachment_id ) ) { + return (string) \get_attached_file( (int) $attachment_id ); + } + + return ''; + } + + /** + * Invalidates the file cache after a new Simple Author Box avatar has been + * uploaded or deleted. + * + * @param string[] $meta_ids IDs of updated metadata entry. + * @param int $user_id The user ID. + * @param string $meta_key Metadata key. + * + * @return void + */ + public function invalidate_cache_after_avatar_change( $meta_ids, $user_id, $meta_key ) { + if ( \SUA_USER_META_KEY !== $meta_key || empty( $meta_ids ) ) { + return; + } + + $this->user_fields->invalidate_local_avatar_cache( $user_id ); + } +} diff --git a/includes/avatar-privacy/integrations/class-theme-my-login-profiles-integration.php b/includes/avatar-privacy/integrations/class-theme-my-login-profiles-integration.php new file mode 100644 index 0000000..cba850f --- /dev/null +++ b/includes/avatar-privacy/integrations/class-theme-my-login-profiles-integration.php @@ -0,0 +1,145 @@ + + */ +class Theme_My_Login_Profiles_Integration implements Plugin_Integration { + /** + * The form helper. + * + * @var User_Form + */ + private $form; + + /** + * Creates a new instance. + * + * @param User_Form $form The form handling helper. + */ + public function __construct( User_Form $form ) { + $this->form = $form; + } + + /** + * Check if the bbPress integration should be activated. + * + * @return bool + */ + public function check() { + return \class_exists( Theme_My_Login_Profiles::class ) + && \function_exists( 'tml_get_form' ) + && \function_exists( 'tml_add_form_field' ); + } + + /** + * Activate the integration. + * + * @return void + */ + public function run() { + \add_action( 'init', [ $this, 'integrate_with_theme_my_login' ] ); + } + + /** + * Integrates with Theme My Login after all plugins have been loaded. + * + * @return void + */ + public function integrate_with_theme_my_login() { + $tml_form = \tml_get_form( 'profile' ); + if ( ! $tml_form instanceof Theme_My_Login_Form ) { + // Profiles extension not set up. + return; + } + + $avatar_field = $tml_form->get_field( 'avatar' ); + if ( ! $avatar_field instanceof Theme_My_Login_Form_Field ) { + // Avatars seem to be disabled. + return; + } + + // Add proper encoding for uploading. + $tml_form->add_attribute( 'enctype', 'multipart/form-data' ); + + // Change render callback for avatar field. + $avatar_field->set_content( [ $this, 'render_avatar_field' ] ); + + // Add additional fields. + \tml_add_form_field( $tml_form, 'avatar_privacy_use_gravatar', [ + 'type' => 'custom', + 'content' => [ $this, 'render_use_gravatar_checkbox' ], + 'priority' => 86, + ] ); + \tml_add_form_field( $tml_form, 'avatar_privacy_allow_anonymous', [ + 'type' => 'custom', + 'content' => [ $this, 'render_allow_anonymous_checkbox' ], + 'priority' => 86, + ] ); + + // Save the added fields. + \add_action( 'personal_options_update', [ $this->form, 'save' ] ); + } + + /** + * Renders the avatar uploader for use with Theme_My_Login_Profiles. + * + * @return string + */ + public function render_avatar_field() { + return $this->form->get_avatar_uploader( \get_current_user_id() ); + } + + /** + * Renders the "use gravatar" checkbox for use with Theme_My_Login_Profiles. + * + * @return string + */ + public function render_use_gravatar_checkbox() { + return $this->form->get_use_gravatar_checkbox( \get_current_user_id() ); + } + + /** + * Renders the "allow anonymous" checkbox for use with Theme_My_Login_Profiles. + * + * @return string + */ + public function render_allow_anonymous_checkbox() { + return $this->form->get_allow_anonymous_checkbox( \get_current_user_id() ); + } +} diff --git a/includes/avatar-privacy/integrations/class-ultimate-member-integration.php b/includes/avatar-privacy/integrations/class-ultimate-member-integration.php new file mode 100644 index 0000000..c11716b --- /dev/null +++ b/includes/avatar-privacy/integrations/class-ultimate-member-integration.php @@ -0,0 +1,177 @@ + + * + * @phpstan-import-type AvatarDefinition from \Avatar_Privacy\Core\User_Fields + * + * @phpstan-type UltimateMemberSettingsField array{ id: string, conditional: array{ 0: string, 1: string, 2: int } } + * @phpstan-type UltimateMemberSettingsStructure array{ '': array{ sections: array{ users: array{ fields: UltimateMemberSettingsField[] } } } } + */ +class Ultimate_Member_Integration implements Plugin_Integration { + + /** + * The avatar upload handler. + * + * @var User_Avatar_Upload_Handler + */ + private User_Avatar_Upload_Handler $upload; + + /** + * Creates a new instance. + * + * @param User_Avatar_Upload_Handler $upload The avatar upload handler. + */ + public function __construct( User_Avatar_Upload_Handler $upload ) { + $this->upload = $upload; + } + + /** + * Check if the Ultimate Member integration should be activated. + * + * @return bool + */ + public function check() { + return \class_exists( \UM::class ) && \function_exists( 'um_get_user_avatar_data' ); + } + + /** + * Activate the integration. + * + * @return void + */ + public function run() { + // Integrate with Ultimate Member's avatar handling. + \add_action( 'init', [ $this, 'integrate_with_ultimate_member_avatars' ] ); + + // Disable Ultimate Member's 'use_gravatars' setting a bit earlier to be sure.. + \add_filter( 'um_settings_structure', [ $this, 'remove_ultimate_member_gravatar_settings' ], 10, 1 ); + \add_filter( 'um_options_use_gravatars', '__return_false', 10, 1 ); + } + + /** + * Removes the Ultimate Member avatar filter and disables Avatar Privacy + * profile image upload. + * + * @return void + */ + public function integrate_with_ultimate_member_avatars() { + // Remove Ultimate Member avatar filter. + \remove_filter( 'get_avatar', 'um_get_avatar', 99999 ); + + // Disable profile image uploading. + \add_filter( 'avatar_privacy_profile_picture_upload_disabled', '__return_true', 10, 0 ); + + // Serve Ultime Member profile pictures via the filesystem cache. + \add_filter( 'avatar_privacy_pre_get_user_avatar', [ $this, 'enable_ultimate_member_user_avatars' ], 10, 2 ); + + // Invalidate cache when a new image is uploaded. + \add_action( 'um_after_upload_db_meta_profile_photo', [ $this->upload, 'invalidate_user_avatar_cache' ], 10, 1 ); + } + + /** + * Filters the Ultimate Member settings structure to remove conflicting checkboxes + * on Gravatar use. + * + * @param array $settings_structure The settings page definition. + * + * @return array + * + * @phpstan-param UltimateMemberSettingsStructure $settings_structure + * @phpstan-return UltimateMemberSettingsStructure + */ + public function remove_ultimate_member_gravatar_settings( array $settings_structure ) { + if ( + isset( $settings_structure['']['sections']['users']['fields'] ) && + \is_array( $settings_structure['']['sections']['users']['fields'] ) + ) { + /** + * Iterate over the fields. + * + * @phpstan-var UltimateMemberSettingsField $field + */ + foreach ( $settings_structure['']['sections']['users']['fields'] as &$field ) { + if ( 'use_gravatars' === $field['id'] ) { + // Make conditional on non-existing setting (hiding it). + $field['conditional'] = [ 'avatar_privacy_active', '=', 0 ]; + + // That's all. + break; + } + } + } + + return $settings_structure; + } + + /** + * Retrieves the user avatar from Ultimate Member. + * + * @param array|null $avatar Optional. The user avatar information. Default null. + * @param int $user_id The user ID. + * + * @return array|null { + * Optional. The user avatar information. Default null. + * + * @type string $file The local filename. + * @type string $type The MIME type. + * } + * + * @phpstan-param AvatarDefinition|null $avatar + * @phpstan-return AvatarDefinition|null + */ + public function enable_ultimate_member_user_avatars( array $avatar = null, $user_id ) { + // Retrieve Ultimate Member user data. + \add_filter( 'um_filter_avatar_cache_time', '__return_null' ); + $um_profile = \um_get_user_avatar_data( $user_id, 'original' ); + \remove_filter( 'um_filter_avatar_cache_time', '__return_null' ); + + if ( empty( $um_profile['type'] ) || 'upload' !== $um_profile['type'] || empty( $um_profile['url'] ) ) { + return null; + } + + $file = \ABSPATH . \wp_make_link_relative( $um_profile['url'] ); + $type = \wp_check_filetype( $file )['type']; + + if ( ! empty( $type ) ) { + return [ + 'file' => $file, + 'type' => $type, + ]; + } + + return null; + } +} diff --git a/includes/avatar-privacy/integrations/class-wp-user-manager-integration.php b/includes/avatar-privacy/integrations/class-wp-user-manager-integration.php new file mode 100644 index 0000000..4e4a13a --- /dev/null +++ b/includes/avatar-privacy/integrations/class-wp-user-manager-integration.php @@ -0,0 +1,161 @@ + + * + * @phpstan-import-type AvatarDefinition from User_Fields + */ +class WP_User_Manager_Integration implements Plugin_Integration { + + const WP_USER_MANAGER_META_KEY = 'current_user_avatar'; + + /** + * The user data helper. + * + * @since 2.4.0 + * + * @var User_Fields + */ + private User_Fields $user_fields; + + /** + * A flag indicating that the user avatar cache should be invalidated soon. + * + * @var bool + */ + private bool $flush_cache = false; + + /** + * Creates a new instance. + * + * @since 2.4.0 Parameter $uploads removed, $user_fields added. + * + * @param User_Fields $user_fields The user data API. + */ + public function __construct( User_Fields $user_fields ) { + $this->user_fields = $user_fields; + } + + /** + * Check if the WP_User_Manager integration should be activated. + * + * @return bool + */ + public function check() { + return \class_exists( \WP_User_Manager::class ) && \function_exists( 'wpum_get_option' ) && \wpum_get_option( 'custom_avatars' ); + } + + /** + * Activate the integration. + */ + public function run() { + // Disable profile image uploading. + \add_filter( 'avatar_privacy_profile_picture_upload_disabled', '__return_true' ); + + // Serve WP User Manager profile pictures via the filesystem cache. + \add_filter( 'avatar_privacy_pre_get_user_avatar', [ $this, 'enable_wpusermanager_user_avatars' ], 10, 2 ); + \add_filter( 'carbon_fields_should_save_field_value', [ $this, 'maybe_mark_user_avater_for_cache_flushing' ], 9999, 3 ); + \add_action( 'carbon_fields_user_meta_container_saved', [ $this, 'maybe_flush_cache_after_saving_user_avatar' ], 10, 1 ); + } + + /** + * Retrieves the user avatar from WP User Manager. + * + * @param array|null $avatar Optional. The user avatar information. Default null. + * @param int $user_id The user ID. + * + * @return array|null { + * Optional. The user avatar information. Default null. + * + * @type string $file The local filename. + * @type string $type The MIME type. + * } + * + * @phpstan-param AvatarDefinition|null $avatar + * @phpstan-return AvatarDefinition|null + */ + public function enable_wpusermanager_user_avatars( array $avatar = null, $user_id ) { + $file = \carbon_get_user_meta( $user_id, self::WP_USER_MANAGER_META_KEY ); + + if ( \is_string( $file ) && ! empty( $file ) ) { + $type = \wp_check_filetype( $file )['type']; + + if ( ! empty( $type ) ) { + return [ + 'file' => $file, + 'type' => $type, + ]; + } + } + + return null; + } + + /** + * Marks the user avatar cache for flushing if the corresponding WP_User_Manager + * field is about to been changed. + * + * @param bool $save Whether the field should be saved. Passed on as-is. + * @param mixed $value The field value. Ignored. + * @param Field $field A Carbon Fields object. + * + * @return bool + */ + public function maybe_mark_user_avater_for_cache_flushing( $save, $value, Field $field ) { + if ( $field->get_base_name() === self::WP_USER_MANAGER_META_KEY ) { + $this->flush_cache = true; + } + + return $save; + } + + /** + * Flushes the user avatar cache if necessary. + * + * @param int $user_id The user ID. + * + * @return void + */ + public function maybe_flush_cache_after_saving_user_avatar( $user_id ) { + if ( $this->flush_cache ) { + $this->user_fields->invalidate_local_avatar_cache( $user_id ); + } + } +} diff --git a/includes/avatar-privacy/integrations/class-wpdiscuz-integration.php b/includes/avatar-privacy/integrations/class-wpdiscuz-integration.php new file mode 100644 index 0000000..364cdf3 --- /dev/null +++ b/includes/avatar-privacy/integrations/class-wpdiscuz-integration.php @@ -0,0 +1,191 @@ + + */ +class WPDiscuz_Integration implements Plugin_Integration { + + /** + * The script & style registration helper. + * + * @since 2.4.0 + * + * @var Dependencies + */ + private Dependencies $dependencies; + + /** + * The comment handling component. + * + * @var Comments + */ + private Comments $comments; + + /** + * The field name for the cookies consent checkbox. + * + * @var string + */ + private string $cookie_consent_name; + + /** + * Creates a new instance. + * + * @param Dependencies $dependencies The script & style registration helper. + * @param Comments $comments The comment handler. + */ + public function __construct( Dependencies $dependencies, Comments $comments ) { + $this->dependencies = $dependencies; + $this->comments = $comments; + } + + /** + * Check if the bbPress integration should be activated. + * + * @return bool + */ + public function check() { + return \function_exists( 'wpDiscuz' ); + } + + /** + * Activate the integration. + * + * @return void + */ + public function run() { + \add_action( 'init', [ $this, 'init' ] ); + } + + /** + * Init action handler. + * + * @return void + */ + public function init() { + if ( ! \is_user_logged_in() ) { + if ( ! \is_admin() ) { + \add_action( 'wpdiscuz_submit_button_before', [ $this, 'print_gravatar_checkbox' ] ); + \add_action( 'wp_enqueue_scripts', [ $this, 'enqeue_styles_and_scripts' ] ); + } + + // Needed in AJAX calls. + \add_action( 'wpdiscuz_form_init', [ $this, 'store_cookie_consent_checkbox' ] ); + \add_action( 'wpdiscuz_before_save_commentmeta', [ $this, 'set_comment_cookies' ] ); + } + } + + /** + * Prints the wpDiscuz "Use Gravatar" checkbox. + * + * @return void + */ + public function print_gravatar_checkbox() { + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- echoing a partial. + echo $this->comments->get_gravatar_checkbox_markup( 'public/partials/wpdiscuz/use-gravatar.php' ); + } + + /** + * Enqueue stylesheet comments form. + * + * @return void + */ + public function enqeue_styles_and_scripts() { + // Register script. + $this->dependencies->register_script( 'avatar-privacy-wpdiscuz-use-gravatar', 'public/js/wpdiscuz/use-gravatar.js', [ 'jquery' ], false, true ); + + // Set up the localized script data. + $data = [ + 'cookie' => Comments::COOKIE_PREFIX . \COOKIEHASH, + 'checkbox' => Comments::CHECKBOX_FIELD_NAME, + ]; + \wp_localize_script( 'avatar-privacy-wpdiscuz-use-gravatar', 'avatarPrivacy', $data ); + + // Enqueue script. + $this->dependencies->enqueue_script( 'avatar-privacy-wpdiscuz-use-gravatar' ); + } + + /** + * Sets the "Use Gravatar" cookie. + * + * @param \WP_Comment $comment Comment object. + * + * @return void + */ + public function set_comment_cookies( \WP_Comment $comment ) { + $user = \wp_get_current_user(); + $cookie_consent = $this->filter_bool( \INPUT_POST, $this->cookie_consent_name ); + + $this->comments->set_comment_cookies( $comment, $user, $cookie_consent ); + } + + /** + * Stores the wpDiscuz form fields for later use. + * + * @param Form $form The form object. + * + * @return void + */ + public function store_cookie_consent_checkbox( Form $form ) { + $form->initFormFields(); + + foreach ( $form->getFormCustomFields() as $field_name => $field ) { + if ( Field\CookiesConsent::class === $field['type'] ) { + $this->cookie_consent_name = $field_name; + } + } + } + + /** + * Filters boolean values in one of the input super globals to allow for + * unit testing. + * + * @since 2.6.0 Renamed to `filter_bool` and made more specific. + * + * @param int $type One of INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER, or INPUT_ENV. + * @param string $variable_name Name of a variable to get. + * + * @return bool + * + * @phpstan-param \INPUT_GET|\INPUT_POST|\INPUT_COOKIE|\INPUT_SERVER|\INPUT_ENV $type + */ + protected function filter_bool( $type, $variable_name ) { + return true === \filter_input( $type, $variable_name, \FILTER_VALIDATE_BOOLEAN ); // @codeCoverageIgnore + } +} diff --git a/includes/avatar-privacy/tools/class-hasher.php b/includes/avatar-privacy/tools/class-hasher.php new file mode 100644 index 0000000..cde734c --- /dev/null +++ b/includes/avatar-privacy/tools/class-hasher.php @@ -0,0 +1,133 @@ + + */ +class Hasher { + + /** + * The salt used for the get_hash() method. + * + * @var string + */ + private $salt; + + /** + * The network options handler. + * + * @var Network_Options + */ + private $network_options; + + /** + * Creates a new instance. + * + * @param Network_Options $network_options The network options handler. + */ + public function __construct( Network_Options $network_options ) { + $this->network_options = $network_options; + } + + /** + * Retrieves the salt for current the site/network. + * + * @return string + */ + public function get_salt() { + if ( empty( $this->salt ) ) { + /** + * Filters the salt used for generating this sites email hashes. + * + * If a non-empty string is returned, this value is used instead of + * the one stored in the network options. On first activation, a random + * value is generated and stored in the option. + * + * @param string $salt Default ''. + */ + $_salt = \apply_filters( 'avatar_privacy_salt', '' ); + + if ( empty( $_salt ) ) { + // Let's try the network option next. + $_salt = $this->network_options->get( Network_Options::SALT ); + + if ( ! \is_string( $_salt ) || empty( $_salt ) ) { + // Still nothing? Generate a random value. + $_salt = $this->generate_salt(); + + // Save the generated salt. + $this->network_options->set( Network_Options::SALT, $_salt ); + } + } + + $this->salt = $_salt; + } + + return $this->salt; + } + + /** + * Generates a new salt. + * + * @since 2.5.0 + * + * @return string + */ + protected function generate_salt() { + return \wp_generate_password( 64, true, true ); + } + + /** + * Generates a salted SHA-256 hash for the given identifier (an e-mail address + * in most cases). + * + * @param string $identifer The identifier. Whitespace on either side + * is ignored. + * @param bool $case_sensitive Optional. Whether the identifier is case-sensitive + * (e.g. an URL). Default false. + * + * @return string + */ + public function get_hash( $identifer, $case_sensitive = false ) { + $identifier = \trim( $identifer ); + + if ( ! $case_sensitive ) { + $identifer = \strtolower( $identifier ); + } + + return \hash( 'sha256', "{$this->get_salt()}{$identifer}" ); + } +} diff --git a/includes/avatar-privacy/tools/class-multisite.php b/includes/avatar-privacy/tools/class-multisite.php new file mode 100644 index 0000000..24213a2 --- /dev/null +++ b/includes/avatar-privacy/tools/class-multisite.php @@ -0,0 +1,80 @@ + + */ +class Multisite { + + /** + * Performs the given task on all sites in a network. + * + * Warning: This is potentially expensive. + * + * @param callable $task The task to execute. Should take the site ID as its parameter. + * @param int|null $network_id Optional. The network ID (`null` means the current netwrok). Default null. + * + * @return void + */ + public function do_for_all_sites_in_network( callable $task, $network_id = null ) { + foreach ( $this->get_site_ids( $network_id ) as $site_id ) { + \switch_to_blog( $site_id ); + + $task( $site_id ); + + \restore_current_blog(); + } + } + + /** + * Retrieves all site IDs for a network. + * + * @param int|null $network_id Optional. The network ID (`null` means the current network). Default null. + * + * @return int[] An array of site IDs. + */ + public function get_site_ids( $network_id = null ) { + $network_id = $network_id ?: \get_current_network_id(); + $query = [ + 'fields' => 'ids', + 'network_id' => $network_id, + 'number' => 0, + ]; + + $result = \get_sites( $query ); + if ( ! \is_array( $result ) ) { + $result = []; + } + + return $result; + } +} diff --git a/includes/avatar-privacy/tools/class-number-generator.php b/includes/avatar-privacy/tools/class-number-generator.php new file mode 100644 index 0000000..7c80625 --- /dev/null +++ b/includes/avatar-privacy/tools/class-number-generator.php @@ -0,0 +1,72 @@ + + */ +class Number_Generator { + + /** + * Initializes the pseudo-random number generator with the seed hash. + * + * @param string $hash A string of hexadecimal digits (i.e. the result of a + * hash function). + * + * @return void + */ + public function seed( $hash ) { + // phpcs:ignore WordPress.WP.AlternativeFunctions.rand_seeding_mt_srand -- we need deterministic "randomness". + \mt_srand( (int) \hexdec( \substr( $hash, 0, 8 ) ) ); + } + + /** + * Resets the pseudo-random number generator to a less predictable value. + * + * @return void + */ + public function reset() { + \mt_srand(); // phpcs:ignore WordPress.WP.AlternativeFunctions.rand_seeding_mt_srand + } + + /** + * Retrieves a pseudo-random number falling into the given interval. + * + * @param int $min The minimum. + * @param int $max The maximum. + * + * @return int + */ + public function get( $min, $max ) { + return \mt_rand( $min, $max ); // phpcs:ignore WordPress.WP.AlternativeFunctions.rand_mt_rand + } +} diff --git a/includes/avatar-privacy/tools/class-template.php b/includes/avatar-privacy/tools/class-template.php new file mode 100644 index 0000000..45bd6e2 --- /dev/null +++ b/includes/avatar-privacy/tools/class-template.php @@ -0,0 +1,256 @@ + + * + * @phpstan-type PartialArguments array + */ +class Template { + + /** + * The allowed HTML tags and attributes for checkbox labels. + * + * @var array> + */ + const ALLOWED_HTML_LABEL = [ + 'a' => [ + 'href' => true, + 'rel' => true, + 'target' => true, + ], + ]; + + /** + * Retrieves and filters the `rel` attribute for links to gravatar.com. + * + * @deprecated 2.4.0 + * + * @return string The result is safe for output. + */ + public static function get_gravatar_link_rel() { + \_deprecated_function( __METHOD__, '2.4.0', 'Please use ' . __CLASS__ . '::get_uploader_description() or ::get_use_gravatar_label() instead.' ); + + /** + * Filters the `rel` attribute for user-visible links to gravatar.com. + * + * @since 2.0.0 + * + * @param string $rel Default 'noopener nofollow'. + */ + return \esc_attr( \apply_filters( 'avatar_privacy_gravatar_link_rel', 'noopener nofollow' ) ); + } + + /** + * Retrieves and filters the `target` attribute for links to gravatar.com. + * + * @deprecated 2.4.0 + * + * @return string The result is safe for output. + */ + public static function get_gravatar_link_target() { + \_deprecated_function( __METHOD__, '2.4.0', 'Please use ' . __CLASS__ . '::get_uploader_description() or ::get_use_gravatar_label() instead.' ); + + /** + * Filters the `target` attribute for user-visible links to gravatar.com. + * + * @since 2.0.0 + * + * @param string $target Default '_self'. + */ + return \esc_attr( \apply_filters( 'avatar_privacy_gravatar_link_target', '_self' ) ); + } + + /** + * Retrieves the uploader description depending on whether the user is allowed + * upload images and whether a local avatar has already been set. + * + * @param bool $can_upload Optional. Whether the current user can upload images. Default false. + * @param bool $has_local_avatar Optional. Whether the user currently has a local avatar set. Default false. + * + * @return string + */ + public function get_uploader_description( $can_upload = false, $has_local_avatar = false ) { + $link_needed = false; + + if ( $can_upload ) { + if ( ! $has_local_avatar ) { + /* translators: 1: gravatar.com URL, 2: rel attribute, 3: target attribute */ + $description = \__( 'No local profile picture is set. Use the upload field to add a local profile picture or change your profile picture on Gravatar.', 'avatar-privacy' ); + $link_needed = true; + } else { + /* translators: 1: gravatar.com URL, 2: rel attribute, 3: target attribute */ + $description = \__( 'Replace the local profile picture by uploading a new avatar, or erase it (falling back on Gravatar) by checking the delete option.', 'avatar-privacy' ); + $link_needed = true; + } + } elseif ( ! $has_local_avatar ) { + /* translators: 1: gravatar.com URL, 2: rel attribute, 3: target attribute */ + $description = \__( 'No local profile picture is set. Change your profile picture on Gravatar.', 'avatar-privacy' ); + $link_needed = true; + } else { + $description = \__( 'You do not have media management permissions. To change your local profile picture, contact the site administrator.', 'avatar-privacy' ); + } + + if ( $link_needed ) { + $description = $this->fill_in_gravatar_url( $description ); + } + + return $description; + } + + /** + * Retrieves the label for the "Use gravatar" checkbox. + * + * @since 2.4.0 + * + * @param string $context Optional. The context for the label (valid: 'user', + * 'comment'). Default 'user'. + * + * @return string + */ + public function get_use_gravatar_label( $context = 'user' ) { + if ( 'user' === $context ) { + /* translators: 1: gravatar.com URL, 2: rel attribute, 3: target attribute */ + $label = \__( 'Display a Gravatar image for my e-mail address.', 'avatar-privacy' ); + } elseif ( 'comment' === $context ) { + /* translators: 1: gravatar.com URL, 2: rel attribute, 3: target attribute */ + $label = \__( 'Display a Gravatar image next to my comments.', 'avatar-privacy' ); + } else { + \_doing_it_wrong( __METHOD__, \esc_html( "Invalid context $context" ), '2.4.0' ); + return ''; + } + + return $this->fill_in_gravatar_url( $label ); + } + + /** + * Fills in the (translated) Gravatar.com URL and the link `rel` and `target` + * attributes. + * + * @since 2.4.0 + * + * @param string $message The message to fill in. It needs to contain placeholders + * in this order: + * 1. URL (default 'https://en.gravatar.com'), + * 2. `rel` attribute (default 'noopener nofollow'), and + * 3. `target` attribute (default '_self'). + * @return string + */ + protected function fill_in_gravatar_url( $message ) { + return \sprintf( + $message, + \__( 'https://en.gravatar.com/', 'avatar-privacy' ), + $this->get_gravatar_link_rel_attribute(), + $this->get_gravatar_link_target_attribute() + ); + } + /** + * Retrieves and filters the `rel` attribute for links to gravatar.com. + * + * @since 2.4.0 + * + * @return string The result is safe for output. + */ + protected function get_gravatar_link_rel_attribute() { + /** + * Filters the `rel` attribute for user-visible links to gravatar.com. + * + * @since 2.0.0 + * + * @param string $rel Default 'noopener nofollow'. + */ + return \esc_attr( \apply_filters( 'avatar_privacy_gravatar_link_rel', 'noopener nofollow' ) ); + } + + /** + * Retrieves and filters the `target` attribute for links to gravatar.com. + * + * @since 2.4.0 + * + * @return string The result is safe for output. + */ + protected function get_gravatar_link_target_attribute() { + /** + * Filters the `target` attribute for user-visible links to gravatar.com. + * + * @since 2.0.0 + * + * @param string $target Default '_self'. + */ + return \esc_attr( \apply_filters( 'avatar_privacy_gravatar_link_target', '_self' ) ); + } + + /** + * Parses and echoes a partial template. + * + * @since 2.4.0 + * + * @param string $partial The file path of the partial to include (relative + * to the plugin directory. + * @param array $args Arguments passed to the partial. Only string keys + * allowed and the keys must be valid variable names. + * + * @return void + * + * @phpstan-param PartialArguments $args + */ + public function print_partial( $partial, array $args = [] ) { + if ( \extract( $args ) !== \count( $args ) ) { // phpcs:ignore WordPress.PHP.DontExtract.extract_extract -- needed for "natural" partials. + \_doing_it_wrong( __METHOD__, \esc_html( "Invalid arguments passed to partial {$partial}." ), 'Avatar Privacy 2.4.0' ); + } + + require \AVATAR_PRIVACY_PLUGIN_PATH . "/{$partial}"; + } + + /** + * Parses a partial template and returns the content as a string. + * + * @since 2.4.0 + * + * @param string $partial The file path of the partial to include (relative + * to the plugin directory. + * @param array $args Arguments passed to the partial. Only string keys + * allowed and the keys must be valid variable names. + * + * @return string + * + * @phpstan-param PartialArguments $args + */ + public function get_partial( $partial, array $args = [] ) { + \ob_start(); + $this->print_partial( $partial, $args ); + return (string) \ob_get_clean(); + } +} diff --git a/includes/avatar-privacy/tools/functions.php b/includes/avatar-privacy/tools/functions.php new file mode 100644 index 0000000..cbecea6 --- /dev/null +++ b/includes/avatar-privacy/tools/functions.php @@ -0,0 +1,51 @@ + + */ +class Dependencies { + + /** + * The minification suffix. + * + * @var string + */ + private $suffix; + + /** + * The base URL for plugin scripts and styles. + * + * @var string + */ + private $url; + + /** + * The plugin base path for scripts and styles. + * + * @since 2.5.2 + * + * @var string + */ + private $path; + + /** + * Creates a new instance. + */ + public function __construct() { + $this->suffix = ( defined( 'SCRIPT_DEBUG' ) && \SCRIPT_DEBUG ) ? '' : '.min'; + $this->url = \plugins_url( '', \AVATAR_PRIVACY_PLUGIN_FILE ); + $this->path = \AVATAR_PRIVACY_PLUGIN_PATH; + } + + /** + * Registeres a script for the block editor (using the generated asset file). + * + * @param string $handle The name of the script. Should be unique. + * @param string $block The path of the script relative to the plugin's + * directory, but without the file extension. + * + * @return bool Whether the script has been registered. True on + * success, false on failure. + */ + public function register_block_script( $handle, $block ) { + // Load meta information. + $asset = include "{$this->path}/{$block}.asset.php"; + + // Register script. + return \wp_register_script( $handle, "{$this->url}/{$block}.js", $asset['dependencies'], $asset['version'], false ); + } + + /** + * Registers the script (does not overwrite). + * + * @param string $handle The name of the script. Should be unique. + * @param string $src The path of the script relative to the + * plugin's directory. + * @param string[] $deps Optional. An array of registered script + * handles this script depends on. Default []. + * @param string|bool $version Optional. A string specifying the script + * version number, if it has one, which is added + * to the URL as a query string for cache busting + * purposes. If $version is set to false, the + * script file's modification time is used + * automatically. If set to null, no version + * is added. + * @param bool $in_footer Optional. Whether to enqueue the script before + * instead of in the . Default `false`. + * + * @return bool Whether the script has been registered. True + * on success, false on failure. + */ + public function register_script( $handle, $src, $deps = [], $version = false, $in_footer = false ) { + // Use minified versions where appropriate. + $src = $this->maybe_add_minification_suffix( $src ); + + // Use file modification time as version. + $version = $this->maybe_add_file_modification_version( $version, $src ); + + // Register script. + return \wp_register_script( $handle, "{$this->url}/{$src}", $deps, $version, $in_footer ); + } + + /** + * Registers a CSS stylesheet. + * + * @param string $handle The name of the script. Should be unique. + * @param string $src The path of the script relative to the plugin's + * directory. + * @param string[] $deps Optional. An array of registered script + * handles this script depends on. Default []. + * @param string|bool $version Optional. A string specifying the script version + * number, if it has one, which is added to the + * URL as a query string for cache busting purposes. + * If $version is set to false, the style file's + * modification time is used automatically. If + * set to null, no version is added. + * @param string $media Optional. The media for which this stylesheet + * has been defined. Accepts media types like 'all', + * 'print' and 'screen', or media queries like + * '(orientation: portrait)' and '(max-width: 640px)'. + * Default 'all'. + * + * @return bool xxx + */ + public function register_style( $handle, $src, $deps = [], $version = false, $media = 'all' ) { + // Use minified versions where appropriate. + $src = $this->maybe_add_minification_suffix( $src ); + + // Use file modification time as version. + $version = $this->maybe_add_file_modification_version( $version, $src ); + + // Register style. + return \wp_register_style( $handle, "{$this->url}/{$src}", $deps, $version, $media ); + } + + /** + * Enqueues the script specified by the handle. + * + * @param string $handle A registered script handle. + * + * @return void + */ + public function enqueue_script( $handle ) { + $key = \preg_replace( [ '/^avatar-privacy-/', '/-/' ], [ '', '_' ], $handle ); + + /** + * Filters whether to enqueue the script. + * + * The $key part will be the script handle without the plugin prefix + * and with all '-' replaced with '_'. + * + * @since 2.4.0 + * + * @param bool $allow Optional. Default true. + */ + if ( \apply_filters( "avatar_privacy_enqueue_script_{$key}", true ) ) { + \wp_enqueue_script( $handle ); + } + } + + /** + * Enqueues the stylesheet specified by the handle. + * + * @param string $handle A registered stylesheet handle. + * + * @return void + */ + public function enqueue_style( $handle ) { + $key = \preg_replace( [ '/^avatar-privacy-/', '/-style$/', '/-/' ], [ '', '', '_' ], $handle ); + + /** + * Filters whether to enqueue the stylesheet. + * + * The $key part will be the stylesheet handle without the plugin prefix + * or '-style' suffix and with all '-' replaced with '_'. + * + * @since 2.4.0 + * + * @param bool $allow Optional. Default true. + */ + if ( \apply_filters( "avatar_privacy_enqueue_style_{$key}", true ) ) { + \wp_enqueue_style( $handle ); + } + } + + /** + * Adds the minification suffix to a file path (if appropriate). + * + * @param string $src The path of a file relative to the plugin's directory. + * + * @return string + */ + protected function maybe_add_minification_suffix( $src ) { + if ( ! empty( $this->suffix ) && ! empty( $src ) ) { + $i = \pathinfo( $src ); + $ext = ! empty( $i['extension'] ) ? ".{$i['extension']}" : ''; + $src = "{$i['dirname']}/{$i['filename']}{$this->suffix}{$ext}"; + } + + return $src; + } + + /** + * Adds the file modification time as a version number if necessary. + * + * @param string|bool|null $version A string specifying a version number If + * version is set to false, the file's + * modification time is used automatically. + * If set to null, no version is added. + * @param string $src The path of a file relative to the plugin's + * directory. + * + * @return string|bool|null + */ + protected function maybe_add_file_modification_version( $version, $src ) { + $full_src_path = "{$this->path}/{$src}"; + + if ( false === $version && ! empty( $src ) && \file_exists( $full_src_path ) ) { + $version = (string) @\filemtime( $full_src_path ); + $version = empty( $version ) ? false : $version; + } + + return $version; + } +} diff --git a/includes/avatar-privacy/tools/html/class-user-form.php b/includes/avatar-privacy/tools/html/class-user-form.php new file mode 100644 index 0000000..6a80dbf --- /dev/null +++ b/includes/avatar-privacy/tools/html/class-user-form.php @@ -0,0 +1,574 @@ + + * + * @phpstan-import-type PartialArguments from Template + * + * @phpstan-type ConfigData array{ nonce: string, action: string, field: string, erase?: string, partial: string } + * @phpstan-type AdditionArguments array{ avatar_size?: int, show_description?: bool } + */ +class User_Form { + + /** + * The upload handler. + * + * @var Upload + */ + protected Upload $upload; + + /** + * The user fields API. + * + * @since 2.4.0 + * + * @var User_Fields + */ + protected User_Fields $registered_user; + + /** + * The templating handler. + * + * @since 2.4.0 + * + * @var Template + */ + private Template $template; + + /** + * The configuration data for the `use_gravatar` checkbox. + * + * @var array { + * @type string $nonce The nonce root (the ID of the user in question + * will be automatically added). + * @type string $action The nonce action. + * @type string $field The ID/name of the actual `` element. + * @type string $partial The path to the partial template file (relative + * to the plugin path). + * } + * + * @phpstan-var ConfigData + */ + protected array $use_gravatar; + + /** + * The configuration data for the `allow_anonymous` checkbox. + * + * @var array { + * @type string $nonce The nonce root (the ID of the user in question + * will be automatically added). + * @type string $action The nonce action. + * @type string $field The ID/name of the actual `` element. + * @type string $partial The path to the partial template file (relative + * to the plugin path). + * } + * + * @phpstan-var ConfigData + */ + protected array $allow_anonymous; + + /** + * The configuration data for the user avatar uploader. + * + * @var array { + * @type string $nonce The nonce root (the ID of the user in question + * will be automatically added). + * @type string $action The nonce action. + * @type string $field The ID/name of the upload `` element. + * @type string $erase The ID/name of the erase checkbox `` element. + * @type string $partial The path to the partial template file (relative + * to the plugin path). + * } + * + * @phpstan-var ConfigData&array{ erase: string } + */ + protected array $user_avatar; + + /** + * Creates a new form helper instance. + * + * @since 2.4.0 Parameters $registered_user, and $template added. + * + * @param Upload $upload The upload handler. + * @param User_Fields $registered_user The user fields API handler. + * @param Template $template The templating handler. + * @param array $use_gravatar { + * The configuration data for the `use_gravatar` checkbox. + * + * @type string $nonce The nonce root (the ID of the user in question + * will be automatically added). + * @type string $action The nonce action. + * @type string $field The ID/name of the actual `` element. + * @type string $partial The path to the partial template file (relative + * to the plugin path). + * } + * @param array $allow_anonymous { + * The configuration data for the `allow_anonymous` checkbox. + * + * @type string $nonce The nonce root (the ID of the user in question + * will be automatically added). + * @type string $action The nonce action. + * @type string $field The ID/name of the actual `` element. + * @type string $partial The path to the partial template file (relative + * to the plugin path). + * } + * @param array $user_avatar { + * The configuration data for the user avatar uploader. + * + * @type string $nonce The nonce root (the ID of the user in question + * will be automatically added). + * @type string $action The nonce action. + * @type string $field The ID/name of the upload `` element. + * @type string $erase The ID/name of the erase checkbox `` element. + * @type string $partial The path to the partial template file (relative + * to the plugin path). + * } + * + * @phpstan-param ConfigData $use_gravatar + * @phpstan-param ConfigData $allow_anonymous + * @phpstan-param ConfigData&array{ erase: string } $user_avatar + */ + public function __construct( Upload $upload, User_Fields $registered_user, Template $template, array $use_gravatar, array $allow_anonymous, array $user_avatar ) { + $this->upload = $upload; + $this->registered_user = $registered_user; + $this->template = $template; + $this->use_gravatar = $use_gravatar; + $this->allow_anonymous = $allow_anonymous; + $this->user_avatar = $user_avatar; + } + + /** + * Prints the markup for the `use_gravatar` checkbox. + * + * @param int $user_id The ID of the user to edit. + * @param array $args { + * Additional arguments for the template. + * + * @type bool $show_description True if the long description should be displayed. Default true. + * } + * + * @return void + * + * @phpstan-param AdditionArguments $args + */ + public function use_gravatar_checkbox( $user_id, array $args = [] ) { + $this->checkbox( $this->registered_user->allows_gravatar_use( $user_id ), "{$this->use_gravatar['nonce']}{$user_id}", $this->use_gravatar['action'], $this->use_gravatar['field'], $this->use_gravatar['partial'], $args ); + } + + /** + * Retrieves the markup for the `use_gravatar` checkbox. + * + * @param int $user_id The ID of the user to edit. + * @param array $args { + * Additional arguments for the template. + * + * @type bool $show_descriptions True if the long description should be displayed. Default true. + * } + * + * @return string + * + * @phpstan-param AdditionArguments $args + */ + public function get_use_gravatar_checkbox( $user_id, array $args = [] ) { + \ob_start(); + $this->use_gravatar_checkbox( $user_id, $args ); + return (string) \ob_get_clean(); + } + + /** + * Prints the markup for the `allow_anonymous` checkbox. + * + * @param int $user_id The ID of the user to edit. + * @param array $args { + * Additional arguments for the template. + * + * @type bool $show_descriptions True if the long description should be displayed. Default true. + * } + * + * @return void + * + * @phpstan-param AdditionArguments $args + */ + public function allow_anonymous_checkbox( $user_id, array $args = [] ) { + $this->checkbox( $this->registered_user->allows_anonymous_commenting( $user_id ), "{$this->allow_anonymous['nonce']}{$user_id}", $this->allow_anonymous['action'], $this->allow_anonymous['field'], $this->allow_anonymous['partial'], $args ); + } + + /** + * Retrieves the markup for the `allow_anonymous` checkbox. + * + * @param int $user_id The ID of the user to edit. + * @param array $args { + * Additional arguments for the template. + * + * @type bool $show_descriptions True if the long description should be displayed. Default true. + * } + * + * @return string + * + * @phpstan-param AdditionArguments $args + */ + public function get_allow_anonymous_checkbox( $user_id, array $args = [] ) { + \ob_start(); + $this->allow_anonymous_checkbox( $user_id, $args ); + return (string) \ob_get_clean(); + } + + /** + * Prints the markup for uploading user avatars. + * + * @param int $user_id The ID of the user to edit. + * @param array $args { + * Additional arguments for the template. + * + * @type int $avatar_size The width/height of the avatar preview image (in pixels). Default 96. + * @type bool $show_descriptions True if the long description should be displayed. Default true. + * } + * + * @return void + * + * @phpstan-param AdditionArguments $args + */ + public function avatar_uploader( $user_id, array $args = [] ) { + // Merge default arguments. + $args = \wp_parse_args( $args, [ + 'avatar_size' => 96, + 'show_descriptions' => true, + ] ); + + /** + * Filters whether native profile picture uploading is disabled for some + * reasone (e.g. because another plugin already provides for that). + * + * @since 2.3.0 + * + * @param bool $disabled Default false. + */ + $uploads_disabled = \apply_filters( 'avatar_privacy_profile_picture_upload_disabled', false ); + + // Set up variables used by the included partial. + $partial_args = [ + 'user_id' => $user_id, + 'template' => $this->template, + 'nonce' => "{$this->user_avatar['nonce']}{$user_id}", + 'action' => $this->user_avatar['action'], + 'upload_field' => $this->user_avatar['field'], + 'erase_field' => $this->user_avatar['erase'], + 'uploads_disabled' => $uploads_disabled, + 'can_upload' => empty( $uploads_disabled ) && \current_user_can( 'upload_files' ), + 'has_local_avatar' => ! empty( $this->registered_user->get_local_avatar( $user_id ) ), + 'size' => $args['avatar_size'], + 'show_description' => $args['show_descriptions'], + ]; + + // Include partial. + $this->template->print_partial( $this->user_avatar['partial'], $partial_args ); + } + + /** + * Retrieves the markup for uploading user avatars. + * + * @param int $user_id The ID of the user to edit. + * @param array $args { + * Additional arguments for the template. + * + * @type int $avatar_size The width/height of the avatar preview image (in pixels). Default 96. + * @type bool $show_descriptions True if the long description should be displayed. Default true. + * } + * + * @return string + * + * @phpstan-param AdditionArguments $args + */ + public function get_avatar_uploader( $user_id, array $args = [] ) { + \ob_start(); + $this->avatar_uploader( $user_id, $args ); + return (string) \ob_get_clean(); + } + + /** + * Prints checkbox markup, initialized from the given user meta key. + * + * @since 2.4.0 Parameters $user_id, and $meta_key removed, parameter $value + * added. The parameter $nonce now has to include the variable + * part (user ID). + * + * @param bool $value Whether the checkbox should be checked, or not. + * @param string $nonce The nonce root required for saving the field. + * @param string $action The action required for saving the field. + * @param string $field_name The HTML name of the checkbox field. + * @param string $partial The relative path to the partial to load. + * @param array $args { + * Additional arguments for the template. + * + * @type bool $show_descriptions True if the long description should be displayed. Default true. + * } + * + * @return void + * + * @phpstan-param AdditionArguments $args + */ + protected function checkbox( $value, $nonce, $action, $field_name, $partial, array $args = [] ) { + // Merge default arguments. + $args = \wp_parse_args( $args, [ + 'show_descriptions' => true, + ] ); + + // Set up variables used by the included partial. + $partial_args = [ + 'template' => $this->template, + 'nonce' => $nonce, + 'action' => $action, + 'field_name' => $field_name, + 'value' => $value, + 'show_description' => $args['show_descriptions'], + ]; + + // Include partial. + $this->template->print_partial( $partial, $partial_args ); + } + + /** + * Saves the value of the 'use_gravatar' checkbox from the user profile in + * the database. + * + * @param int $user_id The ID of the user that has just been saved. + * + * @return void + * + * @throws Invalid_Nonce_Exception An exception is thrown when the nonce cannot + * be verified. + */ + public function save_use_gravatar_checkbox( $user_id ) { + try { + $this->registered_user->update_gravatar_use( $user_id, $this->get_submitted_checkbox_value( "{$this->use_gravatar['nonce']}{$user_id}", $this->use_gravatar['action'], $this->use_gravatar['field'] ) ); + } catch ( Form_Field_Not_Found_Exception $e ) { + // No attempt to set the field (probably no form submitted). + return; + } + } + + /** + * Saves the value of the 'allow_anonymous' checkbox from the user profile in + * the database. + * + * @param int $user_id The ID of the user that has just been saved. + * + * @return void + * + * @throws Invalid_Nonce_Exception An exception is thrown when the nonce cannot + * be verified. + */ + public function save_allow_anonymous_checkbox( $user_id ) { + try { + $this->registered_user->update_anonymous_commenting( $user_id, $this->get_submitted_checkbox_value( "{$this->allow_anonymous['nonce']}{$user_id}", $this->allow_anonymous['action'], $this->allow_anonymous['field'] ) ); + } catch ( Form_Field_Not_Found_Exception $e ) { + // No attempt to set the field (probably no form submitted). + return; + } + } + + /** + * Retrieves the checkbox value to save. + * + * @since 2.4.0 + * + * @global array $_POST Post request superglobal. + * + * @param string $nonce The nonce root required for saving the field + * (the user ID will be automatically appended). + * @param string $action The action required for saving the field. + * @param string $field_name The HTML name of the field to be saved. + * + * @return bool + * + * @throws Form_Field_Not_Found_Exception An exception is thrown when the field + * does not exist (i.e. no form was submitted). + * @throws Invalid_Nonce_Exception An exception is thrown when the nonce + * cannot be verified. + */ + protected function get_submitted_checkbox_value( $nonce, $action, $field_name ) { + if ( ! isset( $_POST[ $nonce ] ) && ! isset( $_POST[ $field_name ] ) ) { + throw new Form_Field_Not_Found_Exception( "Form field '{$field_name}' not found." ); + } + + // @phpstan-ignore-next-line -- super globals are all array. + if ( isset( $_POST[ $nonce ] ) && \wp_verify_nonce( \sanitize_key( $_POST[ $nonce ] ), $action ) ) { + return isset( $_POST[ $field_name ] ) && 'true' === $_POST[ $field_name ]; + } + + throw new Invalid_Nonce_Exception( 'Could not verify checkbox nonce.' ); + } + + /** + * Saves the uploaded avatar image to the proper directory. + * + * @param int $user_id The user ID. + * + * @return void + */ + public function save_uploaded_user_avatar( $user_id ) { + $this->upload->save_uploaded_user_avatar( $user_id, $this->user_avatar['nonce'], $this->user_avatar['action'], $this->user_avatar['field'], $this->user_avatar['erase'] ); + } + + /** + * Saves all the custom fields of the user form into the database/the + * the filesystem. (The data is ultimately taken from the $_POST and $_FILES + * superglobals.) + * + * If the current user lacks the capability to edit the profile of the given + * user ID, the data is not saved. + * + * @since 2.4.0 The method now throws an exception when a nonce cannot be + * verified. + * + * @param int $user_id The ID of the edited user. + * + * @return void + * + * @throws Invalid_Nonce_Exception An exception is thrown when a nonce + * cannot be verified. + */ + public function save( $user_id ) { + if ( ! \current_user_can( 'edit_user', $user_id ) ) { + return; + } + + $this->save_use_gravatar_checkbox( $user_id ); + $this->save_allow_anonymous_checkbox( $user_id ); + $this->save_uploaded_user_avatar( $user_id ); + } + + /** + * Processes a form submission. Currently, it is limited to "self-editing". + * + * This method should only be hooked for frontend forms (via the `init` + * action hook). + * + * @since 2.4.0 The method now throws an exception when a nonce cannot be + * verified. + * + * @return void + * + * @throws Invalid_Nonce_Exception An exception is thrown when a nonce + * cannot be verified. + */ + public function process_form_submission() { + // Check that user is logged in. + $user_id = \get_current_user_id(); + if ( empty( $user_id ) ) { + return; + } + + // Process upload. + $this->save( $user_id ); + } + + /** + * Registers the `process_form_submission` method with the `init` hook, but + * makes sure not to do it twice. + * + * @return void + */ + public function register_form_submission() { + if ( ! \has_action( 'init', [ $this, 'process_form_submission' ] ) ) { + \add_action( 'init', [ $this, 'process_form_submission' ] ); + } + } + + /** + * Prints the form for the specified user, using the given PHP template. + * + * @since 2.4.0 + * + * @param string $partial The file path of the partial to include (relative + * to the plugin directory. + * @param int $user_id The ID of the edited user. + * @param array $args Arguments passed to the partial. Only string keys + * allowed and the keys must be valid variable names. + * + * @return void + * + * @phpstan-param PartialArguments $args + */ + public function print_form( $partial, $user_id, array $args = [] ) { + $this->template->print_partial( $partial, $this->get_partial_arguments( $user_id, $args ) ); + } + + /** + * Retrieves the form markup for the specified user, using the given PHP template. + * + * @since 2.4.0 + * + * @param string $partial The file path of the partial to include (relative + * to the plugin directory. + * @param int $user_id The ID of the edited user. + * @param array $args Arguments passed to the partial. Only string keys + * allowed and the keys must be valid variable names. + * + * @return string + * + * @phpstan-param PartialArguments $args + */ + public function get_form( $partial, $user_id, array $args = [] ) { + return $this->template->get_partial( $partial, $this->get_partial_arguments( $user_id, $args ) ); + } + + /** + * Prepares the arguments array for passing to Template::get_partial and + * Template::print_partial. + * + * @since 2.4.0 + * + * @param int $user_id The ID of the edited user. + * @param array $args Arguments passed to the partial. Only string keys + * allowed and the keys must be valid variable names. + * + * @return array + * + * @phpstan-param PartialArguments $args + * @phpstan-return PartialArguments + */ + protected function get_partial_arguments( $user_id, array $args ) { + $args['form'] = $this; + $args['user_id'] = $user_id; + + return $args; + } +} diff --git a/includes/avatar-privacy/tools/images/class-color.php b/includes/avatar-privacy/tools/images/class-color.php new file mode 100644 index 0000000..74df4fd --- /dev/null +++ b/includes/avatar-privacy/tools/images/class-color.php @@ -0,0 +1,135 @@ + + * + * @phpstan-type RGBValue int<0,255> + * @phpstan-type PercentValue int<0,100> + * + * @phpstan-type HueDegree int<-360,360> + * @phpstan-type NormalizedHue int<0,359> + */ +class Color { + const MAX_DEGREE = 360; + const MAX_RGB = 255; + const MAX_PERCENT = 100; + + /** + * Converts a color specified using HSL to its RGB representation. + * + * @since 2.5.0 + * @since 2.7.0 Moved to Color class. + * + * @param int $hue The hue (in degrees, i.e. -360°–+360°). + * @param int $saturation The saturation (in percent, i.e. 0–100%). + * @param int $lightness The lightness (in percent, i.e. 0–100%). + * + * @return int[] { + * The RGB color as a tuple. + * + * @type int $red The red component (0–255). + * @type int $green The green component (0–255). + * @type int $blue The blue component (0–255). + * } + * + * @phpstan-param NormalizedHue $hue + * @phpstan-param PercentValue $saturation + * @phpstan-param PercentValue $lightness + * @phpstan-return array{ 0: RGBValue, 1: RGBValue, 2: RGBValue } + */ + public function hsl_to_rgb( $hue, $saturation, $lightness ) { + /** + * Convert saturation to decimal notation. + * + * @var float + */ + $saturation = $saturation / self::MAX_PERCENT; + + /** + * Convert lightness to decimal notation. + * + * @var float + */ + $lightness = $lightness / self::MAX_PERCENT; + + /** + * Conversion function. + * + * @param int $n Conversion factor. + * + * @return float A floating point number between 0.0 and 1.0. + */ + $f = function( $n ) use ( $hue, $saturation, $lightness ) { + $k = \fmod( $n + $hue / 30, 12 ); + $a = $saturation * \min( $lightness, 1 - $lightness ); + return $lightness - $a * \max( -1, \min( $k - 3, 9 - $k, 1 ) ); + }; + + /** + * The red component. + * + * @phpstan-var RGBValue + */ + $red = (int) \round( $f( 0 ) * self::MAX_RGB ); + /** + * The green component. + * + * @phpstan-var RGBValue + */ + $green = (int) \round( $f( 8 ) * self::MAX_RGB ); + /** + * The blue component. + * + * @phpstan-var RGBValue + */ + $blue = (int) \round( $f( 4 ) * self::MAX_RGB ); + + // Return result array. + return [ $red, $green, $blue ]; + } + + /** + * Normalizes the hue value. + * + * @param int $hue The hue as a positive or negative arc on the color wheel (-360°–+360°). + * + * @return int The normalized hue (0–359°). + * + * @phpstan-param HueDegree $hue + * @phpstan-return NormalizedHue + */ + public function normalize_hue( int $hue ) { + // Ensure a unique, non-negative hue. + return ( $hue < 0 ? self::MAX_DEGREE + $hue : $hue ) % self::MAX_DEGREE; + } +} diff --git a/includes/avatar-privacy/tools/images/class-editor.php b/includes/avatar-privacy/tools/images/class-editor.php new file mode 100644 index 0000000..dd8db40 --- /dev/null +++ b/includes/avatar-privacy/tools/images/class-editor.php @@ -0,0 +1,350 @@ + + */ +class Editor { + + const DEFAULT_STREAM = 'avprimg://image_editor/dummy/path'; + + /** + * Allowed image formats for exporting. + * + * @internal + * + * @since 2.4.0 + * + * @var array + */ + const ALLOWED_IMAGE_FORMATS = [ + Image_File::JPEG_IMAGE => true, + Image_File::PNG_IMAGE => true, + ]; + + /** + * A stream wrapper URL. + * + * @since 2.1.0 + * + * @var string + */ + private string $stream_url; + + /** + * The stream implmentation to use. + * + * @since 2.1.0 + * + * @var string + */ + private string $stream_class; + + /** + * The handle (hostname/path) parsed from the stream URL. + * + * @var string + */ + private string $handle; + + /** + * Creates a new image editor helper. + * + * @since 2.1.0 + * @since 2.4.0 An exception is thrown when an invalid URL is passed to the method. + * + * @param string $url Optional. The stream URL to be used for in-memory-images. Default self::DEFAULT_STREAM. + * @param string $stream_class Optional. The stream wrapper class that should be used. Default Image_Stream. + * + * @throws \InvalidArgumentException Throws an exception if the default stream URL is not valid. + */ + public function __construct( $url = self::DEFAULT_STREAM, $stream_class = Image_Stream::class ) { + $this->stream_url = $url; + $this->stream_class = $stream_class; + + // Determine stream URL scheme. + $scheme = \parse_url( $url, \PHP_URL_SCHEME ); // phpcs:ignore WordPress.WP.AlternativeFunctions.parse_url_parse_url + if ( empty( $scheme ) ) { + throw new \InvalidArgumentException( "{$url} is not a valid stream URL" ); + } + + // Also save the memory handle. + $this->handle = $stream_class::get_handle_from_url( $url ); + + $stream_class::register( $scheme ); + } + + /** + * Creates a \WP_Image_Editor from a given stream wrapper. + * + * @param string $stream The image stream wrapper URL. + * + * @return \WP_Image_Editor|\WP_Error + */ + public function create_from_stream( $stream ) { + // Create image editor instance from stream, but strongly prefer GD implementations. + $result = $this->get_image_editor( $stream ); + + // Clean up stream data. + $this->delete_stream( $stream ); + + // Return image editor. + return $result; + } + + /** + * Creates a \WP_Image_Editor from in-memory image data. + * + * @param string $data Image data. + * + * @return \WP_Image_Editor|\WP_Error + */ + public function create_from_string( $data ) { + // Copy data to stream implementation. + \file_put_contents( $this->stream_url, $data ); // phpcs:ignore WordPress.WP.AlternativeFunctions.file_system_operations_file_put_contents + + return $this->create_from_stream( $this->stream_url ); + } + + /** + * Creates a \WP_Image_Editor from a GD image. The image is destroyed on success. + * + * @since 2.5.0 Parameter $image can now also be a GdImage. + * + * @param resource|GdImage $image Image data. + * + * @return \WP_Image_Editor|\WP_Error + */ + public function create_from_image_resource( $image ) { + if ( \is_gd_image( $image ) && \imagePNG( $image, $this->stream_url ) ) { + // Clean up resource. + \imageDestroy( $image ); + + // Create editor. + return $this->create_from_stream( $this->stream_url ); + } + + return new \WP_Error( 'invalid_image', \__( 'Resource is not an image.', 'avatar-privacy' ) ); + } + + /** + * Retrieves the image data from the given editor object. + * + * @param \WP_Image_Editor|\WP_Error $image The image. + * @param string $format Optional. The image mimetype. Default 'image/png'. + * + * @return string + */ + public function get_image_data( $image, $format = Image_File::PNG_IMAGE ) { + // Check for validity. + if ( + $image instanceof \WP_Error || + ! isset( self::ALLOWED_IMAGE_FORMATS[ $format ] ) || + ! isset( Image_File::FILE_EXTENSION[ $format ] ) + ) { + return ''; + } + + // Convert the image the given format and extract data. + $extension = Image_File::FILE_EXTENSION[ $format ]; + if ( $image->save( "{$this->stream_url}.{$extension}", $format ) instanceof \WP_Error ) { + return ''; + } + + // Read the data from memory stream and clean up. + return $this->stream_class::get_data( "{$this->handle}.{$extension}", true ); + } + + /** + * Resizes the given image and returns the image data. If the aspect ratios + * differ, the image is center-cropped. + * + * @since 2.0.5 Parameter $crop has been deprecated. + * @since 2.1.0 Parameter $crop has been removed. + * @since 2.4.0 Image is cropped if the target aspect ratio differs from the + * original one. + * + * @param \WP_Image_Editor|\WP_Error $image The image. + * @param int $width The width in pixels. + * @param int $height The height in pixels. + * @param string $format Optional. The image mimetype. Default 'image/png'. + * + * @return string + */ + public function get_resized_image_data( $image, $width, $height, $format = Image_File::PNG_IMAGE ) { + + // Try to resize only if we haven't been handed an error object. + if ( $image instanceof \WP_Error ) { + return ''; + } + + // Caculate the crop dimensions. + $current = $image->get_size(); + $crop = $this->get_crop_dimensions( $current['width'], $current['height'], $width, $height ); + + // We need to use the `crop` method because `resize` includes a block against enlarging images. + if ( $image->crop( $crop['x'], $crop['y'], $crop['width'], $crop['height'], $width, $height, false ) instanceof \WP_Error ) { + $result = ''; + } else { + $result = $this->get_image_data( $image, $format ); + } + + return $result; + } + + /** + * Determines the necessary crop dimensions for moving from the original image + * to the destination image. + * + * @since 2.4.0 + * + * @param int $orig_w Original image width. + * @param int $orig_h Original image height. + * @param int $dest_w Destination image width. + * @param int $dest_h Destination image height. + * + * @return array { + * The crop dimensions and coordinates. + * + * @type int $x The X coordinate for the crop. + * @type int $y The Y coordinate for the crop. + * @type int $width The width of the crop. + * @type int $height The height of the crop. + * } + * + * @phpstan-return array{ x: int, y: int, width: int, height: int } + */ + protected function get_crop_dimensions( $orig_w, $orig_h, $dest_w, $dest_h ) { + // We crop to the largest rectangle fitting inside the original image + // with the same aspect ratio as the destination image. + $factor = \min( $orig_w / $dest_w, $orig_h / $dest_h ); + + // Caclulate the crop dimensions. + $crop_w = \round( $dest_w * $factor ); + $crop_h = \round( $dest_h * $factor ); + + // Center the crop. + $x = \floor( ( $orig_w - $crop_w ) / 2 ); + $y = \floor( ( $orig_h - $crop_h ) / 2 ); + + return [ + 'x' => (int) $x, + 'y' => (int) $y, + 'width' => (int) $crop_w, + 'height' => (int) $crop_h, + ]; + } + + /** + * Returns a `\WP_Image_Editor` instance and loads file into it. Preference is + * given to stream-capable editor classes (i.e. GD-based ones). + * + * @param string $path Path to the file to load. + * @param mixed[] $args Optional. Additional arguments for retrieving the image editor. Default []. + * + * @return \WP_Image_Editor|\WP_Error + */ + public function get_image_editor( $path, array $args = [] ) { + // Create image editor instance from path, but strongly prefer GD implementations. + \add_filter( 'wp_image_editors', [ $this, 'prefer_gd_image_editor' ], 9999 ); + $result = \wp_get_image_editor( $path, $args ); + \remove_filter( 'wp_image_editors', [ $this, 'prefer_gd_image_editor' ], 9999 ); + + return $result; + } + + /** + * Moves Imagick-based image editors to the end of the queue. + * + * @param string[] $editors A list of image editor implementation class names. + * + * @return string[] + */ + public function prefer_gd_image_editor( array $editors ) { + $preferred_editors = []; + $imagick_editors = []; + foreach ( $editors as $editor ) { + if ( \preg_match( '/imagick/i', $editor ) ) { + $imagick_editors[] = $editor; + } else { + $preferred_editors[] = $editor; + } + } + + return \array_merge( $preferred_editors, $imagick_editors ); + } + + /** + * Retrieves the real MIME type of an image. + * + * @since 2.3.0 + * + * @param string $data Image data. + * + * @return string|false The actual MIME type or false if the type cannot be determined. + */ + public function get_mime_type( $data ) { + // Use custom handle. + $stream = $this->stream_url . '/mime/type/check'; + + // Copy data to stream implementation. + \file_put_contents( $stream, $data ); // phpcs:ignore WordPress.WP.AlternativeFunctions.file_system_operations_file_put_contents + + // Retrieve MIME type. + $mime = \wp_get_image_mime( $stream ); + + // Clean up. + $this->delete_stream( $stream ); + + // Return the MIME type. + return $mime; + } + + /** + * Deletes the handle/data for the given stream URL. + * + * @since 2.3.0 + * + * @param string $stream The image stream wrapper URL. + * + * @return void + */ + protected function delete_stream( $stream ) { + $this->stream_class::delete_handle( $this->stream_class::get_handle_from_url( $stream ) ); + } +} diff --git a/includes/avatar-privacy/tools/images/class-image-file.php b/includes/avatar-privacy/tools/images/class-image-file.php new file mode 100644 index 0000000..b7e026a --- /dev/null +++ b/includes/avatar-privacy/tools/images/class-image-file.php @@ -0,0 +1,350 @@ + + * + * @phpstan-type HandleUploadOverrides array{ upload_dir: string, upload_error_handler?: callable, unique_filename_callback?: callable, upload_error_strings?: string[], test_form?: bool, test_size?: bool, test_type?: bool, mimes?: string[]} + * @phpstan-type HandleUploadSuccess array{ file: string, url: string, type: string } + * @phpstan-type HandleUploadError array{ error: string } + * @phpstan-type FileSlice array{ name: string, type: string, tmp_name: string, error: int|string, size: int } + */ +class Image_File { + const JPEG_IMAGE = 'image/jpeg'; + const PNG_IMAGE = 'image/png'; + const GIF_IMAGE = 'image/gif'; + const SVG_IMAGE = 'image/svg+xml'; + + const JPEG_EXTENSION = 'jpg'; + const JPEG_ALT_EXTENSION = 'jpeg'; + const PNG_EXTENSION = 'png'; + const GIF_EXTENSION = 'gif'; + const SVG_EXTENSION = 'svg'; + + const CONTENT_TYPE = [ + self::JPEG_EXTENSION => self::JPEG_IMAGE, + self::JPEG_ALT_EXTENSION => self::JPEG_IMAGE, + self::PNG_EXTENSION => self::PNG_IMAGE, + self::SVG_EXTENSION => self::SVG_IMAGE, + ]; + + const FILE_EXTENSION = [ + self::JPEG_IMAGE => self::JPEG_EXTENSION, + self::PNG_IMAGE => self::PNG_EXTENSION, + self::GIF_IMAGE => self::GIF_EXTENSION, + self::SVG_IMAGE => self::SVG_EXTENSION, + ]; + + const ALLOWED_UPLOAD_MIME_TYPES = [ + 'jpg|jpeg|jpe' => self::JPEG_IMAGE, + 'gif' => self::GIF_IMAGE, + 'png' => self::PNG_IMAGE, + ]; + + /** + * Handles the file upload by optionally switching to the primary site of the network. + * + * @since 4.4.0 Default value for parameter `$overrides` removed (as it would be invalid). + * + * @param array $file A slice of the $_FILES superglobal. + * @param array $overrides An associative array of names => values to override + * default variables. See `wp_handle_uploads` documentation + * for the full list of available overrides. + * + * @return string[] Information about the uploaded file. + * + * @phpstan-param FileSlice $file + * @phpstan-param HandleUploadOverrides $overrides + * @phpstan-return HandleUploadSuccess|HandleUploadError + */ + public function handle_upload( array $file, array $overrides ) { + // Enable front end support. + if ( ! function_exists( 'wp_handle_upload' ) ) { + require_once \ABSPATH . 'wp-admin/includes/file.php'; // @codeCoverageIgnore + } + + // Switch to primary site if this should be a global upload. + $use_global_upload_dir = $this->is_global_upload( $overrides ); + if ( $use_global_upload_dir ) { + \switch_to_blog( \get_main_site_id() ); + } + + // Ensure custom upload directory. + $upload_dir = $overrides['upload_dir']; + $upload_dir_filter = function( array $uploads ) use ( $upload_dir ) { + // @codeCoverageIgnoreStart + $uploads['path'] = \str_replace( $uploads['subdir'], $upload_dir, $uploads['path'] ); + $uploads['url'] = \str_replace( $uploads['subdir'], $upload_dir, $uploads['url'] ); + $uploads['subdir'] = $upload_dir; + + return $uploads; + // @codeCoverageIgnoreEnd + }; + + \add_filter( 'upload_dir', $upload_dir_filter ); + + // Move uploaded file. + + /** + * Check if the image size falls within the allowed minimum and maximum dimensions. + * + * @phpstan-var FileSlice + */ + $file = $this->validate_image_size( $file ); + + /** + * Let WordPress handle the upload natively. + * + * @phpstan-var HandleUploadSuccess|HandleUploadError + */ + $result = \wp_handle_upload( $file, $this->prepare_overrides( $overrides ) ); + + // Restore standard upload directory. + \remove_filter( 'upload_dir', $upload_dir_filter ); + + // Ensure normalized path on Windows. + if ( ! empty( $result['file'] ) ) { + $result['file'] = \wp_normalize_path( $result['file'] ); + } + + // Switch back to current site. + if ( $use_global_upload_dir ) { + \restore_current_blog(); + } + + return $result; + } + + /** + * Handles the file upload by optionally switching to the primary site of the network. + * + * @since 4.4.0 Default value for parameter `$overrides` removed (as it would be invalid). + * + * @param string $image_url The image file to sideload. + * @param array $overrides An associative array of names => values to override + * default variables. See `wp_handle_uploads` documentation + * for the full list of available overrides. + * + * @return string[] Information about the sideloaded file. + * + * @throws Upload_Handling_Exception The method throws a `RuntimeException` + * when an error is returned by `::handle_upload()` + * or the image file could not be copied. + * + * @phpstan-param HandleUploadOverrides $overrides + * @phpstan-return HandleUploadSuccess|HandleUploadError + */ + public function handle_sideload( $image_url, array $overrides ) { + // Enable front end support. + if ( ! function_exists( 'wp_tempnam' ) ) { + require_once \ABSPATH . 'wp-admin/includes/file.php'; // @codeCoverageIgnore + } + + // Save the file. + $temp_file = \wp_tempnam( $image_url ); + if ( ! @\copy( $image_url, $temp_file ) ) { // phpcs:ignore WordPress.PHP.NoSilencedErrors -- We throw our own exception. + throw new Upload_Handling_Exception( "Error copying $image_url to $temp_file." ); + } + + // Prepare file data. + $file_data = [ + 'name' => $image_url, + 'type' => '', // No need to determine the MIME type here as it is untrusted anyway. + 'tmp_name' => $temp_file, + 'error' => \UPLOAD_ERR_OK, + 'size' => (int) @\filesize( $temp_file ), + ]; + + // Optionally override target filename. + if ( ! empty( $overrides['filename'] ) ) { + $file_data['name'] = $overrides['filename']; + } + + // Use a custom action if none is set. + if ( empty( $overrides['action'] ) ) { + $overrides['action'] = 'avatar_privacy_sideload'; + } + + // Now, sideload it in. + $sideloaded = $this->handle_upload( $file_data, $overrides ); + + if ( ! empty( $sideloaded['error'] ) ) { + // Delete temporary file. + delete_file( $temp_file ); + + // Signal error. + throw new Upload_Handling_Exception( $sideloaded['error'] ); + } + + return $sideloaded; + } + + /** + * Determines if the upload should use the global upload directory. + * + * @param array $overrides { + * An associative array of names => values to override default variables. + * See `wp_handle_uploads` documentation for the full list of available + * overrides. + * + * @type bool $global_upload Whether to use the global uploads directory on multisite. + * } + * + * @return bool + * + * @phpstan-param array{ global_upload?: bool } $overrides + */ + protected function is_global_upload( $overrides ) { + return ( ! empty( $overrides['global_upload'] ) && \is_multisite() ); + } + + /** + * Prepares the overrides array for `wp_handle_upload()`. + * + * @param mixed[] $overrides An associative array of names => values to override + * default variables. See `wp_handle_uploads` documentation + * for the full list of available overrides. + * + * @return array{ mimes: array, action: string, test_form: bool } + */ + protected function prepare_overrides( array $overrides ) { + $defaults = [ + 'mimes' => self::ALLOWED_UPLOAD_MIME_TYPES, + 'action' => 'avatar_privacy_upload', + 'test_form' => false, + ]; + + /** + * Ensure that all necessary overrides have a default value. + * + * @phpstan-var array{ mimes: array, action: string, test_form: bool } + */ + return \wp_parse_args( $overrides, $defaults ); + } + + /** + * Validates the image dimensions before uploading the file. + * + * @since 2.6.0 + * + * @param array $file { + * Reference to a single element from $_FILES. + * + * @type string $name The original name of the file on the client machine. + * @type string $type The MIME type of the file, if the browser provided this information. + * @type string $tmp_name The temporary filename of the file in which the uploaded file was stored on the server. + * @type int $size The size, in bytes, of the uploaded file. + * @type int $error The error code associated with this file upload. + * } + * + * @return array The filtered $file array. The `error` key will be set to a + * string containing the error message if the image dimensions + * don't match the set limits. + * + * @phpstan-param FileSlice $file + * @phpstan-return FileSlice + */ + public function validate_image_size( array $file ) { + $image_size = @\getimagesize( $file['tmp_name'] ); // phpcs:ignore WordPress.PHP.NoSilencedErrors -- prevent additional errors if the file cannot be read. + if ( ! $image_size || empty( $image_size[0] ) || empty( $image_size[1] ) ) { + /* translators: uploaded image file name */ + $file['error'] = \sprintf( \__( 'Error reading dimensions of image file %s.', 'avatar-privacy' ), $file['tmp_name'] ); + } else { + $image_width = $image_size[0]; + $image_height = $image_size[1]; + + /** + * Filters the minimum width for uploaded images. + * + * @since 2.6.0 + * + * @param int $min_width The minimum width in pixels. Default 0. + */ + $min_width = \apply_filters( 'avatar_privacy_upload_min_width', 0 ); + + /** + * Filters the minimum height for uploaded images. + * + * @since 2.6.0 + * + * @param int $min_height The minimum width in pixels. Default 0. + */ + $min_height = \apply_filters( 'avatar_privacy_upload_min_height', 0 ); + + /** + * Filters the maximum width for uploaded images. + * + * @since 2.6.0 + * + * @param int $max_width The maximum width in pixels. Default 2000. + */ + $max_width = \apply_filters( 'avatar_privacy_upload_max_width', 2000 ); + + /** + * Filters the maximum height for uploaded images. + * + * @since 2.6.0 + * + * @param int $max_height The maximum height in pixels. Default 2000. + */ + $max_height = \apply_filters( 'avatar_privacy_upload_max_height', 2000 ); + + if ( $image_width < $min_width || $image_height < $min_height ) { + $file['error'] = \sprintf( + /* translators: 1: minimum upload width, 2: minimum upload height, 3: actual image width, 4: actual image height */ + \__( 'Image dimensions are too small. Minimum size is %1$d×%2$d pixels. Uploaded image is %3$d×%4$d pixels.', 'avatar-privacy' ), + $min_width, + $min_height, + $image_width, + $image_height + ); + } elseif ( $image_width > $max_width || $image_height > $max_height ) { + $file['error'] = \sprintf( + /* translators: 1: maximum upload width, 2: maximum upload height, 3: actual image width, 4: actual image height */ + \__( 'Image dimensions are too large. Maximum size is %1$d×%2$d pixels. Uploaded image is %3$d×%4$d pixels.', 'avatar-privacy' ), + $max_width, + $max_height, + $image_width, + $image_height + ); + } + } + + return $file; + } +} diff --git a/includes/avatar-privacy/tools/images/class-image-stream.php b/includes/avatar-privacy/tools/images/class-image-stream.php new file mode 100644 index 0000000..e378366 --- /dev/null +++ b/includes/avatar-privacy/tools/images/class-image-stream.php @@ -0,0 +1,579 @@ + + * + * @phpstan-type StreamStat array{ dev: int, ino: int, mode: int, nlink: int, uid: int, gid: int, rdev: int, size: int, atime: int, mtime: int, ctime: int, blksize: int, blocks: int } + * @phpstan-type StreamHandle array{ data: string, atime: int, mtime: int } + */ +class Image_Stream { + const PROTOCOL = 'avprimg'; + + const READ_MODE = [ + 'r' => true, + 'r+' => true, + 'w' => false, + 'w+' => true, + 'a' => false, + 'a+' => true, + 'c' => false, + 'c+' => true, + ]; + const WRITE_MODE = [ + 'r' => false, + 'r+' => true, + 'w' => true, + 'w+' => true, + 'a' => true, + 'a+' => true, + 'c' => true, + 'c+' => true, + ]; + + // The access keys for StreamHandle components. + private const DATA = 'data'; + private const ACCESS_TIME = 'atime'; + private const MODIFICATION_TIME = 'mtime'; + + /** + * The persistent handles for existing streams. + * + * @var array + * + * @phpstan-var array + */ + private static array $handles = []; + + /** + * The contents of the stream. + * + * @var string + */ + private string $data; + + /** + * The access time of the stream. + * + * @since 2.7.0 + * + * @var int + */ + private int $atime; + + /** + * The modification time of the stream. + * + * @since 2.7.0 + * + * @var int + */ + private int $mtime; + + /** + * Whether this stream can be read from. + * + * @var bool + */ + private bool $read; + + /** + * Whether this stream can be written to. + * + * @var bool + */ + private bool $write; + + /** + * The stream options. + * + * @var int + */ + private int $options; + + /** + * The current position within the stream. + * + * @var int + */ + private int $position; + + /** + * The stream context resource. + * + * @var resource + */ + public $context; + + /** + * Opens a stream. Only the host part is used as the handle. + * + * @param string $path The stream URL. + * @param string $mode The mode flags. + * @param int $options Holds additional flags set by the streams API. + * @param string $opened_path Return value of the actually opened path. Passed by reference. + * + * @return bool + */ + public function stream_open( $path, $mode, $options, &$opened_path ) { + $real_path = static::get_handle_from_url( $path ); + $this->options = $options; + + [ + self::DATA => &$this->data, + self::ACCESS_TIME => &$this->atime, + self::MODIFICATION_TIME => &$this->mtime, + ] = static::get_data_reference( $real_path ); + + // Strip binary/text flags from mode for comparison. + $mode = \str_replace( [ 'b', 't' ], '', $mode ); + + switch ( $mode ) { + + case 'w': + case 'w+': + $this->stream_truncate( 0 ); + // fall through. + case 'r': + case 'r+': + case 'c': + case 'c+': + $this->read = self::READ_MODE[ $mode ]; + $this->write = self::WRITE_MODE[ $mode ]; + $this->position = 0; + break; + + case 'a': + case 'a+': + $this->read = self::READ_MODE[ $mode ]; + $this->write = self::WRITE_MODE[ $mode ]; + $this->position = \strlen( $this->data ); + break; + + default: + // Signal error. + $this->maybe_trigger_error( ! empty( $this->options & \STREAM_REPORT_ERRORS ), 'Invalid mode specified (mode specified makes no sense for this stream implementation)' ); + + return false; + } + + // Set the opened path if requested. + if ( $this->options & \STREAM_USE_PATH ) { + $opened_path = $real_path; + } + + return true; + } + + /** + * Reads from the stream. + * + * @param int $bytes The number of bytes to read. + * + * @return string|false + */ + public function stream_read( $bytes ) { + if ( $this->read ) { + $read_bytes = \substr( $this->data, $this->position, $bytes ); + $this->position += \strlen( $read_bytes ); + + // Update access time. + $this->atime = \time(); + + return $read_bytes; + } + + return false; + } + + /** + * Writes to the stream. + * + * @param string $data The data to write. + * + * @return int + */ + public function stream_write( $data ) { + if ( $this->write ) { + $data_length = \strlen( $data ); + $left = \substr( $this->data, 0, $this->position ); + $right = \substr( $this->data, $this->position + $data_length ); + $this->data = "{$left}{$data}{$right}"; + $this->position += $data_length; + + // Update modification time. + $this->mtime = \time(); + + return $data_length; + } + + return 0; + } + + /** + * Retrieves the current position. + * + * @return int + */ + public function stream_tell() { + return $this->position; + } + + /** + * Determines if the stream has reached its EOF. + * + * @return bool + */ + public function stream_eof() { + return $this->position >= \strlen( $this->data ); + } + + /** + * Seeks to a new position. + * + * @param int $offset The amount by which to change the position. + * @param int $whence A flag indicating the direction of the seek operation. + * + * @return bool + */ + public function stream_seek( $offset, $whence ) { + switch ( $whence ) { + case \SEEK_SET: + $this->position = $offset; + $truncate = true; + break; + + case \SEEK_CUR: + $this->position += $offset; + $truncate = true; + break; + + case \SEEK_END: + $this->position = \strlen( $this->data ) + $offset; + $truncate = true; + break; + + default: + $truncate = false; + } + + if ( $truncate ) { + $this->truncate_after_seek(); + } + + return $truncate; + } + + /** + * Truncates the stream after a seek operation beyond its length. + * + * @return void + */ + protected function truncate_after_seek() { + if ( $this->position > \strlen( $this->data ) ) { + $this->stream_truncate( $this->position ); + } + } + + /** + * Truncates the stream to a given size. + * + * @param int $length The new length in bytes. + * + * @return bool + */ + public function stream_truncate( $length ) { + $current_length = \strlen( $this->data ); + + if ( $current_length > $length ) { + $this->data = \substr( $this->data, 0, $length ); + $this->mtime = \time(); + } elseif ( $current_length < $length ) { + $this->data = \str_pad( $this->data, $length, "\0", \STR_PAD_RIGHT ); + $this->mtime = \time(); + } + + return true; + } + + /** + * Retrieves information about the stream. + * + * @return array + * + * @phpstan-return StreamStat + */ + public function stream_stat() { + return [ + 'dev' => 0, + 'ino' => 0, + 'mode' => 0100777, // is_file & mode 0777. + 'nlink' => 0, + 'uid' => 0, + 'gid' => 0, + 'rdev' => 0, + 'size' => \strlen( $this->data ), + 'atime' => isset( $this->atime ) ? $this->atime : 0, + 'mtime' => isset( $this->mtime ) ? $this->mtime : 0, + 'ctime' => isset( $this->mtime ) ? $this->mtime : 0, // We don't have an inode. + 'blksize' => -1, + 'blocks' => -1, + ]; + } + + /** + * Retrieves information about the stream. Non-existing paths are silently + * ignored to simulate folders. + * + * @param string $path The URL. + * @param int $flags Additional flags set by the streams API. + * + * @return array|false + * + * @phpstan-return StreamStat|false + */ + public function url_stat( $path, $flags ) { + $handle = static::get_handle_from_url( $path ); + + if ( static::handle_exists( $handle ) ) { + $h = @\fopen( $path, 'r' ); // phpcs:ignore WordPress.WP.AlternativeFunctions.file_system_operations_fopen + + // If fopen() failed, we are in trouble. + if ( ! \is_resource( $h ) ) { + $this->maybe_trigger_error( ! ( $flags & \STREAM_URL_STAT_QUIET ), 'Error opening stream handle for stat call' ); + + return false; + } + + return \fstat( $h ); + } + + // Since we don't really have folders, treat every other call as if + // STREAM_URL_STAT_QUIET was set. + return [ + 'dev' => 0, + 'ino' => 0, + 'mode' => 0, + 'nlink' => 0, + 'uid' => 0, + 'gid' => 0, + 'rdev' => 0, + 'size' => 0, + 'atime' => 0, + 'mtime' => 0, + 'ctime' => 0, + 'blksize' => -1, + 'blocks' => -1, + ]; + } + + /** + * Implements touch(), chmod(), chown() and chgrp() for the stream. + * + * @param string $path The URL to set the metadata for. + * @param int $option A flag indicating the originating function. + * @param array|string|int $value The arguments of the originating function. + * + * @return bool + * + * @phpstan-param array{ mtime: int, atime: int }|string|int $value + */ + public function stream_metadata( $path, $option, $value ) { + if ( \STREAM_META_TOUCH === $option ) { + $stream = &static::get_data_reference( static::get_handle_from_url( $path ) ); + + $stream[ self::MODIFICATION_TIME ] = isset( $value[0] ) ? (int) $value[0] : \time(); + $stream[ self::ACCESS_TIME ] = isset( $value[1] ) ? (int) $value[1] : $stream[ self::MODIFICATION_TIME ]; + } + + // Ignore metadata changing functions, but simulate success. + return true; + } + + /** + * Unlinks the given URL. + * + * @param string $path The stream URL. + * + * @return bool + */ + public function unlink( $path ) { + $handle = static::get_handle_from_url( $path ); + + if ( empty( $handle ) ) { + return false; + } + + static::delete_handle( $handle ); + + // Clean up local references. + unset( $this->data ); + unset( $this->atime ); + unset( $this->mtime ); + + return true; + } + + /** + * Triggers an error if the trigger condition is fulfilled. + * + * @since 2.4.0 + * + * @param bool $condition Whether the error should be triggered. + * @param string $message The error message. + * @param int $error_level Optional. Only the E_USER_* constants are valid. Default E_USER_ERROR. + * + * @return void + */ + protected function maybe_trigger_error( $condition, $message, $error_level = \E_USER_ERROR ) { + if ( $condition ) { + // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_trigger_error + \trigger_error( \esc_html( $message ), $error_level ); + } + } + + /** + * Retrieves a reference to the handle and creates it if necessary. + * + * @since 2.1.0 Visibility changed to protected and renamed to get_data_reference. + * + * @param string $handle The stream handle. + * + * @return array A reference to the stream data. + * + * @phpstan-return StreamHandle + */ + protected static function &get_data_reference( $handle ) { // phpcs:ignore ImportDetection.Imports.RequireImports.Symbol -- false positive. + if ( ! static::handle_exists( $handle ) ) { + $now = \time(); + + self::$handles[ $handle ] = [ + self::DATA => '', + self::ACCESS_TIME => $now, + self::MODIFICATION_TIME => $now, + ]; + } + + return self::$handles[ $handle ]; + } + + /** + * Determines if the given handle already exists. + * + * @since 2.1.0 Visibility changed to protected. + * + * @param string $handle The stream handle. + * + * @return bool + */ + protected static function handle_exists( $handle ) { + return isset( self::$handles[ $handle ] ); + } + + /** + * Retrieves the stream data and optionally deletes the handle. + * + * @param string $handle The stream handle. + * @param bool $delete Delete the handle after retrieving the stream data. + * + * @return string|null The stream data or null. + */ + public static function get_data( $handle, $delete = false ) { + if ( ! static::handle_exists( $handle ) ) { + return null; + } + + // Save data. + $result = static::get_data_reference( $handle )[ self::DATA ]; + + // Clean up, if requested. + if ( $delete ) { + static::delete_handle( $handle ); + } + + return $result; + } + + /** + * Deletes the given stream handle and its data. + * + * @param string $handle The stream handle. + * + * @return void + */ + public static function delete_handle( $handle ) { + unset( self::$handles[ $handle ] ); + } + + /** + * Retrieves the stream handle from the wrapper URL. + * + * @since 2.4.0 An exception is thrown when an invalid URL is passed to the method. + * + * @param string $url The wrapper URL. + * + * @return string The handle. + * + * @throws \InvalidArgumentException Throws an exception if the URL is not valid. + */ + public static function get_handle_from_url( $url ) { + $parts = \parse_url( $url ); // phpcs:ignore WordPress.WP.AlternativeFunctions.parse_url_parse_url + + // Validate results. + if ( empty( $parts ) ) { + throw new \InvalidArgumentException( "{$url} is not a valid stream URL" ); + } + + $host = $parts['host'] ?? ''; + $path = $parts['path'] ?? '/'; + + return $host . $path; + } + + /** + * Registers the stream wrapper. + * + * @since 2.1.0 + * + * @param string $protocol Optional. The wrapper-specific URL protocol. Default 'avprimg'. + * + * @return void + */ + public static function register( $protocol = self::PROTOCOL ) { + if ( ! \in_array( $protocol, \stream_get_wrappers(), true ) ) { + \stream_wrapper_register( $protocol, static::class ); + } + } +} diff --git a/includes/avatar-privacy/tools/images/class-png.php b/includes/avatar-privacy/tools/images/class-png.php new file mode 100644 index 0000000..c96f868 --- /dev/null +++ b/includes/avatar-privacy/tools/images/class-png.php @@ -0,0 +1,266 @@ + + * + * @internal + * + * @phpstan-import-type RGBValue from Color + * @phpstan-import-type PercentValue from Color + * @phpstan-import-type NormalizedHue from Color + */ +class PNG { + + /** + * The color helper. + * + * @since 2.7.0 + * + * @var Color + */ + private Color $color; + + /** + * Creates a new PNG helper. + * + * @since 2.7.0 + * + * @param Color $color The color helper. + */ + public function __construct( Color $color ) { + $this->color = $color; + } + + /** + * Creates an image resource of the chosen type. + * + * @since 2.5.0 Returns a resource or GdImage instance, depending on the PHP version. + * + * @param string $type The type of background to create. Valid: 'white', 'black', 'transparent'. + * @param int $width Image width in pixels. + * @param int $height Image height in pixels. + * + * @return resource|GdImage + * + * @throws \InvalidArgumentException Called with an incorrect type. + * @throws PNG_Image_Exception The image could not be created. + */ + public function create( $type, $width, $height ) { + /** + * A bitmap image (class or resource). + * + * @var resource|GdImage $image The created GD image. + */ + $image = \imageCreateTrueColor( $width, $height ); + + // Something went wrong, badly. + if ( ! \is_gd_image( $image ) ) { + throw new PNG_Image_Exception( "The image of type {$type} ($width x $height) could not be created." ); // @codeCoverageIgnore + } + + // Don't do alpha blending for the initial fill operation. + \imageAlphaBlending( $image, false ); + \imageSaveAlpha( $image, true ); + + try { + // Fill image with appropriate color. + switch ( $type ) { + case 'transparent': + $color = \imageColorAllocateAlpha( $image, 0, 0, 0, 127 ); + break; + + case 'white': + $color = \imageColorAllocateAlpha( $image, 255, 255, 255, 0 ); + break; + + case 'black': + // No need to do anything else. + return $image; + + default: + throw new \InvalidArgumentException( "Invalid image type $type." ); + } + + if ( false === $color || ! \imageFilledRectangle( $image, 0, 0, $width, $height, $color ) ) { + throw new PNG_Image_Exception( "Error filling image of type $type." ); // @codeCoverageIgnore + } + } catch ( PNG_Image_Exception $e ) { + // Clean up and re-throw exception. + \imageDestroy( $image ); // @codeCoverageIgnoreStart + throw $e; // @codeCoverageIgnoreEnd + } + + // Fix transparent background. + \imageAlphaBlending( $image, true ); + + return $image; + } + + /** + * Creates an image resource from the given file. + * + * @since 2.5.0 Returns a resource or GdImage instance, depending on the PHP version. + * + * @param string $file The absolute path to a PNG image file. + * + * @return resource|GdImage + * + * @throws PNG_Image_Exception The image could not be read. + */ + public function create_from_file( $file ) { + /** + * A bitmap image (class or resource). + * + * @var resource|GdImage $image The created GD image. + */ + $image = @\imageCreateFromPNG( $file ); + + // Something went wrong, badly. + if ( ! \is_gd_image( $image ) ) { + throw new PNG_Image_Exception( "The PNG image {$file} could not be read." ); + } + + // Fix transparent background. + \imageAlphaBlending( $image, true ); + \imageSaveAlpha( $image, true ); + + return $image; + } + + /** + * Copies an image onto an existing base image. The image resource is freed + * after copying. + * + * @since 2.5.0 Parameters $base and $image can now also be instances of GdImage. + * + * @param resource|GdImage $base The avatar image resource. + * @param resource|GdImage $image The image to be copied onto the base. + * @param int $width Image width in pixels. + * @param int $height Image height in pixels. + * + * @return void + * + * @throws \InvalidArgumentException One of the first two parameters was not a valid image resource. + * @throws PNG_Image_Exception The image could not be copied. + */ + public function combine( $base, $image, $width, $height ) { + + // Abort if $image is not a valid resource. + if ( ! \is_gd_image( $base ) || ! \is_gd_image( $image ) ) { + throw new \InvalidArgumentException( 'Invalid image resource.' ); + } + + // Copy the image to the base. + $result = \imageCopy( $base, $image, 0, 0, 0, 0, $width, $height ); + + // Clean up. + \imageDestroy( $image ); + + // Return copy success status. + if ( ! $result ) { + throw new PNG_Image_Exception( 'Error while copying image.' ); // @codeCoverageIgnore + } + } + + /** + * Fills the given image with a HSL color. + * + * @since 2.5.0 Parameter $image can now also be a GdImage. + * + * @param resource|GdImage $image The image. + * @param int $hue The hue (0-359). + * @param int $saturation The saturation (0-100). + * @param int $lightness The lightness/Luminosity (0-100). + * @param int $x The horizontal coordinate. + * @param int $y The vertical coordinate. + * + * @return void + * + * @throws \InvalidArgumentException Not a valid image resource. + * @throws PNG_Image_Exception The image could not be filled. + * + * @phpstan-param NormalizedHue $hue + * @phpstan-param PercentValue $saturation + * @phpstan-param PercentValue $lightness + */ + public function fill_hsl( $image, $hue, $saturation, $lightness, $x, $y ) { + // Abort if $image is not a valid resource. + if ( ! \is_gd_image( $image ) ) { + throw new \InvalidArgumentException( 'Invalid image resource.' ); + } + + list( $red, $green, $blue ) = $this->color->hsl_to_rgb( $hue, $saturation, $lightness ); + $color = \imageColorAllocate( $image, $red, $green, $blue ); + + if ( false === $color || ! \imageFill( $image, $x, $y, $color ) ) { + throw new PNG_Image_Exception( "Error filling image with HSL ({$hue}, {$saturation}, {$lightness})." ); // @codeCoverageIgnore + } + } + + /** + * Converts a color specified using HSL to its RGB representation. + * + * @since 2.5.0 + * + * @deprecated 2.7.0 Use Color::hsl_to_rgb instead. + * + * @param int $hue The hue (in degrees, i.e. 0-359). + * @param int $saturation The saturation (in percent, i.e. 0-100). + * @param int $lightness The lightness (in percent, i.e. 0-100). + * + * @return int[] { + * The RGB color as a tuple. + * + * @type int $red The red component (0-255). + * @type int $green The green component (0-255). + * @type int $blue The blue component (0-255). + * } + * + * @phpstan-param NormalizedHue $hue + * @phpstan-param PercentValue $saturation + * @phpstan-param PercentValue $lightness + * @phpstan-return array{ 0: RGBValue, 1: RGBValue, 2: RGBValue } + */ + public function hsl_to_rgb( $hue, $saturation, $lightness ) { + \_deprecated_function( __METHOD__, 'Avatar Privacy 2.7.0', 'Avatar_Privacy\Tools\Images\Color::hsl_to_rgb' ); + + return $this->color->hsl_to_rgb( $hue, $saturation, $lightness ); + } +} diff --git a/includes/avatar-privacy/tools/images/class-svg.php b/includes/avatar-privacy/tools/images/class-svg.php new file mode 100644 index 0000000..900eb26 --- /dev/null +++ b/includes/avatar-privacy/tools/images/class-svg.php @@ -0,0 +1,716 @@ + + */ +abstract class SVG { + + // SVG attributes. + const ATTR_CLASS = 'class'; + const ATTR_CLIPPATHUNITS = 'clippathunits'; + const ATTR_CLIP_PATH = 'clip-path'; + const ATTR_CLIP_RULE = 'clip-rule'; + const ATTR_COLOR_INTERPOLATION_FILTERS = 'color-interpolation-filters'; + const ATTR_CX = 'cx'; + const ATTR_CY = 'cy'; + const ATTR_D = 'd'; + const ATTR_DISPLAY = 'display'; + const ATTR_DX = 'dx'; + const ATTR_DY = 'dy'; + const ATTR_FILL = 'fill'; + const ATTR_FILL_OPACITY = 'fill-opacity'; + const ATTR_FILL_RULE = 'fill-rule'; + const ATTR_FILTER = 'filter'; + const ATTR_FILTERRES = 'filterres'; + const ATTR_FILTERUNITS = 'filterunits'; + const ATTR_FONT_FAMILY = 'font-family'; + const ATTR_FONT_SIZE = 'font-size'; + const ATTR_FONT_STYLE = 'font-style'; + const ATTR_FONT_WEIGHT = 'font-weight'; + const ATTR_FX = 'fx'; + const ATTR_FY = 'fy'; + const ATTR_GRADIENTTRANSFORM = 'gradienttransform'; + const ATTR_GRADIENTUNITS = 'gradientunits'; + const ATTR_HEIGHT = 'height'; + const ATTR_HREF = 'href'; + const ATTR_ID = 'id'; + const ATTR_MARKERHEIGHT = 'markerheight'; + const ATTR_MARKERUNITS = 'markerunits'; + const ATTR_MARKERWIDTH = 'markerwidth'; + const ATTR_MARKER_END = 'marker-end'; + const ATTR_MARKER_MID = 'marker-mid'; + const ATTR_MARKER_START = 'marker-start'; + const ATTR_MASK = 'mask'; + const ATTR_MASKEDCONTENTUNITS = 'maskcontentunits'; + const ATTR_MASKUNITS = 'maskunits'; + const ATTR_METHOD = 'method'; + const ATTR_OFFSET = 'offset'; + const ATTR_OPACITY = 'opacity'; + const ATTR_ORIENT = 'orient'; + const ATTR_PATTERNCONTENTUNITS = 'patterncontentunits'; + const ATTR_PATTERNTRANSFORM = 'patterntransform'; + const ATTR_PATTERNUNITS = 'patternunits'; + const ATTR_POINTS = 'points'; + const ATTR_PRESERVEASPECTRATIO = 'preserveaspectratio'; + const ATTR_PRIMITIVEUNITS = 'primitiveunits'; + const ATTR_R = 'r'; + const ATTR_REFX = 'refx'; + const ATTR_REFY = 'refy'; + const ATTR_REQUIREDFEATURES = 'requiredfeatures'; + const ATTR_ROTATE = 'rotate'; + const ATTR_RX = 'rx'; + const ATTR_RY = 'ry'; + const ATTR_SPACING = 'spacing'; + const ATTR_SPREADMETHOD = 'spreadmethod'; + const ATTR_STARTOFFSET = 'startoffset'; + const ATTR_STDDEVIATION = 'stddeviation'; + const ATTR_STOP_COLOR = 'stop-color'; + const ATTR_STOP_OPACITY = 'stop-opacity'; + const ATTR_STROKE = 'stroke'; + const ATTR_STROKE_DASHARRAY = 'stroke-dasharray'; + const ATTR_STROKE_DASHOFFSET = 'stroke-dashoffset'; + const ATTR_STROKE_LINECAP = 'stroke-linecap'; + const ATTR_STROKE_LINEJOIN = 'stroke-linejoin'; + const ATTR_STROKE_MITERLIMIT = 'stroke-miterlimit'; + const ATTR_STROKE_OPACITY = 'stroke-opacity'; + const ATTR_STROKE_WIDTH = 'stroke-width'; + const ATTR_STYLE = 'style'; + const ATTR_SYSTEMLANGUAGE = 'systemlanguage'; + const ATTR_TEXTLENGTH = 'textlength'; + const ATTR_TEXT_ANCHOR = 'text-anchor'; + const ATTR_TRANSFORM = 'transform'; + const ATTR_TYPE = 'type'; + const ATTR_WIDTH = 'width'; + const ATTR_VIEWBOX = 'viewbox'; + const ATTR_X = 'x'; + const ATTR_X1 = 'x1'; + const ATTR_X2 = 'x2'; + const ATTR_XLINK_HREF = 'xlink:href'; + const ATTR_XLINK_TITLE = 'xlink:title'; + const ATTR_XMLNS = 'xmlns'; + const ATTR_XMLNS_SE = 'xmlns:se'; + const ATTR_XMLNS_XLINK = 'xmlns:xlink'; + const ATTR_XML_SPACE = 'xml:space'; + const ATTR_Y = 'y'; + const ATTR_Y1 = 'y1'; + const ATTR_Y2 = 'y2'; + + /** + * An array of allowed elements and attributes in wp_kses syntax. + * + * List initially compiled by Michael Pollett in Trac #24251. + * + * @link https://core.trac.wordpress.org/ticket/24251 + * + * @var array> + */ + const ALLOWED_ELEMENTS = [ + 'a' => [ + self::ATTR_CLASS => true, + self::ATTR_CLIP_PATH => true, + self::ATTR_CLIP_RULE => true, + self::ATTR_FILL => true, + self::ATTR_FILL_OPACITY => true, + self::ATTR_FILL_RULE => true, + self::ATTR_FILTER => true, + self::ATTR_ID => true, + self::ATTR_MASK => true, + self::ATTR_OPACITY => true, + self::ATTR_STROKE => true, + self::ATTR_STROKE_DASHARRAY => true, + self::ATTR_STROKE_DASHOFFSET => true, + self::ATTR_STROKE_LINECAP => true, + self::ATTR_STROKE_LINEJOIN => true, + self::ATTR_STROKE_MITERLIMIT => true, + self::ATTR_STROKE_OPACITY => true, + self::ATTR_STROKE_WIDTH => true, + self::ATTR_STYLE => true, + self::ATTR_SYSTEMLANGUAGE => true, + self::ATTR_TRANSFORM => true, + self::ATTR_HREF => true, + self::ATTR_XLINK_HREF => true, + self::ATTR_XLINK_TITLE => true, + ], + 'circle' => [ + self::ATTR_CLASS => true, + self::ATTR_CLIP_PATH => true, + self::ATTR_CLIP_RULE => true, + self::ATTR_CX => true, + self::ATTR_CY => true, + self::ATTR_FILL => true, + self::ATTR_FILL_OPACITY => true, + self::ATTR_FILL_RULE => true, + self::ATTR_FILTER => true, + self::ATTR_ID => true, + self::ATTR_MASK => true, + self::ATTR_OPACITY => true, + self::ATTR_R => true, + self::ATTR_REQUIREDFEATURES => true, + self::ATTR_STROKE => true, + self::ATTR_STROKE_DASHARRAY => true, + self::ATTR_STROKE_DASHOFFSET => true, + self::ATTR_STROKE_LINECAP => true, + self::ATTR_STROKE_LINEJOIN => true, + self::ATTR_STROKE_MITERLIMIT => true, + self::ATTR_STROKE_OPACITY => true, + self::ATTR_STROKE_WIDTH => true, + self::ATTR_STYLE => true, + self::ATTR_SYSTEMLANGUAGE => true, + self::ATTR_TRANSFORM => true, + ], + 'clippath' => [ + self::ATTR_CLASS => true, + self::ATTR_CLIPPATHUNITS => true, + self::ATTR_ID => true, + ], + 'defs' => [ + // Global attributes. + self::ATTR_CLASS => true, + self::ATTR_ID => true, + self::ATTR_STYLE => true, + ], + 'style' => [ + self::ATTR_TYPE => true, + ], + 'desc' => [ + // Global attributes. + self::ATTR_CLASS => true, + self::ATTR_ID => true, + self::ATTR_STYLE => true, + ], + 'ellipse' => [ + self::ATTR_CLASS => true, + self::ATTR_CLIP_PATH => true, + self::ATTR_CLIP_RULE => true, + self::ATTR_CX => true, + self::ATTR_CY => true, + self::ATTR_FILL => true, + self::ATTR_FILL_OPACITY => true, + self::ATTR_FILL_RULE => true, + self::ATTR_FILTER => true, + self::ATTR_ID => true, + self::ATTR_MASK => true, + self::ATTR_OPACITY => true, + self::ATTR_REQUIREDFEATURES => true, + self::ATTR_RX => true, + self::ATTR_RY => true, + self::ATTR_STROKE => true, + self::ATTR_STROKE_DASHARRAY => true, + self::ATTR_STROKE_DASHOFFSET => true, + self::ATTR_STROKE_LINECAP => true, + self::ATTR_STROKE_LINEJOIN => true, + self::ATTR_STROKE_MITERLIMIT => true, + self::ATTR_STROKE_OPACITY => true, + self::ATTR_STROKE_WIDTH => true, + self::ATTR_STYLE => true, + self::ATTR_SYSTEMLANGUAGE => true, + self::ATTR_TRANSFORM => true, + ], + 'fegaussianblur' => [ + self::ATTR_CLASS => true, + self::ATTR_COLOR_INTERPOLATION_FILTERS => true, + self::ATTR_ID => true, + self::ATTR_REQUIREDFEATURES => true, + self::ATTR_STDDEVIATION => true, + ], + 'filter' => [ + self::ATTR_CLASS => true, + self::ATTR_COLOR_INTERPOLATION_FILTERS => true, + self::ATTR_FILTERRES => true, + self::ATTR_FILTERUNITS => true, + self::ATTR_HEIGHT => true, + self::ATTR_ID => true, + self::ATTR_PRIMITIVEUNITS => true, + self::ATTR_REQUIREDFEATURES => true, + self::ATTR_WIDTH => true, + self::ATTR_X => true, + self::ATTR_XLINK_HREF => true, + self::ATTR_Y => true, + ], + 'foreignobject' => [ + self::ATTR_CLASS => true, + self::ATTR_FONT_SIZE => true, + self::ATTR_HEIGHT => true, + self::ATTR_ID => true, + self::ATTR_OPACITY => true, + self::ATTR_REQUIREDFEATURES => true, + self::ATTR_STYLE => true, + self::ATTR_TRANSFORM => true, + self::ATTR_WIDTH => true, + self::ATTR_X => true, + self::ATTR_Y => true, + ], + 'g' => [ + self::ATTR_CLASS => true, + self::ATTR_CLIP_PATH => true, + self::ATTR_CLIP_RULE => true, + self::ATTR_ID => true, + self::ATTR_DISPLAY => true, + self::ATTR_FILL => true, + self::ATTR_FILL_OPACITY => true, + self::ATTR_FILL_RULE => true, + self::ATTR_FILTER => true, + self::ATTR_MASK => true, + self::ATTR_OPACITY => true, + self::ATTR_REQUIREDFEATURES => true, + self::ATTR_STROKE => true, + self::ATTR_STROKE_DASHARRAY => true, + self::ATTR_STROKE_DASHOFFSET => true, + self::ATTR_STROKE_LINECAP => true, + self::ATTR_STROKE_LINEJOIN => true, + self::ATTR_STROKE_MITERLIMIT => true, + self::ATTR_STROKE_OPACITY => true, + self::ATTR_STROKE_WIDTH => true, + self::ATTR_STYLE => true, + self::ATTR_SYSTEMLANGUAGE => true, + self::ATTR_TRANSFORM => true, + self::ATTR_FONT_FAMILY => true, + self::ATTR_FONT_SIZE => true, + self::ATTR_FONT_STYLE => true, + self::ATTR_FONT_WEIGHT => true, + self::ATTR_TEXT_ANCHOR => true, + ], + 'image' => [ + self::ATTR_CLASS => true, + self::ATTR_CLIP_PATH => true, + self::ATTR_CLIP_RULE => true, + self::ATTR_FILTER => true, + self::ATTR_HEIGHT => true, + self::ATTR_ID => true, + self::ATTR_MASK => true, + self::ATTR_OPACITY => true, + self::ATTR_REQUIREDFEATURES => true, + self::ATTR_STYLE => true, + self::ATTR_SYSTEMLANGUAGE => true, + self::ATTR_TRANSFORM => true, + self::ATTR_WIDTH => true, + self::ATTR_X => true, + self::ATTR_XLINK_HREF => true, + self::ATTR_XLINK_TITLE => true, + self::ATTR_Y => true, + ], + 'line' => [ + self::ATTR_CLASS => true, + self::ATTR_CLIP_PATH => true, + self::ATTR_CLIP_RULE => true, + self::ATTR_FILL => true, + self::ATTR_FILL_OPACITY => true, + self::ATTR_FILL_RULE => true, + self::ATTR_FILTER => true, + self::ATTR_ID => true, + self::ATTR_MARKER_END => true, + self::ATTR_MARKER_MID => true, + self::ATTR_MARKER_START => true, + self::ATTR_MASK => true, + self::ATTR_OPACITY => true, + self::ATTR_REQUIREDFEATURES => true, + self::ATTR_STROKE => true, + self::ATTR_STROKE_DASHARRAY => true, + self::ATTR_STROKE_DASHOFFSET => true, + self::ATTR_STROKE_LINECAP => true, + self::ATTR_STROKE_LINEJOIN => true, + self::ATTR_STROKE_MITERLIMIT => true, + self::ATTR_STROKE_OPACITY => true, + self::ATTR_STROKE_WIDTH => true, + self::ATTR_STYLE => true, + self::ATTR_SYSTEMLANGUAGE => true, + self::ATTR_TRANSFORM => true, + self::ATTR_X1 => true, + self::ATTR_X2 => true, + self::ATTR_Y1 => true, + self::ATTR_Y2 => true, + ], + 'lineargradient' => [ + self::ATTR_CLASS => true, + self::ATTR_ID => true, + self::ATTR_GRADIENTTRANSFORM => true, + self::ATTR_GRADIENTUNITS => true, + self::ATTR_REQUIREDFEATURES => true, + self::ATTR_SPREADMETHOD => true, + self::ATTR_SYSTEMLANGUAGE => true, + self::ATTR_X1 => true, + self::ATTR_X2 => true, + self::ATTR_XLINK_HREF => true, + self::ATTR_Y1 => true, + self::ATTR_Y2 => true, + ], + 'marker' => [ + self::ATTR_ID => true, + self::ATTR_CLASS => true, + self::ATTR_MARKERHEIGHT => true, + self::ATTR_MARKERUNITS => true, + self::ATTR_MARKERWIDTH => true, + self::ATTR_ORIENT => true, + self::ATTR_PRESERVEASPECTRATIO => true, + self::ATTR_REFX => true, + self::ATTR_REFY => true, + self::ATTR_SYSTEMLANGUAGE => true, + self::ATTR_VIEWBOX => true, + ], + 'mask' => [ + self::ATTR_CLASS => true, + self::ATTR_HEIGHT => true, + self::ATTR_ID => true, + self::ATTR_MASKEDCONTENTUNITS => true, + self::ATTR_MASKUNITS => true, + self::ATTR_WIDTH => true, + self::ATTR_X => true, + self::ATTR_Y => true, + ], + 'metadata' => [ + self::ATTR_CLASS => true, + self::ATTR_ID => true, + ], + 'path' => [ + self::ATTR_CLASS => true, + self::ATTR_CLIP_PATH => true, + self::ATTR_CLIP_RULE => true, + self::ATTR_D => true, + self::ATTR_FILL => true, + self::ATTR_FILL_OPACITY => true, + self::ATTR_FILL_RULE => true, + self::ATTR_FILTER => true, + self::ATTR_ID => true, + self::ATTR_MARKER_END => true, + self::ATTR_MARKER_MID => true, + self::ATTR_MARKER_START => true, + self::ATTR_MASK => true, + self::ATTR_OPACITY => true, + self::ATTR_REQUIREDFEATURES => true, + self::ATTR_STROKE => true, + self::ATTR_STROKE_DASHARRAY => true, + self::ATTR_STROKE_DASHOFFSET => true, + self::ATTR_STROKE_LINECAP => true, + self::ATTR_STROKE_LINEJOIN => true, + self::ATTR_STROKE_MITERLIMIT => true, + self::ATTR_STROKE_OPACITY => true, + self::ATTR_STROKE_WIDTH => true, + self::ATTR_STYLE => true, + self::ATTR_SYSTEMLANGUAGE => true, + self::ATTR_TRANSFORM => true, + ], + 'pattern' => [ + self::ATTR_CLASS => true, + self::ATTR_HEIGHT => true, + self::ATTR_ID => true, + self::ATTR_PATTERNCONTENTUNITS => true, + self::ATTR_PATTERNTRANSFORM => true, + self::ATTR_PATTERNUNITS => true, + self::ATTR_REQUIREDFEATURES => true, + self::ATTR_STYLE => true, + self::ATTR_SYSTEMLANGUAGE => true, + self::ATTR_VIEWBOX => true, + self::ATTR_WIDTH => true, + self::ATTR_X => true, + self::ATTR_XLINK_HREF => true, + self::ATTR_Y => true, + ], + 'polygon' => [ + self::ATTR_CLASS => true, + self::ATTR_CLIP_PATH => true, + self::ATTR_CLIP_RULE => true, + self::ATTR_FILL => true, + self::ATTR_FILL_OPACITY => true, + self::ATTR_FILL_RULE => true, + self::ATTR_FILTER => true, + self::ATTR_ID => true, + self::ATTR_MARKER_END => true, + self::ATTR_MARKER_MID => true, + self::ATTR_MARKER_START => true, + self::ATTR_MASK => true, + self::ATTR_OPACITY => true, + self::ATTR_POINTS => true, + self::ATTR_REQUIREDFEATURES => true, + self::ATTR_STROKE => true, + self::ATTR_STROKE_DASHARRAY => true, + self::ATTR_STROKE_DASHOFFSET => true, + self::ATTR_STROKE_LINECAP => true, + self::ATTR_STROKE_LINEJOIN => true, + self::ATTR_STROKE_MITERLIMIT => true, + self::ATTR_STROKE_OPACITY => true, + self::ATTR_STROKE_WIDTH => true, + self::ATTR_STYLE => true, + self::ATTR_SYSTEMLANGUAGE => true, + self::ATTR_TRANSFORM => true, + ], + 'polyline' => [ + self::ATTR_CLASS => true, + self::ATTR_CLIP_PATH => true, + self::ATTR_CLIP_RULE => true, + self::ATTR_ID => true, + self::ATTR_FILL => true, + self::ATTR_FILL_OPACITY => true, + self::ATTR_FILL_RULE => true, + self::ATTR_FILTER => true, + self::ATTR_MARKER_END => true, + self::ATTR_MARKER_MID => true, + self::ATTR_MARKER_START => true, + self::ATTR_MASK => true, + self::ATTR_OPACITY => true, + self::ATTR_POINTS => true, + self::ATTR_REQUIREDFEATURES => true, + self::ATTR_STROKE => true, + self::ATTR_STROKE_DASHARRAY => true, + self::ATTR_STROKE_DASHOFFSET => true, + self::ATTR_STROKE_LINECAP => true, + self::ATTR_STROKE_LINEJOIN => true, + self::ATTR_STROKE_MITERLIMIT => true, + self::ATTR_STROKE_OPACITY => true, + self::ATTR_STROKE_WIDTH => true, + self::ATTR_STYLE => true, + self::ATTR_SYSTEMLANGUAGE => true, + self::ATTR_TRANSFORM => true, + ], + 'radialgradient' => [ + self::ATTR_CLASS => true, + self::ATTR_CX => true, + self::ATTR_CY => true, + self::ATTR_FX => true, + self::ATTR_FY => true, + self::ATTR_GRADIENTTRANSFORM => true, + self::ATTR_GRADIENTUNITS => true, + self::ATTR_ID => true, + self::ATTR_R => true, + self::ATTR_REQUIREDFEATURES => true, + self::ATTR_SPREADMETHOD => true, + self::ATTR_SYSTEMLANGUAGE => true, + self::ATTR_XLINK_HREF => true, + ], + 'rect' => [ + self::ATTR_CLASS => true, + self::ATTR_CLIP_PATH => true, + self::ATTR_CLIP_RULE => true, + self::ATTR_FILL => true, + self::ATTR_FILL_OPACITY => true, + self::ATTR_FILL_RULE => true, + self::ATTR_FILTER => true, + self::ATTR_HEIGHT => true, + self::ATTR_ID => true, + self::ATTR_MASK => true, + self::ATTR_OPACITY => true, + self::ATTR_REQUIREDFEATURES => true, + self::ATTR_RX => true, + self::ATTR_RY => true, + self::ATTR_STROKE => true, + self::ATTR_STROKE_DASHARRAY => true, + self::ATTR_STROKE_DASHOFFSET => true, + self::ATTR_STROKE_LINECAP => true, + self::ATTR_STROKE_LINEJOIN => true, + self::ATTR_STROKE_MITERLIMIT => true, + self::ATTR_STROKE_OPACITY => true, + self::ATTR_STROKE_WIDTH => true, + self::ATTR_STYLE => true, + self::ATTR_SYSTEMLANGUAGE => true, + self::ATTR_TRANSFORM => true, + self::ATTR_WIDTH => true, + self::ATTR_X => true, + self::ATTR_Y => true, + ], + 'stop' => [ + self::ATTR_CLASS => true, + self::ATTR_ID => true, + self::ATTR_OFFSET => true, + self::ATTR_REQUIREDFEATURES => true, + self::ATTR_STOP_COLOR => true, + self::ATTR_STOP_OPACITY => true, + self::ATTR_STYLE => true, + self::ATTR_SYSTEMLANGUAGE => true, + ], + 'svg' => [ + self::ATTR_CLASS => true, + self::ATTR_CLIP_PATH => true, + self::ATTR_CLIP_RULE => true, + self::ATTR_FILTER => true, + self::ATTR_ID => true, + self::ATTR_HEIGHT => true, + self::ATTR_MASK => true, + self::ATTR_PRESERVEASPECTRATIO => true, + self::ATTR_REQUIREDFEATURES => true, + self::ATTR_STYLE => true, + self::ATTR_SYSTEMLANGUAGE => true, + self::ATTR_VIEWBOX => true, + self::ATTR_WIDTH => true, + self::ATTR_X => true, + self::ATTR_XMLNS => true, + self::ATTR_XMLNS_SE => true, + self::ATTR_XMLNS_XLINK => true, + self::ATTR_Y => true, + ], + 'switch' => [ + self::ATTR_CLASS => true, + self::ATTR_ID => true, + self::ATTR_REQUIREDFEATURES => true, + self::ATTR_SYSTEMLANGUAGE => true, + ], + 'symbol' => [ + self::ATTR_CLASS => true, + self::ATTR_FILL => true, + self::ATTR_FILL_OPACITY => true, + self::ATTR_FILL_RULE => true, + self::ATTR_FILTER => true, + self::ATTR_FONT_FAMILY => true, + self::ATTR_FONT_SIZE => true, + self::ATTR_FONT_STYLE => true, + self::ATTR_FONT_WEIGHT => true, + self::ATTR_ID => true, + self::ATTR_OPACITY => true, + self::ATTR_PRESERVEASPECTRATIO => true, + self::ATTR_REQUIREDFEATURES => true, + self::ATTR_STROKE => true, + self::ATTR_STROKE_DASHARRAY => true, + self::ATTR_STROKE_DASHOFFSET => true, + self::ATTR_STROKE_LINECAP => true, + self::ATTR_STROKE_LINEJOIN => true, + self::ATTR_STROKE_MITERLIMIT => true, + self::ATTR_STROKE_OPACITY => true, + self::ATTR_STROKE_WIDTH => true, + self::ATTR_STYLE => true, + self::ATTR_SYSTEMLANGUAGE => true, + self::ATTR_TRANSFORM => true, + self::ATTR_VIEWBOX => true, + ], + 'text' => [ + self::ATTR_CLASS => true, + self::ATTR_CLIP_PATH => true, + self::ATTR_CLIP_RULE => true, + self::ATTR_FILL => true, + self::ATTR_FILL_OPACITY => true, + self::ATTR_FILL_RULE => true, + self::ATTR_FILTER => true, + self::ATTR_FONT_FAMILY => true, + self::ATTR_FONT_SIZE => true, + self::ATTR_FONT_STYLE => true, + self::ATTR_FONT_WEIGHT => true, + self::ATTR_ID => true, + self::ATTR_MASK => true, + self::ATTR_OPACITY => true, + self::ATTR_REQUIREDFEATURES => true, + self::ATTR_STROKE => true, + self::ATTR_STROKE_DASHARRAY => true, + self::ATTR_STROKE_DASHOFFSET => true, + self::ATTR_STROKE_LINECAP => true, + self::ATTR_STROKE_LINEJOIN => true, + self::ATTR_STROKE_MITERLIMIT => true, + self::ATTR_STROKE_OPACITY => true, + self::ATTR_STROKE_WIDTH => true, + self::ATTR_STYLE => true, + self::ATTR_SYSTEMLANGUAGE => true, + self::ATTR_TEXT_ANCHOR => true, + self::ATTR_TRANSFORM => true, + self::ATTR_X => true, + self::ATTR_XML_SPACE => true, + self::ATTR_Y => true, + ], + 'textpath' => [ + self::ATTR_CLASS => true, + self::ATTR_ID => true, + self::ATTR_METHOD => true, + self::ATTR_REQUIREDFEATURES => true, + self::ATTR_SPACING => true, + self::ATTR_STARTOFFSET => true, + self::ATTR_STYLE => true, + self::ATTR_SYSTEMLANGUAGE => true, + self::ATTR_TRANSFORM => true, + self::ATTR_XLINK_HREF => true, + ], + 'title' => [ + // Global attributes. + self::ATTR_CLASS => true, + self::ATTR_ID => true, + self::ATTR_STYLE => true, + ], + 'tspan' => [ + self::ATTR_CLASS => true, + self::ATTR_CLIP_PATH => true, + self::ATTR_CLIP_RULE => true, + self::ATTR_DX => true, + self::ATTR_DY => true, + self::ATTR_FILL => true, + self::ATTR_FILL_OPACITY => true, + self::ATTR_FILL_RULE => true, + self::ATTR_FILTER => true, + self::ATTR_FONT_FAMILY => true, + self::ATTR_FONT_SIZE => true, + self::ATTR_FONT_STYLE => true, + self::ATTR_FONT_WEIGHT => true, + self::ATTR_ID => true, + self::ATTR_MASK => true, + self::ATTR_OPACITY => true, + self::ATTR_REQUIREDFEATURES => true, + self::ATTR_ROTATE => true, + self::ATTR_STROKE => true, + self::ATTR_STROKE_DASHARRAY => true, + self::ATTR_STROKE_DASHOFFSET => true, + self::ATTR_STROKE_LINECAP => true, + self::ATTR_STROKE_LINEJOIN => true, + self::ATTR_STROKE_MITERLIMIT => true, + self::ATTR_STROKE_OPACITY => true, + self::ATTR_STROKE_WIDTH => true, + self::ATTR_STYLE => true, + self::ATTR_SYSTEMLANGUAGE => true, + self::ATTR_TEXT_ANCHOR => true, + self::ATTR_TEXTLENGTH => true, + self::ATTR_TRANSFORM => true, + self::ATTR_X => true, + self::ATTR_XML_SPACE => true, + self::ATTR_Y => true, + ], + 'use' => [ + self::ATTR_CLASS => true, + self::ATTR_CLIP_PATH => true, + self::ATTR_CLIP_RULE => true, + self::ATTR_FILL => true, + self::ATTR_FILL_OPACITY => true, + self::ATTR_FILL_RULE => true, + self::ATTR_FILTER => true, + self::ATTR_HEIGHT => true, + self::ATTR_ID => true, + self::ATTR_MASK => true, + self::ATTR_STROKE => true, + self::ATTR_STROKE_DASHARRAY => true, + self::ATTR_STROKE_DASHOFFSET => true, + self::ATTR_STROKE_LINECAP => true, + self::ATTR_STROKE_LINEJOIN => true, + self::ATTR_STROKE_MITERLIMIT => true, + self::ATTR_STROKE_OPACITY => true, + self::ATTR_STROKE_WIDTH => true, + self::ATTR_STYLE => true, + self::ATTR_TRANSFORM => true, + self::ATTR_WIDTH => true, + self::ATTR_X => true, + self::ATTR_XLINK_HREF => true, + self::ATTR_Y => true, + ], + ]; +} diff --git a/includes/avatar-privacy/tools/images/class-type.php b/includes/avatar-privacy/tools/images/class-type.php new file mode 100644 index 0000000..c253382 --- /dev/null +++ b/includes/avatar-privacy/tools/images/class-type.php @@ -0,0 +1,62 @@ + + */ +abstract class Type { + const JPEG_IMAGE = Image_File::JPEG_IMAGE; + const PNG_IMAGE = Image_File::PNG_IMAGE; + const SVG_IMAGE = Image_File::SVG_IMAGE; + + const JPEG_EXTENSION = Image_File::JPEG_EXTENSION; + const JPEG_ALT_EXTENSION = Image_File::JPEG_ALT_EXTENSION; + const PNG_EXTENSION = Image_File::PNG_EXTENSION; + const SVG_EXTENSION = Image_File::SVG_EXTENSION; + + const CONTENT_TYPE = [ + self::JPEG_EXTENSION => self::JPEG_IMAGE, + self::JPEG_ALT_EXTENSION => self::JPEG_IMAGE, + self::PNG_EXTENSION => self::PNG_IMAGE, + self::SVG_EXTENSION => self::SVG_IMAGE, + ]; + + const FILE_EXTENSION = [ + self::JPEG_IMAGE => self::JPEG_EXTENSION, + self::PNG_IMAGE => self::PNG_EXTENSION, + self::SVG_IMAGE => self::SVG_EXTENSION, + ]; +} diff --git a/includes/avatar-privacy/tools/network/class-gravatar-service.php b/includes/avatar-privacy/tools/network/class-gravatar-service.php new file mode 100644 index 0000000..71f2c44 --- /dev/null +++ b/includes/avatar-privacy/tools/network/class-gravatar-service.php @@ -0,0 +1,287 @@ + + */ +class Gravatar_Service { + + /** + * A cache for the results of the validate method. + * + * @var string[] + */ + private $validation_cache = []; + + /** + * The transients handler. + * + * @var Transients + */ + private $transients; + + /** + * The site transients handler. + * + * @var Site_Transients + */ + private $site_transients; + + /** + * The image editor. + * + * @since 2.3.0 + * + * @var Editor + */ + private $editor; + + /** + * Creates a new instance. + * + * @since 2.3.0 Parameter $editor added. + * + * @param Transients $transients The transients handler. + * @param Site_Transients $site_transients The site transients handler. + * @param Editor $editor The image editor. + */ + public function __construct( Transients $transients, Site_Transients $site_transients, Editor $editor ) { + $this->transients = $transients; + $this->site_transients = $site_transients; + $this->editor = $editor; + } + + /** + * Retrieves the gravatar image for a given e-mail address. + * + * @param string $email The e-mail address. + * @param int $size The size in pixels. + * @param string $rating The audience rating. + * + * @return string The image data. + */ + public function get_image( $email, $size, $rating ) { + $image = \wp_remote_retrieve_body( + \wp_remote_get( $this->get_url( $email, $size, $rating ) ) + ); + + if ( false === $this->editor->get_mime_type( $image ) ) { + // Propably a Varnish error, so we ignore the data. + $image = ''; + } + + return $image; + } + + /** + * Constructs the Gravatar.com service URL from the given parameters. + * + * @param string $email The email address. + * @param int $size Optional. The size in pixels. Default 80 (the same as Gravatar.com). + * @param string $rating Optional. Either 'g', 'pg', 'r', or 'x'. Default 'x' (to allow any image). + * + * @return string + */ + public function get_url( $email, $size = 80, $rating = 'x' ) { + $args = [ + 'd' => '404', // We are never interested in gravatar default images. + 's' => empty( $size ) ? '' : $size, + 'r' => $rating, + ]; + + return \esc_url_raw( \add_query_arg( $args, "https://secure.gravatar.com/avatar/{$this->get_hash( $email )}" ) ); + } + + /** + * Creates a hash from the given mail address using the SHA-256 algorithm. + * + * @since 2.1.0 Visibility changed to protected. + * + * @param string $email An email address. + * + * @return string + */ + protected function get_hash( $email ) { + return \md5( \strtolower( \trim( $email ) ) ); + } + + /** + * Checks if a gravatar exists for the given e-mail address and returns the + * MIME type of the image if successful. + * + * Function originally taken from: http://codex.wordpress.org/Using_Gravatars. + * + * @param string $email The e-mail address to check. + * @param int $age Optional. The age of the object associated with the e-mail address. Default 0. + * + * @return string Returns the MIME type if a gravatar exists for the given e-mail address, + * '' otherwise. This includes situations where Gravatar.com could not be + * reached, or answered with a different error code, or if no e-mail address + * was given. + */ + public function validate( $email = '', $age = 0 ) { + // Make sure we have a real address to check. + if ( empty( $email ) ) { + return ''; + } + + // Calculate the hash of the e-mail address. + $hash = $this->get_hash( $email ); + + // Try to find something in the cache. + if ( isset( $this->validation_cache[ $hash ] ) ) { + return $this->validation_cache[ $hash ]; + } + + // Try to find it via transient cache. On multisite, we use site transients. + return $this->validate_and_cache( \is_multisite() ? $this->site_transients : $this->transients, $email, $hash, $age ); + } + + /** + * Checks if a gravatar exists for the given e-mail address and cachces the + * result. + * + * @since 2.4.0 Extracted from ::validate + * + * @param Transients_Helper $transients The transients API helper to use. + * @param string $email The e-mail address to check. + * @param string $hash The hashed e-mail address. + * @param int $age The age of the object associated with + * the e-mail address. + * + * @return string Returns the image MIME type if successful, + * or the empty string otherwise. + */ + protected function validate_and_cache( Transients_Helper $transients, $email, $hash, $age ) { + $transient_key = "check_{$hash}"; + $result = $transients->get( $transient_key ); + if ( \is_string( $result ) ) { + // Warm 1st level cache. + $this->validation_cache[ $hash ] = $result; + return $result; + } + + // Ask gravatar.com. + $result = $this->ping_gravatar( $email ); + if ( false !== $result ) { + // Cache result. + $transients->set( $transient_key, $result, $this->calculate_caching_duration( $result, $age ) ); + $this->validation_cache[ $hash ] = $result; + } + + return $result ?: ''; + } + + /** + * Pings Gravatar.com to check if there is an image for the given hash. + * + * @since 2.1.0 Visibility changed to protected. + * @since 2.4.0 Returns '' instead of 0 when no Gravatar can be found. + * + * @param string $email The e-mail address to check. + * + * @return string|false Returns the image MIME type if successful, the empty + * string there is no Gravatar for the e-mail address, + * and `false` in case of an error. + */ + protected function ping_gravatar( $email ) { + // Ask gravatar.com. + $response = \wp_remote_head( $this->get_url( $email ) ); + if ( $response instanceof \WP_Error ) { + return false; // Don't cache the result. + } + + switch ( \wp_remote_retrieve_response_code( $response ) ) { + case 200: + // Valid image found. + $result = \wp_remote_retrieve_header( $response, 'content-type' ); + if ( \is_array( $result ) ) { + $result = $result[0]; + } + break; + + case 404: + // No image found. + $result = ''; + break; + + default: + $result = false; // Don't cache the result. + } + + return $result; + } + + /** + * Calculates the proper caching duration. + * + * @since 2.1.0 Visibility changed to protected. + * @since 2.4.0 The type hint of $result has been adjusted according the + * simplified return value of `::ping_gravatar`. + * + * @param string|false $result The result of the validation check. + * @param int $age The "age" (difference between now and the + * creation date) of a comment or post (in seconds). + * + * @return int + */ + protected function calculate_caching_duration( $result, $age ) { + // Cache the result across all blogs (a YES for 1 week, a NO for 10 minutes + // or longer, depending on the age of the object (comment, post), since a + // YES basically shouldn't change, but a NO might change when the user + // signs up with gravatar.com). + if ( ! empty( $result ) || $age > \WEEK_IN_SECONDS ) { + $duration = \WEEK_IN_SECONDS; + } elseif ( $age > \DAY_IN_SECONDS ) { + $duration = \DAY_IN_SECONDS; + } elseif ( $age > \HOUR_IN_SECONDS ) { + $duration = \HOUR_IN_SECONDS; + } else { + $duration = 10 * \MINUTE_IN_SECONDS; + } + + /** + * Filters the interval between gravatar validation checks. + * + * @param int $duration The validation interval. Default 1 week if the check was successful, less if not. + * @param bool $result The result of the validation check. + * @param int $age The "age" (difference between now and the creation date) of a comment or post (in sceonds). + */ + return \apply_filters( 'avatar_privacy_validate_gravatar_interval', $duration, ! empty( $result ), $age ); + } +} diff --git a/includes/avatar-privacy/tools/network/class-remote-image-service.php b/includes/avatar-privacy/tools/network/class-remote-image-service.php new file mode 100644 index 0000000..7aa9b44 --- /dev/null +++ b/includes/avatar-privacy/tools/network/class-remote-image-service.php @@ -0,0 +1,233 @@ + + */ +class Remote_Image_Service { + + /** + * The cache handler. + * + * @since 2.4.0 + * + * @var Cache + */ + private $cache; + + /** + * The hashing helper. + * + * @since 2.4.0 + * + * @var Hasher + */ + private $hasher; + + /** + * The images editor. + * + * @since 2.4.0 + * + * @var Editor + */ + private $editor; + + /** + * The hashes database table. + * + * @since 2.4.0 + * + * @var Hashes_Table + */ + private $table; + + const IDENTIFIER_TYPE = 'image-url'; + const URL_CACHE_DURATION = 24 * \HOUR_IN_SECONDS; + /** + * Creates a new instance. + * + * @since 2.4.0 + * + * @param Cache $cache The cache helper. + * @param Hasher $hasher The hashing helper. + * @param Editor $editor The image editor. + * @param Hashes_Table $table The database table for storing hash <=> URL mappings. + */ + public function __construct( Cache $cache, Hasher $hasher, Editor $editor, Hashes_Table $table ) { + $this->cache = $cache; + $this->hasher = $hasher; + $this->editor = $editor; + $this->table = $table; + } + + /** + * Retrieves the remote image. + * + * @since 2.4.0 + * + * @param string $url The image URL. + * @param int $size The image size in pixels. + * @param string $mimetype The expected MIME type of the image data. + * + * @return string The image data (or an empty string on error). + */ + public function get_image( $url, $size, $mimetype ) { + // Retrieve remote image. + $image = \wp_remote_retrieve_body( + \wp_remote_get( $url ) + ); + + // Check if the image data is valid. + if ( false === $this->editor->get_mime_type( $image ) ) { + // Something went wrong, so we ignore the data. + return ''; + } + + // Resize and convert image. + return $this->editor->get_resized_image_data( + $this->editor->create_from_string( $image ), $size, $size, $mimetype + ); + } + + /** + * Checks that the given string is a valid image URL. + * + * @since 2.3.4 + * + * @param string $maybe_url Possibly an image URL. + * @param string $context The URL context (e.g. `'default_icon'` or `'avatar'`). + * + * @return bool + */ + public function validate_image_url( $maybe_url, $context ) { + /** + * Filters whether remote default icon URLs (i.e. having a different domain) are allowed. + * + * @since 2.3.4 + * + * @param bool $allow Default false. + */ + $allow_remote = \apply_filters( "avatar_privacy_allow_remote_{$context}_url", false ); + + // Get current site domain part (without schema). + $domain = \wp_parse_url( \get_site_url(), \PHP_URL_HOST ); + + // Make sure URL is valid and local (unless $allow_remote is set to true). + $result = + \filter_var( $maybe_url, \FILTER_VALIDATE_URL, \FILTER_FLAG_PATH_REQUIRED ) && + ( $allow_remote || \wp_parse_url( $maybe_url, \PHP_URL_HOST ) === $domain ); + + /** + * Filters the result of checking whether the candidate URL is a valid image URL. + * + * @since 2.3.4 + * + * @param bool $result The validation result. + * @param string $maybe_url The candidate URL. + * @param bool $allow_remote Whether URLs from other domains should be allowed. + */ + return \apply_filters( "avatar_privacy_validate_{$context}_url", $result, $maybe_url, $allow_remote ); + } + + /** + * Retrieves the hash for the given image URL. This method ensures that a reverse + * lookup using is possible by storing the URL and the hash in a database table. + * + * @since 2.4.0 + * + * @param string $url The remote image URL. + * + * @return string + */ + public function get_hash( $url ) { + // Generate hash. + $hash = $this->hasher->get_hash( $url ); + + // Check cache. + $key = "image-url_{$hash}"; + if ( $url !== $this->cache->get( $key ) ) { + // OK, we need to update the database. + $data = [ + 'identifier' => $url, + 'hash' => $hash, + 'type' => self::IDENTIFIER_TYPE, + ]; + $this->table->insert_or_update_row( $data ); + + // Also prime the URL cache, just in case. + $this->cache->set( $key, $url, self::URL_CACHE_DURATION ); + } + + return $hash; + } + + /** + * Retrieves the image URL for the given hash value. + * + * @since 2.4.0 + * + * @global \wpdb $wpdb The WordPress Database Access Abstraction. + * + * @param string $hash The hashed URL. + * + * @return string|false + */ + public function get_image_url( $hash ) { + global $wpdb; + + // Check cache. + $key = "image-url_{$hash}"; + $url = $this->cache->get( $key ); + + if ( false === $url ) { + // Lookup image URL. + $url = $wpdb->get_var( $wpdb->prepare( // phpcs:ignore WordPress.DB.DirectDatabaseQuery.NoCaching,WordPress.DB.DirectDatabaseQuery.DirectQuery + // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared + "SELECT identifier FROM `{$this->table->get_table_name()}` WHERE hash = %s AND type = %s", + $hash, + self::IDENTIFIER_TYPE + ) ); + + // Store only positive results. + if ( ! empty( $url ) ) { + $this->cache->set( $key, $url, self::URL_CACHE_DURATION ); + } + } + + return $url; + } +} diff --git a/includes/avatar-privacy/upload-handlers/class-custom-default-icon-upload-handler.php b/includes/avatar-privacy/upload-handlers/class-custom-default-icon-upload-handler.php new file mode 100644 index 0000000..7ca98cb --- /dev/null +++ b/includes/avatar-privacy/upload-handlers/class-custom-default-icon-upload-handler.php @@ -0,0 +1,300 @@ + + * + * @phpstan-import-type UploadArgs from Upload_Handler + * @phpstan-import-type FileSlice from Image_File + * @phpstan-import-type HandleUploadSuccess from Image_File + * @phpstan-import-type HandleUploadError from Image_File + * + * @phpstan-type UploadArgsWithSiteID UploadArgs&array{site_id:int} + */ +class Custom_Default_Icon_Upload_Handler extends Upload_Handler { + + /** + * The nonce action for updating custom default icons. + */ + const ACTION_UPLOAD = 'avatar_privacy_upload_default_icon'; + + /** + * The nonce used for updating custom default icons. + */ + const NONCE_UPLOAD = 'avatar_privacy_upload_default_icon_nonce_'; + + const CHECKBOX_ERASE = 'avatar-privacy-custom-default-icon-erase'; + const FILE_UPLOAD = 'avatar-privacy-custom-default-icon-upload'; + + const UPLOAD_DIR = '/avatar-privacy/custom-default'; + + const ERROR_FILE = 'default_avatar_file_error'; + const ERROR_INVALID_IMAGE = 'default_avatar_invalid_image_type'; + const ERROR_OTHER = 'default_avatar_other_error'; + const ERROR_UNKNOWN = 'default_avatar_unknown_error'; + + /** + * The default avatars API. + * + * @since 2.4.0 + * + * @var Default_Avatars + */ + private Default_Avatars $default_avatars; + + /** + * The options handler. + * + * @var Options + */ + private Options $options; + + /** + * Creates a new instance. + * + * @since 2.1.0 Parameter $plugin_file removed. + * @since 2.4.0 Parameters $core and $file_cache removed, parameters $image_file, + * and $default_avatars added. + * + * @param Image_File $image_file The image file handler. + * @param Default_Avatars $default_avatars The default avatars API. + * @param Options $options The options handler. + */ + public function __construct( Image_File $image_file, Default_Avatars $default_avatars, Options $options ) { + parent::__construct( self::UPLOAD_DIR, $image_file ); + + $this->default_avatars = $default_avatars; + $this->options = $options; + } + + /** + * Stores the uploaded default icon in the proper directory. + * + * @global array $_POST Post request superglobal. + * @global array $_FILES Uploaded files superglobal. + * + * @param int $site_id A site ID. + * @param string|string[] $option_value The option value. Passed by reference. + * + * @return void + */ + public function save_uploaded_default_icon( $site_id, &$option_value ) { + // Prepare arguments. + $args = [ + 'nonce' => self::NONCE_UPLOAD . $site_id, + 'action' => self::ACTION_UPLOAD, + 'upload_field' => Settings::UPLOAD_CUSTOM_DEFAULT_AVATAR, + 'erase_field' => self::CHECKBOX_ERASE, + 'site_id' => $site_id, + 'option_value' => &$option_value, + ]; + + $this->maybe_save_data( $args ); + } + + /** + * Retrieves the relevant slice of the global $_FILES array. + * + * @since 2.4.0 + * + * @param array $args Arguments passed from ::maybe_save_data(). + * + * @return array A slice of the $_FILES array. + * + * @phpstan-param UploadArgs $args + * @phpstan-return FileSlice|array{} + */ + protected function get_file_slice( array $args ) { + $upload_index = $this->options->get_name( Settings::OPTION_NAME ); + + // @phpstan-ignore-next-line -- super globals are all array. + if ( ! empty( $_FILES[ $upload_index ]['name'] ) ) { + // @phpstan-ignore-next-line -- super globals are all array. + $normalized_files = $this->normalize_files_array( $_FILES[ $upload_index ] ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput -- $_FILES does not need wp_unslash. + + if ( ! empty( $normalized_files[ $args['upload_field'] ] ) ) { + return $normalized_files[ $args['upload_field'] ]; + } + } + + return []; + } + + /** + * Handles upload errors and prints appropriate notices. + * + * @since 2.1.0 Visibility changed to protected. + * @since 2.4.0 Renamed to handle_upload_errors, parameter $result renamed + * to $upload_result. Parameter $args added. + * + * @param array $upload_result The result of ::handle_upload(). + * @param array $args Arguments passed from ::maybe_save_data(). + * + * @phpstan-param HandleUploadSuccess|HandleUploadError $upload_result + * @phpstan-param UploadArgsWithSiteID $args + */ + protected function handle_upload_errors( array $upload_result, array $args ) { + if ( empty( $upload_result['error'] ) ) { + $id = self::ERROR_UNKNOWN; + $message = \__( 'An unknown error occured while uploading the avatar', 'avatar-privacy' ); + } elseif ( 'Sorry, this file type is not permitted for security reasons.' === $upload_result['error'] ) { + $id = self::ERROR_INVALID_IMAGE; + $message = \__( 'Please upload a valid PNG, GIF or JPEG image for the avatar.', 'avatar-privacy' ); + } else { + $id = self::ERROR_OTHER; + $message = \sprintf( '%s %s', \__( 'There was an error uploading the avatar:', 'avatar-privacy' ), \esc_attr( $upload_result['error'] ) ); + } + + $this->raise_settings_error( $id, $message ); + } + + /** + * Stores metadata about the uploaded file. + * + * @since 2.4.0 + * + * @param array $upload_result The result of ::handle_upload(). + * @param array $args Arguments passed from ::maybe_save_data(). + * + * @phpstan-param HandleUploadSuccess|HandleUploadError $upload_result + * @phpstan-param UploadArgsWithSiteID $args + */ + protected function store_file_data( array $upload_result, array $args ) { + // Delete previous image and thumbnails. + if ( $this->delete_uploaded_icon( $args['site_id'] ) ) { + // Store new option value. + $args['option_value'] = $upload_result; + } else { + // There was an error deleting the previous image file. + $this->handle_file_delete_error(); + } + } + + /** + * Deletes a previously uploaded file and its metadata. + * + * @since 2.4.0 + * + * @param array $args Arguments passed from ::maybe_save_data(). + * + * @phpstan-param UploadArgsWithSiteID $args + */ + protected function delete_file_data( array $args ) { + // Delete previous image and thumbnails. + if ( $this->delete_uploaded_icon( $args['site_id'] ) ) { + // Store new option value. + $args['option_value'] = []; + } else { + // There was an error deleting the previous image file. + $this->handle_file_delete_error(); + } + } + + /** + * Retrieves the filename to use. + * + * @since 2.4.0 + * + * @param string $filename The proposed filename. + * @param array $args Arguments passed from ::maybe_save_data(). + * + * @return string + * + * @phpstan-param UploadArgsWithSiteID $args + */ + protected function get_filename( $filename, array $args ) { + return $this->default_avatars->get_custom_default_avatar_filename( $filename ); + } + + /** + * Delete the uploaded avatar (including all cached size variants) for the given site. + * + * @param int $site_id The site ID. + * + * @return bool + */ + public function delete_uploaded_icon( $site_id ) { + if ( $this->default_avatars->delete_custom_default_avatar_image_file() ) { + $this->default_avatars->invalidate_custom_default_avatar_cache( $site_id ); + + return true; + } + + return false; + } + + /** + * Raises an error on the settings page. + * + * @since 2.4.0 + * + * @internal + * + * @param string $id The error ID. + * @param string $message The error message. + * @param string $type Optional. The error type. Default 'error'. + * + * @return void + */ + protected function raise_settings_error( $id, $message, $type = 'error' ) { + \add_settings_error( + $this->options->get_name( Settings::OPTION_NAME ) . '[' . Settings::UPLOAD_CUSTOM_DEFAULT_AVATAR . ']', + $id, + $message, + $type + ); + } + + /** + * Handles errors during file deletion. + * + * @since 2.4.0 + * + * @internal + * + * @return void + */ + protected function handle_file_delete_error() { + $icon = $this->default_avatars->get_custom_default_avatar(); + $file = ! empty( $icon['file'] ) ? $icon['file'] : \__( 'No filename given.', 'avatar-privacy' ); + $this->raise_settings_error( self::ERROR_FILE, \sprintf( '%s %s', \__( 'Could not delete avatar image file:', 'avatar-privacy' ), \esc_attr( $file ) ) ); + } +} diff --git a/includes/avatar-privacy/upload-handlers/class-upload-handler.php b/includes/avatar-privacy/upload-handlers/class-upload-handler.php new file mode 100644 index 0000000..338ec17 --- /dev/null +++ b/includes/avatar-privacy/upload-handlers/class-upload-handler.php @@ -0,0 +1,366 @@ + + * + * @phpstan-import-type UploadDir from \Avatar_Privacy\Data_Storage\Filesystem_Cache + * @phpstan-import-type FileSlice from Image_File + * @phpstan-import-type HandleUploadSuccess from Image_File + * @phpstan-import-type HandleUploadError from Image_File + * + * @phpstan-type UploadArgs array{ nonce: string, action: string, upload_field: string, erase_field: string, user_id?: int, site_id?: int } + * @phpstan-type FileSliceMulti array{ name: string[], type: string[], tmp_name: string[], error: int[], size: int[] } + */ +abstract class Upload_Handler { + + /** + * A mapping of file extension patterns to MIME types. + * + * @deprecated 2.4.0 + * + * @var string[] + */ + const ALLOWED_MIME_TYPES = Image_File::ALLOWED_UPLOAD_MIME_TYPES; + + /** + * The subfolder used for our uploaded files. Has to start with /. + * + * @var string + */ + private string $upload_dir; + + /** + * The image file handler. + * + * @since 2.4.0 + * + * @var Image_File + */ + private Image_File $image_file; + + /** + * Whether to use the global upload directory. + * + * @since 2.4.0 + * + * @var bool + */ + private bool $global_upload; + + /** + * Creates a new instance. + * + * @since 2.1.0 Parameter $plugin_file removed. + * @since 2.4.0 Parameters $core and $file_cache removed, parameters + * $image_File and $global_upload added. + * + * @param string $upload_dir The subfolder used for our uploaded files. + * Has to start with /. + * @param Image_File $image_file The image file handler. + * @param bool $global_upload Optional. A flag indicating whether there + * should be a global upload directory on + * multisite. Default false. + */ + public function __construct( $upload_dir, Image_File $image_file, $global_upload = false ) { + $this->upload_dir = $upload_dir; + $this->image_file = $image_file; + $this->global_upload = $global_upload; + } + + /** + * Returns a unique filename. + * + * @deprecated 2.4.0 + * + * @param string $directory The uploads directory. + * @param string $filename The proposed filename. + * @param string $extension The file extension (including leading dot). + * + * @return string + */ + public function get_unique_filename( $directory, $filename, $extension ) { + $number = 1; + $basename = \basename( $filename, $extension ); + $filename = $basename; + + while ( \file_exists( "$directory/{$filename}{$extension}" ) ) { + $filename = "{$basename}_{$number}"; + ++$number; + } + + return "{$filename}{$extension}"; + } + + /** + * Processes the submitted form and saves the upload results if possible. + * + * @since 2.4.0 + * + * @global array $_POST Post request superglobal. + * + * @param array $args { + * An array of arguments passed to the form processing methods. All of + * the listed arguments are required. + * + * @type string $nonce The nonce. + * @type string $action The form action. + * @type string $upload_field The upload field name. + * @type string $erase_field The erase checkbox field name. + * } + * + * @return void + * + * @phpstan-param UploadArgs $args + */ + protected function maybe_save_data( array $args ) { + // Check arguments. + if ( empty( $args['nonce'] ) || empty( $args['action'] ) || empty( $args['upload_field'] ) || empty( $args['erase_field'] ) ) { + \_doing_it_wrong( __METHOD__, 'Required arguments missing', 'Avatar Privacy 2.4.0' ); + return; + } + + // Verify nonce. + // @phpstan-ignore-next-line -- super globals are all array. + if ( ! isset( $_POST[ $args['nonce'] ] ) || ! \wp_verify_nonce( \sanitize_key( $_POST[ $args['nonce'] ] ), $args['action'] ) ) { + return; + } + + // Verify a file was uploaded. + $file_slice = $this->get_file_slice( $args ); + if ( ! empty( $file_slice['name'] ) ) { + + // Upload to our custom directory. + $upload_result = $this->upload( $file_slice, $args ); + + // Handle upload failures. + if ( empty( $upload_result['file'] ) ) { + $this->handle_upload_errors( $upload_result, $args ); + return; // Abort. + } + + // Save the new avatar image. + $this->store_file_data( $upload_result, $args ); + } elseif ( ! empty( $_POST[ $args['erase_field'] ] ) && 'true' === $_POST[ $args['erase_field'] ] ) { + // Just delete the current avatar. + $this->delete_file_data( $args ); + } + } + + /** + * Retrieves the relevant slice of the global $_FILES array. + * + * @since 2.4.0 + * + * @global array $_FILES Uploaded files superglobal. + * + * @param array $args Arguments passed from ::maybe_save_data(). + * + * @return array A slice of the $_FILES array. + * + * @phpstan-param UploadArgs $args + * @phpstan-return FileSlice|array{} + */ + abstract protected function get_file_slice( array $args ); + + /** + * Handles upload errors and prints appropriate notices. + * + * @since 2.4.0 + * + * @param array $upload_result The result of ::handle_upload(). + * @param array $args Arguments passed from ::maybe_save_data(). + * + * @return void + * + * @phpstan-param HandleUploadSuccess|HandleUploadError $upload_result + * @phpstan-param UploadArgs $args + */ + abstract protected function handle_upload_errors( array $upload_result, array $args ); + + /** + * Stores metadata about the uploaded file. + * + * @since 2.4.0 + * + * @param array $upload_result The result of ::handle_upload(). + * @param array $args Arguments passed from ::maybe_save_data(). + * + * @return void + * + * @phpstan-param HandleUploadSuccess|HandleUploadError $upload_result + * @phpstan-param UploadArgs $args + */ + abstract protected function store_file_data( array $upload_result, array $args ); + + /** + * Deletes a previously uploaded file and its metadata. + * + * @since 2.4.0 + * + * @param array $args Arguments passed from ::maybe_save_data(). + * + * @return void + * + * @phpstan-param UploadArgs $args + */ + abstract protected function delete_file_data( array $args ); + + /** + * Retrieves the filename to use. + * + * @since 2.4.0 + * + * @param string $filename The proposed filename. + * @param array $args Arguments passed from ::maybe_save_data(). + * + * @return string + * + * @phpstan-param UploadArgs $args + */ + protected function get_filename( $filename, array $args ) { // phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundAfterLastUsed -- Argument is used in subclasses. + return $filename; + } + + /** + * Handles the file upload by optionally switching to the primary site of the network. + * + * @since 2.4.0 Parameter $global replaced with property. + * + * @param array $file A slice of the $_FILES superglobal. + * @param array $args Arguments passed from ::maybe_save_data(). + * + * @return string[] Information about the uploaded file. + * + * @phpstan-param FileSlice $file + * @phpstan-param UploadArgs $args + * @phpstan-return HandleUploadSuccess|HandleUploadError + */ + protected function upload( array $file, $args ) { + // Prepare arguments. + $overrides = [ + 'global_upload' => $this->global_upload, + 'upload_dir' => $this->upload_dir, + ]; + + // Allow for subclass-specific filenames. + $file['name'] = $this->get_filename( $file['name'], $args ); + + return $this->image_file->handle_upload( $file, $overrides ); + } + + /** + * Returns a custom upload directory. + * + * @deprecated 2.4.0 + * + * @param array $uploads The uploads data. + * + * @return array + * + * @phpstan-param UploadDir $uploads + * @phpstan-return UploadDir + */ + public function custom_upload_dir( array $uploads ) { + \_deprecated_function( __METHOD__, 'Avatar Privacy 2.4.0' ); + + $uploads['path'] = \str_replace( $uploads['subdir'], $this->upload_dir, $uploads['path'] ); + $uploads['url'] = \str_replace( $uploads['subdir'], $this->upload_dir, $uploads['url'] ); + $uploads['subdir'] = $this->upload_dir; + + return $uploads; + } + + /** + * Normalizes the sliced $_FILES to be an array indexed by file handle/number. + * + * This functions assumes a single file or at most a two-dimensional array of files. + * Higher dimensional arrays are not supported. + * + * @since 4.4.0 Input assumptions/limitations documented. + * + * @param array $files_slice A slice of the $_FILES superglobal. + * @return array { + * An array containing one sub-array for each uploaded file. + * + * @type array $file { + * An array of properties for an uploaded file. + * + * @type string $name The name of the uploaded file. + * @type string $type The MIME type. + * @type string tmp_name The path of the temporary file created by the upload. + * @type int $error The error code for the upload. + * @type int $size The file size in bytes. + * } + * } + * + * @phpstan-param FileSlice|FileSliceMulti $files_slice + * @phpstan-return array + */ + protected function normalize_files_array( array $files_slice ) { + if ( ! \is_array( $files_slice['name'] ) ) { + return [ $files_slice ]; + } + + /** + * The file properties. + * + * @var string[] $props + */ + $props = \array_keys( $files_slice ); + + /** + * The file numbers. + * + * @var int[] $files + */ + $files = \array_keys( $files_slice['name'] ); + + // Assemble the properties into a normalized slize per file. + $normalized_slice = []; + foreach ( $files as $file ) { + foreach ( $props as $property ) { + $normalized_slice[ $file ][ $property ] = $files_slice[ $property ][ $file ]; + } + } + + /** + * The normalized $_FILES array. + * + * @phpstan-var array + */ + return $normalized_slice; + } +} diff --git a/includes/avatar-privacy/upload-handlers/class-user-avatar-upload-handler.php b/includes/avatar-privacy/upload-handlers/class-user-avatar-upload-handler.php new file mode 100644 index 0000000..4857d98 --- /dev/null +++ b/includes/avatar-privacy/upload-handlers/class-user-avatar-upload-handler.php @@ -0,0 +1,257 @@ + + * + * @phpstan-import-type UploadArgs from Upload_Handler + * @phpstan-import-type FileSlice from Image_File + * @phpstan-import-type HandleUploadSuccess from Image_File + * @phpstan-import-type HandleUploadError from Image_File + * + * @phpstan-type UploadArgsWithUserID UploadArgs&array{user_id:int} + */ +class User_Avatar_Upload_Handler extends Upload_Handler { + + const UPLOAD_DIR = '/avatar-privacy/user-avatar'; + + /** + * The user fields API. + * + * @since 2.4.0 + * + * @var User_Fields + */ + private User_Fields $registered_user; + + /** + * Creates a new instance. + * + * @since 2.1.0 Parameter $plugin_file removed. + * @since 2.4.0 Parameters $core and $file_cache removed, parameters $image_file + * and $registered_user added. + * + * @param Image_File $image_file The image file handler. + * @param User_Fields $registered_user The user fields API. + */ + public function __construct( Image_File $image_file, User_Fields $registered_user ) { + parent::__construct( self::UPLOAD_DIR, $image_file, true ); + + $this->registered_user = $registered_user; + } + + /** + * Retrieves the markup for uploading user avatars. + * + * @deprecated 2.4.0 + * + * @param \WP_User $user The profile user. + * + * @return string + */ + public function get_avatar_upload_markup( \WP_User $user ) { + \_deprecated_function( __METHOD__, 'Avatar Privacy 2.4.0' ); + + \ob_start(); + require \AVATAR_PRIVACY_PLUGIN_PATH . '/admin/partials/profile/user-avatar-upload.php'; + return (string) \ob_get_clean(); + } + + /** + * Stores the uploaded avatar image in the proper directory. + * + * @global array $_POST Post request superglobal. + * @global array $_FILES Uploaded files superglobal. + * + * @param int $user_id The user ID. + * @param string $nonce The nonce root required for saving the field + * (the user ID will be automatically appended). + * @param string $action The action required for saving the field. + * @param string $upload_field The HTML name of the "upload" field. + * @param string $erase_field The HTML name of the "erase" checkbox. + * + * @return void + */ + public function save_uploaded_user_avatar( $user_id, $nonce, $action, $upload_field, $erase_field ) { + // Prepare arguments. + $args = [ + 'nonce' => "{$nonce}{$user_id}", + 'action' => $action, + 'upload_field' => $upload_field, + 'erase_field' => $erase_field, + 'user_id' => $user_id, + ]; + + $this->maybe_save_data( $args ); + } + + /** + * Retrieves the relevant slice of the global $_FILES array. + * + * @since 2.4.0 + * + * @global array $_FILES Uploaded files superglobal. + * + * @param array $args Arguments passed from ::maybe_save_data(). + * + * @return array A slice of the $_FILES array. + * + * @phpstan-param UploadArgs $args + * @phpstan-return FileSlice|array{} + */ + protected function get_file_slice( array $args ) { + if ( ! empty( $_FILES[ $args['upload_field'] ] ) ) { + return (array) $_FILES[ $args['upload_field'] ]; // phpcs:ignore WordPress.Security.ValidatedSanitizedInput -- $_FILES does not need wp_unslash. + } + + return []; + } + + /** + * Handles upload errors and prints appropriate notices. + * + * @since 2.1.0 Visibility changed to protected. + * @since 2.4.0 Renamed to handle_upload_errors, parameter $result renamed + * to $upload_result. Parameter $args added. + * + * @param array $upload_result The result of ::upload(). + * @param mixed[] $args Arguments passed from ::maybe_save_data(). + * + * @return void + * + * @phpstan-param array{ error?: string } $upload_result + */ + protected function handle_upload_errors( array $upload_result, array $args ) { + if ( empty( $upload_result['error'] ) ) { + $error_message = \__( 'An unknown error occured while uploading the avatar', 'avatar-privacy' ); + } elseif ( 'Sorry, this file type is not permitted for security reasons.' === $upload_result['error'] ) { + $error_message = \__( 'Please upload a valid PNG, GIF or JPEG image for the avatar.', 'avatar-privacy' ); + } else { + $error_message = \sprintf( '%s %s', \__( 'There was an error uploading the avatar:', 'avatar-privacy' ), \esc_attr( $upload_result['error'] ) ); + } + + \add_action( 'user_profile_update_errors', function( \WP_Error $errors ) use ( $error_message ) { + $errors->add( 'avatar_error', $error_message ); // @codeCoverageIgnore + } ); + } + + /** + * Stores metadata about the uploaded file. + * + * @since 2.4.0 + * + * @param mixed[] $upload_result The result of ::upload(). + * @param mixed[] $args Arguments passed from ::maybe_save_data(). + * + * @return void + * + * @phpstan-param HandleUploadSuccess|HandleUploadError $upload_result + * @phpstan-param UploadArgsWithUserID $args + */ + protected function store_file_data( array $upload_result, array $args ) { + $this->registered_user->set_uploaded_local_avatar( $args['user_id'], $upload_result ); + } + + /** + * Deletes a previously uploaded file and its metadata. + * + * @since 2.4.0 + * + * @param mixed[] $args Arguments passed from ::maybe_save_data(). + * + * @return void + * + * @phpstan-param UploadArgsWithUserID $args + */ + protected function delete_file_data( array $args ) { + $this->registered_user->delete_local_avatar( $args['user_id'] ); + } + + /** + * Retrieves the filename to use. + * + * @since 2.4.0 + * + * @param string $filename The proposed filename. + * @param array $args Arguments passed from ::maybe_save_data(). + * + * @return string + * + * @phpstan-param UploadArgsWithUserID $args + */ + protected function get_filename( $filename, array $args ) { + return $this->registered_user->get_local_avatar_filename( $args['user_id'], $filename ); + } + + /** + * Delete the uploaded avatar (including all cached size variants) for the given user. + * + * @deprecated 2.4.0 Use \Avatar_Privacy\Core:delete_user_avatar instead. + * + * @param int $user_id The user ID. + * + * @return void + */ + public function delete_uploaded_avatar( $user_id ) { + \_deprecated_function( __METHOD__, 'Avatar Privacy 2.4.0', 'Avatar_Privacy\Core:delete_user_avatar' ); + + $this->registered_user->delete_local_avatar( $user_id ); + } + + /** + * Invalidates cached avatar images. + * + * @since 2.2.0 + * + * @deprecated 2.4.0 Use \Avatar_Privacy\Core::invalidate_user_avatar_cache + * instead. + * + * @param int $user_id The user ID. + * + * @return void + */ + public function invalidate_user_avatar_cache( $user_id ) { + \_deprecated_function( __METHOD__, 'Avatar Privacy 2.4.0', 'Avatar_Privacy\Core::invalidate_user_avatar_cache' ); + + $this->registered_user->invalidate_local_avatar_cache( $user_id ); + } +} diff --git a/includes/avatar-privacy/upload-handlers/ui/class-file-upload-input.php b/includes/avatar-privacy/upload-handlers/ui/class-file-upload-input.php new file mode 100644 index 0000000..ad9d729 --- /dev/null +++ b/includes/avatar-privacy/upload-handlers/ui/class-file-upload-input.php @@ -0,0 +1,139 @@ + element for file uploads. + * + * @since 2.0.0 + * + * @author Peter Putzer + */ +class File_Upload_Input extends Controls\Input { + + /** + * The HTML ID of the erase image checkbox. + * + * @var string + */ + private string $erase_checkbox_id; + + /** + * The nonce prefix for the upload. + * + * @var string + */ + private string $nonce; + + /** + * The action ID for the upload. + * + * @var string + */ + private string $action; + + /** + * Create a new input control object. + * + * @param Options $options Options API handler. + * @param string $options_key Database key for the options array. + * @param string $id Control ID (equivalent to option name). Required. + * @param array $args { + * Optional and required arguments. + * + * @type string $tab_id Tab ID. Required. + * @type string $section Section ID. Required. + * @type string|int $default The default value. Required, but may be an empty string. + * @type string|null $short Optional. Short label. Default null. + * @type string|null $label Optional. Label content with the position of the control marked as %1$s. Default null. + * @type string|null $help_text Optional. Help text. Default null. + * @type bool $inline_help Optional. Display help inline. Default false. + * @type array $attributes Optional. Default [], + * @type array $outer_attributes Optional. Default [], + * @type array $settings_args Optional. Default [], + * @type string $erase_checkbox Erase image checkbox ID. + * } + * + * @throws \InvalidArgumentException Missing argument. + * + * @phpstan-param array{ tab_id: string, section: string, default: string|int, short?: ?string, label?: ?string, help_text?: ?string, inline_help?: bool, attributes?: mixed[], outer_attributes?: mixed[], settings_args?: mixed[], erase_checkbox?: string } $args + */ + public function __construct( Options $options, $options_key, $id, array $args ) { + $args = $this->prepare_args( $args, [ 'erase_checkbox', 'action', 'nonce', 'help_no_file', 'help_no_upload' ] ); + $args['input_type'] = 'file'; + + parent::__construct( $options, $options_key, $id, $args ); + + if ( \current_user_can( 'upload_files' ) ) { + $value = $this->get_value(); + if ( empty( $value ) ) { + $this->help_text = $args['help_no_file']; + } + } else { + $this->help_text = $args['help_no_upload']; + } + + $this->erase_checkbox_id = \esc_attr( $args['erase_checkbox'] ); + $this->action = \esc_attr( $args['action'] ); + $this->nonce = \esc_attr( $args['nonce'] ); + } + + /** + * Render the value markup for this input. + * + * @param mixed $value The input value. + * + * @return string + */ + protected function get_value_markup( $value ) { + // Don't display file names. + return 'value="" '; + } + + /** + * Retrieves the control-specific HTML markup. + * + * @return string + */ + protected function get_element_markup() { + $value = $this->get_value(); + $checkbox_markup = ''; + $nonce_markup = \wp_nonce_field( $this->action, $this->nonce . \get_current_blog_id(), true, false ); + + if ( ! empty( $value ) ) { + $checkbox_markup = + "erase_checkbox_id}\" name=\"{$this->erase_checkbox_id}\" value=\"true\" type=\"checkbox\"> + '; + } + + return $nonce_markup . parent::get_element_markup() . $checkbox_markup; + } +} diff --git a/public/images/LICENSE.md b/public/images/LICENSE.md new file mode 100644 index 0000000..ea63852 --- /dev/null +++ b/public/images/LICENSE.md @@ -0,0 +1,82 @@ +# Image License Terms + +The icons in this folder and its subfolders have been released under various free licenses. See below for details. + +## comment-bubble.svg + +Re-drawn in Illustrator, based on `comment.png` from the NDD Icon Set 1.0. + +Copyright: Fabian Volme (2007), Peter Putzer (2018)\ +URL: (archived)\ +License: LGPLv3\ +License URL: + +## mystery.svg + +Drawn from scratch in Illustrator, too simple for copyright protection. + +License: CC0\ +License URL: + +## shaded-cone.svg and silhouette.svg + +Taken from the Oxygen Icon theme 4.8.0 provided by KDE (`im-user-offline.svgz` and `view-media-artist.svgz`). + +Copyright: Nuno Pinheiro (2007), David Vignoni (2007), David Miller (2007), Johann Ollivier Lapeyre (2007), Kenneth Wimer (2007), Riccardo Iaconelli (2007)\ +URL: \ +License: LGPLv3\ +License URL: + +## birds/*.png + +The Bird Avatars implementation is based on the original package by David Revoy. + +Copyright: David Revoy (2019)\ +URL: \ +License: CC-BY 4.0 (attribution _David Revoy_), with the following exception: +"Generated pictures used as Avatar (for blog,forum,social-network) don't need +direct attribution and so, can be used as regular avatars without pasting David +Revoy's name all over the place."\ +License URL: + +## cats/*.png + +The Cat Avatars implementation is based on the original package by David Revoy. + +Copyright: David Revoy (2016)\ +URL: \ +License: CC-BY 4.0 (attribution _David Revoy_), with the following exception: +"Generated cats used as Avatar (for blog,forum,social-network) don't need direct +attribution and so, can be used as regular avatars without pasting David Revoy's +name all over the place."\ +License URL: + +## monster-id/*.png + +The MonsterID implementation is based on the hand-drawn icons provided in Scott Sherrill-Mix's WP_MonsterID plugin. + +Copyright: Katherine Garner (2008)\ +URL: \ +License: GPLv2 or later\ +License URL: + +## robohash/*.svg + +The RoboHash implementation is based on Nimiq's SVG version of the original images +created by Zikri Kader for Colin Davis RoboHash.org project. + +Copyright: Zikri Kader, Colin Davis (2011), Nimiq (2017)\ +URL (PNG): \ +URL (SVG): \ +License: CC-BY 4.0 (attribution _Zikri Kader_)\ +License URL: + + +## wavatars/*.png + +The Wavatars impelementation is based on the original WordPress plugin by Shamus Young. + +Copyright: Shames Young (2007)\ +URL: +License: GPLv2 or later\ +License URL: diff --git a/public/images/birds/accessoire_1.png b/public/images/birds/accessoire_1.png new file mode 100644 index 0000000000000000000000000000000000000000..19501b6d2ca1d7a16e64ebb5040ee91c83023994 GIT binary patch literal 1154 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 bopC~Ya&4CoCGE5?Na=2x0Zpq+JYxO>R39c! literal 0 HcmV?d00001 diff --git a/public/images/birds/accessoire_11.png b/public/images/birds/accessoire_11.png new file mode 100644 index 0000000000000000000000000000000000000000..11c8598b1f0d54b2922dd2b3e1a3399d2be6d009 GIT binary patch literal 19617 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 B*Kz;= literal 0 HcmV?d00001 diff --git a/public/images/birds/accessoire_13.png b/public/images/birds/accessoire_13.png new file mode 100644 index 0000000000000000000000000000000000000000..526ac55a3acea217438df7f7df4ad1c54715fb02 GIT binary patch literal 1154 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 literal 0 HcmV?d00001 diff --git a/public/images/birds/accessoire_15.png b/public/images/birds/accessoire_15.png new file mode 100644 index 0000000000000000000000000000000000000000..697ab770dc95335ea78dcea0d9760150a37b07a6 GIT binary patch literal 1154 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 UPuQ#yi{Q^l--MjE*CF)(04<{oo&W#< literal 0 HcmV?d00001 diff --git a/public/images/birds/accessoire_17.png b/public/images/birds/accessoire_17.png new file mode 100644 index 0000000000000000000000000000000000000000..78457e81327aaeff4026b392326647efba5ac40d GIT binary patch literal 1154 zcmeAS@N?(olHy`uVBq!ia0y~yU;;9k7&zE~)R&4Yzkn25lDE4H!+#K5uy^@npa^Gy zM`SSrgPt-7Ggd6MF9Qm)mw5WRvOnhF7iD6QIWrq*4hz4hi(^Q|t+xja8G#B8E%@r6 o%bvdg$Q%WuAut*OBP;|Sm@|D~VAQ{Lz#HUoPgg&ebxsLQ0O|fDkpKVy literal 0 HcmV?d00001 diff --git a/public/images/birds/accessoire_18.png b/public/images/birds/accessoire_18.png new file mode 100644 index 0000000000000000000000000000000000000000..78457e81327aaeff4026b392326647efba5ac40d GIT binary patch literal 1154 zcmeAS@N?(olHy`uVBq!ia0y~yU;;9k7&zE~)R&4Yzkn25lDE4H!+#K5uy^@npa^Gy zM`SSrgPt-7Ggd6MF9Qm)mw5WRvOnhF7iD6QIWrq*4hz4hi(^Q|t+xja8G#B8E%@r6 o%bvdg$Q%WuAut*OBP;|Sm@|D~VAQ{Lz#HUoPgg&ebxsLQ0O|fDkpKVy literal 0 HcmV?d00001 diff --git a/public/images/birds/accessoire_19.png b/public/images/birds/accessoire_19.png new file mode 100644 index 0000000000000000000000000000000000000000..78457e81327aaeff4026b392326647efba5ac40d GIT binary patch literal 1154 zcmeAS@N?(olHy`uVBq!ia0y~yU;;9k7&zE~)R&4Yzkn25lDE4H!+#K5uy^@npa^Gy zM`SSrgPt-7Ggd6MF9Qm)mw5WRvOnhF7iD6QIWrq*4hz4hi(^Q|t+xja8G#B8E%@r6 o%bvdg$Q%WuAut*OBP;|Sm@|D~VAQ{Lz#HUoPgg&ebxsLQ0O|fDkpKVy literal 0 HcmV?d00001 diff --git a/public/images/birds/accessoire_2.png b/public/images/birds/accessoire_2.png new file mode 100644 index 0000000000000000000000000000000000000000..19501b6d2ca1d7a16e64ebb5040ee91c83023994 GIT binary patch literal 1154 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𝔖l0;#QRMMZbrsaL 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�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 literal 0 HcmV?d00001 diff --git a/public/images/birds/accessoire_8.png b/public/images/birds/accessoire_8.png new file mode 100644 index 0000000000000000000000000000000000000000..161d9a0b7bca2a0cde0ecfcc4c3a90d15b61f167 GIT binary patch literal 40871 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 M%m!P2+AH?|0N}Ecp#T5? literal 0 HcmV?d00001 diff --git a/public/images/birds/accessoire_9.png b/public/images/birds/accessoire_9.png new file mode 100644 index 0000000000000000000000000000000000000000..10c7469ffae60333b80bb0ed40753b385a85172b GIT binary patch literal 1154 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

JK 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 I^^d;)KL<0csQ>@~ literal 0 HcmV?d00001 diff --git a/public/images/birds/beak_2.png b/public/images/birds/beak_2.png new file mode 100644 index 0000000000000000000000000000000000000000..bf9c0a325a8538d847ec27f70b35357c293d4913 GIT binary patch literal 13109 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 literal 0 HcmV?d00001 diff --git a/public/images/birds/beak_3.png b/public/images/birds/beak_3.png new file mode 100644 index 0000000000000000000000000000000000000000..9a327f250a3a23200b9b1dec146214ab7221de20 GIT binary patch literal 16880 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 literal 0 HcmV?d00001 diff --git a/public/images/birds/beak_4.png b/public/images/birds/beak_4.png new file mode 100644 index 0000000000000000000000000000000000000000..fdfc40e39f7652d04cb6a16885e035502ba4d8ad GIT binary patch literal 16564 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 literal 0 HcmV?d00001 diff --git a/public/images/birds/beak_5.png b/public/images/birds/beak_5.png new file mode 100644 index 0000000000000000000000000000000000000000..607c627511a231cd34551a4da26ccde8d410495c GIT binary patch literal 13407 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 PS}wrQ{4PS@CGLL!ArSdw literal 0 HcmV?d00001 diff --git a/public/images/birds/beak_6.png b/public/images/birds/beak_6.png new file mode 100644 index 0000000000000000000000000000000000000000..2fb0a6da8da4aca8dacfef195366238bcbe3efdb GIT binary patch literal 13495 zcmeHtcTm$?*Dj!dfQk)J5fG(F?@gNEK@5aWq!*<~?>#~kRL(&uCbSS~(xe6HLJ|-; zh%_k?LJLu;p#%segg|n`duP7?zW?vceUr)j_UuWr_gec|?b+)eOLOCM+}F8TSXj;h z9{y#`!otQJvay`uU_N$ZejYL(98XM*|6*aByo)duFy;(b$U}#478d#2Cm+_BGW{s# zBxeM`%!qUT3@;xWXX3~6#Vjm0Spa_-*v3q6;K8|GPa_FbLL6nTqN=^R-6@)j>-2-0 zVq&6|;)>tSC#AA>T^QE<_nP2)&odV5EK0F&^JCVx3>0n57}HCaUJ8BA6no|ipx PNF4Rkb+lDq{Co$D$flU2Sfc@0Z^^ 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

O72cP%7SvH+DKX%3{DLi_d%k z%p^AJ3%)Eb_k}7QiD_X)D_*i4;*Ji zgnSXV71yx`7t&nRILkZ>*U^^mP(ARcPoHyCF68{XM8X$8%u%IyP0cMJ)v!C(%)Lzx zk828&tVA1j*PWfXPYR>_QplR}7})H-I_XxxD`8?mf*ion6?w=cEtzQ%j+n>-QYcvq zh{L2iz@p}HXJ1R@jg1CqDBcr#?26OD*Fay!v>!Z^qsYDr|7NDOn2dXJHCsl?+LpV~ zcSkY(!8?N!N7F8+bptQI{*9deT{*2S-?t;jT>Cg9;-~|E@!FpapmE#rU^=P;k3M;mE#vp@erT2r$StK9aieg3A9q+C3R7J7POEk1T7urQ14wn3q05SRs|8`1nrlEM! zP}!l7_bM#VEU5-XWe-Rvh2AEVR}*^P+aLPTi2}1dRTvY$OGTP$9C7a>$Kql>FUgaT z%=5Uf^S^PLC*93c+`%KP5+x#{;A)nts#l|LTEvyFmbRSwX?8|8F$gZC=$iR7~m zt4uLTGCVhcWv~JT&G4m2O=g+FM=6*ga?}`<-tfno*rQsO^x|&Bus&TmWSoZT#4^0= zx4ZvDk3H@PHQ-e}p-8#)(6oz(i@$S1c)~frF)BR!jj%61uF$qeiEv=Z%BbSNb64}tAwsE+0q;}Zf5a*=&f?#K zP2!;EPp-_cneEzM&;H#YqxMgqXVijwbasP7Lq)v@bnezJl-}PAkK=x@dO|-65b*l& z!vxH-cfYH|L`_YmwR3q!6_o@X`bC{oogdB?EPAo|H_LKz|Bp7frguiNW37ULkn(Eu zVUttuY%>o2OS zSGe&m4D-o)GL4S2pzoP^BD&G@-wJErR~~^*r!^@|+VXJQ0Htk%4NKNTGuU7y`CE9G z%zIh0LVwfiPx-R?UWjyjrQIE0QIL3CMV#xEltQQ)*XX3--7MA^gXO=vU$Xd_UXEBa zg2(qq_uQlQcC^QVV#U80>!?UB&DSxwZc>>HU7Yc{I8F3cp##EVM`G_ub* zsm>SH=mVa}Na$#AXu6r0qOB^d^D=?ps&Ce^Q0mY4KIB0v=8ifE066^cd)e7zr_w5m zYC|RwRD6w)-&z-lkQ&jmhm$ySs}tgUurSj&kU`0;iSaYd%g^NW>9 zq_>MXVs;wq@gT4&r^xMGqfeoguld+Yvggd*;2WEMr~4oYGN<&CC=VpNi!7v@a=@vCrPDb-(|$z~XOMqyI}T zMOgNWw&}(hvZn1DC6Rf^dYfmOkcs8kN^Iotej8TKIbHDj9U0GzS=TQp(2mBv*1mOJH$8tzI^F5b$%tv1oN!feuO8QFlE&uZBNe{mW=J4w9;q`)+B6OQsMWKu<9?9P2?7h#nsSW|27>)UEfgVQac?6q(QIkA z#1BcQxQjfmNi_b_T+!DmS?Vn=TKG95D5Qcki_9w$c#O2y72lZ)2KoGjo`VAHqa z-UKQ!TDreZoM`NAE9Sj_sVKW>OOyWac~kxowIN2pE+`Y2fO zxjViI(BP!{j7zdd?G79Y0ls&3D!`cM+(zS!lNFB&IQOM@ovmhtR6s*q|Jd z!YfxooK0LboN+Ph)h>D~C2a`LyMFa(_(^POS z*mPD`UWq1DN81UhVY61s_;YTsC?pdZLKe>2(*-7ndVaxFrXFB_OG0 z;WpYSaZE;@DvK_jAKw0Ut;O9PPu*g`NF$MW#a%>5G zALWm(Ft=8GUSc)sF}r_GzLjc#KYVc?aNIp5MvOcvo`}6b{|5^HG?06f@O9QB)iBfa zXGp0rDKmJ6Wjc>#y+hf|g0HiuyLy}xRLl@31IX7NX`yXkfiKIk)~5qKu5`j+EUz~3|KtpTvZ_X-5t3Gq;s@l;htUr1&%6VF2| z<~{w4r8$?-)v~XuQZm-xCsI}6Tg4Nn)EXIkr{E^cBQ?jbm2tk#GEYkJ|+%qQzfr8KkGGBW|-k{(m=G_zgw2sQB7s28I88 zbhgo46A%=>P5Nun4nOC|TC~-#NeY6(NW%;stoZ*v^xu>JYT*B^fme+*rt6n0+2Si# Q43F;u>YF}9>N-dNAG9qYA^-pY literal 0 HcmV?d00001 diff --git a/public/images/birds/beak_9.png b/public/images/birds/beak_9.png new file mode 100644 index 0000000000000000000000000000000000000000..5af8c90c03522eeaf6dcf3f14223ccd874966920 GIT binary patch literal 16121 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 F{{xXwhdTfO literal 0 HcmV?d00001 diff --git a/public/images/birds/body_1.png b/public/images/birds/body_1.png new file mode 100644 index 0000000000000000000000000000000000000000..40511ab261c9403f8b2730d0851f2a5fb6d2890a GIT binary patch literal 51871 zcmeFY^;gv07dHHvp_?IxhG7JxL68oS6qW9jR2u0XLO?ncL6k;tNKv{5=}H`26_bV76Cd7Rl z2Toq#J_zl!HB^Dye_sXdWtq6Yka%gD`2c`0_rGsYV5yQn?vF&iT2Iu7FvL{!U^+qu zod^Kn1hiBi7zWPovX?;#e=Pb%5@T`_@{uMXLoKR_!l{|U+kZWXcm~k1u4jB7D~rnC4ahw(~ET+lK3E#hc~E zzp>ORAZ211;Nd>V3xoxJ0;Zrbu$Ktp=+E{8m)S;;B~dLUnji55&<3(5+_Qj1QnbTG zGqtkR^={ez%tY9nq4M!Bcf!ubiToeOA=RL!jGJY`F`dTk6t|VgdF-#~6;$pcVgi7x zKa-5=ih(`kzaLH5F>W5omhi2h+{xK|uvdUf(gM&SDtY__sQ9zJ7thO4rlgtNP;$vi z9LIU>t}cH&PK+vV6rsO_v7NJ(s&~G-Io1gG1O+mqRsgIZLK|Rz(yK+Ktocm&-$WV- zNBf~1Nj5A{a}mi!AwYz{iwGeJh!A>-g?Uo{Ix`SiWD%Qu8oR2N(v?Me9sjeohKZc1 z=Y=X-7U68bbr1(AQlej8%ukmR?U^Vl#DEdhb-Ig}%PaH%Ps6;S?Vx!`E7&HB`NE`B zJtC-Qd&M<(hTuPu1l2xex|kPmG$A6j)DHa>xPjB-hXD!+;C}|rVd*%zy&$&iB#h5K zc{MNUF?;TrDM9=@C%l1BkhZ?2fGf0c0>Q;u7ZCDV?yp09mI20vWe#*qeNe9HFB`n|c_wu`V z(=ClRVlQ?*&Q2_rZrYdlWb3D>qWKzl>Wu05C&axn$_b&6z?4XCusy!yj9T{@TIT8R zQWm^XpH&&kk@!-Efw4d;@(?FynE1(0wM=S|8#6s|G4z^G1=>5f;+eRD^nl+yM!|GQ#q|wLI?FT}>VSIwO_E$}O_Icd|0S8yC??+shcD zXPD~#Lb~&t*gk(fFL*}mfQ_ibeyn;%_sp`XI{N*7m!uOkfg|uH4%HC{)90=+=9)HF zeG$W%WPkjf+M=EMV|e_mxv5dimnX4|8L7MLvxGHNF0}Gg=v#t=3QZ?^ON`t9e79?X z<3?KXXyiyTx#*sS-qqBXEh)9>a5J})5@gFI+e}vEj1X7{-)}|j-oY2cn!=4{VtJ}Q zc-}1+)A>X0K@R8|4ZN?DF&4M=kD}kz%W|*SdYR2y^Al;gbL_Cs03|YX=L=SM#nU}c z2fTlKW);x6HBn0F4F4;`fh@b2?%-*-I7zRsF`W9^65?^An5>9qDyCS;e5=kje8TL~ zLDVnya5UW7?GSV(^LCq_JdS{__Pr{BY&-Q*ILAzb?CgIhae7e-wjei7E#|AnK~JmB zV^l5_^1r!^gcY$MsJ-Qk_fwTaqc2-C7WFm8y+X5b;~dPFU7ZHq`*M_7+n{OlClaoT zi{oOKy%N8_(vUV^HX`GHLvuf}S9^GD2R8~Vi7r<_XTb;WfN)B!-{^X{e!=N4yvNLN z+=c`j#v}fV271)=13Z*OUDh}Prf0L9dgek3=fs4}3^=M*ReI2}6L!$3U`>qd6B zflzLQh?;)DO4a-)|BZRxqirrQpRX=$zZhZUw(Vzz0wbz1@+f$lC#BzGn>lBAZ+y}0 zkbh080E?0vh5w->A|m*&-ZZHSYsi^q*frPATV9st$?xYgk&%yU%zcR=DH-JRs<($A~6 zq(EZ{duLpRTlfQ-zB5ZajgbP)@QW5sFV=6{5A?G)|AQa04Rb|}lfLqP&+8Rd5skCj zEa}4@<6+rnQzfy=O3B2>>65g9bf}s#6*Q?2{y&2exnl2}U~Tf4Z%hE`Oy(O-$t(TI z0!w>zh{x6-)uVlIev zcsD~;qeL&#nwbgf1KhG}Sw;H&Wd3(k9#0%7VL{4|*-+ZR)kDCB04;%F&N#n(g}H(u zTv;b$PmVzL_#K#n)sW}Y;K>P>(0fCR`3+Lmei0b1J^PjZp6Mb+^`^Rx*PBv}Hn1SB{^g@|8q&?y_IkF4J218smD=2G7cOVE)y^1~CK9XzV`!%y!_A+Q>c zoA5)C5)s?t0T28w?GY)KyzkKYE`GI}$Le{qyYKfdm|E%gu}?}?@N-ZnF**zo_A&i; z%=$~)XFwW{mVmGeO90xcIfW>A1fWWhVs}G93?Vj@Wdy?CHG^;vkX56`2KYd9 z&Y04NcMJ(ieD<}cXy7gsXfNo%1H`uruwfY)iXRmmCtkHIT z=w7Foc^CZhG?`To(#x>Wu2}8njv4B^AFPL8VemRW#f3xdYfeiS0O{splp|U zP7<~~rp)$UQ2NZ01PHs>yb%p)V)Y^Xw~MZf_?(USe`z}^Xl5MPDKsME)b;Id5|mO- zd+cLHc<=~dR2{LYYCCn8@(BI!nLjiM7f-Nlr<*tUCew{StIxXQ3{TiJU9gP54lFHA zExKO&`z&tH6wfODO`65dUOfoLz`*t+)rEllhR~L$J`_YN z_t<5iOJzoC(B7to=49TQ73H!{0V!Kf;{JThgD7-99`*si5q@P8VdEg8G(?GWqqN?& z=oHXT#Dw}}JuHL5p(w`1Mru9IFjYy8ZS5j)~n8lzGo@?m2zTi>e)OS+Lv zW#&%y;?>)>XVEX#O?Dm?ES_hqhD%z72Ug5<8_Z05yI0&(bky~^xP+oM(?@8qRQGq> z6>jnxYq@1&y@(Nl5-V2%992q(SM`mH|DA>_HeAra$*^m`sAIeZzaSk{!Rm*=A_ZC- zWNF^9PoXnkz;woO%_qmK4iM*XSRdrAsJG5pl2~rCu`GOyXc;FPT_}kj?hRo5p!6kX zV%WWj@?_6C>1USw;(G6gb)dO6zT3i?*UTSU z>H5XI>BVqyZHQM)>So9md`;A$W=OW$y?gv#> z`I+&SeH@neN_qh8uQhfYIj~;~V9{D1xf6f2KIFR6P=7d>s@zz8_!~E@xDTdt2YM8S zyjb>tuCVoauio31bIM-N*ZcWS;3S<}1b|E4d^Te2hfc~BZfSJeFWOMyh`D|;+PhRX<0Y=Nri0N* zNu`G7R{z(WGO0l2w_<{)DV3z|Ogb=|N`!s|cxb7iPJZ+&Qna5+hzS2fNBzBV><~!M zTjFp%BO4Ag3Q{>ape$D_E233zlTJy6rh+Oy$vn_IDRNV`{F2?Wzko58X3pw+u*9Pc zye6VSn)!$?$9HO)yEK7+qrJEa11-a0x9X9MW>eptC&i+Cw1q6?+q39SSMR_z62mAg zlHo*qaN-1%59?$omE=si2b3$JD&@simm7!*)ed+N9E`7DE_+3%1OL$HcWfi*idO3r z?4!W&Un)zY#+oYh;{2m=y3RI&5P*^-jo<)tb{7oSflBvr9#~0)QnmACgu7|H`d-fI zWdQNwMWhOa4Z2plhyLXr`rjHS#BVBqaB|cwx$WojZdy3m`JzuSg{yYes`%GCZ0P5_ z{B(c==oRY5-^*aNs4EST7`xA%0`n~n6m=4{mLGVaFZv%D5Nd}z70cz&or(WDYRJZw z+)CV3O;Eqtzm(O8N1Pz52LV_$2i0A7aGn8iEb- zft&;?foD@$j}ahCSx6)UtSQl+SsiPVIv%(cXZ_CzJR9HfItefr0eIL(U^yN>DV>)r zFR}bow(~aSp6m1JD6Np5pyLY}q4bd+Y--E385H839IcM#ZeaKrUf$BmmNK7oPm`1| z>?Ll^@*U^1WkTE_9Bwt-_#MrGfNrh>;Y=tKPP4+tFIxl;S&25YETkj;;)6#O+9-Xk z<@{BU@!EqF;jiP%GgZL_$l0w|n74QuYR6gtE+4-x6$$!5n}p9A;HahPh`D{ByjB6a z0wY@c^17|q-o+Pe$V#^^_6Z4Sd$B$o%}I-fkdXq$MiIh9o6_pqb4ngD_%{y1>A<{IVBHmr_q8=|HUZW5n`3hr*DwJIu!EZzyk$ z|Au)6e(3&Zww>R3XE)V7#+@Lo*;{h|R9;Fs4v_AVWu=6RbYn|QsXAMooR5qrbtdLY zji_rYKGA8dw8ucHeA6%h2BPlwE`eZa)W6_xZSc`Cs_V22Xv0U9ne2shV`h|&YuDXN z08adX&ZAp@Sh^?S!4dG3+gY&#GH(3i-IV&1QNhMiD-p{<9e&@~mk4X@_n=eE$?Bjb z%XtuWH9wFs2g*C{rvAvsKYt^E5TQn6Ty2g{%WAH>Y6Lv*;gC(=;>k7Dr8m0MD)~w< zV`O!QXq*@a!p)FG(sLe4$5ITwQus^nl(q78O= z%9pAzW2b!~h94+b9ojyUb`H>A4J+G*Lxug!37%K~#WRtgs~VV_Td z=>l)etgo$ABiB?Z(vBKot?aEk6QVlp9U+b<1w)#sP%)iuEwf!WY7*TQzY<(_c%rJD zSAHK521{2VITX+8Z*4Knw-*&{!~fXS@f(F2 z*B9qW!K2apGQV3X;byI&O4i=iOsnJW-=Y|mUTn%IJ9Ou;L`II65p!nBm%+d*PmCcu zaf4tLnS~3$nh*8`h&Zfk4ENlhNWIE$i^6S-@9(tDP5I?ca&n`)>R||G>Det;q`lY7 zXIkm6EhW{M_-&~4XV8#X$pjt20Jf2V7;moo?8o=q{EHh$PB0cadfhJDgJEmPgwv!| zvW-!3|55k0rW341iZFB;RbVIE&u)uvHp9=}VGVVGwBjBdP1Y2&^LhBpX7?n5$57#I z{gWj>uYIAi+If#IF+z1!(!NV)N5i9-F6$0gV*!e%3S!=(aMT(Kuh}Fh2!0gY<`@-B zO^Vo-eomvUs6xg0fB`-9KVI(U^hl@u z;!)={j21gkpgOjzhh;NTDouWL=5_b1?H~9<(;)&&F(pxqQ8DlYi;8+NV zz_`kV0@dH+?YW2@>t^*X!VT)8ky~=#I-~4M^i51zw=gP7o*0edoob^80ESTRY z@p8vR(D08fuh8Q+e)4hL#C-S+%6N-#F!HD6T*d0Bb)AK(LjQvw0pm+nyvlt$KZJlh z;Gp^KOh=Uu<{{M)k3Nv52EVD3$}^)Xj$kyu92$w!#>ZtB*Gxrn_#CnvG~OT!(aK#>}FuU^3?t^LKW#bvgM198Z^dh%(HwY7u1zw2LJVB7`x}F^!{-F zI`p04B8Lf&<%dnj8a;$rLRW4NB0hezg;|>Nen^<=bc&~anjygnD3lU5D$;o&^q5p0 zZc3W;c*IKSuUzu%e4OCHk07=u-Dh6g^Q7`|%wMC@vm4NN=kqt(J`wC^%23JdL}U() zzFFG|z&47(1gZ#yD}@sGvnw~h5Tac{IKHm6$9qmo6s*k9gOy`m*sqJ?(B&MM?+akH zw6y4Y^z~;<-QdNc*<+4388boM8`g@;AFke|lj&v&w%W9(n~0kdP;zU7JXF~@`R~GIlgI&U()xurRs?N2N z?>#*3*I0bwUvrNMw)#DvV z``>T=-g(4Q@uRQp)y<~R-KU>Ig(noLKK}ZW(XK&UM{(IiJdgrrJw0j_AYFw<2e)`A z^OE<^{P6-+axp!<8u^zxQ%*p*D#)kjJfMS$@_@#5ZNU(3AkoriTWZ~H-YP@YXOk#f z5(br0K-lLVUyoBB7sw8^PYO%_>+Z@Nprt>=%ToFq_(}AyA8~Z2Gb9bK0COt&4;EHgEt|$oHg?nQ+|w4A!*x4fnseZ2EpYw>73G4o8cKzrWxyexGqUO!;+|qn_t@_TUyjz zAXRwfEVlo?;yGlh%C+q>2}tYy{n~ZghMFw=QKa$oW!`oHJ65`RGD^(H6OSQGEUT{b zESL?cO7k2|b+(*{bkYFT%I(xhU2bL)ufaSOwPQ$;6c%@`Ut#R(r{4JEs#PdkBHcF} z!-on0HC#B0{NU)z|+|3((?~MDBu5zFdRXM4awP zv*^#|^BGsEb`Fcg4SehM(%G-n`R<{QqWP<9=JSoU|lHpZhEjfQABNu*$zfTs`E!T}Mf@Z@tB9D-0zj-a`Spw0O8 zA!jspQ~JP?NV^_LMsaj3|2a9t`j{NfZB};$SXD}Fi^6J+A#>1b?+r(HM6{@U+zYn~ zxbIsv>Xgj5aNW_=r`Tq}V%a>2cL6q%XD4>_1@xmLo`w1C@`*teIx6_{#PU||Q>!wB z;BhgcE+Q`}1g) z=h928K7EOS!5R^1_TXv zn(q^g?4!uW500o(WzjWvr6=Cpmu)i{jiV?ZZ{$+UzHIkz^*W!Ygea!?Pyy9F`P+7- z?w|h{SD=RQKqzQ5W}6wC7yW+IuGzZ#Nb3HUY09SU9!b8ofY+~q2S}WTCu^%#oM+4<#ECI5zW~60sUg0isbpHB?lXY z2ob^qV?Zd2B#-@ZCFeh70@GiQAVh4`KIk^Yi*MFMILj6{M@Vl;LNd zY3w!}bJdp}WI=Jjna&+fPW1MkclM0C(u&RcSMk*VL$S4>%Qqy7Havzy)7fbs?3t*} zO|Gw=a@dnw+B+0aWRCTXeH`j9h7}N?Mc(a)bZ1(MrQzZS1t!0;?Suh1ZE`FPy`679Sk?B?|we-1B`=QLa`C${?I+@n` zuFvFv2|bfJO%-2~9WJ`@no~&IiP8{3g{XZ+5T457YB)YV?KU{C(^8}mGQ+s9os^;AC+)C@Rq6-T{13wQ`pK3%_7 zI*tb&P^CYvA3VMZn^6-^|BNEKq+B7@wZitlssd=N3(|&#`dvFIh%al60Z_>Rxkg4zfd!{{L4>bT*Y8& z*sH@!O{$hZk#YT<-(e3wJMa{UpLXOPtfkNACk|?3O}lV8qVCkbtlsk^K^O#Ls35GDZe2RWM|-Yneck&K)qw z4`R0tJe8PFmaSp^oM3n?yJ;5x__vmG@|b1Wri|MhXgLEWkoK+Uz9dH3hf9cW_jI~LN8Gl5ej4Pi;=Q5v9<5|nsnLxZ| z$ALM_sW~nhcA5gjuj=??%zERIKcNFwcm;4-0KlmbT(zta zl^ClhY)rQe5m&TsFX(_0m<=U*-|!DzGVz}DTlf`3oEsyTYWR^!_l}5dhH7hj{2Tt> zkiR{eQ{LeYs^UDa?>mI;Kk0W>t^HN5J#oe<)wvJ*OyXtC`mQPoj4(X7QGlO(TQHJ+ zf3J$r*n+}ZT3iTHKo-0c^ek9NG+ym8N5ZCHCmYEC44pJ+!yvC>TTrNCyEm}27W}-p zdjE&Nm_Qhkn8s2);9WP)aZ5f(0uhZvVN^JR>ZxEiR1vl|`x;U7WzYMeiNud87Zsbg zf4ht}4xNo=1rmiH*P+rL^F9At-4%GueYV((BRMD}LUq=i^d?mF>B{d^(Km>a0vX%a zypp#oZ&Z_0FxUHdGjz&TV6}-_q$CT_A!|Thzk)+LRjjBSTF(+t|9Kz^T%}#FTbi(AUzY zdH3p1qWI--iUC{%;dZCsklO$YQ>hR`z(&UPA1gJfX` zGN(F}I`|{vyamYea`VbEO>)CzU&E80uTD@p`okRG_3uSHSK^Qismo_q%x_34a;tOV z3-&JS^lKh?wqY;@^ufd2UUA%)|h5#L|k@P-t^zF^SvqVJDAX&D9H0S8- zyC2l$u&AL7l61_VPRp@ZI+pK|cx4OBZoK|(#peP|XZ*_gTrakJ9jSK!8>cqJ{bbyL zUSx>Yia<@*AIvU9bRgYjBK;rer~0g$1$^%tZSJ3iWi(&$i3KWqzgXfQkF0buWyr}^ zMHoS-f`0REGjIGz(j>egz|mtb_N(=ZJ_}vS0=)ksYnCcVSy=Hn9>6-m=>anDqyqNG z&RrY?1;|=t?fvtQ)qkE0Sj!(oPv#jt{A+|u;qoWBw#bkX{~(@ck$1hH)wx%?!H^0{ZUTc4>9DGpBN+ z$XW9k?d%lrXjaxbAD5uFu2JcBqNlL{r5|&maVxJs?j6>jBho``dt`-$N04toE%d`TvpG;hNWR zv;X;zlNB$4RRE?djZ2+V4vK6e=w~-cxgTO)j!YMrd?9gv$4v{vz%n=Qg1Z0I=Zch! z2#l?zZM5-I>C|Ki*CS`le;fwikpxzq$-8~Vd*og z)O7ufA5P!U_YS5Qy<{4CNhvY>%h1pI$^Ru@`_(w$yW>e(DS!`MF_Xi(+y&n%IZ%`mXmojo( zaLVPAdi^?stbK1?rUGiT)s!6@xe{n0wnh*Owyb43h^Y|{9gTXr6|$(Ax=fCdhf1sK zk18FWvO%&SJYUfT8QMs}VgY&>QINXAcGDdV&NW<#F{kvXCvlCn%mKP0J{}EzU;t;9 z;C-Y|M=~JG?w!tP{{w+kdtLWvH!G;i z+;%L1+&2&U**ryhlv{+BMET@Th*24Y6uGYR=4UuH=)I)Pe56!3g$;4RU~eQJkRsp* zL=e%}-3HVTNxZ1}bJ^q=M3RR=nJ3~7LdV8NXJ*}_XfMbsIdXgFYV08MAq|MAxm83pZqoFQrM)WIbbTZ@X9#-0J36n?Hc3k0+xO3apO2!`%rwHen46xbrQdRhJ%j zD=^c3coS=X<-j%T$`FknfrP{WqBc zryFyv;+a2T4xM>co-b%_XxrHhHcB?2*O3vhvCR++r3>6ON;)XfOVv^}G!`qVjOlM< zCQ=(_a(+v^>}Qiq{1m>8m*jED47hKAaJNTl59HMkKWkVIX~G=iRFR3&Dc>Z?U|yq_~44V&u5u1lpLDTanYAfx>&zVPITe zmsKFoVnx+K=&6w8I5{{lrCUXDO*#QkJ8ZkEySR3|gQ$-x98G-w=0~~)!MJYe{ReaW zF+rQ+f7%D-Zi@UE{KKYw{(-q2+#WqgS#Y+zjd+-bAJ9S6n?KTds7|cGpb2{T~rY`VEW6eVTNz`gMyEAMrU3b$uq*$KU^d0mbQJTSbD!;>+!3~Bhi5x zN>fQt-DAEt)giiP@+HIg+WdeuSwWvXK#IV8e*yQay;BqPc^ieat1|1K*C!*jZJ+4% zSL&I2dq*M~@j85sFA;%E+yyd)MhuMblVX?Xr#=yGyrxm}*2@zgPiK6^C)bFapwQEM zW7uq6noeo2iW8=K`(M;70FyaH$~a>+Q4I-y{e6Xe(n2rTvg$nr$R&4P8)AQ;^GVYw-&`8nxNs*;}|?b|vxCQ$pDD z8NA8GRqz8|;KT1N6djlSV}SKH%7+2IJ<>jeC;?Hn#!2Y>in1V zn(m37K<<{wu~m?|(6F?V(R^-6_D{G0V}-iL-yZe1+mV!J zHq);XK$>zA6zVvq;64MEaD7mBpi`D;pe-~hzcEOyj@L&{svDLw&#%3krN)97+&CV_ zPmhj17&!C!$or#^k0o|i?76x_vtFE5Mz%a4f`=BTLV(fb6NCp*MX~G5(V4r1K*7X* z@mt|_?a0TPh2F@FHbRG*Eh#Oo!lEE-kdh;zzQ7(H0r+{%<$NNRuOh>gFHco`ol=l8=_f zks#3@$4Hk3yVoAd0F1NadH|~<7^qQxa2>JYjcyh$;!~%yzzHQ%x_3-fctmyi4o#0# zyPG!i&&A%ilic?7Q9&>j)e^I#Rru-;`jXP|kN?Wk957l_ zU!#uD-viH$kiC*WST6~u5ZMbUfb%$vrXyg_(wv_keZLK|4wy5In10j7A4D$Rr8DmR zxP^MW=*^ETzG1&|xQl8Uxerg_&xQ0i1otcdUC5FqESe~-+=9;h zG!~~)t2vB@Armr9BbD_jIC-oUD9=m!!Wt-U5Fm=6Z@x!&tSg&>g0 zP*2ex%^;knWoxr@vkZHz53rV24?qFl#Jy61DB3E*%`4iMfl-A6wy(iO$PC$<%#qF- z^Y}8i$U-gS-CQ`SzT<0jyXCNc=*)wbqUN}gr$fv!t{)5lRv|E45_q}qD0iTD1ij#O zc=Wi_p?dGdJAD{w0t|29aO0$W5#A5YUZV*DI#>sF?-Bq6sB}9D6yt`%EZDYc3Q>4) z$KgHuwV`S>QpEsMv)-ELJHPZm{od)?+tJA;CZ^ppVNNDO+rvyq6X^)pXVq#S$8~&y zang=LzcGJhxirzWqg5x?EeuRf3A}D;WROt2jZm7ncH)Y15&(KoOAugKbNZ1tC?-^u z31k{7)#J?uU%g#anW-iY-L&<~Lw-*Q6pvxW!&8#PltZfDPyjbZl74Q;-D2iJE9d|G$>31osCx!ksc!gdiCkms~80;8HV`~W_RbwJu2~A z(@LiVDJ}eJvEs8G7~(xN1&m9r6fT;dn$}L4hfmC9^=$V|E8?fV$M3w?vYmMPSe0|9 zm6*wIt5jFox#>8qnQ=^QQ!=190tR*t82@@7LHN&XdfpG;1Lo#q2lAs!K7AQToDljy zHON*65idQ>d*)lKqc_j5Ns>d>i6fJ)>p6e$y1rPed`s!<_feZ_dd})<6mRS?-dolh zd>?=zE0Ib8Mp_AOG9qOjQm;`uo~&qS!POXgNheRKwm%AkXV_9oKl4C9oM!eYsPNs# zDY<*gaYiiei7>7IY#1(NSz}i7=fgiPea(MNLtq<$ORy4qOH0&d0^<87jdHV#ds%xU zNLT`GH%FgXwWqs%@q`*K8KRrJe-0y6;Cj;%S1~)?*rSZcR<_CeLpvQmg%K7H2ymXR zy0;`?Sa0=BPpKjB_%FS0@b%);7ZnTL#*J|U=Bm@bw>IuKTyi~a$Sp5@NE{ubWRIUB z#=6hjKcBU~c~5+$&xY#HSE9dRDfa3Q1%(lSdWr5~;GM0vB~YUEmEQ%7^MHQj2~+dKH54;x?n$`Jeh^7~p7^Ob^-cI)=N z#MP5wt}uTQ`x||%8Hg2=M2VFH_8v#{hgRMN7;+@x6_!RW5*E*5M&%%;}IOwV&r&8P$c>WPTt zT>uI)#i`Q?m0fF+wN$-6EvfuCqV8qDJx2Io?NYdUsTD<&tiA+F?@?-#UGqyN+SC(P=MtJ2WIa8tEE5>EcH`%*Ly20;6FW zzp`k@j}>rAHRRxmy@1E)YHK#jM0@`^pf*8sk4gObFa z6DZ2RYZk>lHL%b7BBtb3A#X~n%IM3Z+b4)%CqQ}VWC*fL!Y9mlTr#WwiFBAFH845@ zSJ2z`9TR82x@rE(`otG#4{MToGSpwOPk^a|IgrKcG62J6i65xAebIx5#IH1aYtp|l zm$Sde;AoKtOb;1zZRwRs5d>wg9b^*?ckkk(Ube@oqravoaS=Jc+4%00Uw5tHwyRo^ z@KbZ=jmUP$k(f;xPym?vZfQCJnr5!)J=YpbKHg5v1TzO&v@he?v6btMdzWxE+bUQ? z%go0=&z9oI$LlC5aVT9-+MR9$fc{+2vWn;@_Av7()FTUACoa^@@gf30DF#{^EfLXl z3g)Mu_HH&QNO7p~)%yR+(lP-1N=P_;PZVbQdB*GI=iWczF(dgza%Y?HjCjPXIa?)p z3!iBP#q;n1g?;&8Khq%@Cewu3k7qG>4*= zFX@TpfBFE<17A@iQlsu7@-PK^A*L@T(PKDJ#L#E(X|{t3xiV{lj}v`YBvwr&bOZ0b zubq(WMS&)iC?jC>0sh9ZRVWg7$Blu>1anI_p{m- zo&ezxpPJ*Rg;Z8baa_~nAo5~E*1qFdr+osd9fKe&?OgTFECVUGuW7|g@ALMXvBnc8 zrK`q3g*Af;=IQgkiD5Y}hSKuy?@(oaKnH1T?{qNWNK_%P}FiMP&6lG54>bF-m zA%L)^qY%y}IG{5n3}pPk+L0~Y>%!(mHE?NStExAAz*tHsQ?%olv)mr)#NOLiO^k3Q z#}^;KxgZp(lYg!AFaE-Nl8C6xsV9tM9e@mk`_M?iff8k}@#W-^Q>y@89r2 z-~RH!wRXgK{@5@Sz-&L9THIv=bbztl(eMvCk_0FfsY&bAXiuU0jja}yG(GUIph_M`|4lQXhvD$2XfHjWgE!WOxOTd_mdVyD_)Iv`vyX0ccZ@oBh0S& zjHp}Ct81CsrV_T5;0N9ZM2MBtf5-K7Y!3rH><#Q)r7HX>-!(QIO6e#@56^g@o42f%jSLPveJ@S-t=X7QP&obBoI&~J zO~DrcEPZ@IGFP*j@$f1oN5WbRJPJL=JizzfvJtpcs1Z#W$2}Ea_>;RfF#!vfSt4J`pA%Z~kkl~i&f;U>gM`v^ zYhG}yUW{p+Byj(XMh(Zk``{{F3;F)T(|O1T7fG++QVPfeHzC~f%zb6rxX|)tE%9V?M7dg zs8(AkExY>>X?KG*WY@3RHk#>(fkoj8SK%A~Rn^0wdPGQq*4H)TdPJn!d%1oMBr_P$Y zon992Qz6SJFCTxj`|SHqhw)UTzSOLyDk1)^;ifuT#wjrR9hjpmD?sHo1v05GhI{ax z0Ln9>M9IekOw!Co>f}y$n{ZWFKp83WQ)~n+w*bh6^{*B#L&@J9gjkoh^W7vNW7U?@ zBgtK#$*Fs7zh3_q^$ylRI$F4?Gr$^*HBv)8OZ-?!D&4cTIwG>C2Dy++1St0AlGBM1 ziYMDjePuZ~M{7E$J}ce`siylTt7TwGNcK!{1}rGG-93$#iA}^(i+9GJp~z3U)FhnV zM{>lrIswnO&TZB)xC?xM&7)%JAGMl6QUiQtz#hu*;FanUzoKg0hZ>y2aT4|+=x>Q-RM5xXcMY^S>mM&>fB&0(^ zIwY5n?hYwMIz>uifBXJ?U%x+K@7}p*=A4;lo@dUae*r3~+SIRc_rd$Siv{;u)|f9w z0r}pov;f04f(hi05wJ2H^^5gg{lD+i*l@J3Aiwk^CUgYR6CmqDJ^P8~SiZS15LwEI z&@h9Pvkc0+$P9&22I|oJk;G|`Cs_O)1SIM_dHi1bh{kq6aF#Ku>~-cV_B?zNDD)3z z=5(H4@^M;@bw#6*gr{bOXTb4?(R)5}FrYt=U}dduZU~%U>72R7LqV1D=BF)YF@f*x8xA+@PX>@}NY1AM(}6pto=)CVX?VK){z@xP~xqiAVxlgX;J)vDX)s_h@=?&!90P8?M# zYQ_ASQF5M6-iR1PjEYI~)a~;KSv%vOO6>PR#H*c;H@I*+P#_pyq4)RmJ?<$9I^wl; zpOmZL zG(V-1m;c~#_6hi9_H!2a${dtV-+JjPm4dQy{MTs^$LF@@$5$_*48M<{=1aO|rP~PgeNq8yp*#NL z1_aW=FahVe!K=KEBu!LW`qOj2NBB#e1kSvZuiVSs!McD|xRswMe4MAkvQHQj6xRb1SPPYXOnP<`A57<+7<_Phon`;~I1?^Dlc8 zi7NH$sO-iBFhmbQxW=%Y#Piigg;5wbb5t-Z1VeGb*if9DUCa6MpMx7cN?X6c4i-Lt zv{96VrIYfeat><_1yZTx$`Ws0R>MdJ_l~(i9q5}(K-CI)n|}g|6@ZxT!Tzl1oX6$( zEW9@OPq-N^GT%>=+QiT)ty_=CD1OKo^(mp&ID?s6*d{`gk$kqc1JW8vqs0d{AI~fo z7>uZyN&^JX;;)hqt%3$o;%?q`A+$|Vz@We}@8&jSy zb$*M1BJ=R7N(Q93~r=b0M(^~xRJ?6kGr3&j6 zuk2%2x=GUwlxB?(T4jua+Pycjhh=5ae(@-ekY^LsSjf-x$_XOhSQUYy_a&3)qSelC z2>6cj_fB2`uK))42If?gcHV!hJ1s{;+?IHORY&>TwJ0u_gh4eL{IgLxDse$Xy`9D> z)Rp|_$PQ`mQX#EhZI&P>6L^wOzM2$X!2$=U1O(n<6g4N8e@MO{Ru z*w^1}B)A=VKIxmXq?vj<|GNXy(9PY+t7vyk3FIm8qbHYypi)nkkHOpHj-k)3E^iCp z-I zd9eS7Wwf+65E=_NUs4M31#dnFBx)Ae2a%|!f314)=e^;b16w(i+~m7$8Rqx=OwA6b ze-`9}&|l1l-BgP12`I@eYibjiI;DUx=D4SEOGX_m@cOT}R*8Mb^8#%83zxkeHdS5% zA}pHr7rN4=yzjl4LA>BI1K^$J<4Dq3ED8l4!3MHlBue8t^%ahzq{=98Bli{=%a>HG zAe}h9e_c0^LsVIKg3_i@yf9MfL; z{(0;A3KY9o>DvFl87Q^qcE}t}D%76cj0~m1I^&b~p?cN;LXB}Ca01~TAbooY*UV!M zSJwpR2n53|_iV)X=@wX~;lU(Dbm|6>B`@RN6K7=hT5wkI+c8FTrQZ?+e@%--1`=G| z8ZX*$H_r>bbx_G@%I1umTNLF*ru=k5{fOV{12j9=mH)&o)STR^lIrJy{&O<{*j60k zI>&02MyS0aj#Z-&cwimJ%ZxfV7!QQnFq8cU7JTyC^$f_b$a0u15{Z3{A4mfr@ep_# z$jYeEm$hdSXqB3=^Em8TCixb69ySf(!Q_3OG!Y&WxOW8Q{wN*Wu$Q)1aZiHlW>%-e zP|s_5qv7C)WVv|RJqZO?uf<*)Y$gmAv#3`ouYg8<%)xfN&1=AmHe}MoFB-Mj=&RWG zTveR}10){~8Y)_+$IYdOP*i{bLX}5a3w@`*r@YPLc(WdxVrd3Y>T%q{+vjgiB74T_ zvT!Bw9mARN!y^eW2gu9Wzq)xV=4K9p0;wG-9&4b{04eolrxb)v(YbHyZAgH2SYjxO z2Iv@SG!T+LKAxdxV{;UQ69c5OCEPgu`+wFA$1(G!}`tl_P4vL^m=)~20 z*LS~5j)(?HJlsqMNuRQ!BhEKx0=l#r{%H4~F9c_~Y<}ZajG9HO6w=A38{8`q1vSG^ z#MarrgZLx=rXGpkE@2qpvtj4^2PxD`#g6}=*Z3||MwdtmtYDn20%AFLnjrTdey^&6 z6ft7`i4{?DDJ{>nH#UgIbBD;!FkL+weax^|9XF;AeRF!{9dM3N}P!k zee(4`)tf(5cWl~ot$S%n{(_215ZW_&VST)SuZ(*$$lpw{YKYs8p_jpladeKjAK)CI zouqfRSD|Na0x?htT4s+c_d-YE5&4zvC8aIK>pmaHVgy3^Q;AYgkACUR<J7_QfrjdkABRM#)aW&r)(8gFZ`5bVI^d0;&0;!LCyeBy zlRRo|=7jhlm*0}+Ti+GQ|Mu!%%=6f-anbkqG+vSQ{9?q#j{-4?mT7a0#06Z%+Rvgs z!b|Qoi|4;f*=;DyFaaebkWn+7+Z2ejfP_cXXB|1;NBz@a?<*t)@W%OpLFXVP=5mqj0Vj;4S7SqOu{lSAkzNzadu|R8Yl(+{ z$U#^l2PrT{`>?x_QIm>V?YC5<;#2o8=SbGcY=Iw8bNm6wqN-df2onQ6^F3VUmq|Uo zGacQ~N3_Nlz0|WKjbLmBn7j;zjENA>u?cR2&1ka@%jPG0Hi;LWJ)xtF3#!(}i{;+4 zrPPY(KhPZCUm?dzkQ9hKz)w0;;Fbps?o9A7#nHrtc2wP5vEqYeBAP<0l_HSd>%p}<6})aU6HLi z*lGSY#_!Yay3Ud6f=_flHQJhrW?H)KlxWamp3(9y9!ze03^~UI>OsKBPizut=zy#~ zu7Dg{_P-W^rcdL378sN}(gF|)`pvL+-&b(Z*~T;Vn%1KIC-akmo)4rzHC3z?rikgc z9wInu5hwhsgE&_v1Oq*VR1(RBceBUc92oISEfzTRCfXStlv|2+4Z@@}mCcqYg1!7F}|DYE@x2qcTC zp>3d~Gu-{p1_WUO9NGQuMp@jn7()O%>^5ZHC|gsvbyF@8+G$ET&5(tu?&nH}-Y2j} zo*9gH=x0{0Bpp{ZC5oVZ`B77esb4XDhmR%en4l7|TyJyewOu&^%2WOT!%XcuIsHaM z@!2so03CsUc3KZ`Uv>-RMy@`H!Z)m|y;)E*pOU$nWKBb72%dO$-qC}MdetkM=n*Mt$?69?LNHAnO~C%(KRe$`ZC-_|3YBzc7+omCTtGPdMuil9>` z^xTz~XDsQKAO29YKpD^=%C1*L$P(3Kcz)S2Few&x7K_ULwnivsKxSCU;n7S}1@TG6b#+#D>XFSOB38 z7Q6@5Ghnp{B6Zan)4X{h@;0L25h64J=#bB^RS%1w2J!b~`+wS@=9q<+8R~b}E&tx` zW)*{75fg9X)|NTBh&sp+bkhGyFZ}(70D6-eyiqgz2Y@_&6o^3=5ftz#^E?`VztGGC zp;V{mSKbh_E2-|Y#e*<~FAt-KTMgped}r+1GAn~Cmgr5<+@~{aBQ!y)X3xXot;7udj|9LW3 zdpx=%{w5lZK^P2uYAxPapj6MLB#1-V3L5I2d|+T))I0)TuWQ?q2K^DHM!R4{&lqX^ zIE;r^K?9vCHObeZ6si&AEZ(@i<`!D6|6SGBw%23#C=tFP;aGxK*HYHxre~_d7CD;s z#Q>+V6p(;!S|>e@Nsn~D#sHQ-tn27#!2Y)5JbaFSpT@;r!dK~dL_NlvYrs<95(hWV zhUR(;FfO(EL8teS4K570ZtmDjNO$cm*fT9BRuhvdXZfu*h=}`kNBb`XFcHUQ$ou^B-@Vn%fTZyfB=w~90@_4Kqfuh zIh{#X#OL!}o0GKj-^;AOUeqU1dh518t6^2_auh^3syYIOwx+>A7E339s|7 z=wT+qR%Ax3!g7|wz2Bii_$ztY46tS@F4TO9JJHUNHuJv}(sZ{1k*irRHWl~m7#NM- zUW^}7iqAS^DOduhptCKdjr0s8KQPps_+STgH@ZJPGlJioRAr!png%k4Neu8=G8dbO z{+$;D&R!g<-HpMU(ITocwI&^ZL!)f@9QtK)wrgz_UC`FwxAKcGrogx!waO<5i;g+S?;DlFVqI@q(o`&{y*Z=60&m={&N8JjgW!eDw zp}*6KR4eu2$vh(6o=1{UCc?(Cg`hfw6|n6-8}yux8hZZ6%%yMuAe1E^T;Ga`9S$dK z)(&Ban0x_cWCf}ORbO~Vy8q?99opbj;68+z(ZltJGNW+JYbAdlvaJqhITaP?O^15^ z3tH7(6v{PUwIb!ASkE|_Ob0tjKTZG1vbl4?N{aT<24`3-q?$tWnnwk#LErG%TSe#G;~ZnBEkcP9ha8~pMWptIgFYcyJyqGeK~eOXZkxl=bCQM~w~X<0lApp&8HaqH${=PAT{8|- zva6`Cf6RTxDL!&0C_3*UDjPthgl0uMEIX&{&l*n}6n#5xXT$E|129F(#h$%D{+x z>M5qlv_6c?)nVKtHC}S6Rmbu@-zxaxOP?IHUM9cmWfPNS%=<<~;>Eca|9SL7!pBgs zE%rD5l=Arl0&_$V1F$V50xp?+lg;vHk#d}RIzJ&ZRBvAF{e|#huk}Y?Ew;6$WhP)9 z-!{YKzX0`lMd*IjB?`~OIHRcygA?L%{+tvoJ7j#@62uT0OHG|^@tt0FAFf@ehwR`Q0Pc$GJGtf=yYu52#=U1|Hu>(e3J;w% z-WdfSOr3C4jUql@1wUUiaeAuquXONBCTd4qjT+rs(Io%Pl#FpAOC80FE794W6z)HN z$@LW80{CrD=M7i?w~dK&6XpZ=oNzbvi@eZp#!u^_zg$ebkN`WjYqdtAkCBr+kxjN} zKY%a0<+NYD?Nzfc#BSG0#>4~>)>d$+Hi*6=Yd@!SQX$q4XP zIzp+`=SI>=JN^0NJ?Y*{f=-Ic2A)*Xm8SZ^r@x+&s?M`a>TTp@r={JR1qW0%B)`Nt&JP z?D)T18(jVSi{=9aO2d(-z2EKxFvd~mc3n7pBM_(A;$~#9hdjR`k7H;41-$oaF6FLU z&twPk%}0V*1yk|w{F)zS3tYRRclozUCrV*(G_#a#Wq=zFu9+Ph1n0X3tNe-?P$f7slqK&@numY{xjz$Fth_gPTo6_Wm*bUDJomf;l7p zOZJk?RuoFa4XL2;PSi^-#mdik(eCNJ_4lZ5HyHOU)WNRqrsF@*WkXnxxwR%QN|7(?&wwG zIX*M}@|8{wt4$NT9#1qX}ac3STX~oZ6?e_J2TWlFFQ4C zpG(jfZRX9>2x6ktUYvO7op8(;kxm2P#2YjGHP4H2;vX;D)h}tN)cP@gL(qXK8PS@) zckk#3ZDqPnW>PTi!u^^7h348I-npMQ=mtC1KkJhVR-zgO_fW(#CtME1a!jY)(deAH-Weuv^DBhbDk&BkR<{q*No55~q zYo5hKPoJUBObkCG$7U#cHfm?+;v4$>#gp5*@1IA!WMP~A;rGw*-xTzl?qcU1x5}(r z(S(Sfl`ceZ;P?Av*{_QP3-p&UoNHq)Sn(R@L(4BOu5E|ao*;<)*oLsN8I>8dI0go} zk1c1ouKIY3g1e7X=t7RuIzrei)KK2mZtQa_-IdYuUko9Z!bv7E-Nj?%bz&?W3$0C< z?u+=Sl}U8|QA!VS6Uz2a#5RpHLM|;GNrmwS8u^cd!wZ2-Ew;$QWY%ITC0r66#lc^y zcq8?h*^^ECA-iXyEUe}=uuWe07H_eXxj>pnQD}UZu~gn3kD_Eb!V#G$!U-ezONe2{m zR4++Pzu6Mp)%E+r;vX-cruL8~OQ8vj@X!mx9UGhqwq}47^E&v^$Y1t0|07~O0HD6V z_hcI?1|B;woCeA{K|qs!^Ssv0XJlx4f^JLVk7tT{ygB7;uZ>UA7IBm-s)R)dMI7LD z+;wg#;gX3bV5y&7exVoA{4tw?2d%Fs-SX%UTHaFxu(MHrQjqz}liyfcc8y=_)*sBeWP`qwhd%8@7c_hO zyy0RJwNW<#;NWYQhGQPT@6m=aNj<)pu&<+yD7JvcX@4U|z1?A2W&7O=*+20gEXt0$ zN-wZyS7LDSut5yaCLMC+*m~aI=qg||HZ(h0&ifqhZ4xzcCm7DHMma`|JT3DScPnWq zpzWLUQt~$V1P1al&EKS)xUE@bY;8{4O_cs3edLSy^ubhj%lii*GTTd9VtUe|dRU7y z?$N{n{d)qH#TX~<{Vb|I!T~NH{jqpVMgC?B;=B z%}!X5`vsm?s}}c7A^3&Shl_8r$5e#QcUuYJ^-K^-2zOf;p)vFJLK1dzPDa)9Uo;hi)RQBIj1)lesi7fOl zHW@Buw-*>V_k_ z+X?$0$&EbmZj+5$^I$p!v&3{qg2)Mr!41A(>#171-0s}3Dm~MbLGXp9(KjRidZ6?K z99FsAPuKXxaxRRge;N2J*FTyC6@t&q0cl{fdl_W2{9j6`j*2%wm|OSFe3DFzH0W?O z|JI+Lk{bf@87s5s=(Snqrfamu$NA&-E%3F=q0_I%l`mMOdWCeFK3)C_X4Nb|EzUl>b7KgTnazzH3|D?# z+%WyR&4T>oD0TbrEr7GbtNN6nr;&K`Z}%6^M@YU7cGBsQRmcm1n>bUn8v(!$bRUhg zd$Q;s`CpFIL;&`?`)+Z~9C1TWZWnV)3?nbpjOpK*lf#gTP7xIP1XSZe=@|uHr*jd& zDMc+ygs#dwU#Tjgg<&Xw*l^*=5ZpM%EZQN4fAn#A4IEY-{Mm{ubfPIB^sn-p7vKrL zf9U+1FkPiN%E-|4;B6rr?O8P040%V6@e*yvcX(BRPX~+K+1`YFRmlCC5d@p$@Mnl` z!0%%2Ji=XlkAD#_;zP6-=)vQXh!l{t+9*Nl&nX%4eP@d*f{m9=I$HX8tdQ4H1hW&H zt=ZAU9ZJlme2;!+4@+*z8q7#3rt13NX|GHH4dzMMLCq@H-TII zEViVdao!{RWaP`M{nO?hUE}tt{#JkrZRrEiG44#o^y6#G>EoMe&&I9Yo7fd%2BCqd#g5(pIP;_*_aA}8r@CK7&7r8wl<@5f6Kmn5$?W_|B z-a_TRl^uoVCc|CM%lgd$lhS_TncWGEkNOyrn2_b|!PP$%R!N-#Rz>WgEYCP2VQi6P zIAFM{!&n8jC)GpycLz_c*G_^F{ONW%lnI;+TB}{VJ3p`F;=*R&G31XsH}}l4u8upO zi=j)R7~_W4jA6yCFX?rRoE!?%^i+yYltq3TSgZ=O@C2sz<#p#CD{GF4S@`5?CkFOs z)YyHNv+4sh(VV{^|~Y*m%8b==@n>8z^KXAz9iwOshg53dCImq3R|mw zgK=3B{aRN57%P6rTUze>9Dl#OyNWWE0Mzk-GF8u9#uI~n^)eSvWGVQ(a)Y2S9*`n> zFMt7oywn=x44neCDyM{bwGne^H@^@yP&_ekNX(H2-j6=%n|V)0oAFF_mB=y*Kl00~ zBI@$MN{0J>S)0S$YHlZu+4iH0JBN>J-&w~yg`ULnB6Vp@`3JBU=uC+4iwXJK)ULV< zJ6@IsQQD2=zBlHP&(r@KUflxR_@W|o(tmyowJRl{gAb0$Le}!a_a=cKu5`cr){2{% zlwok3c;)2djcDIT?&IY)`$$ANC(2S~wzR5x;-^o7|MC(lYL<=<2Szb5tT@a3kfW)# z`xVTmF?lpWK|I4dAWZ>(; z=ZliKg-Gl|0n08l1P0}AL}bFm^m}a$W#4>OE()Fx5#!ScVo+qR2}E_K#iu8gasOL0 zPJVX$2`TKkY_TW=?P#_+!7#3QIb3mz*XPf;hhhVIuZyVtSIgZw8g|6M}Z#(5H89v#>M&f_$9)TBkCCyQX&!-DNu_d0F z)UHym-mt5ZXLh1#!U2OUN*#jm#`81<11Xa!x-S2oNO9Aswd#v;Ep%WagyFa0WE0)Y zJgNVg)+2+04bB%OunMokV?aN^o47EW^rmOVxZs$u1<5k1nYDIx`6Y6EUe01)xK-!3 zXE(30qWQ@cNto$6A{=LJSs5c?$Niy!$AW&`_YymZ*tCx#8s0>dcA69UU?FT}x|+6@uFXVPrm zetjRFjZ#RBZ9sP>QFjf+Z1WQmfUw%4x#)f=K{)?<2TG9`X?`)_`9A2)qY|BO~&V737 zLA9OzE~QBQ`PvjVe#m#u7uqc!PnOf3LoiC7YqYV7L<-Weq`*+PBf@?<@d9L=t<7deyw+^fUTRTW9fnaB|Eot^*D|k8fYR`2*Sve3dPd9W{xTI$8Hk(1p)eaw_QGso6 zRkoBp-Wg|SDIPBSXz@$twp+a{?RibdVc8#>bX01cO%B-;;CVOyi@E-f`QbQ+q88@U!E!n>cZAc?<3$dedw8nS4L5Y-N*!%A5>_EH?iv#0A+% zY#%!h{bh7C_x1@NQe5Y!i5EWW2ZIw1T-48VKd~?x|3u6-G>_w9?5@R}s^av@?7==P#Ar7nstD6~!rq;w|`)$yyPU~`qN!n*AO7+${TD}o*lj#J9 z7!A?ojvtN^{BA^g6ZkjSh`;#HpU~l&@STroIyG;4%VcAShIYtlRuk+&_aXGBGXdCb{zXP%95DwVH%3`;-V(5Zg;$Jy5V24>o zBsd!(yr1=Na1ffD(}%7W#e|!NdpohOu+U9cibd*eg0(dh@YKNu~vh^~rv@nnk^6+BbIBmff+-L=ZQFdIt z?3X_gvp-G?3lxU?r;^&b2DN|Gyz{;Oh{MP_zLYnvy)0HqCC3>Fe|=mR@7^~tgjFLL z@5dxEhfDePJlKN6zluA?ve>QT%G02Y$#Bg4+HhP%g$VjC;720eBe4)mbK7!Q8(x%&+enC_b-eH#$Bzvv~Yz<>by; z|8ZkAe$Pa9{ajPxp&7}<<0FcOYU_tNBfj|pl-3m$lhHFFbdiA!WPeDZ+MJ#E0VL>H z2tTc#69OizHdLd{#X3a_qSO9vvV6R7|7v#|eua|8=j#coOt9^A9J#AT`ncivE1;N! z)n!+PK`o)Fb`450gd2Ui7Q?-@T1%MdGnuZ^JSXe(-`VE)gpHwl8?v>37%^ilc&-x3H zinp#ar*yeE{d&#tTYCM|M6k0Pf38%z(mzz;#-dVG9~H0Cw;O%$NZ?rsiEEwLt*b_ zEv7Y9N*Uu`1|xdd8&z;rgffV)&g>5qb2g$n9LgxM@tiKOX@^G9{>#PokA5?>jx#Lt z)*y1VXk8{IqrLnxiz1IdQX{^z*D=4ANqB{B8XtH_&QxT$q7OdV1G4P<9N?a6-h-M0 zO0sK~%mr_7p?ZatAxS`)a8$Q}@@=<4#=r3H4zKfArS+SUj{N^R@T>o>I!@m;P zg0EP<@`pHUYwi;v9*4BP#n^4@PyT38?`t^GsHM%N$P0ocp%9|(?t%Llb5|R7<3wp~ zLN(*dz?PSBp7^!`rk~Wbom|bR!j$o_Z^ccDwg?0cH$oiU{uJvA?MnTZ^4W;j2i^Nh zX~8|n$bQCu4)eqw2F`+47ui z9*W?e>TK)u`ZJuy6T{mk+c{&QzIc(7ebSzM#xkbO91n&F3VUX#0zzH64Dv5VYOYdq zlxdDS>1w+_ikDTnII~cctWi~96>szARK4$FPJAn#wRzv$otc(r zxg6UKq7FOx&+dsu?7pwinJg`oiLc(3&-?0dMCLxQ;a5}~s__bhoXxqPP1GkNCv^ib zLp)FbsnLQksuWw+pl3SEb^Ad6!On052?{gE*+h4*@8y640BZ><)Lzpk2+(AdFhJv) z>$~C;(`~88Y?pE;)GFzOosm{XKS>Yob*qEN#dP*P6Ac}Tp5`Cz>D`2KLuc+^h!c8a zBv0atcreJ!eHJ3bY6O_&nI(@%1F@OkKh(8NLI-G~BR929S~XuH-&yebsWfh2k;s+N zy#KZs`kD^2+f%s%r^m#pmtIIOxEjqBe!?!@FDu0mO)s%yIL-69j!5weMFH?(5tv=v zXh!vENym_tgnyN*8{e^t|KH*{v|k^I1BJW54GR#0gBS#nzs9RJQBgPUOb7SXpXKLs zVl!cmy*JYP_45%_>b(|IksLcTXcKGlLRbs3-Rngp9AB46UC-nss@Q`1rI*0M{7Ijv z)jlSf&`9`$|85bj=*yUS$<1Vj>vfr z;D^i-ZhPZs3w7SOcDN3GxBooLmuc)i(D?MjPuNFkNm9h#y?F9exoN7~{ZvmK5v6wC z->hoKNYs&*=5IG=fp$YEfMh0GFBFu{D0=+QGu!{cHh+lYpl%+7pF+-T0F43){>GK> z>U>3Flr|&Ocp4r%(2y24m)C|LwExa~uim_JK8t(V;H266+Jthdc~SiRf-{-S6azhL z;=-B-miR&Ir(osjIUDRAd4RunZ*e|dl8|uRPK%L~q-2zhO96G)(3Z6!{D#nNv%jbG z&T*)aBt`MzqB%rbf7f#&Z&jy{Ca*8F@0$2oYF4`E5AXbQI*rO=Eyb{3oH7^LIuLz= zQqLoewDRsx;hkuk8{xO(S+|Sifw#TOV`nG`(xlmr6q*A*(*wG2N;!FJDZz(kduG2j z#Ssy@x9vfmXxT;DqgGzu2%0~^ZC6=J@}B(l;%!w>`ejbV_C^K5pdKw}XigZKTu3hv zPp`-4ei`i0fT_;LpwIehxKUL4lqTjIrb@Be^p``rmw`)>&#Jq1F<)}`Mrs;gXY#zYSQC*ZScpo;=w<})-k z&3)fB0R~!J-+LT>8CO<yQg(+G5Y`JZa8t+sC@0W4e4~X4QPm^Ko`9U7W3a^-J}cZ+U_&zp{)z?hwlJP6 ziWPi0j(!H@J6x)DV@Cg!3{s+vMdml1x`*JCzvb1G^$^(N$q`DorF?@x0h9Xk*a5Sm zsMLw&YgRW(BB2DFP9siHJUyqN}-)YMzCLWX^P;m_!W}lzp4qc{feimH&d4 z_oh9aMDB`735HKZ9%JsCuM*AVO~r4~UY$xjxZ&EQyW*iT6yD3rv^~Lr`77+#drgVM z!iuL?ECOn6)ZNJ8TQJVr}$!%s2KCmls|jd=<0Q!aE!`@(E>V7#{xWGK1fGyzl`%o zSU^77A z)Qp@TuksPpc=eB@`am2br0EIh2-pn!>^M~W)tN{Dgft^3r(U_r;*gTKUFK|8Ro-|Q~8N#G(bfXSk7 zjj)EaR-hU}OSjO0^HtCrj+c@sqLZ3!<|4bgr^wj=ZXgMQ2YeHRAqClywz3o!ctG`I zJ{-Rr$AAKPxN=VdDPo$F4%=A38cB+%nzojYQ#*z>uxC7{D~9bZ>hE(8GZynS?M+&WOvjZy0jP1J#lKH9x07mm%;oXliY}~PO910E5JY10 z(Ag!uF1TL9V&4$)y!=8}OCC&$;`sQzMRqwJ#2bvq8q+5mMR4$W`(iD4amx z;+LhFnaFi&N6ef5aw%^DNEFZolyaWQ0>8YCG04{F`|1&2rU~r^n3UN_0Srg=Olu!( zk7m~@Z<95yv!X1D44v`=%7zhn&oV`{bcLwI%-mBJv)ey7W=H9_&m!#gLs#6QUYL27ImGwAROL%`!l)E z^Ouwf#M&L}%-XL{4YqeP`wL6=^28}67h@kz<>WG)#h{(sL!IPt5_dDbb^owr{#>kB z2;UaP3uK=&_FiCYwYuq!4c)*v5lp<0(h8IkYKo%i1I11cN$|mbvG3{S2#~qCSR_>QuYL{ztB$#dAFcm#d|l53njqx zwPnSw?u2}|^MA06)$!*BH_Q}2Qurcp699b16tHyZ$*od|RJQpuRGu%tMXP{={1-whKz`IMF~F~nD_&vaj( z$`ZKY<~yqd9z`>y5eQl!gC?Z;KWx-=8Gb?VB=Z#GOd52f2uyy@Vv4>K7K&)MGTIy) z7`n2Gb`JbA{Yl&0NvAuJ0YyX~?if&;C*;MB=&P4!;F_LPyvaiIH^80a4a+8fi&DZt>1dl(Idi^wfAR42uS5BcfBSZhWpF{$$j!H->_mVZ^N>&yjgq6L` zH>ivl##ZMbKA+5Rd`TjF+6~@Z1l^0kulZ{+7sM8C{^zTd`D|-#n0QPeS>}GckkzL5#?6HWXbF*|OnyOK7>ja1a+$6_g#tBO?#EU_Vm2SaR z+;=B%T=K**9W|%6I#gC3%*&&%Fo-P$V;*~RyJ*G=;J>7J1A_lTZ&V1*awAD)84u9y z$$$K^V3wE%-nT0eV$n zVaZbz4`s|LqgJ%T0YF_I`4o^IM_>X+VMaDj{}*4Q&E(K@Qs_Mza7|;N2s0d%;(nPP ziOc*hd(UtQJw!`c+JX0oN9pHghuq7h*ZAb}%&lL85WJ7-6k$Ox!h$G&fI*eQyaq2` zZWfwm|KlmC)x{DoG&wNTFL!F>6*}@K+kdVznhVgY2l%SVAKmSn8kmbHF>vbb0hV4| ziCdYr(<*;VgBa9zRa>p?Y{w2LXZ;g~16>99bMyEx-9ZR6`gZ_A4tESOwtQ}fVl|sI zU&0Xp;&~4tI%;Mz*^&v#|K|cEW}L)6%ZCFNJao!T-G{S(aK|#jW+=;) zyfugNQ?hNLrtKQ9ekE9V{I_TM_Y{1C2B5B=G^2mVzj*y$aB!`j+d!m1wo6l}PBH!m zZ@j;up>uLN**m1`fhK(**R>TyE$6$UQ9|4Z?na7@mxSPT|5mYXI`%%6wrlI;i~&P@5!_AEjX&iaT4c6=%)|z&bgVl1A5vHKKTtqe8dLEK{1TrZ2vJAb-{5;h z+gmPfG85T2Gfwry>uVe&Udnke3twtGjb#kHk-9b|l77+_WX=vGf&2&&s9TO15CO~k z|M%U~0Prqddb87J2;>Zp_c;9f^hxdSmQ3c}FVleCi-ArUJ@rJTuHD%A;J0-TX=+8b zQ}@yaY|IP)-F$K~(T_T>XW8gjrn#a8K*sgog79hV&$m7{0?i*-SNrJLsB|QZCX;@v z^m^Ggdf~{^XUfZnMe5&(`fu@PK?y{`wr1A+HM}h&iF@f97=RjZF9i=leNBM2+x_HG zY$Nx-_VGj3(o`cd?TQ1_J}R#M*7;@8~*^%>bcnaH58Ywwo4w8kn{4%s8|5eUXXfSl0vh3a3q z{dbVtv9IsP*5Rp=eH8x>X>fC3=Pr^N=hq8gY?iK9THLlDBa!j4t~DBcP;*6!M*pKea_y` zes(RP*I|ej9(t~uN#CD2T;x+GiG4tDMyZ);T9YW<-}PpG#m}j!D4QKH&>7d`Bgd8$ zc8mDgh_MI{>ARu;x|1Ohv;L%t^;-h~e-h|exX0D_8D;7}Q}jIu;W57k9HJaQ2XstG zHUgb0{PQU3Nod6Cw;L-p_^Opbd?o3mFW!1#&7dO-bmZoG9x3M(eLuI5RRREY>X*&j zS)%uecQ8>46Wgpd8BOjFV?%~N{4f^xVYQP{q!}8)naCV3vew2c-%%rw(V}5htd%t4=16rWkmNp+0-6dh#o)^8A=TBriF~7xS~M^ zZ9&`fU4SM=TQyc*76dfI+1nPbYQ1~k%A!E+x-K{UK|dHBG()+jr`5ZHjx!ZU zTnj7<;@t={&u>tyL<|baWIxcV+Ry>LpaiQrP>itiK~!2#k&G@B>qTFPqQquqF^}92 zW49$`NnyfH!|Sff{q3y(8IR9=VmuLR82)7HN?qomtd!#9P$mcvtg=b{S%oz&w(6lO z&)B}0(v2@{*(!F#r{t}4}!;^!fxHtM2MDnM^c zC@%1tn0RbOXvp9n>a-a~1N_*!=maJAk@5sRgN&mdyYWzj*e$|Wka}oYYMdiw&_O(> z9kyT1hlhT{Oy{G6WVL&i5~g-2>W})K@hnA5cfe66KQtwBtqX=~TW_J{-0^;nm^_Bt z0Un1CyM3_vP4eF@wLykGM~?&?24`trBLS|u)tTG+B%S5tm^`zBFOC*zB(&(9TpX92 zmD90E9|X~}J%;k%L33hX_>V=17yp4X zt?P}89ejKPaBdjSGX{aSf43}?zp+pnqSZOYdXS*>y;--Qf_e`6~F6ls#@x+PX)*Nc^>JK3iax@5^F z2gW2|7#}*CQd|e)CbTn2m0L;TMF@@&#Rr+K$hA+{<8|W(GTPP(5K@GS`kJPNU?dM4 zb_TfD00+$Sxvh$w7P#F8BeZ0ppR541D4Ygwb??JtY-Zva_hwvzHx$5L8t-8 zR)}+Du=P#wKXHo%@<@My=+Ly0Gd&6OISsWuPx-!okY|@{#zh{TOSgX-69pO zD*22VgwGZGtOWNHhToc;V}w4Lu@G*brp^S*ZgmPWwu}t^s2={MUdx)S8ZAJ<5QZWR z=yK%`++R7vUHM!!`QL>-VAy|_>DFg3dh_~0a^w14>gt6nee^4yT*C#tK2^uNYKyKo zE?dnnm$qC$JO#5ne42?IWte8_#6J7|-MkFc4(U4SDX~edL;atXMTnrW3W7%>>a&%= z(t1RllpA#Fx_JAJ!+xSMy~+;~l0oGxa`tAd;!i`JAY1{U@bZSfw@< zaQq9<@qqZm^c&sL4+5MifI6Gj-~+@j;(_-es6gh<%n90-a}3JEmXl4LmOP|_eCrX5 zkqzA3(#H+A@teuP?o=)co+Q~!*3gFTw(kY?lC>6zS*(Oh#`MWghiDpgnJwTqB>BS`ux8vbnxG5nHT=S{nA^G&dopGhv!>{za1X7e|EU4 z3&vy}jj|F$T5w5VYCn=RSMAPcp|PRYWEcX3=&DMoHrL;AgdLxD@fNvGwgVYMN4JwS$J3=*}2fq|t%v!-=@rF27Ee<4?#wMgcyA~yatq5) zxjjG0Yap%K;enDWTv-Gx2JeyZ0cwk8WpTdJMuYZZtm^eHo>*_RfpmkxLmZj0P>Q=V zkxUIz+I3bag`*A_)1ekKZFb^QVJsRV*$kL!i=c~0Shs|dIaY9CC;k|SZAr{U=nnFc zLy0R*$o3uJ9_F^R<;Jjj9Wa-?WtJiMz!{>Qixdmqz3^H?mLe?M@?dqpC2Y8v{4xZI zZr(t!*ut17%5+9fJsIVuz6wEWcLhf&j6`ylln! z4e=dzl>!K$KBJ1PcngaJW{>K2{ln0li@pHZeJEmvFS=6dqri@*-koM>ppbMVh=d3~ zJazU&Z{6PNB+%@{<1cZe5U@eShKO1+!_MWRZR`2Z4l80U&2l>-4vD6 zV}^l*MQ5yRoJD`6&^7A?6j)?2gHNQr zsh~w)v75C(e(LGe7I3a2>7iIlS{=u@ud|uI1lR~JtX`&;9tXHQ z`V3ej{6-y;|g4$NT!`&!}=rUR)eM~V^0mkq4+GpcK+UA@5}?0^n5n3uV*Urj$$Mn=NTKhy;Zd9OmN zHVXp_B>+;J-Y$aZUG>+`iNr~QX|E(xNCERr&sAw_q&{1kv8U?3vEqS_d7{}$;=mdJ z4}y?of6Mebb!VMWOVFQLA(w^9Mp;P8zG272u+Nl z9~1)6qjDp~z%2s@QmJ3cWbXGJdPaPmMX0EfS8+zB1Q24R>nXpnjt5F3TAu$*?ViA* zR3Npw*upMW@cYLVAFSyXrV4rrBK*)VP;bLGG~^G}C4sB@3s{uydjfA&QBii^pB^@( z!!*rL3+>7h92QeZYWtUlZ)+!!Y1W!N2qTOgQ>|an{%$-{S%4HI5^hWCs0M5BA{2GS z_b$jQ0;j>$1099UB|W2%sA|5f5DXGr)oD&>8xSU@GPnwG6)|61h@Y+nYa_6KViHF` z;Biy*s`1+^EK8810&V;0a(?x?piQ*i2Cbrk!{Yr2{mfq%`M@`k>Jn8gza{itH&ca! zL{S2w2Za~oWTK}x@ER56=usHRA0Z;>wnwUaOuk;4;)BlDg&CVvc`>_ zRqqH22vHn<9SBAuZ-7YchaV|u^E&$%ceGtfSW02^)O4{wnNkW;56F)10X;L*6*?d} zLhEM$(0eH1TS(k+2}`^PN{zEjtR@O1PG(1mDgm9**7gtzf;!5av-8M>A}$@GifW;@ zVV@mQB>Z}%z9x-i5XlD5eibV?m@=_Wgr&x&(8yEdyWH)))zAldzrtLlE9S^|0rA(u zY&ce{;Ij&Sslks#Nk&{`=5JIhPe={L$D;=k6741J1x%&XPcH*#r6F}UI z5LrLg*`0*8__@@Dj@JN$4<7sTi%W}3!gOi41&u#vTu3yLQXdM3BvFMvKw9YeWGF-% z8WnN?^bWE9{6jehz8`mNFh7%qj4;c3g|v+kC3OG<>nH_?KJf4RzgIedSS_dEp=0DZ z*kS>G9$}V7^Mfmm4MwM{)hw>QR#COl!o)vb87siN`Z#@K)+JgCo>Q5Ams+BuQs;20 zq>f#A*)GlZY2NM@BZ<(>UMWcwG|XSB*prBLyaVVEH$VB$%zdsyIM5x#N6IquDwCxo|C~Cw?NiN+Jly%x9d!HwTnHeYGh^->njhw4{KgMn6=Gz>*$tC;2k$Vp4GS3= z&1Z4774Q9VzBD$Dc3gb(bNoLJp%w2r&s66X(sA>;C9T`tER$el&6$wiBM8|c%9cEI zYJ0jW#puX8SGG!P=I?{m7RCOznDeKE0|MqT zf+y>HW_G4SkQv^VU{2MRK*1CMgnGX0Cm~19Lw)l5xy^6?BLtZQzCFO-0L+mrlu>?@ zq$4IzmUumyts7)EHd^XjU%oKL=czjNrPk}zXz8hu@Red7VyJ(Cl_QovwjyWi83M=v zgB~PA$B^F_B*`VCQAD4eds{~c0AB+-hTcjc=!Sos%;zMITvV7JU`bK_jiYdH#k*MwOH4Z^aC8umF6144&pxixF6em|dR7c&0T=L&_;gA;#Z zO@_Eo*a5wpGiydC5b64UR>C$XDZ z2ZaNf?dx>XNpLa69=LQ$926!4_#18aE;I9-%a?z7fR^uwbFJq!Xt1vqGP1Tsf0}i_ z>DF^K1+t!0eN%_3$zU}I8e`ZSJ@$KBcv4jGpB)Hd(VQ(O9%uvQB~cN{7Uusl1$jvV z*dRhk-sLpOuM2546C#BLUIg6J(WK##PUWT6M!ys>1bQd!$);kK+I&+=7PLF`Gp}27 zFI_l6@#;(vz2~qD&MRMpC(}_1&n@7g9VMlvd zX|JdL^#c6Bf)1+?*>s52{zFefnaduR2bw!aK7cVGA_}EJXW_vEo%P<14k)fKk`k)Q zg<(KUH9y|TKH5xf({`$@ey5bm)w(vBB3msa-jF}=#rZ9~)0cXHQPI$k=$7NZKgD&q z7oMow+Z0xAorFQnV z4z*mf0IJ)M!&C5pEmz9pZXUVM2n*wcqo%%xsd`q5{DWFv3d17(DBI~@itEMx{kW7c zlB>`N%8#mGOMkzcIT>1nWA%k2_KX_W>0Ap*Uh&cEC6Ugbpfcsa(MAEuFVkvL@hR9{ zwST`+Csv$Fq_g9=Pd(1{VHrM0p|Cx9PYG(6^7i#YbkttylX(S%`T^U>Dy00^mefvh zQvVa{GfFrBifDC@1VE5Y>_Bm9p!opKAqMk_!>l%$1u*s_(uT~=%MBvYQyYQ3h|>-- z@OI3i!TS%U#z<61$Gdq)x~C(<@f8c1>3MM${=65Wr?0Z_3h23!qDDQt5$+(uQaYH* z@pS^A?9%IbNM)xv|KoJ22ef!}JItRIUOYwv9@%1ln*R}26-(FW%jcKFj58+fUY)gv z$mn?TY!eHgc2o=Lw7q6ln{aPpha`<{V2To^zrlOEM+|^gp98mGx-tTua z)N7$lox*neoioN`@D>?547{gMw?km@Z^)Yn%pzem1}B7YhtggxzoUnXfwynP_yB-G8Te?)wHYKoU^}jdm;q5XXYP z1E3B2=g*RbFpR}UA_j*MDTcZi=$RJ_<>=4nW>^!lD93T14y*;vx_zgW&KHpTRBtw} z7S9=Ab`D|eP>q**_>?@N9*Njm^fSzlK3LFizVYOwJk7LnUn_1pHj+=3M)Y#_&t7;x< zJw7D&n{Le~OPDGu|7rjnI{+ksQ0mQA4)SMiE(m3N5H@moj*zDpwCKSFnaB78H<=D) z_iTQz>0)V3dqc2nZX446&m@tvUpI)!sy!_+D>^T4vr{fnq`z31nzRA{h$a+{CX$&j z?y7yuRTktiAfiD8^^gtZzgy5iaFI|s4F>}9-Xc0rNJ_|rSw39?SiIh6;X08Hw)mi5 zvCvv|s9Vr8%D*HvD~SacGT1V&QIQ8!k3U8zp(rbE6iCQRCz2ku@v`t_8BB~YLaNY? z^#GTrrWyaj3AvVcy+V&ub*Y<2=x2`epgRuF`*50UvS+RXJDg5&5hOUOLV!)unzZcw zPn@B9@|T`bR&8H*G=vtkK65}^(ZM5D+cAIUZex!hoG#f9e%R51jCs52lO)-nnz8_U z5geV^m-bydxZ2G?g5+Z{`l}1Y;tM-oIj&aPrUAL7fJMQ^{=&uxxPUd5DXICu!d9wY z&2}rw;#=F74X1dmV8w=nWOr$Py?pjsb8ll2QMfAK2WGu}bvy63cGS}?Xo!wOE@*ps z!(XKT!~fr$%;8XUSBE3mp;B(!bHF|V7VLq9K9Mc0`;5>D! z|7m^k&&uXF^=i=|qKJ%lDLbn-^Tj#b{-+i%X4Qx;D`lenTvq!pH_^g=xRrWT$<4gp z9!bC-qMlmg{^{M@%HMGPut12-R|Pa)oRgpVo+bKF2m$c*K&EE<6Odi)5D~U`cMZGY z^moDSx2tW`Us%Qg*K7c|tJjN%^G@&kos+RP;~)7MvM`ZSA-B1Ai!3ppaU-eKEMX*t z*ER!Tw~*(E(1I}UjHvDFM{ajj7WRl``XfRR;XoKl5n_hsq-_42K7+1 zJ$!4aG2oToO%*zgD+!Nl!>?<7BmhH2PbA)^W&fRV9wn+oToP0YD#^LjJx zb}p_hA^Brae@AHCDIOe#t3{7WZ`Ych z@;>MDTk~R?AIwyBpuV7T{p)T$k%3uPiWcNHB@7j{Vx>UmM`axV^)6Pgz+O}?10mAo z`Zrd5RA~nHx(N7=Rwy`u%nJVN*TLgl=Z^)w@P&~@HUfD0SYBF^BQDX;5sN2uJ5XMRv5yTz&0`k+i zSy(8W@Tj@I*n3JiF3)!K=D{UYo>0NTH*&VUI~{?p&~IFNm|byqmK>ihW9*U|df z)otnX$Aip0sYVdc=Zi`M=C2#U3fJ!y#Zs)=x)WoyJj^g~cbR!4KE981RgdR5)5Ly!W_y*4P9&ObWckLs$`IEFLY))y+Su2 zj7fuP^i`!^p2$+8dSFBR%6f?l#uB{U3LIKe&BssyfM#O=SLr7>%Ws zYbMfI=ufY7{N0)bO}!zPbN{5njNFOyb13g-;wOAYMg^l93AXJ7ti}j}h!p(2T?JW> zriL-98MaIyuGH-e_kg)FgCc+~iFNh#yc8@e3A}&3b^rQqBih%^%F$qWcBGJ?t8niR zsoE&oa1N77#c=|~rs)t3QJp+5+w{|A~deX(* zYy`dNXskZhgzkE~5@xeqO-SAxo`~C-BjOGXx^3l9`zwMKiyqOf4l>NVZA?ve6E02H zQ`r0Vv^eYLovB*-IPpb5uMCb#FFd6;mYlltytF@oQMdWsYpt*T&ii$G_S}U=Agm;W90q<} zb0Z(U9}C#?bx8~ee3ud}@uL%dF8ldI9Ud;1yBb(_LS66U5)be5eq**hY42mI4UWRv zHy*-FTKM(J-nbiIF`Zk%`#HxO?WIDjEEUCBOzLc*mD8wxLH?BBC{)P5myBI=Bf+Oc zuikNY)E1cU;#`hiX*t+n3?DFwZr;;3oyvY=SXLY>`pWW^r(yh;T3}n`6p8N!7}fBt zz%ewRU+-VR-2uPero?%8~lNvvj+L!*8K2&oNaMwJ^tC!F;7n6dlxY)USBWG z%yk;Qgf=B#H}m!d8%}??Kv!KnV2d;@VtDbvXiGW@A3{izXm}}fI%_)Ds6`H<`}dXI z*HVCca>r$%r}JStel0{Wx>2e%@lJ7rx>*90pH`f`U(Yi;_Ua}w$a9SMJ2tUUlS2tc zS_240SG5Stz%zWY3QIWXWs!b5alAbDc|2 z!406Ia}@|2(q~&J_(!h)uSr23h#a71#i}lGuLQxjEIM}o*0pJY@QVEl5AO>v8YGF3 z6%iM7smZJpspFaVs;i0k<ZmfO35fL2|^`8@?6HG-(?tdm%)JM1`ztfv+X?biM-lA6btnp$QjC8)hmu{?4uWMiIZEcgZ zWws#fs`potqu(*$X$KzO-t)oyg3lh-e%vh#8{qDrM8Yf?RZm+|hCSc3n*Vv0^j3ph z>kA=PT=rv8=IA|czgeP#hM1PuyKIxgdSN~;Z->^P85YD)kdxjgb8@IO4mXABwXc6;f+GJmK99z~9EAwiSW@hy?0 zaNAGSGforlti^xKWAsZoU&JhF5Wk^K)TQY?-#A{pGoF$BQQPZIFZQwU3Q7+@&sdjH zdV@maK28qDzK(<@Tt*gN+Trp(4##EpeITGkspKe_9xU9VZoWF9id0gS;TxYPA&yi4 z61vK=NKj%?L_aNsISz3sD6iM{Na1`3Or;q_(lb~__3?6nbY2NKRd7O~oA#B+9K<;= z8K_0{?*pGSocy8JdxJ^ienbKT}{-`9s}U zkC**p5f4lD#%$hjOI*l%C43~2#GedtJrFuxByjUU8yr{i417G@zP3F&cXnTRlCU)D z4V|yXE~_W9TGm*K9PrVyktJLM;nT!CGk>y$S6@%y(k{ZcU!RnqJLE)a+4=Oi{OJ>g zLcrZsu{}Ns$r18H9X{{hZD66)?E4LO@b$PQy3y zs#boAfFpe!%FLM{*MiZkzv045%^Ey7 zpb3L(fF9;<;Pf*9?`}nD6&6sed%}MK4!2vh7~#lX$s)TJb|*DjqIR+?P!CNK^$Mw2|x} z{JH*5`p&dZOzK)a&?n$5lKTp6)xLdIs63Bth@jL8q3j-Me_4Y7SKH7KHx5{3qe>FCN$b#vQn{{E)c*KGhr$^B4wEN+;TGwCW2& zJV%Y+_@i$_mEB7+-;JSQg@EFkm;JggWl(-NphGWEAz!7|NudAM6?yP@NwBxrUaIQ2 zh`zj8;QU!n&Gb!s(4RnA5bxfb6KNaH!Y@m6g}8`;6>bhJyL8f93H9K40!;Wi1?0ac zbly&PP6t{B9IsSPQJ9>pI-I&zTqi6gAOU2)dVPItzdDaeUi)LLv@AAW#zLB5Ljo6j z2N(N&oR4ulfY8`a=IVLdS!fNzs zRH>x9PvVn<%}ePQ@fT~?pZK9g*lMA+Jwfr0^c=2u-n3juAD^!NhWPDa0te~V>Ykj- zsQ?SD_d_|OXywy4bUFyQCpVv`U-59UXM1>}ixrsJRff4bis zaD>!xn7=4K@vdgZd7$Ux(v>~q(4{(@oLnwQJS)J=X!zFEldpeuE&`s?0FL^%be%`K zb9^&vmW!e=xt2>F^8Hjdni_K1+AlTA{ezDLtZUc7Lh7MwVG2~PZm zRrpuCjSi0%$=w|(%;UuKA9z5q3vL2bw!;(IRGNNSJo;{B547Z{*h#V>pxT#3r>U0r z3e_3GSALEWC)V`ncrgI_ri)MdK_>M4X{mGGVq<>&ufpHQ%d_GaPw0k#-3ToHbo4j# z92^k|?BNDq0jWEWb6uh$$)8TE(hro_HRHR3s~eM<*2#fl%Q~`+?7}oA&(Aou3^J5% z!V{jIz95<~`;g2>>|KG1X>uhuyyhOmtslS1T^+t@*|yzw}7(`S~hGjG%f$?`}LTVy)^974e`Dx<1lc`r?yy#NIw4ilp_(xVpJ4*~&RAXiTfVnqgdY|(K zxWe)or{_CJnpst?d>pJ|zCGZT1itfue?^5d9iMo&Bo%^}GX~!kj!8W}qhY8r zX!1R0MkNpBRd9HFwDiPH2IKQ{PeWC5$^E5gmk!_7IgjV*1`<_Xo!oreGugo@ujum$s@n*>>Zp)HuNWYR z?*&Q!akhw=NUpE4>)`#w!<(-7Nt>)kwbdx{w}dPRzqon~9k;z-c;ME4WS)eGjG!eh zTR%OS(U+*@O1 z_on<)G2|p*#pJ`IT5p6REstf?AWZpLz4SIBrr4ta3=%+^tw~v}>Kqr1yvY42dMZDy zED$}VOiG8o5-J^b5OVR(OFRhvH5^it{wJzDYVf3_HobB!GefY6l<3!Y^gz_> zKH+QTCy6>2FmN!4VBINgN@yF$xW!Kye*8J%U|j(Hep=_>4gkN|9P+c!B~=fSx8aBx zMUw?(N6MGC{NnL^j_4eBl*LK@DS>dr9qw@zP_|*dI_8%^{ASh^98JOEKK!v^1!8b3 zhiT=a@I8o|8o9&e;=b8T{N$fC3CBCufsKYKNTdH&HSjx~rtoK18%*stjLb212&$ZO z&bIOpwlz#excwYWpQ89@b~Dlnq*z&Fy9^_#{ZK*_zo_iK>5(5YvV`%!;|YS_HDIf< z>d1!4_Fjv{Q$XIwA54a^F9tLYq#TpAT}W-x9e@9Iw#C&?kgx<|L!k5zwGTC=%j>UK zX(3WdB$%ltM}8&;CmH=~$3?~mgeuXYa+k9{5jH~>CKfqzpsu19b#&j#Z$7N(kqjdo z)3`3==&2&rq;0TBqHcbeyh?OBekEbKJ_~CiT|G7;3t)Cle9lFq4d^oIli*cAqPz0G zJY1WT^%&%`hZ}h;>HjX{t?0_s;QYiYd}>p$UB#^xQ*i)_>+SeBcj@xr-v*O^asuW~ zf*^TBAx)s(IpL$%N_aq|x5!+|X|gnB747|UtM8;Oov^uGE}DN+Co{KD(J_>2imQT( zh`q&2E+^1ZlJ(Q4M(|S;{Y>EH-SZDNudqV@FvY?78!UIZLf5>z%U-B|#oQAg<*yfK zV^wKrDH*f4eHimAB5ac3@D8g3*(EkgKSwU N^oC0YCW`#KUgthb!-8~KkSl{9XP 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 DzJ)_c literal 0 HcmV?d00001 diff --git a/public/images/birds/body_2.png b/public/images/birds/body_2.png new file mode 100644 index 0000000000000000000000000000000000000000..dda23638a82661c00653cbe79f3ca6e7678d7677 GIT binary patch literal 52945 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[!&wVHrP4DD$SV@f#bf5`EBJiJNG`XwXATZ|q& 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%0A(58ruP>&NF!=9RHvkw;h~VUf{?oDkJ)4PZ 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 Z{{#MAaHnx5A5H)O002ovPDHLkV1oF}5G4Qr literal 0 HcmV?d00001 diff --git a/public/images/birds/body_9.png b/public/images/birds/body_9.png new file mode 100644 index 0000000000000000000000000000000000000000..62ace53e5d0cf142770e07e1811b1662d77e17f0 GIT binary patch literal 65307 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 gdo92QSyTMT+rcgM);qsizJ4WL;Rs- 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%0AA&>(3UJf$f%9xKOUHR9chVS93MOa)KgdCpxKV+ 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 V4NN)&Ax!|NPg!0=u13Z@^nX)m4PXEO literal 0 HcmV?d00001 diff --git a/public/images/birds/eyes_1.png b/public/images/birds/eyes_1.png new file mode 100644 index 0000000000000000000000000000000000000000..dcc39d5d66bd3bfad57e1e21652451af82ca3ed2 GIT binary patch literal 21166 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 H0eAib)rZp{ literal 0 HcmV?d00001 diff --git a/public/images/birds/eyes_2.png b/public/images/birds/eyes_2.png new file mode 100644 index 0000000000000000000000000000000000000000..01447601c6d812860763a251f447df45b769c64c GIT binary patch literal 22784 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 z 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

oAx=5yf*}dW`@|*m;7A95o}rV^ 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 RsTl3?QdiMdE>pA!{vSmRPF4T_ literal 0 HcmV?d00001 diff --git a/public/images/birds/body_6.png b/public/images/birds/body_6.png new file mode 100644 index 0000000000000000000000000000000000000000..869bf3a9748ca15ea2b8def47663052e16dbbee0 GIT binary patch literal 68081 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 X)8%1z^!F10dqGgm#}8`M?PC51G~GRp literal 0 HcmV?d00001 diff --git a/public/images/birds/body_8.png b/public/images/birds/body_8.png new file mode 100644 index 0000000000000000000000000000000000000000..76f3077167da85b0ecb6ba04c00068f6dfb73b59 GIT binary patch literal 85868 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