├── .gitignore ├── LICENSE ├── README.md ├── docker-compose.yml ├── docker ├── README.md ├── logs │ └── .gitkeep ├── nginx.conf └── php │ ├── build │ └── php.ini └── src ├── API.php ├── controller ├── AuthorController.php ├── ResourceCategoryController.php ├── ResourceController.php ├── ResourceUpdateController.php └── index.html ├── imports.php ├── index.php ├── object ├── Author.php ├── Error.php ├── JsonResponse.php ├── Resource.php ├── ResourceCategory.php ├── ResourceUpdate.php └── index.html ├── openapi.yaml ├── support ├── Config.php ├── Database.php ├── Router.php └── index.html └── util ├── IconUtil.php ├── RequestUtil.php └── index.html /.gitignore: -------------------------------------------------------------------------------- 1 | # We don't want to link the symlink you make for dev stuff. That will be wonky. Just no. 2 | /docker/www 3 | 4 | # Ignore your personal logs 5 | /docker/logs/* 6 | 7 | # Keep logs folder tho 8 | !.gitkeep -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | BSD 3-Clause License 2 | 3 | Copyright (c) 2020, SpigotMC Pty. Ltd. 4 | All rights reserved. 5 | 6 | Redistribution and use in source and binary forms, with or without 7 | modification, are permitted provided that the following conditions are met: 8 | 9 | 1. Redistributions of source code must retain the above copyright notice, this 10 | list of conditions and the following disclaimer. 11 | 12 | 2. Redistributions in binary form must reproduce the above copyright notice, 13 | this list of conditions and the following disclaimer in the documentation 14 | and/or other materials provided with the distribution. 15 | 16 | 3. Neither the name of the copyright holder nor the names of its 17 | contributors may be used to endorse or promote products derived from 18 | this software without specific prior written permission. 19 | 20 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 21 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 23 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 24 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 25 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 26 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 27 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 28 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## XenforoResourceManagerAPI 2 | This project aims to safely expose information from the [SpigotMC](https://spigotmc.org) website in a machine-readable format for use in projects and other systems. 3 | 4 | ### Current Capabilities 5 | | Action | Description | 6 | |------------------------|------------------------------------------------------------------------------------------------------- | 7 | | listResources | get information about all resources in the system | 8 | | getResource | get information about a resource by its ID | 9 | | getResourcesByAuthor | get information about all resources created by a specific author by the user id | 10 | | listResourceCategories | get information about available resource categories | 11 | | getResourceUpdate | get information about a specific resource update by its id | 12 | | getResourceUpdates | get information about all of the updates for a specific resource by the resource id | 13 | | getAuthor | get information about an author by the user id | 14 | | findAuthor | get information about an author by the username (**exact username match only**) | 15 | 16 | ### How To Use 17 | All requests must currently be sent via **GET** to https://api.spigotmc.org/simple/0.2/index.php. To get started, attach a **GET** parameter `action` specifying which operation you'd like to perform (seen above). Then, attach the action's **GET** parameter(s). See below for information on the parameters that each action accepts. 18 | 19 | ### Documentation 20 | 21 | #### listResources 22 | ##### Parameters: 23 | | name | type | required | default | description | 24 | |---------- |------ |---------- |--------- |----------------------------------------------------------------------------- | 25 | | category | int | no | none | The resource category to restrict results to (see `listResourceCategories`) | 26 | | page | int | no | 1 | The page number to retrieve. Items are paginated at 10 results per page. | 27 | ##### Request: https://api.spigotmc.org/simple/0.2/index.php?action=listResources&category=4&page=2 28 | ##### Response (truncated): 29 | ```json 30 | [ 31 | { 32 | "id":"12", 33 | "title":"BungeeLobbyKick", 34 | "tag":"This plugin will move all players to a configured server on command", 35 | "current_version":"0.2", 36 | "native_minecraft_version":null, 37 | "supported_minecraft_versions":null, 38 | "icon_link":"https:\/\/www.spigotmc.org\/styles\/default\/xenresource\/resource_icon.png", 39 | "author":{ 40 | "id":"1013", 41 | "username":"fuzzy_bot" 42 | }, 43 | "premium":{ 44 | "price":"0.00", 45 | "currency":"" 46 | }, 47 | "stats":{ 48 | "downloads":"2789", 49 | "updates":"0", 50 | "reviews":{ 51 | "unique":"12", 52 | "total":"12" 53 | }, 54 | "rating":"4.58333" 55 | }, 56 | "description":"[B]This plugin will move all players to a configured server when one of these commands is run:[\/B]\n\n[B]\/lobbykick (Kick all players to lobby)[\/B]\n[B]\/lobbykickstop (lobbykick + Runs console command stop)[\/B]\n[B]\/lobbykickrestart ([\/B][B]lobbykick +[\/B][B]Runs console command restart <- this is a spigot feature)[\/B]\n\n\n[B]All of the above commands require the permission \"Lobby.Kick\" or may be run from the console.[\/B]\n\n[B]\/lobbykickplayer playername (kick 1 player, Requires Lobby.Kick.Player permission)[\/B]\n\n[B]The server name to move the players to is in the \"config.yml\" file in the BungeeLobbyKick folder. The default is to move players to the server \"lobby\". You can reload this file using:[\/B]\n\n[B]\/lobbykickreload (rereads config file)[\/B]" 57 | }, 58 | { 59 | "id":"13", 60 | "title":"BungeeKickStop", 61 | "tag":"Bungee Kick control plugin - move players to a different server when kicked", 62 | "current_version":"0.1", 63 | "native_minecraft_version":null, 64 | "supported_minecraft_versions":null, 65 | "icon_link":"https:\/\/www.spigotmc.org\/styles\/default\/xenresource\/resource_icon.png", 66 | "author":{ 67 | "id":"1013", 68 | "username":"fuzzy_bot" 69 | }, 70 | "premium":{ 71 | "price":"0.00", 72 | "currency":"" 73 | }, 74 | "stats":{ 75 | "downloads":"1776", 76 | "updates":"0", 77 | "reviews":{ 78 | "unique":"3", 79 | "total":"3" 80 | }, 81 | "rating":"5" 82 | }, 83 | "description":"BungeeKickStop moves players to a configured server when the player is kicked with a specific message.\n \nConfiguration is in the config.txt file. An empty file is generated the first time you start the plugin.\n \ncreate lines in config.txt to setup the kick filters:\n \nservername!!!Kick Text!!!Message &dto &fuser\n \nWhen a player is kicked the kick is evaluated for \"Kick Text\"\nif this is found, the player is sent to \"servername\" server and also told \"Message &dto &fuser\"\n \nwith permission bks.reload use the command \/bksreload to reload the configuration\n \n \n** Note ** This requires the latest version of Bungee!" 84 | } 85 | ] 86 | ``` 87 | 88 | #### getResource 89 | ##### Parameters: 90 | | name | type | required | default | description | 91 | |------ |------ |---------- |--------- |------------------------------------------------ | 92 | | id | int | yes | none | The id of the resource to retrieve | 93 | ##### Request: https://api.spigotmc.org/simple/0.2/index.php?action=getResource&id=2 94 | ##### Response: 95 | ```json 96 | { 97 | "id":"2", 98 | "title":"HubKick", 99 | "tag":"Send players to lobby on kick. \/lobby \/ hub", 100 | "current_version":"1.7.1", 101 | "native_minecraft_version":null, 102 | "supported_minecraft_versions":[ 103 | "1.7", 104 | "1.8", 105 | "1.9" 106 | ], 107 | "icon_link":"https:\/\/www.spigotmc.org\/data\/resource_icons\/0\/2.jpg?1482076430", 108 | "author":{ 109 | "id":"106", 110 | "username":"LaxWasHere" 111 | }, 112 | "premium":{ 113 | "price":"0.00", 114 | "currency":"" 115 | }, 116 | "stats":{ 117 | "downloads":"7719", 118 | "updates":"22", 119 | "reviews":{ 120 | "unique":"11", 121 | "total":"11" 122 | }, 123 | "rating":"5" 124 | }, 125 | "description":"[CENTER][I][B][URL='https:\/\/discord.gg\/SvFEBGW'][IMG]https:\/\/i.imgur.com\/inmwaK3.png[\/IMG] [\/URL]| [URL='https:\/\/www.paypal.me\/LaxWasHere'][IMG]https:\/\/i.imgur.com\/h5YgdLC.png[\/IMG][\/URL] | [URL='https:\/\/github.com\/AwesomePowered\/HubKick'][IMG]https:\/\/i.imgur.com\/ikjLwXh.png[\/IMG][\/URL][\/B][\/I][\/CENTER]\n[I][B]Info[\/B]\nWhen a player get's kicked from the server, this plugin will forward him\/her to the server you specified in the config.yml.\nKick everyone and shutdown the server or just kick everyone.\n\n[B]Configuration[\/B]\n[code]#Hub is the server you want the players to be sent to.\nHubServer: hub\n\n#Enable this and it will pick a hub on random when kicked\nHubs:\n- Hub\n- Lobby\nrandomHubs: false\n\n#Regex pattern for forcekicking a player. No touchy touchy pls\nignorePattern: '(\\bafk|AFK|-f\\b)'\n\n#Prefix\nprefix: '&4[&aHubKick&4]'\n\n#Message to be sent when kicking everyone\/ shutting down the server.\nKickallMessage: '&a&lServer shutting down, you have been kicked to the hub!'\n\n#Should the plugin send the users on hub on kick?\nHubOnKick: true\n[\/code]\n\n[B]Installation[\/B]\n [\/I]\n[LIST]\n[I]\n[LIST][*]Drop the HubKick.jar at your \/plugins folder[\/LIST]\n[LIST][*]Restart Server[\/LIST]\n[LIST][*]Get Kicked[\/LIST][\/I]\n[\/LIST]\n[I][B]Commands:[\/B]\n[CODE]\/hub (sends you to he hub server)\n\/lobby (same as above)\n\/alltolobby (sends everyone to lobby)\n\/lobbyall (Same as above)\n\/sendplayer(Sends player to a server)\n\/sendp(^)\n\/shutdown (sends everyone to lobby and shuts down the server)\n\/forcekick (kicked the player off the network) (or simply add -f to a kick message)\n\/fkick (same as above)\n[\/CODE]\n\n[B]Permissions:[\/B]\n [\/I]\n[LIST]\n[I]\n[LIST][*]hubkick.command[\/LIST]\n[LIST][*]hubkick.kickall[\/LIST]\n[LIST][*]hubkick.send[\/LIST]\n[LIST][*]hubkick.shutdown[\/LIST]\n[LIST][*]hubkick.forcekick[\/LIST][\/I]\n[\/LIST]\n[I][URL='https:\/\/github.com\/AwesomePowered\/HubKick']Github[\/URL][\/I]" 126 | } 127 | ``` 128 | 129 | #### getResourcesByAuthor 130 | ##### Parameters: 131 | | name | type | required | default | description | 132 | |------ |------ |---------- |--------- |----------------------------------------------------------------------------- | 133 | | id | int | yes | none | The id of the author to restrict results to (see `findAuthor`) | 134 | | page | int | no | 1 | The page number to retrieve. Items are paginated at 10 results per page. | 135 | ##### Request: https://api.spigotmc.org/simple/0.2/index.php?action=getResourcesByAuthor&id=100356&&page=1 136 | ##### Response (truncated): 137 | ```json 138 | [ 139 | { 140 | "id":"57242", 141 | "title":"spark", 142 | "tag":"spark is a performance profiling plugin\/mod for Minecraft clients, servers and proxies.", 143 | "current_version":"1.6.1", 144 | "native_minecraft_version":"", 145 | "supported_minecraft_versions":[ 146 | "1.8", 147 | "1.9", 148 | "1.10", 149 | "1.11", 150 | "1.12", 151 | "1.13", 152 | "1.14", 153 | "1.15", 154 | "1.16", 155 | "1.17" 156 | ], 157 | "icon_link":"https:\/\/www.spigotmc.org\/data\/resource_icons\/57\/57242.jpg?1615457966", 158 | "author":{ 159 | "id":"100356", 160 | "username":"Luck" 161 | }, 162 | "premium":{ 163 | "price":"0.00", 164 | "currency":"" 165 | }, 166 | "stats":{ 167 | "downloads":"16589", 168 | "updates":"10", 169 | "reviews":{ 170 | "unique":"49", 171 | "total":"53" 172 | }, 173 | "rating":"4.89796" 174 | }, 175 | "description":"[CENTER][B][SIZE=7][IMG]https:\/\/i.imgur.com\/cJ4sYV5.png[\/IMG] [\/SIZE][\/B]\n[SIZE=4][B]spark is a performance profiling plugin\/mod for Minecraft clients, servers and proxies.[\/B][\/SIZE]\n[\/CENTER]\n[B]Useful Links[\/B]\n[LIST]\n[*][B][URL='https:\/\/spark.lucko.me\/']Website[\/URL][\/B] - browse the project homepage\n[*][B][URL='https:\/\/spark.lucko.me\/docs']Documentation[\/URL][\/B] - read documentation and usage guides\n[*][B][URL='https:\/\/spark.lucko.me\/download']Downloads[\/URL][\/B] - latest development builds\n[\/LIST]\n[B][SIZE=5]What does it do?[\/SIZE][\/B]\nspark is made up of a number of components, each detailed separately below.\n[LIST]\n[*][B]CPU Profiler[\/B]: Diagnose performance issues.\n[*][B]Memory Inspection[\/B]: Diagnose memory issues.\n[*][B]Server Health Reporting[\/B]: Keep track of overall server health.\n[\/LIST]\n\n[B][SIZE=6]\u26a1 CPU Profiler[\/SIZE][\/B]\nspark's profiler can be used to diagnose performance issues: \"lag\", low tick rate, high CPU usage, etc.\n\nIt is:\n[LIST]\n[*][B]Lightweight[\/B] - can be ran in production with minimal impact.\n[*][B]Easy to use[\/B] - no configuration or setup necessary, just install the plugin\/mod.\n[*][B]Quick to produce results[\/B] - running for just ~30 seconds is enough to produce useful insights into problematic areas for performance.\n[*][B]Customisable[\/B] - can be tuned to target specific threads, sample at a specific interval, record only \"laggy\" periods, etc\n[*][B]Highly readable[\/B] - simple tree structure lends itself to easy analysis and interpretation. The viewer can also apply deobfuscation mappings.\n[\/LIST]\nIt works by sampling statistical data about the systems activity, and constructing a call graph based on this data. The call graph is then displayed in an online viewer for further analysis by the user.\n\nThere are two different profiler engines:\n[LIST]\n[*]Native [ICODE]AsyncGetCallTrace[\/ICODE] + [ICODE]perf_events[\/ICODE] - uses [URL='https:\/\/github.com\/jvm-profiling-tools\/async-profiler']async-profiler[\/URL] ([I]only available on Linux x86_64 systems[\/I])\n[*]Built-in Java [ICODE]ThreadMXBean[\/ICODE] - an improved version of the popular [URL='https:\/\/github.com\/sk89q\/WarmRoast']WarmRoast profiler[\/URL] by sk89q.\n[\/LIST]\n[B]\n[SIZE=6]\u26a1 Memory Inspection[\/SIZE][\/B]\nspark includes a number of tools which are useful for diagnosing memory issues with a server.\n[LIST]\n[*][B]Heap Summary[\/B] - take & analyse a basic snapshot of the servers memory\n[LIST]\n[*]A simple view of the JVM's heap, see memory usage and instance counts for each class\n[*]Not intended to be a full replacement of proper memory analysis tools. (see below)\n[\/LIST]\n[\/LIST]\n[LIST]\n[*][B]Heap Dump[\/B] - take a full (HPROF) snapshot of the servers memory\n[LIST]\n[*]Dumps (& optionally compresses) a full snapshot of JVM's heap.\n[*]This snapshot can then be inspected using conventional analysis tools.\n[\/LIST]\n[\/LIST]\n[LIST]\n[*][B]GC Monitoring[\/B] - monitor garbage collection activity on the server\n[LIST]\n[*]Allows the user to relate GC activity to game server hangs, and easily see how long they are taking & how much memory is being free'd.\n[*]Observe frequency\/duration of young\/old generation garbage collections to inform which GC tuning flags to use\n[\/LIST]\n[\/LIST]\n[B][SIZE=6]\u26a1 Server Health Reporting[\/SIZE][\/B]\nspark can report a number of metrics summarising the servers overall health.\n\nThese metrics include:\n[LIST]\n[*][B]TPS[\/B] - ticks per second, to a more accurate degree indicated by the \/tps command\n[*][B]Tick Durations[\/B] - how long each tick is taking (min, max and average)\n[*][B]CPU Usage[\/B] - how much of the CPU is being used by the server process, and by the overall system\n[*][B]Memory Usage[\/B] - how much memory is being used by the process\n[*][B]Disk Usage[\/B] - how much disk space is free\/being used by the system\n[\/LIST]\nAs well as providing tick rate averages, spark can also monitor individual ticks - sending a report whenever a single tick's duration exceeds a certain threshold. This can be used to identify trends and the nature of performance issues, relative to other system or game events.\n\n\n[SIZE=5][B]Us[SIZE=5]a[\/SIZE]ge[\/B][\/SIZE]\nTo install, just add the [B]spark.jar[\/B] file to your servers plugins directory.\n\nInformation about [URL='https:\/\/spark.lucko.me\/docs\/Command-Usage']how to use commands[\/URL] can be found in the docs.\n\nIf you\u2019d like help analysing a profiling report, or just want to chat, feel free to join us on [URL='https:\/\/discord.gg\/PAGT2fu']Discord[\/URL].\n\n\n[B][SIZE=5]Guides[\/SIZE][\/B]\nThere are a few small \"guides\" available in the docs, covering the following topics.\n[LIST]\n[*][URL='https:\/\/spark.lucko.me\/docs\/guides\/The-tick-loop']The tick loop[\/URL]\n[*][URL='https:\/\/spark.lucko.me\/docs\/guides\/Finding-lag-spikes']Finding the cause of lag spikes[\/URL]\n[\/LIST]" 176 | }, 177 | { 178 | "id":"28140", 179 | "title":"LuckPerms", 180 | "tag":"A permissions plugin for Minecraft servers (Bukkit\/Spigot, BungeeCord & more)", 181 | "current_version":"5.3.47", 182 | "native_minecraft_version":"", 183 | "supported_minecraft_versions":[ 184 | "1.7", 185 | "1.8", 186 | "1.9", 187 | "1.10", 188 | "1.11", 189 | "1.12", 190 | "1.13", 191 | "1.14", 192 | "1.15", 193 | "1.16", 194 | "1.17" 195 | ], 196 | "icon_link":"https:\/\/www.spigotmc.org\/data\/resource_icons\/28\/28140.jpg?1490821714", 197 | "author":{ 198 | "id":"100356", 199 | "username":"Luck" 200 | }, 201 | "premium":{ 202 | "price":"0.00", 203 | "currency":"" 204 | }, 205 | "stats":{ 206 | "downloads":"1466009", 207 | "updates":"42", 208 | "reviews":{ 209 | "unique":"826", 210 | "total":"926" 211 | }, 212 | "rating":"4.77603" 213 | }, 214 | "description":"[RIGHT][URL='https:\/\/luckperms.net\/download']Looking for the BungeeCord download? Click here![\/URL][\/RIGHT]\n[CENTER][IMG]https:\/\/raw.githubusercontent.com\/LuckPerms\/branding\/master\/banner\/banner.png[\/IMG][\/CENTER]\n[IMG]https:\/\/i.imgur.com\/7vjPbyM.png[\/IMG]\nLuckPerms is a permissions plugin for Minecraft servers (Bukkit\/Spigot, BungeeCord & more). It allows server admins to control what features players can use by creating groups and assigning permissions.\n\nIt is:\n[LIST]\n[*][B]fast[\/B] - written with performance and scalability in mind.\n[*][B]reliable[\/B] - trusted by thousands of server admins, and the largest of server networks.\n[*][B]easy to use[\/B] - setup permissions using commands, directly in config files, or using the web editor.\n[*][B]flexible[\/B] - supports a variety of data storage options, and works on lots of different server types.\n[*][B]extensive[\/B] - a plethora of customization options and settings which can be changed to suit your server.\n[*][B]free[\/B] - available for download and usage at no cost, and permissively licensed so it can remain free forever.\n[\/LIST]\nFor more information, see the wiki article on [URL='https:\/\/luckperms.net\/wiki\/Why-LuckPerms']Why LuckPerms?[\/URL]\n\n[IMG]https:\/\/i.imgur.com\/E5SUQSP.png[\/IMG]\nThe latest downloads & other useful links can be found on the project homepage at [URL='https:\/\/luckperms.net\/']luckperms.net[\/URL].\n\nThe plugin has extensive [URL='https:\/\/luckperms.net\/wiki']documentation available on the wiki[\/URL]. Please use the resources there before coming to us directly for support.\n\nSupport for the plugin is provided on [URL='https:\/\/discord.gg\/luckperms']Discord[\/URL]. If you have a question which cannot be answered by reading the wiki, the best place to ask it is there.\n\nIf you would like to report a bug, please [URL='https:\/\/github.com\/lucko\/LuckPerms\/issues']open a ticket on GitHub[\/URL].\n\n[IMG]https:\/\/i.imgur.com\/3kfqrp1.png[\/IMG]\n[URL='https:\/\/bisecthosting.com\/luck'][IMG]https:\/\/i.imgur.com\/fpcKnbV.png[\/IMG][\/URL]\n[CENTER]LuckPerms is proudly sponsored by [URL='https:\/\/bisecthosting.com\/luck']BisectHosting[\/URL].[\/CENTER]\n\nThey've kindly offered LuckPerms users a massive [B]25% off[\/B] the first month of any of their game server hosting plans. To get the discount, just enter the promo code [B]luck[\/B] at checkout!\n\n[IMG]https:\/\/i.imgur.com\/zflMO8M.png[\/IMG]\nMost of the other available permission plugins date back a number of years, and were created in the early Bukkit era. Almost without exception, they've been abandoned by their original authors, and receive no updates, support or bug fixes.\n\nLuckPerms is still a growing and active resource, and I endeavour to reply to all bug reports, issues and feature requests in a timely manner.\n\nLuckPerms supports fully automatic migration and data transfer from existing permissions plugins.\nFor more information about this process, please [URL='https:\/\/luckperms.net\/wiki\/Migration']read the wiki page[\/URL].\n\n[IMG]https:\/\/i.imgur.com\/CzC56lP.png[\/IMG]\nPlease don't post bug reports\/suggestions in the review section. Bugs should be reported by [URL='https:\/\/github.com\/lucko\/LuckPerms\/issues']opening a ticket on GitHub[\/URL].\n\nIf you just have a question, the best place to ask is in our Discord server. Either myself or somebody else will hopefully be able to assist.\n\nThis plugin took me while to make, so if you find it useful, a nice review would be appreciated. :) On the other hand, if you have suggestions, I'd love to hear those too!\n\n[B]If you're having issues using the plugin, please contact me BEFORE making a review. I *cannot* give support in the review section.[\/B]" 215 | } 216 | ] 217 | ``` 218 | 219 | #### listResourceCategories 220 | ##### Parameters: **none** 221 | ##### Request: https://api.spigotmc.org/simple/0.2/index.php?action=listResourceCategories 222 | ##### Response (truncated): 223 | ```json 224 | [ 225 | { 226 | "id":"2", 227 | "title":"Bungee - Spigot", 228 | "description":"Spigot plugins that interact with BungeeCord." 229 | }, 230 | { 231 | "id":"3", 232 | "title":"Bungee - Proxy", 233 | "description":"Bungee plugins that interact directly with the proxy plugins folder." 234 | }, 235 | { 236 | "id":"4", 237 | "title":"Spigot", 238 | "description":"Plugins which work on a standard Spigot install." 239 | }, 240 | { 241 | "id":"5", 242 | "title":"Transportation", 243 | "description":"" 244 | }, 245 | { 246 | "id":"6", 247 | "title":"Chat", 248 | "description":"" 249 | }, 250 | { 251 | "id":"7", 252 | "title":"Tools and Utilities", 253 | "description":"" 254 | }, 255 | { 256 | "id":"8", 257 | "title":"Misc", 258 | "description":"" 259 | }, 260 | { 261 | "id":"9", 262 | "title":"Libraries \/ APIs", 263 | "description":"" 264 | }, 265 | { 266 | "id":"10", 267 | "title":"Transportation", 268 | "description":"" 269 | } 270 | ] 271 | ``` 272 | 273 | #### getResourceUpdate 274 | ##### Parameters: 275 | | name | type | required | default | description | 276 | |------ |------ |---------- |--------- |----------------------------------------------------------------------------- | 277 | | id | int | yes | none | The id of the **resource _update_** to retrieve (see `getResourceUpdates`) | 278 | ##### Request: https://api.spigotmc.org/simple/0.2/index.php?action=getResourceUpdate&id=352711 279 | ##### Response: 280 | ```json 281 | { 282 | "id":"352711", 283 | "resource_id":"6245", 284 | "title":"2.10.9 back to normal", 285 | "message":"[B][SIZE=6]2.10.9\n[\/SIZE][\/B]\n[LIST]\n[*][SIZE=4]Fixed issues with maven repo regarding Jetbrains annotations when using other IDE's[\/SIZE]\n[\/LIST]\n[SIZE=4]Like this update to pay respects[\/SIZE]\n[LIST]\n[*][SIZE=4]Updated deprecation methods in PlaceholderAPI class. Now normal methods of setPlaceholders will not nag you regardless if you use Player or OfflinePlayer.. This also resolves issues with plugins providing placeholders as both methods pre 2.10.7 are functional from PlaceholderHook. Use onRequest or onPlaceholderRequest.... Doesn't matter until we hit 3.0.0. [\/SIZE]\n[*][SIZE=4]Fixed a few bugs that probably wont be noticed but if you really care about them you can follow the trail if you are on the hunt [\/SIZE]\n[\/LIST]\n[URL]https:\/\/github.com\/PlaceholderAPI\/PlaceholderAPI\/commits\/master[\/URL]\n\nThis update was mainly focused on people who actually hook into PlaceholderAPI so I hope this resolves any issues you may have with deprecated methods or stuff not working. I really don't want people using the dev repo as a way to release updates however they are a good way for everyone to test. Based on the feedback I felt this was the thing to do as we don't want to break things until PAPI3 drops.\n[SIZE=4]\n\n\n[\/SIZE]" 286 | } 287 | ``` 288 | 289 | #### getResourceUpdates 290 | ##### Parameters: 291 | | name | type | required | default | description | 292 | |------ |------ |---------- |--------- |----------------------------------------------------------------------------- | 293 | | id | int | yes | none | The id of the resource for which to retrieve updates | 294 | | page | int | no | 1 | The page number to retrieve. Items are paginated at 10 results per page. | 295 | ##### Request: https://api.spigotmc.org/simple/0.2/index.php?action=getResourceUpdates&id=2&page=1 296 | ##### Response (truncated): 297 | ```json 298 | [ 299 | { 300 | "id":"2", 301 | "resource_id":"2", 302 | "title":"HubKick", 303 | "message":"[CENTER][I][B][URL='https:\/\/discord.gg\/SvFEBGW'][IMG]https:\/\/i.imgur.com\/inmwaK3.png[\/IMG] [\/URL]| [URL='https:\/\/www.paypal.me\/LaxWasHere'][IMG]https:\/\/i.imgur.com\/h5YgdLC.png[\/IMG][\/URL] | [URL='https:\/\/github.com\/AwesomePowered\/HubKick'][IMG]https:\/\/i.imgur.com\/ikjLwXh.png[\/IMG][\/URL][\/B][\/I][\/CENTER]\n[I][B]Info[\/B]\nWhen a player get's kicked from the server, this plugin will forward him\/her to the server you specified in the config.yml.\nKick everyone and shutdown the server or just kick everyone.\n\n[B]Configuration[\/B]\n[code]#Hub is the server you want the players to be sent to.\nHubServer: hub\n\n#Enable this and it will pick a hub on random when kicked\nHubs:\n- Hub\n- Lobby\nrandomHubs: false\n\n#Regex pattern for forcekicking a player. No touchy touchy pls\nignorePattern: '(\\bafk|AFK|-f\\b)'\n\n#Prefix\nprefix: '&4[&aHubKick&4]'\n\n#Message to be sent when kicking everyone\/ shutting down the server.\nKickallMessage: '&a&lServer shutting down, you have been kicked to the hub!'\n\n#Should the plugin send the users on hub on kick?\nHubOnKick: true\n[\/code]\n\n[B]Installation[\/B]\n [\/I]\n[LIST]\n[I]\n[LIST][*]Drop the HubKick.jar at your \/plugins folder[\/LIST]\n[LIST][*]Restart Server[\/LIST]\n[LIST][*]Get Kicked[\/LIST][\/I]\n[\/LIST]\n[I][B]Commands:[\/B]\n[CODE]\/hub (sends you to he hub server)\n\/lobby (same as above)\n\/alltolobby (sends everyone to lobby)\n\/lobbyall (Same as above)\n\/sendplayer(Sends player to a server)\n\/sendp(^)\n\/shutdown (sends everyone to lobby and shuts down the server)\n\/forcekick (kicked the player off the network) (or simply add -f to a kick message)\n\/fkick (same as above)\n[\/CODE]\n\n[B]Permissions:[\/B]\n [\/I]\n[LIST]\n[I]\n[LIST][*]hubkick.command[\/LIST]\n[LIST][*]hubkick.kickall[\/LIST]\n[LIST][*]hubkick.send[\/LIST]\n[LIST][*]hubkick.shutdown[\/LIST]\n[LIST][*]hubkick.forcekick[\/LIST][\/I]\n[\/LIST]\n[I][URL='https:\/\/github.com\/AwesomePowered\/HubKick']Github[\/URL][\/I]" 304 | }, 305 | { 306 | "id":"17", 307 | "resource_id":"2", 308 | "title":"Added \/lobby|\/hub command", 309 | "message":"New commands.\n \n[LIST]\n[*]\/hub\n[*]\/lobby\n[\/LIST]" 310 | }, 311 | { 312 | "id":"66", 313 | "resource_id":"2", 314 | "title":"Added permission", 315 | "message":"Added permission to \/hub, \/lobby command\n \n[B]hubkick.command[\/B]" 316 | }, 317 | { 318 | "id":"87", 319 | "resource_id":"2", 320 | "title":"Fixed commands", 321 | "message":"Fixed \/lobby \/hub commands not working." 322 | }, 323 | { 324 | "id":"119", 325 | "resource_id":"2", 326 | "title":"Metrics", 327 | "message":"Added Metrics" 328 | } 329 | ] 330 | ``` 331 | 332 | #### getAuthor 333 | ##### Parameters: 334 | | name | type | required | default | description | 335 | |------ |------ |---------- |--------- |----------------------------------------------------------------------------- | 336 | | id | int | yes | none | The id of the author to retrieve | 337 | ##### Request: https://api.spigotmc.org/simple/0.2/index.php?action=getAuthor&id=1 338 | ##### Response: 339 | ```json 340 | { 341 | "id":"1", 342 | "username":"md_5", 343 | "resource_count":"12", 344 | "identities":{ 345 | "twitter":"md__5" 346 | }, 347 | "avatar":"https:\/\/www.gravatar.com\/avatar\/b53fd878a84d268da2b6456e0b96cae5.jpg?s=96" 348 | } 349 | ``` 350 | 351 | #### findAuthor 352 | ##### Parameters: 353 | | name | type | required | default | description | 354 | |------ |------ |---------- |--------- |--------------------------------------------------------------------------------------- | 355 | | name | str | yes | none | The exactly matching username of the desired user, with escape sequences if necessary | 356 | ##### Request: https://api.spigotmc.org/simple/0.2/index.php?action=findAuthor&name=simpleauthority 357 | ##### Response: 358 | ```json 359 | { 360 | "id":"12157", 361 | "username":"simpleauthority", 362 | "resource_count":"8", 363 | "identities":{ 364 | "discord":"simple#5957" 365 | }, 366 | "avatar":"https:\/\/www.spigotmc.org\/data\/avatars\/l\/12\/12157.jpg?1623588345" 367 | } 368 | ``` 369 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3' 2 | 3 | services: 4 | nginx: 5 | image: nginx:1.21.0 6 | container_name: "xfrm_nginx" 7 | ports: 8 | - "3000:80" 9 | depends_on: 10 | - "php" 11 | volumes: 12 | - "./docker/nginx.conf:/etc/nginx/nginx.conf" 13 | - "./docker/www/:/usr/share/nginx/html/xfrm/" 14 | - "./docker/logs/:/var/log/nginx/" 15 | 16 | php: 17 | container_name: "xfrm_php" 18 | build: 19 | context: "docker/php" 20 | dockerfile: "build" 21 | expose: 22 | - "9000" 23 | volumes: 24 | - "./docker/www/:/var/www/html/xfrm/" 25 | - "./docker/php/php.ini:/usr/local/etc/php/php.ini" 26 | -------------------------------------------------------------------------------- /docker/README.md: -------------------------------------------------------------------------------- 1 | ## Setup Docker Dev Environment 2 | 3 | 1. `cd` into the `docker` folder and create a symlink using: 4 | 5 | `ln -s ./www` 6 | 7 | 2. **Make sure you do not commit this symlink.** 8 | 9 | 3. `cd` back out and run `docker-compose up -d`. You should be able to access XFRM on port 3000. Edit ``docker-compose.yml`` if you want to change the host port. Don't commit any changes to host port. 10 | -------------------------------------------------------------------------------- /docker/logs/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpigotMC/XenforoResourceManagerAPI/2d4ab6934bac68000ba8a52c257e9a226a9e13b1/docker/logs/.gitkeep -------------------------------------------------------------------------------- /docker/nginx.conf: -------------------------------------------------------------------------------- 1 | user nginx; 2 | pid /var/run/nginx.pid; 3 | worker_processes 1; 4 | 5 | events { 6 | worker_connections 1024; 7 | } 8 | 9 | http { 10 | include /etc/nginx/mime.types; 11 | default_type application/octet-stream; 12 | sendfile on; 13 | keepalive_timeout 65; 14 | 15 | log_format main '$remote_addr - $remote_user [$time_local] "$request" ' 16 | '$status $body_bytes_sent "$http_referer" ' 17 | '"$http_user_agent" "$http_x_forwarded_for"'; 18 | 19 | server { 20 | listen 80 default_server; 21 | listen [::]:80; 22 | 23 | server_name localhost; 24 | server_tokens off; 25 | 26 | access_log /var/log/nginx/access.log main; 27 | error_log /var/log/nginx/error.log error; 28 | 29 | root /usr/share/nginx/html/xfrm; 30 | index index.php; 31 | 32 | location / { 33 | try_files $uri $uri/ /index.php?$uri&$args; 34 | } 35 | 36 | location ~ \.php$ { 37 | fastcgi_pass xfrm_php:9000; 38 | fastcgi_index index.php; 39 | fastcgi_param SCRIPT_FILENAME /var/www/html/xfrm$fastcgi_script_name; 40 | include fastcgi_params; 41 | } 42 | } 43 | } -------------------------------------------------------------------------------- /docker/php/build: -------------------------------------------------------------------------------- 1 | FROM php:7.3-fpm-buster 2 | RUN docker-php-ext-install pdo mysqli pdo_mysql 3 | -------------------------------------------------------------------------------- /docker/php/php.ini: -------------------------------------------------------------------------------- 1 | [PHP] 2 | 3 | ;;;;;;;;;;;;;;;;;;; 4 | ; About php.ini ; 5 | ;;;;;;;;;;;;;;;;;;; 6 | ; PHP's initialization file, generally called php.ini, is responsible for 7 | ; configuring many of the aspects of PHP's behavior. 8 | 9 | ; PHP attempts to find and load this configuration from a number of locations. 10 | ; The following is a summary of its search order: 11 | ; 1. SAPI module specific location. 12 | ; 2. The PHPRC environment variable. (As of PHP 5.2.0) 13 | ; 3. A number of predefined registry keys on Windows (As of PHP 5.2.0) 14 | ; 4. Current working directory (except CLI) 15 | ; 5. The web server's directory (for SAPI modules), or directory of PHP 16 | ; (otherwise in Windows) 17 | ; 6. The directory from the --with-config-file-path compile time option, or the 18 | ; Windows directory (usually C:\windows) 19 | ; See the PHP docs for more specific information. 20 | ; http://php.net/configuration.file 21 | 22 | ; The syntax of the file is extremely simple. Whitespace and lines 23 | ; beginning with a semicolon are silently ignored (as you probably guessed). 24 | ; Section headers (e.g. [Foo]) are also silently ignored, even though 25 | ; they might mean something in the future. 26 | 27 | ; Directives following the section heading [PATH=/www/mysite] only 28 | ; apply to PHP files in the /www/mysite directory. Directives 29 | ; following the section heading [HOST=www.example.com] only apply to 30 | ; PHP files served from www.example.com. Directives set in these 31 | ; special sections cannot be overridden by user-defined INI files or 32 | ; at runtime. Currently, [PATH=] and [HOST=] sections only work under 33 | ; CGI/FastCGI. 34 | ; http://php.net/ini.sections 35 | 36 | ; Directives are specified using the following syntax: 37 | ; directive = value 38 | ; Directive names are *case sensitive* - foo=bar is different from FOO=bar. 39 | ; Directives are variables used to configure PHP or PHP extensions. 40 | ; There is no name validation. If PHP can't find an expected 41 | ; directive because it is not set or is mistyped, a default value will be used. 42 | 43 | ; The value can be a string, a number, a PHP constant (e.g. E_ALL or M_PI), one 44 | ; of the INI constants (On, Off, True, False, Yes, No and None) or an expression 45 | ; (e.g. E_ALL & ~E_NOTICE), a quoted string ("bar"), or a reference to a 46 | ; previously set variable or directive (e.g. ${foo}) 47 | 48 | ; Expressions in the INI file are limited to bitwise operators and parentheses: 49 | ; | bitwise OR 50 | ; ^ bitwise XOR 51 | ; & bitwise AND 52 | ; ~ bitwise NOT 53 | ; ! boolean NOT 54 | 55 | ; Boolean flags can be turned on using the values 1, On, True or Yes. 56 | ; They can be turned off using the values 0, Off, False or No. 57 | 58 | ; An empty string can be denoted by simply not writing anything after the equal 59 | ; sign, or by using the None keyword: 60 | 61 | ; foo = ; sets foo to an empty string 62 | ; foo = None ; sets foo to an empty string 63 | ; foo = "None" ; sets foo to the string 'None' 64 | 65 | ; If you use constants in your value, and these constants belong to a 66 | ; dynamically loaded extension (either a PHP extension or a Zend extension), 67 | ; you may only use these constants *after* the line that loads the extension. 68 | 69 | ;;;;;;;;;;;;;;;;;;; 70 | ; About this file ; 71 | ;;;;;;;;;;;;;;;;;;; 72 | ; PHP comes packaged with two INI files. One that is recommended to be used 73 | ; in production environments and one that is recommended to be used in 74 | ; development environments. 75 | 76 | ; php.ini-production contains settings which hold security, performance and 77 | ; best practices at its core. But please be aware, these settings may break 78 | ; compatibility with older or less security conscience applications. We 79 | ; recommending using the production ini in production and testing environments. 80 | 81 | ; php.ini-development is very similar to its production variant, except it is 82 | ; much more verbose when it comes to errors. We recommend using the 83 | ; development version only in development environments, as errors shown to 84 | ; application users can inadvertently leak otherwise secure information. 85 | 86 | ; This is the php.ini-development INI file. 87 | 88 | ;;;;;;;;;;;;;;;;;;; 89 | ; Quick Reference ; 90 | ;;;;;;;;;;;;;;;;;;; 91 | ; The following are all the settings which are different in either the production 92 | ; or development versions of the INIs with respect to PHP's default behavior. 93 | ; Please see the actual settings later in the document for more details as to why 94 | ; we recommend these changes in PHP's behavior. 95 | 96 | ; display_errors 97 | ; Default Value: On 98 | ; Development Value: On 99 | ; Production Value: Off 100 | 101 | ; display_startup_errors 102 | ; Default Value: Off 103 | ; Development Value: On 104 | ; Production Value: Off 105 | 106 | ; error_reporting 107 | ; Default Value: E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED 108 | ; Development Value: E_ALL 109 | ; Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT 110 | 111 | ; html_errors 112 | ; Default Value: On 113 | ; Development Value: On 114 | ; Production value: On 115 | 116 | ; log_errors 117 | ; Default Value: Off 118 | ; Development Value: On 119 | ; Production Value: On 120 | 121 | ; max_input_time 122 | ; Default Value: -1 (Unlimited) 123 | ; Development Value: 60 (60 seconds) 124 | ; Production Value: 60 (60 seconds) 125 | 126 | ; output_buffering 127 | ; Default Value: Off 128 | ; Development Value: 4096 129 | ; Production Value: 4096 130 | 131 | ; register_argc_argv 132 | ; Default Value: On 133 | ; Development Value: Off 134 | ; Production Value: Off 135 | 136 | ; request_order 137 | ; Default Value: None 138 | ; Development Value: "GP" 139 | ; Production Value: "GP" 140 | 141 | ; session.gc_divisor 142 | ; Default Value: 100 143 | ; Development Value: 1000 144 | ; Production Value: 1000 145 | 146 | ; session.sid_bits_per_character 147 | ; Default Value: 4 148 | ; Development Value: 5 149 | ; Production Value: 5 150 | 151 | ; short_open_tag 152 | ; Default Value: On 153 | ; Development Value: Off 154 | ; Production Value: Off 155 | 156 | ; variables_order 157 | ; Default Value: "EGPCS" 158 | ; Development Value: "GPCS" 159 | ; Production Value: "GPCS" 160 | 161 | ;;;;;;;;;;;;;;;;;;;; 162 | ; php.ini Options ; 163 | ;;;;;;;;;;;;;;;;;;;; 164 | ; Name for user-defined php.ini (.htaccess) files. Default is ".user.ini" 165 | ;user_ini.filename = ".user.ini" 166 | 167 | ; To disable this feature set this option to an empty value 168 | ;user_ini.filename = 169 | 170 | ; TTL for user-defined php.ini files (time-to-live) in seconds. Default is 300 seconds (5 minutes) 171 | ;user_ini.cache_ttl = 300 172 | 173 | ;;;;;;;;;;;;;;;;;;;; 174 | ; Language Options ; 175 | ;;;;;;;;;;;;;;;;;;;; 176 | 177 | ; Enable the PHP scripting language engine under Apache. 178 | ; http://php.net/engine 179 | engine = On 180 | 181 | ; This directive determines whether or not PHP will recognize code between 182 | ; tags as PHP source which should be processed as such. It is 183 | ; generally recommended that should be used and that this feature 184 | ; should be disabled, as enabling it may result in issues when generating XML 185 | ; documents, however this remains supported for backward compatibility reasons. 186 | ; Note that this directive does not control the would work. 319 | ; http://php.net/syntax-highlighting 320 | ;highlight.string = #DD0000 321 | ;highlight.comment = #FF9900 322 | ;highlight.keyword = #007700 323 | ;highlight.default = #0000BB 324 | ;highlight.html = #000000 325 | 326 | ; If enabled, the request will be allowed to complete even if the user aborts 327 | ; the request. Consider enabling it if executing long requests, which may end up 328 | ; being interrupted by the user or a browser timing out. PHP's default behavior 329 | ; is to disable this feature. 330 | ; http://php.net/ignore-user-abort 331 | ;ignore_user_abort = On 332 | 333 | ; Determines the size of the realpath cache to be used by PHP. This value should 334 | ; be increased on systems where PHP opens many files to reflect the quantity of 335 | ; the file operations performed. 336 | ; Note: if open_basedir is set, the cache is disabled 337 | ; http://php.net/realpath-cache-size 338 | ;realpath_cache_size = 4096k 339 | 340 | ; Duration of time, in seconds for which to cache realpath information for a given 341 | ; file or directory. For systems with rarely changing files, consider increasing this 342 | ; value. 343 | ; http://php.net/realpath-cache-ttl 344 | ;realpath_cache_ttl = 120 345 | 346 | ; Enables or disables the circular reference collector. 347 | ; http://php.net/zend.enable-gc 348 | zend.enable_gc = On 349 | 350 | ; If enabled, scripts may be written in encodings that are incompatible with 351 | ; the scanner. CP936, Big5, CP949 and Shift_JIS are the examples of such 352 | ; encodings. To use this feature, mbstring extension must be enabled. 353 | ; Default: Off 354 | ;zend.multibyte = Off 355 | 356 | ; Allows to set the default encoding for the scripts. This value will be used 357 | ; unless "declare(encoding=...)" directive appears at the top of the script. 358 | ; Only affects if zend.multibyte is set. 359 | ; Default: "" 360 | ;zend.script_encoding = 361 | 362 | ;;;;;;;;;;;;;;;;; 363 | ; Miscellaneous ; 364 | ;;;;;;;;;;;;;;;;; 365 | 366 | ; Decides whether PHP may expose the fact that it is installed on the server 367 | ; (e.g. by adding its signature to the Web server header). It is no security 368 | ; threat in any way, but it makes it possible to determine whether you use PHP 369 | ; on your server or not. 370 | ; http://php.net/expose-php 371 | expose_php = On 372 | 373 | ;;;;;;;;;;;;;;;;;;; 374 | ; Resource Limits ; 375 | ;;;;;;;;;;;;;;;;;;; 376 | 377 | ; Maximum execution time of each script, in seconds 378 | ; http://php.net/max-execution-time 379 | ; Note: This directive is hardcoded to 0 for the CLI SAPI 380 | max_execution_time = 30 381 | 382 | ; Maximum amount of time each script may spend parsing request data. It's a good 383 | ; idea to limit this time on productions servers in order to eliminate unexpectedly 384 | ; long running scripts. 385 | ; Note: This directive is hardcoded to -1 for the CLI SAPI 386 | ; Default Value: -1 (Unlimited) 387 | ; Development Value: 60 (60 seconds) 388 | ; Production Value: 60 (60 seconds) 389 | ; http://php.net/max-input-time 390 | max_input_time = 60 391 | 392 | ; Maximum input variable nesting level 393 | ; http://php.net/max-input-nesting-level 394 | ;max_input_nesting_level = 64 395 | 396 | ; How many GET/POST/COOKIE input variables may be accepted 397 | ;max_input_vars = 1000 398 | 399 | ; Maximum amount of memory a script may consume (128MB) 400 | ; http://php.net/memory-limit 401 | memory_limit = 128M 402 | 403 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 404 | ; Error handling and logging ; 405 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 406 | 407 | ; This directive informs PHP of which errors, warnings and notices you would like 408 | ; it to take action for. The recommended way of setting values for this 409 | ; directive is through the use of the error level constants and bitwise 410 | ; operators. The error level constants are below here for convenience as well as 411 | ; some common settings and their meanings. 412 | ; By default, PHP is set to take action on all errors, notices and warnings EXCEPT 413 | ; those related to E_NOTICE and E_STRICT, which together cover best practices and 414 | ; recommended coding standards in PHP. For performance reasons, this is the 415 | ; recommend error reporting setting. Your production server shouldn't be wasting 416 | ; resources complaining about best practices and coding standards. That's what 417 | ; development servers and development settings are for. 418 | ; Note: The php.ini-development file has this setting as E_ALL. This 419 | ; means it pretty much reports everything which is exactly what you want during 420 | ; development and early testing. 421 | ; 422 | ; Error Level Constants: 423 | ; E_ALL - All errors and warnings (includes E_STRICT as of PHP 5.4.0) 424 | ; E_ERROR - fatal run-time errors 425 | ; E_RECOVERABLE_ERROR - almost fatal run-time errors 426 | ; E_WARNING - run-time warnings (non-fatal errors) 427 | ; E_PARSE - compile-time parse errors 428 | ; E_NOTICE - run-time notices (these are warnings which often result 429 | ; from a bug in your code, but it's possible that it was 430 | ; intentional (e.g., using an uninitialized variable and 431 | ; relying on the fact it is automatically initialized to an 432 | ; empty string) 433 | ; E_STRICT - run-time notices, enable to have PHP suggest changes 434 | ; to your code which will ensure the best interoperability 435 | ; and forward compatibility of your code 436 | ; E_CORE_ERROR - fatal errors that occur during PHP's initial startup 437 | ; E_CORE_WARNING - warnings (non-fatal errors) that occur during PHP's 438 | ; initial startup 439 | ; E_COMPILE_ERROR - fatal compile-time errors 440 | ; E_COMPILE_WARNING - compile-time warnings (non-fatal errors) 441 | ; E_USER_ERROR - user-generated error message 442 | ; E_USER_WARNING - user-generated warning message 443 | ; E_USER_NOTICE - user-generated notice message 444 | ; E_DEPRECATED - warn about code that will not work in future versions 445 | ; of PHP 446 | ; E_USER_DEPRECATED - user-generated deprecation warnings 447 | ; 448 | ; Common Values: 449 | ; E_ALL (Show all errors, warnings and notices including coding standards.) 450 | ; E_ALL & ~E_NOTICE (Show all errors, except for notices) 451 | ; E_ALL & ~E_NOTICE & ~E_STRICT (Show all errors, except for notices and coding standards warnings.) 452 | ; E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR (Show only errors) 453 | ; Default Value: E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED 454 | ; Development Value: E_ALL 455 | ; Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT 456 | ; http://php.net/error-reporting 457 | error_reporting = E_ALL 458 | 459 | ; This directive controls whether or not and where PHP will output errors, 460 | ; notices and warnings too. Error output is very useful during development, but 461 | ; it could be very dangerous in production environments. Depending on the code 462 | ; which is triggering the error, sensitive information could potentially leak 463 | ; out of your application such as database usernames and passwords or worse. 464 | ; For production environments, we recommend logging errors rather than 465 | ; sending them to STDOUT. 466 | ; Possible Values: 467 | ; Off = Do not display any errors 468 | ; stderr = Display errors to STDERR (affects only CGI/CLI binaries!) 469 | ; On or stdout = Display errors to STDOUT 470 | ; Default Value: On 471 | ; Development Value: On 472 | ; Production Value: Off 473 | ; http://php.net/display-errors 474 | display_errors = On 475 | 476 | ; The display of errors which occur during PHP's startup sequence are handled 477 | ; separately from display_errors. PHP's default behavior is to suppress those 478 | ; errors from clients. Turning the display of startup errors on can be useful in 479 | ; debugging configuration problems. We strongly recommend you 480 | ; set this to 'off' for production servers. 481 | ; Default Value: Off 482 | ; Development Value: On 483 | ; Production Value: Off 484 | ; http://php.net/display-startup-errors 485 | display_startup_errors = On 486 | 487 | ; Besides displaying errors, PHP can also log errors to locations such as a 488 | ; server-specific log, STDERR, or a location specified by the error_log 489 | ; directive found below. While errors should not be displayed on productions 490 | ; servers they should still be monitored and logging is a great way to do that. 491 | ; Default Value: Off 492 | ; Development Value: On 493 | ; Production Value: On 494 | ; http://php.net/log-errors 495 | log_errors = On 496 | 497 | ; Set maximum length of log_errors. In error_log information about the source is 498 | ; added. The default is 1024 and 0 allows to not apply any maximum length at all. 499 | ; http://php.net/log-errors-max-len 500 | log_errors_max_len = 1024 501 | 502 | ; Do not log repeated messages. Repeated errors must occur in same file on same 503 | ; line unless ignore_repeated_source is set true. 504 | ; http://php.net/ignore-repeated-errors 505 | ignore_repeated_errors = Off 506 | 507 | ; Ignore source of message when ignoring repeated messages. When this setting 508 | ; is On you will not log errors with repeated messages from different files or 509 | ; source lines. 510 | ; http://php.net/ignore-repeated-source 511 | ignore_repeated_source = Off 512 | 513 | ; If this parameter is set to Off, then memory leaks will not be shown (on 514 | ; stdout or in the log). This has only effect in a debug compile, and if 515 | ; error reporting includes E_WARNING in the allowed list 516 | ; http://php.net/report-memleaks 517 | report_memleaks = On 518 | 519 | ; This setting is on by default. 520 | ;report_zend_debug = 0 521 | 522 | ; Store the last error/warning message in $php_errormsg (boolean). 523 | ; This directive is DEPRECATED. 524 | ; Default Value: Off 525 | ; Development Value: Off 526 | ; Production Value: Off 527 | ; http://php.net/track-errors 528 | ;track_errors = Off 529 | 530 | ; Turn off normal error reporting and emit XML-RPC error XML 531 | ; http://php.net/xmlrpc-errors 532 | ;xmlrpc_errors = 0 533 | 534 | ; An XML-RPC faultCode 535 | ;xmlrpc_error_number = 0 536 | 537 | ; When PHP displays or logs an error, it has the capability of formatting the 538 | ; error message as HTML for easier reading. This directive controls whether 539 | ; the error message is formatted as HTML or not. 540 | ; Note: This directive is hardcoded to Off for the CLI SAPI 541 | ; Default Value: On 542 | ; Development Value: On 543 | ; Production value: On 544 | ; http://php.net/html-errors 545 | html_errors = On 546 | 547 | ; If html_errors is set to On *and* docref_root is not empty, then PHP 548 | ; produces clickable error messages that direct to a page describing the error 549 | ; or function causing the error in detail. 550 | ; You can download a copy of the PHP manual from http://php.net/docs 551 | ; and change docref_root to the base URL of your local copy including the 552 | ; leading '/'. You must also specify the file extension being used including 553 | ; the dot. PHP's default behavior is to leave these settings empty, in which 554 | ; case no links to documentation are generated. 555 | ; Note: Never use this feature for production boxes. 556 | ; http://php.net/docref-root 557 | ; Examples 558 | ;docref_root = "/phpmanual/" 559 | 560 | ; http://php.net/docref-ext 561 | ;docref_ext = .html 562 | 563 | ; String to output before an error message. PHP's default behavior is to leave 564 | ; this setting blank. 565 | ; http://php.net/error-prepend-string 566 | ; Example: 567 | ;error_prepend_string = "" 568 | 569 | ; String to output after an error message. PHP's default behavior is to leave 570 | ; this setting blank. 571 | ; http://php.net/error-append-string 572 | ; Example: 573 | ;error_append_string = "" 574 | 575 | ; Log errors to specified file. PHP's default behavior is to leave this value 576 | ; empty. 577 | ; http://php.net/error-log 578 | ; Example: 579 | ;error_log = php_errors.log 580 | ; Log errors to syslog (Event Log on Windows). 581 | ;error_log = syslog 582 | 583 | ; The syslog ident is a string which is prepended to every message logged 584 | ; to syslog. Only used when error_log is set to syslog. 585 | ;syslog.ident = php 586 | 587 | ; The syslog facility is used to specify what type of program is logging 588 | ; the message. Only used when error_log is set to syslog. 589 | ;syslog.facility = user 590 | 591 | ; Set this to disable filtering control characters (the default). 592 | ; Some loggers only accept NVT-ASCII, others accept anything that's not 593 | ; control characters. If your logger accepts everything, then no filtering 594 | ; is needed at all. 595 | ; Allowed values are: 596 | ; ascii (all printable ASCII characters and NL) 597 | ; no-ctrl (all characters except control characters) 598 | ; all (all characters) 599 | ; raw (like "all", but messages are not split at newlines) 600 | ; http://php.net/syslog.filter 601 | ;syslog.filter = ascii 602 | 603 | ;windows.show_crt_warning 604 | ; Default value: 0 605 | ; Development value: 0 606 | ; Production value: 0 607 | 608 | ;;;;;;;;;;;;;;;;; 609 | ; Data Handling ; 610 | ;;;;;;;;;;;;;;;;; 611 | 612 | ; The separator used in PHP generated URLs to separate arguments. 613 | ; PHP's default setting is "&". 614 | ; http://php.net/arg-separator.output 615 | ; Example: 616 | ;arg_separator.output = "&" 617 | 618 | ; List of separator(s) used by PHP to parse input URLs into variables. 619 | ; PHP's default setting is "&". 620 | ; NOTE: Every character in this directive is considered as separator! 621 | ; http://php.net/arg-separator.input 622 | ; Example: 623 | ;arg_separator.input = ";&" 624 | 625 | ; This directive determines which super global arrays are registered when PHP 626 | ; starts up. G,P,C,E & S are abbreviations for the following respective super 627 | ; globals: GET, POST, COOKIE, ENV and SERVER. There is a performance penalty 628 | ; paid for the registration of these arrays and because ENV is not as commonly 629 | ; used as the others, ENV is not recommended on productions servers. You 630 | ; can still get access to the environment variables through getenv() should you 631 | ; need to. 632 | ; Default Value: "EGPCS" 633 | ; Development Value: "GPCS" 634 | ; Production Value: "GPCS"; 635 | ; http://php.net/variables-order 636 | variables_order = "GPCS" 637 | 638 | ; This directive determines which super global data (G,P & C) should be 639 | ; registered into the super global array REQUEST. If so, it also determines 640 | ; the order in which that data is registered. The values for this directive 641 | ; are specified in the same manner as the variables_order directive, 642 | ; EXCEPT one. Leaving this value empty will cause PHP to use the value set 643 | ; in the variables_order directive. It does not mean it will leave the super 644 | ; globals array REQUEST empty. 645 | ; Default Value: None 646 | ; Development Value: "GP" 647 | ; Production Value: "GP" 648 | ; http://php.net/request-order 649 | request_order = "GP" 650 | 651 | ; This directive determines whether PHP registers $argv & $argc each time it 652 | ; runs. $argv contains an array of all the arguments passed to PHP when a script 653 | ; is invoked. $argc contains an integer representing the number of arguments 654 | ; that were passed when the script was invoked. These arrays are extremely 655 | ; useful when running scripts from the command line. When this directive is 656 | ; enabled, registering these variables consumes CPU cycles and memory each time 657 | ; a script is executed. For performance reasons, this feature should be disabled 658 | ; on production servers. 659 | ; Note: This directive is hardcoded to On for the CLI SAPI 660 | ; Default Value: On 661 | ; Development Value: Off 662 | ; Production Value: Off 663 | ; http://php.net/register-argc-argv 664 | register_argc_argv = Off 665 | 666 | ; When enabled, the ENV, REQUEST and SERVER variables are created when they're 667 | ; first used (Just In Time) instead of when the script starts. If these 668 | ; variables are not used within a script, having this directive on will result 669 | ; in a performance gain. The PHP directive register_argc_argv must be disabled 670 | ; for this directive to have any affect. 671 | ; http://php.net/auto-globals-jit 672 | auto_globals_jit = On 673 | 674 | ; Whether PHP will read the POST data. 675 | ; This option is enabled by default. 676 | ; Most likely, you won't want to disable this option globally. It causes $_POST 677 | ; and $_FILES to always be empty; the only way you will be able to read the 678 | ; POST data will be through the php://input stream wrapper. This can be useful 679 | ; to proxy requests or to process the POST data in a memory efficient fashion. 680 | ; http://php.net/enable-post-data-reading 681 | ;enable_post_data_reading = Off 682 | 683 | ; Maximum size of POST data that PHP will accept. 684 | ; Its value may be 0 to disable the limit. It is ignored if POST data reading 685 | ; is disabled through enable_post_data_reading. 686 | ; http://php.net/post-max-size 687 | post_max_size = 8M 688 | 689 | ; Automatically add files before PHP document. 690 | ; http://php.net/auto-prepend-file 691 | auto_prepend_file = 692 | 693 | ; Automatically add files after PHP document. 694 | ; http://php.net/auto-append-file 695 | auto_append_file = 696 | 697 | ; By default, PHP will output a media type using the Content-Type header. To 698 | ; disable this, simply set it to be empty. 699 | ; 700 | ; PHP's built-in default media type is set to text/html. 701 | ; http://php.net/default-mimetype 702 | default_mimetype = "text/html" 703 | 704 | ; PHP's default character set is set to UTF-8. 705 | ; http://php.net/default-charset 706 | default_charset = "UTF-8" 707 | 708 | ; PHP internal character encoding is set to empty. 709 | ; If empty, default_charset is used. 710 | ; http://php.net/internal-encoding 711 | ;internal_encoding = 712 | 713 | ; PHP input character encoding is set to empty. 714 | ; If empty, default_charset is used. 715 | ; http://php.net/input-encoding 716 | ;input_encoding = 717 | 718 | ; PHP output character encoding is set to empty. 719 | ; If empty, default_charset is used. 720 | ; See also output_buffer. 721 | ; http://php.net/output-encoding 722 | ;output_encoding = 723 | 724 | ;;;;;;;;;;;;;;;;;;;;;;;;; 725 | ; Paths and Directories ; 726 | ;;;;;;;;;;;;;;;;;;;;;;;;; 727 | 728 | ; UNIX: "/path1:/path2" 729 | ;include_path = ".:/php/includes" 730 | ; 731 | ; Windows: "\path1;\path2" 732 | ;include_path = ".;c:\php\includes" 733 | ; 734 | ; PHP's default setting for include_path is ".;/path/to/php/pear" 735 | ; http://php.net/include-path 736 | 737 | ; The root of the PHP pages, used only if nonempty. 738 | ; if PHP was not compiled with FORCE_REDIRECT, you SHOULD set doc_root 739 | ; if you are running php as a CGI under any web server (other than IIS) 740 | ; see documentation for security issues. The alternate is to use the 741 | ; cgi.force_redirect configuration below 742 | ; http://php.net/doc-root 743 | doc_root = 744 | 745 | ; The directory under which PHP opens the script using /~username used only 746 | ; if nonempty. 747 | ; http://php.net/user-dir 748 | user_dir = 749 | 750 | ; Directory in which the loadable extensions (modules) reside. 751 | ; http://php.net/extension-dir 752 | ;extension_dir = "./" 753 | ; On windows: 754 | ;extension_dir = "ext" 755 | 756 | ; Directory where the temporary files should be placed. 757 | ; Defaults to the system default (see sys_get_temp_dir) 758 | ;sys_temp_dir = "/tmp" 759 | 760 | ; Whether or not to enable the dl() function. The dl() function does NOT work 761 | ; properly in multithreaded servers, such as IIS or Zeus, and is automatically 762 | ; disabled on them. 763 | ; http://php.net/enable-dl 764 | enable_dl = Off 765 | 766 | ; cgi.force_redirect is necessary to provide security running PHP as a CGI under 767 | ; most web servers. Left undefined, PHP turns this on by default. You can 768 | ; turn it off here AT YOUR OWN RISK 769 | ; **You CAN safely turn this off for IIS, in fact, you MUST.** 770 | ; http://php.net/cgi.force-redirect 771 | ;cgi.force_redirect = 1 772 | 773 | ; if cgi.nph is enabled it will force cgi to always sent Status: 200 with 774 | ; every request. PHP's default behavior is to disable this feature. 775 | ;cgi.nph = 1 776 | 777 | ; if cgi.force_redirect is turned on, and you are not running under Apache or Netscape 778 | ; (iPlanet) web servers, you MAY need to set an environment variable name that PHP 779 | ; will look for to know it is OK to continue execution. Setting this variable MAY 780 | ; cause security issues, KNOW WHAT YOU ARE DOING FIRST. 781 | ; http://php.net/cgi.redirect-status-env 782 | ;cgi.redirect_status_env = 783 | 784 | ; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI. PHP's 785 | ; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok 786 | ; what PATH_INFO is. For more information on PATH_INFO, see the cgi specs. Setting 787 | ; this to 1 will cause PHP CGI to fix its paths to conform to the spec. A setting 788 | ; of zero causes PHP to behave as before. Default is 1. You should fix your scripts 789 | ; to use SCRIPT_FILENAME rather than PATH_TRANSLATED. 790 | ; http://php.net/cgi.fix-pathinfo 791 | ;cgi.fix_pathinfo=1 792 | 793 | ; if cgi.discard_path is enabled, the PHP CGI binary can safely be placed outside 794 | ; of the web tree and people will not be able to circumvent .htaccess security. 795 | ;cgi.discard_path=1 796 | 797 | ; FastCGI under IIS supports the ability to impersonate 798 | ; security tokens of the calling client. This allows IIS to define the 799 | ; security context that the request runs under. mod_fastcgi under Apache 800 | ; does not currently support this feature (03/17/2002) 801 | ; Set to 1 if running under IIS. Default is zero. 802 | ; http://php.net/fastcgi.impersonate 803 | ;fastcgi.impersonate = 1 804 | 805 | ; Disable logging through FastCGI connection. PHP's default behavior is to enable 806 | ; this feature. 807 | ;fastcgi.logging = 0 808 | 809 | ; cgi.rfc2616_headers configuration option tells PHP what type of headers to 810 | ; use when sending HTTP response code. If set to 0, PHP sends Status: header that 811 | ; is supported by Apache. When this option is set to 1, PHP will send 812 | ; RFC2616 compliant header. 813 | ; Default is zero. 814 | ; http://php.net/cgi.rfc2616-headers 815 | ;cgi.rfc2616_headers = 0 816 | 817 | ; cgi.check_shebang_line controls whether CGI PHP checks for line starting with #! 818 | ; (shebang) at the top of the running script. This line might be needed if the 819 | ; script support running both as stand-alone script and via PHP CGI<. PHP in CGI 820 | ; mode skips this line and ignores its content if this directive is turned on. 821 | ; http://php.net/cgi.check-shebang-line 822 | ;cgi.check_shebang_line=1 823 | 824 | ;;;;;;;;;;;;;;;; 825 | ; File Uploads ; 826 | ;;;;;;;;;;;;;;;; 827 | 828 | ; Whether to allow HTTP file uploads. 829 | ; http://php.net/file-uploads 830 | file_uploads = On 831 | 832 | ; Temporary directory for HTTP uploaded files (will use system default if not 833 | ; specified). 834 | ; http://php.net/upload-tmp-dir 835 | ;upload_tmp_dir = 836 | 837 | ; Maximum allowed size for uploaded files. 838 | ; http://php.net/upload-max-filesize 839 | upload_max_filesize = 2M 840 | 841 | ; Maximum number of files that can be uploaded via a single request 842 | max_file_uploads = 20 843 | 844 | ;;;;;;;;;;;;;;;;;; 845 | ; Fopen wrappers ; 846 | ;;;;;;;;;;;;;;;;;; 847 | 848 | ; Whether to allow the treatment of URLs (like http:// or ftp://) as files. 849 | ; http://php.net/allow-url-fopen 850 | allow_url_fopen = On 851 | 852 | ; Whether to allow include/require to open URLs (like http:// or ftp://) as files. 853 | ; http://php.net/allow-url-include 854 | allow_url_include = Off 855 | 856 | ; Define the anonymous ftp password (your email address). PHP's default setting 857 | ; for this is empty. 858 | ; http://php.net/from 859 | ;from="john@doe.com" 860 | 861 | ; Define the User-Agent string. PHP's default setting for this is empty. 862 | ; http://php.net/user-agent 863 | ;user_agent="PHP" 864 | 865 | ; Default timeout for socket based streams (seconds) 866 | ; http://php.net/default-socket-timeout 867 | default_socket_timeout = 60 868 | 869 | ; If your scripts have to deal with files from Macintosh systems, 870 | ; or you are running on a Mac and need to deal with files from 871 | ; unix or win32 systems, setting this flag will cause PHP to 872 | ; automatically detect the EOL character in those files so that 873 | ; fgets() and file() will work regardless of the source of the file. 874 | ; http://php.net/auto-detect-line-endings 875 | ;auto_detect_line_endings = Off 876 | 877 | ;;;;;;;;;;;;;;;;;;;;;; 878 | ; Dynamic Extensions ; 879 | ;;;;;;;;;;;;;;;;;;;;;; 880 | 881 | ; If you wish to have an extension loaded automatically, use the following 882 | ; syntax: 883 | ; 884 | ; extension=modulename 885 | ; 886 | ; For example: 887 | ; 888 | ; extension=mysqli 889 | ; 890 | ; When the extension library to load is not located in the default extension 891 | ; directory, You may specify an absolute path to the library file: 892 | ; 893 | ; extension=/path/to/extension/mysqli.so 894 | ; 895 | ; Note : The syntax used in previous PHP versions ('extension=.so' and 896 | ; 'extension='php_.dll') is supported for legacy reasons and may be 897 | ; deprecated in a future PHP major version. So, when it is possible, please 898 | ; move to the new ('extension=) syntax. 899 | ; 900 | ; Notes for Windows environments : 901 | ; 902 | ; - Many DLL files are located in the extensions/ (PHP 4) or ext/ (PHP 5+) 903 | ; extension folders as well as the separate PECL DLL download (PHP 5+). 904 | ; Be sure to appropriately set the extension_dir directive. 905 | ; 906 | ;extension=bz2 907 | ;extension=curl 908 | ;extension=fileinfo 909 | ;extension=gd2 910 | ;extension=gettext 911 | ;extension=gmp 912 | ;extension=intl 913 | ;extension=imap 914 | ;extension=interbase 915 | ;extension=ldap 916 | ;extension=mbstring 917 | ;extension=exif ; Must be after mbstring as it depends on it 918 | ;extension=mysqli 919 | ;extension=oci8_12c ; Use with Oracle Database 12c Instant Client 920 | ;extension=odbc 921 | ;extension=openssl 922 | ;extension=pdo_firebird 923 | ;extension=pdo_mysql 924 | ;extension=pdo_oci 925 | ;extension=pdo_odbc 926 | ;extension=pdo_pgsql 927 | ;extension=pdo_sqlite 928 | ;extension=pgsql 929 | ;extension=shmop 930 | 931 | ; The MIBS data available in the PHP distribution must be installed. 932 | ; See http://www.php.net/manual/en/snmp.installation.php 933 | ;extension=snmp 934 | 935 | ;extension=soap 936 | ;extension=sockets 937 | ;extension=sodium 938 | ;extension=sqlite3 939 | ;extension=tidy 940 | ;extension=xmlrpc 941 | ;extension=xsl 942 | 943 | ;;;;;;;;;;;;;;;;;;; 944 | ; Module Settings ; 945 | ;;;;;;;;;;;;;;;;;;; 946 | 947 | [CLI Server] 948 | ; Whether the CLI web server uses ANSI color coding in its terminal output. 949 | cli_server.color = On 950 | 951 | [Date] 952 | ; Defines the default timezone used by the date functions 953 | ; http://php.net/date.timezone 954 | ;date.timezone = 955 | 956 | ; http://php.net/date.default-latitude 957 | ;date.default_latitude = 31.7667 958 | 959 | ; http://php.net/date.default-longitude 960 | ;date.default_longitude = 35.2333 961 | 962 | ; http://php.net/date.sunrise-zenith 963 | ;date.sunrise_zenith = 90.583333 964 | 965 | ; http://php.net/date.sunset-zenith 966 | ;date.sunset_zenith = 90.583333 967 | 968 | [filter] 969 | ; http://php.net/filter.default 970 | ;filter.default = unsafe_raw 971 | 972 | ; http://php.net/filter.default-flags 973 | ;filter.default_flags = 974 | 975 | [iconv] 976 | ; Use of this INI entry is deprecated, use global input_encoding instead. 977 | ; If empty, default_charset or input_encoding or iconv.input_encoding is used. 978 | ; The precedence is: default_charset < input_encoding < iconv.input_encoding 979 | ;iconv.input_encoding = 980 | 981 | ; Use of this INI entry is deprecated, use global internal_encoding instead. 982 | ; If empty, default_charset or internal_encoding or iconv.internal_encoding is used. 983 | ; The precedence is: default_charset < internal_encoding < iconv.internal_encoding 984 | ;iconv.internal_encoding = 985 | 986 | ; Use of this INI entry is deprecated, use global output_encoding instead. 987 | ; If empty, default_charset or output_encoding or iconv.output_encoding is used. 988 | ; The precedence is: default_charset < output_encoding < iconv.output_encoding 989 | ; To use an output encoding conversion, iconv's output handler must be set 990 | ; otherwise output encoding conversion cannot be performed. 991 | ;iconv.output_encoding = 992 | 993 | [imap] 994 | ; rsh/ssh logins are disabled by default. Use this INI entry if you want to 995 | ; enable them. Note that the IMAP library does not filter mailbox names before 996 | ; passing them to rsh/ssh command, thus passing untrusted data to this function 997 | ; with rsh/ssh enabled is insecure. 998 | ;imap.enable_insecure_rsh=0 999 | 1000 | [intl] 1001 | ;intl.default_locale = 1002 | ; This directive allows you to produce PHP errors when some error 1003 | ; happens within intl functions. The value is the level of the error produced. 1004 | ; Default is 0, which does not produce any errors. 1005 | ;intl.error_level = E_WARNING 1006 | ;intl.use_exceptions = 0 1007 | 1008 | [sqlite3] 1009 | ; Directory pointing to SQLite3 extensions 1010 | ; http://php.net/sqlite3.extension-dir 1011 | ;sqlite3.extension_dir = 1012 | 1013 | ; SQLite defensive mode flag (only available from SQLite 3.26+) 1014 | ; When the defensive flag is enabled, language features that allow ordinary 1015 | ; SQL to deliberately corrupt the database file are disabled. This forbids 1016 | ; writing directly to the schema, shadow tables (eg. FTS data tables), or 1017 | ; the sqlite_dbpage virtual table. 1018 | ; https://www.sqlite.org/c3ref/c_dbconfig_defensive.html 1019 | ; (for older SQLite versions, this flag has no use) 1020 | ;sqlite3.defensive = 1 1021 | 1022 | [Pcre] 1023 | ; PCRE library backtracking limit. 1024 | ; http://php.net/pcre.backtrack-limit 1025 | ;pcre.backtrack_limit=100000 1026 | 1027 | ; PCRE library recursion limit. 1028 | ; Please note that if you set this value to a high number you may consume all 1029 | ; the available process stack and eventually crash PHP (due to reaching the 1030 | ; stack size limit imposed by the Operating System). 1031 | ; http://php.net/pcre.recursion-limit 1032 | ;pcre.recursion_limit=100000 1033 | 1034 | ; Enables or disables JIT compilation of patterns. This requires the PCRE 1035 | ; library to be compiled with JIT support. 1036 | ;pcre.jit=1 1037 | 1038 | [Pdo] 1039 | ; Whether to pool ODBC connections. Can be one of "strict", "relaxed" or "off" 1040 | ; http://php.net/pdo-odbc.connection-pooling 1041 | ;pdo_odbc.connection_pooling=strict 1042 | 1043 | ;pdo_odbc.db2_instance_name 1044 | 1045 | [Pdo_mysql] 1046 | ; Default socket name for local MySQL connects. If empty, uses the built-in 1047 | ; MySQL defaults. 1048 | pdo_mysql.default_socket= 1049 | 1050 | [Phar] 1051 | ; http://php.net/phar.readonly 1052 | ;phar.readonly = On 1053 | 1054 | ; http://php.net/phar.require-hash 1055 | ;phar.require_hash = On 1056 | 1057 | ;phar.cache_list = 1058 | 1059 | [mail function] 1060 | ; For Win32 only. 1061 | ; http://php.net/smtp 1062 | SMTP = localhost 1063 | ; http://php.net/smtp-port 1064 | smtp_port = 25 1065 | 1066 | ; For Win32 only. 1067 | ; http://php.net/sendmail-from 1068 | ;sendmail_from = me@example.com 1069 | 1070 | ; For Unix only. You may supply arguments as well (default: "sendmail -t -i"). 1071 | ; http://php.net/sendmail-path 1072 | ;sendmail_path = 1073 | 1074 | ; Force the addition of the specified parameters to be passed as extra parameters 1075 | ; to the sendmail binary. These parameters will always replace the value of 1076 | ; the 5th parameter to mail(). 1077 | ;mail.force_extra_parameters = 1078 | 1079 | ; Add X-PHP-Originating-Script: that will include uid of the script followed by the filename 1080 | mail.add_x_header = Off 1081 | 1082 | ; The path to a log file that will log all mail() calls. Log entries include 1083 | ; the full path of the script, line number, To address and headers. 1084 | ;mail.log = 1085 | ; Log mail to syslog (Event Log on Windows). 1086 | ;mail.log = syslog 1087 | 1088 | [ODBC] 1089 | ; http://php.net/odbc.default-db 1090 | ;odbc.default_db = Not yet implemented 1091 | 1092 | ; http://php.net/odbc.default-user 1093 | ;odbc.default_user = Not yet implemented 1094 | 1095 | ; http://php.net/odbc.default-pw 1096 | ;odbc.default_pw = Not yet implemented 1097 | 1098 | ; Controls the ODBC cursor model. 1099 | ; Default: SQL_CURSOR_STATIC (default). 1100 | ;odbc.default_cursortype 1101 | 1102 | ; Allow or prevent persistent links. 1103 | ; http://php.net/odbc.allow-persistent 1104 | odbc.allow_persistent = On 1105 | 1106 | ; Check that a connection is still valid before reuse. 1107 | ; http://php.net/odbc.check-persistent 1108 | odbc.check_persistent = On 1109 | 1110 | ; Maximum number of persistent links. -1 means no limit. 1111 | ; http://php.net/odbc.max-persistent 1112 | odbc.max_persistent = -1 1113 | 1114 | ; Maximum number of links (persistent + non-persistent). -1 means no limit. 1115 | ; http://php.net/odbc.max-links 1116 | odbc.max_links = -1 1117 | 1118 | ; Handling of LONG fields. Returns number of bytes to variables. 0 means 1119 | ; passthru. 1120 | ; http://php.net/odbc.defaultlrl 1121 | odbc.defaultlrl = 4096 1122 | 1123 | ; Handling of binary data. 0 means passthru, 1 return as is, 2 convert to char. 1124 | ; See the documentation on odbc_binmode and odbc_longreadlen for an explanation 1125 | ; of odbc.defaultlrl and odbc.defaultbinmode 1126 | ; http://php.net/odbc.defaultbinmode 1127 | odbc.defaultbinmode = 1 1128 | 1129 | [Interbase] 1130 | ; Allow or prevent persistent links. 1131 | ibase.allow_persistent = 1 1132 | 1133 | ; Maximum number of persistent links. -1 means no limit. 1134 | ibase.max_persistent = -1 1135 | 1136 | ; Maximum number of links (persistent + non-persistent). -1 means no limit. 1137 | ibase.max_links = -1 1138 | 1139 | ; Default database name for ibase_connect(). 1140 | ;ibase.default_db = 1141 | 1142 | ; Default username for ibase_connect(). 1143 | ;ibase.default_user = 1144 | 1145 | ; Default password for ibase_connect(). 1146 | ;ibase.default_password = 1147 | 1148 | ; Default charset for ibase_connect(). 1149 | ;ibase.default_charset = 1150 | 1151 | ; Default timestamp format. 1152 | ibase.timestampformat = "%Y-%m-%d %H:%M:%S" 1153 | 1154 | ; Default date format. 1155 | ibase.dateformat = "%Y-%m-%d" 1156 | 1157 | ; Default time format. 1158 | ibase.timeformat = "%H:%M:%S" 1159 | 1160 | [MySQLi] 1161 | 1162 | ; Maximum number of persistent links. -1 means no limit. 1163 | ; http://php.net/mysqli.max-persistent 1164 | mysqli.max_persistent = -1 1165 | 1166 | ; Allow accessing, from PHP's perspective, local files with LOAD DATA statements 1167 | ; http://php.net/mysqli.allow_local_infile 1168 | ;mysqli.allow_local_infile = On 1169 | 1170 | ; Allow or prevent persistent links. 1171 | ; http://php.net/mysqli.allow-persistent 1172 | mysqli.allow_persistent = On 1173 | 1174 | ; Maximum number of links. -1 means no limit. 1175 | ; http://php.net/mysqli.max-links 1176 | mysqli.max_links = -1 1177 | 1178 | ; Default port number for mysqli_connect(). If unset, mysqli_connect() will use 1179 | ; the $MYSQL_TCP_PORT or the mysql-tcp entry in /etc/services or the 1180 | ; compile-time value defined MYSQL_PORT (in that order). Win32 will only look 1181 | ; at MYSQL_PORT. 1182 | ; http://php.net/mysqli.default-port 1183 | mysqli.default_port = 3306 1184 | 1185 | ; Default socket name for local MySQL connects. If empty, uses the built-in 1186 | ; MySQL defaults. 1187 | ; http://php.net/mysqli.default-socket 1188 | mysqli.default_socket = 1189 | 1190 | ; Default host for mysql_connect() (doesn't apply in safe mode). 1191 | ; http://php.net/mysqli.default-host 1192 | mysqli.default_host = 1193 | 1194 | ; Default user for mysql_connect() (doesn't apply in safe mode). 1195 | ; http://php.net/mysqli.default-user 1196 | mysqli.default_user = 1197 | 1198 | ; Default password for mysqli_connect() (doesn't apply in safe mode). 1199 | ; Note that this is generally a *bad* idea to store passwords in this file. 1200 | ; *Any* user with PHP access can run 'echo get_cfg_var("mysqli.default_pw") 1201 | ; and reveal this password! And of course, any users with read access to this 1202 | ; file will be able to reveal the password as well. 1203 | ; http://php.net/mysqli.default-pw 1204 | mysqli.default_pw = 1205 | 1206 | ; Allow or prevent reconnect 1207 | mysqli.reconnect = Off 1208 | 1209 | [mysqlnd] 1210 | ; Enable / Disable collection of general statistics by mysqlnd which can be 1211 | ; used to tune and monitor MySQL operations. 1212 | mysqlnd.collect_statistics = On 1213 | 1214 | ; Enable / Disable collection of memory usage statistics by mysqlnd which can be 1215 | ; used to tune and monitor MySQL operations. 1216 | mysqlnd.collect_memory_statistics = On 1217 | 1218 | ; Records communication from all extensions using mysqlnd to the specified log 1219 | ; file. 1220 | ; http://php.net/mysqlnd.debug 1221 | ;mysqlnd.debug = 1222 | 1223 | ; Defines which queries will be logged. 1224 | ;mysqlnd.log_mask = 0 1225 | 1226 | ; Default size of the mysqlnd memory pool, which is used by result sets. 1227 | ;mysqlnd.mempool_default_size = 16000 1228 | 1229 | ; Size of a pre-allocated buffer used when sending commands to MySQL in bytes. 1230 | ;mysqlnd.net_cmd_buffer_size = 2048 1231 | 1232 | ; Size of a pre-allocated buffer used for reading data sent by the server in 1233 | ; bytes. 1234 | ;mysqlnd.net_read_buffer_size = 32768 1235 | 1236 | ; Timeout for network requests in seconds. 1237 | ;mysqlnd.net_read_timeout = 31536000 1238 | 1239 | ; SHA-256 Authentication Plugin related. File with the MySQL server public RSA 1240 | ; key. 1241 | ;mysqlnd.sha256_server_public_key = 1242 | 1243 | [OCI8] 1244 | 1245 | ; Connection: Enables privileged connections using external 1246 | ; credentials (OCI_SYSOPER, OCI_SYSDBA) 1247 | ; http://php.net/oci8.privileged-connect 1248 | ;oci8.privileged_connect = Off 1249 | 1250 | ; Connection: The maximum number of persistent OCI8 connections per 1251 | ; process. Using -1 means no limit. 1252 | ; http://php.net/oci8.max-persistent 1253 | ;oci8.max_persistent = -1 1254 | 1255 | ; Connection: The maximum number of seconds a process is allowed to 1256 | ; maintain an idle persistent connection. Using -1 means idle 1257 | ; persistent connections will be maintained forever. 1258 | ; http://php.net/oci8.persistent-timeout 1259 | ;oci8.persistent_timeout = -1 1260 | 1261 | ; Connection: The number of seconds that must pass before issuing a 1262 | ; ping during oci_pconnect() to check the connection validity. When 1263 | ; set to 0, each oci_pconnect() will cause a ping. Using -1 disables 1264 | ; pings completely. 1265 | ; http://php.net/oci8.ping-interval 1266 | ;oci8.ping_interval = 60 1267 | 1268 | ; Connection: Set this to a user chosen connection class to be used 1269 | ; for all pooled server requests with Oracle 11g Database Resident 1270 | ; Connection Pooling (DRCP). To use DRCP, this value should be set to 1271 | ; the same string for all web servers running the same application, 1272 | ; the database pool must be configured, and the connection string must 1273 | ; specify to use a pooled server. 1274 | ;oci8.connection_class = 1275 | 1276 | ; High Availability: Using On lets PHP receive Fast Application 1277 | ; Notification (FAN) events generated when a database node fails. The 1278 | ; database must also be configured to post FAN events. 1279 | ;oci8.events = Off 1280 | 1281 | ; Tuning: This option enables statement caching, and specifies how 1282 | ; many statements to cache. Using 0 disables statement caching. 1283 | ; http://php.net/oci8.statement-cache-size 1284 | ;oci8.statement_cache_size = 20 1285 | 1286 | ; Tuning: Enables statement prefetching and sets the default number of 1287 | ; rows that will be fetched automatically after statement execution. 1288 | ; http://php.net/oci8.default-prefetch 1289 | ;oci8.default_prefetch = 100 1290 | 1291 | ; Compatibility. Using On means oci_close() will not close 1292 | ; oci_connect() and oci_new_connect() connections. 1293 | ; http://php.net/oci8.old-oci-close-semantics 1294 | ;oci8.old_oci_close_semantics = Off 1295 | 1296 | [PostgreSQL] 1297 | ; Allow or prevent persistent links. 1298 | ; http://php.net/pgsql.allow-persistent 1299 | pgsql.allow_persistent = On 1300 | 1301 | ; Detect broken persistent links always with pg_pconnect(). 1302 | ; Auto reset feature requires a little overheads. 1303 | ; http://php.net/pgsql.auto-reset-persistent 1304 | pgsql.auto_reset_persistent = Off 1305 | 1306 | ; Maximum number of persistent links. -1 means no limit. 1307 | ; http://php.net/pgsql.max-persistent 1308 | pgsql.max_persistent = -1 1309 | 1310 | ; Maximum number of links (persistent+non persistent). -1 means no limit. 1311 | ; http://php.net/pgsql.max-links 1312 | pgsql.max_links = -1 1313 | 1314 | ; Ignore PostgreSQL backends Notice message or not. 1315 | ; Notice message logging require a little overheads. 1316 | ; http://php.net/pgsql.ignore-notice 1317 | pgsql.ignore_notice = 0 1318 | 1319 | ; Log PostgreSQL backends Notice message or not. 1320 | ; Unless pgsql.ignore_notice=0, module cannot log notice message. 1321 | ; http://php.net/pgsql.log-notice 1322 | pgsql.log_notice = 0 1323 | 1324 | [bcmath] 1325 | ; Number of decimal digits for all bcmath functions. 1326 | ; http://php.net/bcmath.scale 1327 | bcmath.scale = 0 1328 | 1329 | [browscap] 1330 | ; http://php.net/browscap 1331 | ;browscap = extra/browscap.ini 1332 | 1333 | [Session] 1334 | ; Handler used to store/retrieve data. 1335 | ; http://php.net/session.save-handler 1336 | session.save_handler = files 1337 | 1338 | ; Argument passed to save_handler. In the case of files, this is the path 1339 | ; where data files are stored. Note: Windows users have to change this 1340 | ; variable in order to use PHP's session functions. 1341 | ; 1342 | ; The path can be defined as: 1343 | ; 1344 | ; session.save_path = "N;/path" 1345 | ; 1346 | ; where N is an integer. Instead of storing all the session files in 1347 | ; /path, what this will do is use subdirectories N-levels deep, and 1348 | ; store the session data in those directories. This is useful if 1349 | ; your OS has problems with many files in one directory, and is 1350 | ; a more efficient layout for servers that handle many sessions. 1351 | ; 1352 | ; NOTE 1: PHP will not create this directory structure automatically. 1353 | ; You can use the script in the ext/session dir for that purpose. 1354 | ; NOTE 2: See the section on garbage collection below if you choose to 1355 | ; use subdirectories for session storage 1356 | ; 1357 | ; The file storage module creates files using mode 600 by default. 1358 | ; You can change that by using 1359 | ; 1360 | ; session.save_path = "N;MODE;/path" 1361 | ; 1362 | ; where MODE is the octal representation of the mode. Note that this 1363 | ; does not overwrite the process's umask. 1364 | ; http://php.net/session.save-path 1365 | ;session.save_path = "/tmp" 1366 | 1367 | ; Whether to use strict session mode. 1368 | ; Strict session mode does not accept an uninitialized session ID, and 1369 | ; regenerates the session ID if the browser sends an uninitialized session ID. 1370 | ; Strict mode protects applications from session fixation via a session adoption 1371 | ; vulnerability. It is disabled by default for maximum compatibility, but 1372 | ; enabling it is encouraged. 1373 | ; https://wiki.php.net/rfc/strict_sessions 1374 | session.use_strict_mode = 0 1375 | 1376 | ; Whether to use cookies. 1377 | ; http://php.net/session.use-cookies 1378 | session.use_cookies = 1 1379 | 1380 | ; http://php.net/session.cookie-secure 1381 | ;session.cookie_secure = 1382 | 1383 | ; This option forces PHP to fetch and use a cookie for storing and maintaining 1384 | ; the session id. We encourage this operation as it's very helpful in combating 1385 | ; session hijacking when not specifying and managing your own session id. It is 1386 | ; not the be-all and end-all of session hijacking defense, but it's a good start. 1387 | ; http://php.net/session.use-only-cookies 1388 | session.use_only_cookies = 1 1389 | 1390 | ; Name of the session (used as cookie name). 1391 | ; http://php.net/session.name 1392 | session.name = PHPSESSID 1393 | 1394 | ; Initialize session on request startup. 1395 | ; http://php.net/session.auto-start 1396 | session.auto_start = 0 1397 | 1398 | ; Lifetime in seconds of cookie or, if 0, until browser is restarted. 1399 | ; http://php.net/session.cookie-lifetime 1400 | session.cookie_lifetime = 0 1401 | 1402 | ; The path for which the cookie is valid. 1403 | ; http://php.net/session.cookie-path 1404 | session.cookie_path = / 1405 | 1406 | ; The domain for which the cookie is valid. 1407 | ; http://php.net/session.cookie-domain 1408 | session.cookie_domain = 1409 | 1410 | ; Whether or not to add the httpOnly flag to the cookie, which makes it 1411 | ; inaccessible to browser scripting languages such as JavaScript. 1412 | ; http://php.net/session.cookie-httponly 1413 | session.cookie_httponly = 1414 | 1415 | ; Add SameSite attribute to cookie to help mitigate Cross-Site Request Forgery (CSRF/XSRF) 1416 | ; Current valid values are "Strict", "Lax" or "None". When using "None", 1417 | ; make sure to include the quotes, as `none` is interpreted like `false` in ini files. 1418 | ; https://tools.ietf.org/html/draft-west-first-party-cookies-07 1419 | session.cookie_samesite = 1420 | 1421 | ; Handler used to serialize data. php is the standard serializer of PHP. 1422 | ; http://php.net/session.serialize-handler 1423 | session.serialize_handler = php 1424 | 1425 | ; Defines the probability that the 'garbage collection' process is started on every 1426 | ; session initialization. The probability is calculated by using gc_probability/gc_divisor, 1427 | ; e.g. 1/100 means there is a 1% chance that the GC process starts on each request. 1428 | ; Default Value: 1 1429 | ; Development Value: 1 1430 | ; Production Value: 1 1431 | ; http://php.net/session.gc-probability 1432 | session.gc_probability = 1 1433 | 1434 | ; Defines the probability that the 'garbage collection' process is started on every 1435 | ; session initialization. The probability is calculated by using gc_probability/gc_divisor, 1436 | ; e.g. 1/100 means there is a 1% chance that the GC process starts on each request. 1437 | ; For high volume production servers, using a value of 1000 is a more efficient approach. 1438 | ; Default Value: 100 1439 | ; Development Value: 1000 1440 | ; Production Value: 1000 1441 | ; http://php.net/session.gc-divisor 1442 | session.gc_divisor = 1000 1443 | 1444 | ; After this number of seconds, stored data will be seen as 'garbage' and 1445 | ; cleaned up by the garbage collection process. 1446 | ; http://php.net/session.gc-maxlifetime 1447 | session.gc_maxlifetime = 1440 1448 | 1449 | ; NOTE: If you are using the subdirectory option for storing session files 1450 | ; (see session.save_path above), then garbage collection does *not* 1451 | ; happen automatically. You will need to do your own garbage 1452 | ; collection through a shell script, cron entry, or some other method. 1453 | ; For example, the following script is the equivalent of setting 1454 | ; session.gc_maxlifetime to 1440 (1440 seconds = 24 minutes): 1455 | ; find /path/to/sessions -cmin +24 -type f | xargs rm 1456 | 1457 | ; Check HTTP Referer to invalidate externally stored URLs containing ids. 1458 | ; HTTP_REFERER has to contain this substring for the session to be 1459 | ; considered as valid. 1460 | ; http://php.net/session.referer-check 1461 | session.referer_check = 1462 | 1463 | ; Set to {nocache,private,public,} to determine HTTP caching aspects 1464 | ; or leave this empty to avoid sending anti-caching headers. 1465 | ; http://php.net/session.cache-limiter 1466 | session.cache_limiter = nocache 1467 | 1468 | ; Document expires after n minutes. 1469 | ; http://php.net/session.cache-expire 1470 | session.cache_expire = 180 1471 | 1472 | ; trans sid support is disabled by default. 1473 | ; Use of trans sid may risk your users' security. 1474 | ; Use this option with caution. 1475 | ; - User may send URL contains active session ID 1476 | ; to other person via. email/irc/etc. 1477 | ; - URL that contains active session ID may be stored 1478 | ; in publicly accessible computer. 1479 | ; - User may access your site with the same session ID 1480 | ; always using URL stored in browser's history or bookmarks. 1481 | ; http://php.net/session.use-trans-sid 1482 | session.use_trans_sid = 0 1483 | 1484 | ; Set session ID character length. This value could be between 22 to 256. 1485 | ; Shorter length than default is supported only for compatibility reason. 1486 | ; Users should use 32 or more chars. 1487 | ; http://php.net/session.sid-length 1488 | ; Default Value: 32 1489 | ; Development Value: 26 1490 | ; Production Value: 26 1491 | session.sid_length = 26 1492 | 1493 | ; The URL rewriter will look for URLs in a defined set of HTML tags. 1494 | ;
is special; if you include them here, the rewriter will 1495 | ; add a hidden field with the info which is otherwise appended 1496 | ; to URLs. tag's action attribute URL will not be modified 1497 | ; unless it is specified. 1498 | ; Note that all valid entries require a "=", even if no value follows. 1499 | ; Default Value: "a=href,area=href,frame=src,form=" 1500 | ; Development Value: "a=href,area=href,frame=src,form=" 1501 | ; Production Value: "a=href,area=href,frame=src,form=" 1502 | ; http://php.net/url-rewriter.tags 1503 | session.trans_sid_tags = "a=href,area=href,frame=src,form=" 1504 | 1505 | ; URL rewriter does not rewrite absolute URLs by default. 1506 | ; To enable rewrites for absolute paths, target hosts must be specified 1507 | ; at RUNTIME. i.e. use ini_set() 1508 | ; tags is special. PHP will check action attribute's URL regardless 1509 | ; of session.trans_sid_tags setting. 1510 | ; If no host is defined, HTTP_HOST will be used for allowed host. 1511 | ; Example value: php.net,www.php.net,wiki.php.net 1512 | ; Use "," for multiple hosts. No spaces are allowed. 1513 | ; Default Value: "" 1514 | ; Development Value: "" 1515 | ; Production Value: "" 1516 | ;session.trans_sid_hosts="" 1517 | 1518 | ; Define how many bits are stored in each character when converting 1519 | ; the binary hash data to something readable. 1520 | ; Possible values: 1521 | ; 4 (4 bits: 0-9, a-f) 1522 | ; 5 (5 bits: 0-9, a-v) 1523 | ; 6 (6 bits: 0-9, a-z, A-Z, "-", ",") 1524 | ; Default Value: 4 1525 | ; Development Value: 5 1526 | ; Production Value: 5 1527 | ; http://php.net/session.hash-bits-per-character 1528 | session.sid_bits_per_character = 5 1529 | 1530 | ; Enable upload progress tracking in $_SESSION 1531 | ; Default Value: On 1532 | ; Development Value: On 1533 | ; Production Value: On 1534 | ; http://php.net/session.upload-progress.enabled 1535 | ;session.upload_progress.enabled = On 1536 | 1537 | ; Cleanup the progress information as soon as all POST data has been read 1538 | ; (i.e. upload completed). 1539 | ; Default Value: On 1540 | ; Development Value: On 1541 | ; Production Value: On 1542 | ; http://php.net/session.upload-progress.cleanup 1543 | ;session.upload_progress.cleanup = On 1544 | 1545 | ; A prefix used for the upload progress key in $_SESSION 1546 | ; Default Value: "upload_progress_" 1547 | ; Development Value: "upload_progress_" 1548 | ; Production Value: "upload_progress_" 1549 | ; http://php.net/session.upload-progress.prefix 1550 | ;session.upload_progress.prefix = "upload_progress_" 1551 | 1552 | ; The index name (concatenated with the prefix) in $_SESSION 1553 | ; containing the upload progress information 1554 | ; Default Value: "PHP_SESSION_UPLOAD_PROGRESS" 1555 | ; Development Value: "PHP_SESSION_UPLOAD_PROGRESS" 1556 | ; Production Value: "PHP_SESSION_UPLOAD_PROGRESS" 1557 | ; http://php.net/session.upload-progress.name 1558 | ;session.upload_progress.name = "PHP_SESSION_UPLOAD_PROGRESS" 1559 | 1560 | ; How frequently the upload progress should be updated. 1561 | ; Given either in percentages (per-file), or in bytes 1562 | ; Default Value: "1%" 1563 | ; Development Value: "1%" 1564 | ; Production Value: "1%" 1565 | ; http://php.net/session.upload-progress.freq 1566 | ;session.upload_progress.freq = "1%" 1567 | 1568 | ; The minimum delay between updates, in seconds 1569 | ; Default Value: 1 1570 | ; Development Value: 1 1571 | ; Production Value: 1 1572 | ; http://php.net/session.upload-progress.min-freq 1573 | ;session.upload_progress.min_freq = "1" 1574 | 1575 | ; Only write session data when session data is changed. Enabled by default. 1576 | ; http://php.net/session.lazy-write 1577 | ;session.lazy_write = On 1578 | 1579 | [Assertion] 1580 | ; Switch whether to compile assertions at all (to have no overhead at run-time) 1581 | ; -1: Do not compile at all 1582 | ; 0: Jump over assertion at run-time 1583 | ; 1: Execute assertions 1584 | ; Changing from or to a negative value is only possible in php.ini! (For turning assertions on and off at run-time, see assert.active, when zend.assertions = 1) 1585 | ; Default Value: 1 1586 | ; Development Value: 1 1587 | ; Production Value: -1 1588 | ; http://php.net/zend.assertions 1589 | zend.assertions = 1 1590 | 1591 | ; Assert(expr); active by default. 1592 | ; http://php.net/assert.active 1593 | ;assert.active = On 1594 | 1595 | ; Throw an AssertionError on failed assertions 1596 | ; http://php.net/assert.exception 1597 | ;assert.exception = On 1598 | 1599 | ; Issue a PHP warning for each failed assertion. (Overridden by assert.exception if active) 1600 | ; http://php.net/assert.warning 1601 | ;assert.warning = On 1602 | 1603 | ; Don't bail out by default. 1604 | ; http://php.net/assert.bail 1605 | ;assert.bail = Off 1606 | 1607 | ; User-function to be called if an assertion fails. 1608 | ; http://php.net/assert.callback 1609 | ;assert.callback = 0 1610 | 1611 | ; Eval the expression with current error_reporting(). Set to true if you want 1612 | ; error_reporting(0) around the eval(). 1613 | ; http://php.net/assert.quiet-eval 1614 | ;assert.quiet_eval = 0 1615 | 1616 | [COM] 1617 | ; path to a file containing GUIDs, IIDs or filenames of files with TypeLibs 1618 | ; http://php.net/com.typelib-file 1619 | ;com.typelib_file = 1620 | 1621 | ; allow Distributed-COM calls 1622 | ; http://php.net/com.allow-dcom 1623 | ;com.allow_dcom = true 1624 | 1625 | ; autoregister constants of a component's typlib on com_load() 1626 | ; http://php.net/com.autoregister-typelib 1627 | ;com.autoregister_typelib = true 1628 | 1629 | ; register constants casesensitive 1630 | ; http://php.net/com.autoregister-casesensitive 1631 | ;com.autoregister_casesensitive = false 1632 | 1633 | ; show warnings on duplicate constant registrations 1634 | ; http://php.net/com.autoregister-verbose 1635 | ;com.autoregister_verbose = true 1636 | 1637 | ; The default character set code-page to use when passing strings to and from COM objects. 1638 | ; Default: system ANSI code page 1639 | ;com.code_page= 1640 | 1641 | [mbstring] 1642 | ; language for internal character representation. 1643 | ; This affects mb_send_mail() and mbstring.detect_order. 1644 | ; http://php.net/mbstring.language 1645 | ;mbstring.language = Japanese 1646 | 1647 | ; Use of this INI entry is deprecated, use global internal_encoding instead. 1648 | ; internal/script encoding. 1649 | ; Some encoding cannot work as internal encoding. (e.g. SJIS, BIG5, ISO-2022-*) 1650 | ; If empty, default_charset or internal_encoding or iconv.internal_encoding is used. 1651 | ; The precedence is: default_charset < internal_encoding < iconv.internal_encoding 1652 | ;mbstring.internal_encoding = 1653 | 1654 | ; Use of this INI entry is deprecated, use global input_encoding instead. 1655 | ; http input encoding. 1656 | ; mbstring.encoding_translation = On is needed to use this setting. 1657 | ; If empty, default_charset or input_encoding or mbstring.input is used. 1658 | ; The precedence is: default_charset < input_encoding < mbsting.http_input 1659 | ; http://php.net/mbstring.http-input 1660 | ;mbstring.http_input = 1661 | 1662 | ; Use of this INI entry is deprecated, use global output_encoding instead. 1663 | ; http output encoding. 1664 | ; mb_output_handler must be registered as output buffer to function. 1665 | ; If empty, default_charset or output_encoding or mbstring.http_output is used. 1666 | ; The precedence is: default_charset < output_encoding < mbstring.http_output 1667 | ; To use an output encoding conversion, mbstring's output handler must be set 1668 | ; otherwise output encoding conversion cannot be performed. 1669 | ; http://php.net/mbstring.http-output 1670 | ;mbstring.http_output = 1671 | 1672 | ; enable automatic encoding translation according to 1673 | ; mbstring.internal_encoding setting. Input chars are 1674 | ; converted to internal encoding by setting this to On. 1675 | ; Note: Do _not_ use automatic encoding translation for 1676 | ; portable libs/applications. 1677 | ; http://php.net/mbstring.encoding-translation 1678 | ;mbstring.encoding_translation = Off 1679 | 1680 | ; automatic encoding detection order. 1681 | ; "auto" detect order is changed according to mbstring.language 1682 | ; http://php.net/mbstring.detect-order 1683 | ;mbstring.detect_order = auto 1684 | 1685 | ; substitute_character used when character cannot be converted 1686 | ; one from another 1687 | ; http://php.net/mbstring.substitute-character 1688 | ;mbstring.substitute_character = none 1689 | 1690 | ; overload(replace) single byte functions by mbstring functions. 1691 | ; mail(), ereg(), etc are overloaded by mb_send_mail(), mb_ereg(), 1692 | ; etc. Possible values are 0,1,2,4 or combination of them. 1693 | ; For example, 7 for overload everything. 1694 | ; 0: No overload 1695 | ; 1: Overload mail() function 1696 | ; 2: Overload str*() functions 1697 | ; 4: Overload ereg*() functions 1698 | ; http://php.net/mbstring.func-overload 1699 | ;mbstring.func_overload = 0 1700 | 1701 | ; enable strict encoding detection. 1702 | ; Default: Off 1703 | ;mbstring.strict_detection = On 1704 | 1705 | ; This directive specifies the regex pattern of content types for which mb_output_handler() 1706 | ; is activated. 1707 | ; Default: mbstring.http_output_conv_mimetype=^(text/|application/xhtml\+xml) 1708 | ;mbstring.http_output_conv_mimetype= 1709 | 1710 | ; This directive specifies maximum stack depth for mbstring regular expressions. It is similar 1711 | ; to the pcre.recursion_limit for PCRE. 1712 | ; Default: 100000 1713 | ;mbstring.regex_stack_limit=100000 1714 | 1715 | [gd] 1716 | ; Tell the jpeg decode to ignore warnings and try to create 1717 | ; a gd image. The warning will then be displayed as notices 1718 | ; disabled by default 1719 | ; http://php.net/gd.jpeg-ignore-warning 1720 | ;gd.jpeg_ignore_warning = 1 1721 | 1722 | [exif] 1723 | ; Exif UNICODE user comments are handled as UCS-2BE/UCS-2LE and JIS as JIS. 1724 | ; With mbstring support this will automatically be converted into the encoding 1725 | ; given by corresponding encode setting. When empty mbstring.internal_encoding 1726 | ; is used. For the decode settings you can distinguish between motorola and 1727 | ; intel byte order. A decode setting cannot be empty. 1728 | ; http://php.net/exif.encode-unicode 1729 | ;exif.encode_unicode = ISO-8859-15 1730 | 1731 | ; http://php.net/exif.decode-unicode-motorola 1732 | ;exif.decode_unicode_motorola = UCS-2BE 1733 | 1734 | ; http://php.net/exif.decode-unicode-intel 1735 | ;exif.decode_unicode_intel = UCS-2LE 1736 | 1737 | ; http://php.net/exif.encode-jis 1738 | ;exif.encode_jis = 1739 | 1740 | ; http://php.net/exif.decode-jis-motorola 1741 | ;exif.decode_jis_motorola = JIS 1742 | 1743 | ; http://php.net/exif.decode-jis-intel 1744 | ;exif.decode_jis_intel = JIS 1745 | 1746 | [Tidy] 1747 | ; The path to a default tidy configuration file to use when using tidy 1748 | ; http://php.net/tidy.default-config 1749 | ;tidy.default_config = /usr/local/lib/php/default.tcfg 1750 | 1751 | ; Should tidy clean and repair output automatically? 1752 | ; WARNING: Do not use this option if you are generating non-html content 1753 | ; such as dynamic images 1754 | ; http://php.net/tidy.clean-output 1755 | tidy.clean_output = Off 1756 | 1757 | [soap] 1758 | ; Enables or disables WSDL caching feature. 1759 | ; http://php.net/soap.wsdl-cache-enabled 1760 | soap.wsdl_cache_enabled=1 1761 | 1762 | ; Sets the directory name where SOAP extension will put cache files. 1763 | ; http://php.net/soap.wsdl-cache-dir 1764 | soap.wsdl_cache_dir="/tmp" 1765 | 1766 | ; (time to live) Sets the number of second while cached file will be used 1767 | ; instead of original one. 1768 | ; http://php.net/soap.wsdl-cache-ttl 1769 | soap.wsdl_cache_ttl=86400 1770 | 1771 | ; Sets the size of the cache limit. (Max. number of WSDL files to cache) 1772 | soap.wsdl_cache_limit = 5 1773 | 1774 | [sysvshm] 1775 | ; A default size of the shared memory segment 1776 | ;sysvshm.init_mem = 10000 1777 | 1778 | [ldap] 1779 | ; Sets the maximum number of open links or -1 for unlimited. 1780 | ldap.max_links = -1 1781 | 1782 | [dba] 1783 | ;dba.default_handler= 1784 | 1785 | [opcache] 1786 | ; Determines if Zend OPCache is enabled 1787 | ;opcache.enable=1 1788 | 1789 | ; Determines if Zend OPCache is enabled for the CLI version of PHP 1790 | ;opcache.enable_cli=0 1791 | 1792 | ; The OPcache shared memory storage size. 1793 | ;opcache.memory_consumption=128 1794 | 1795 | ; The amount of memory for interned strings in Mbytes. 1796 | ;opcache.interned_strings_buffer=8 1797 | 1798 | ; The maximum number of keys (scripts) in the OPcache hash table. 1799 | ; Only numbers between 200 and 1000000 are allowed. 1800 | ;opcache.max_accelerated_files=10000 1801 | 1802 | ; The maximum percentage of "wasted" memory until a restart is scheduled. 1803 | ;opcache.max_wasted_percentage=5 1804 | 1805 | ; When this directive is enabled, the OPcache appends the current working 1806 | ; directory to the script key, thus eliminating possible collisions between 1807 | ; files with the same name (basename). Disabling the directive improves 1808 | ; performance, but may break existing applications. 1809 | ;opcache.use_cwd=1 1810 | 1811 | ; When disabled, you must reset the OPcache manually or restart the 1812 | ; webserver for changes to the filesystem to take effect. 1813 | ;opcache.validate_timestamps=1 1814 | 1815 | ; How often (in seconds) to check file timestamps for changes to the shared 1816 | ; memory storage allocation. ("1" means validate once per second, but only 1817 | ; once per request. "0" means always validate) 1818 | ;opcache.revalidate_freq=2 1819 | 1820 | ; Enables or disables file search in include_path optimization 1821 | ;opcache.revalidate_path=0 1822 | 1823 | ; If disabled, all PHPDoc comments are dropped from the code to reduce the 1824 | ; size of the optimized code. 1825 | ;opcache.save_comments=1 1826 | 1827 | ; Allow file existence override (file_exists, etc.) performance feature. 1828 | ;opcache.enable_file_override=0 1829 | 1830 | ; A bitmask, where each bit enables or disables the appropriate OPcache 1831 | ; passes 1832 | ;opcache.optimization_level=0x7FFFBFFF 1833 | 1834 | ;opcache.dups_fix=0 1835 | 1836 | ; The location of the OPcache blacklist file (wildcards allowed). 1837 | ; Each OPcache blacklist file is a text file that holds the names of files 1838 | ; that should not be accelerated. The file format is to add each filename 1839 | ; to a new line. The filename may be a full path or just a file prefix 1840 | ; (i.e., /var/www/x blacklists all the files and directories in /var/www 1841 | ; that start with 'x'). Line starting with a ; are ignored (comments). 1842 | ;opcache.blacklist_filename= 1843 | 1844 | ; Allows exclusion of large files from being cached. By default all files 1845 | ; are cached. 1846 | ;opcache.max_file_size=0 1847 | 1848 | ; Check the cache checksum each N requests. 1849 | ; The default value of "0" means that the checks are disabled. 1850 | ;opcache.consistency_checks=0 1851 | 1852 | ; How long to wait (in seconds) for a scheduled restart to begin if the cache 1853 | ; is not being accessed. 1854 | ;opcache.force_restart_timeout=180 1855 | 1856 | ; OPcache error_log file name. Empty string assumes "stderr". 1857 | ;opcache.error_log= 1858 | 1859 | ; All OPcache errors go to the Web server log. 1860 | ; By default, only fatal errors (level 0) or errors (level 1) are logged. 1861 | ; You can also enable warnings (level 2), info messages (level 3) or 1862 | ; debug messages (level 4). 1863 | ;opcache.log_verbosity_level=1 1864 | 1865 | ; Preferred Shared Memory back-end. Leave empty and let the system decide. 1866 | ;opcache.preferred_memory_model= 1867 | 1868 | ; Protect the shared memory from unexpected writing during script execution. 1869 | ; Useful for internal debugging only. 1870 | ;opcache.protect_memory=0 1871 | 1872 | ; Allows calling OPcache API functions only from PHP scripts which path is 1873 | ; started from specified string. The default "" means no restriction 1874 | ;opcache.restrict_api= 1875 | 1876 | ; Mapping base of shared memory segments (for Windows only). All the PHP 1877 | ; processes have to map shared memory into the same address space. This 1878 | ; directive allows to manually fix the "Unable to reattach to base address" 1879 | ; errors. 1880 | ;opcache.mmap_base= 1881 | 1882 | ; Enables and sets the second level cache directory. 1883 | ; It should improve performance when SHM memory is full, at server restart or 1884 | ; SHM reset. The default "" disables file based caching. 1885 | ;opcache.file_cache= 1886 | 1887 | ; Enables or disables opcode caching in shared memory. 1888 | ;opcache.file_cache_only=0 1889 | 1890 | ; Enables or disables checksum validation when script loaded from file cache. 1891 | ;opcache.file_cache_consistency_checks=1 1892 | 1893 | ; Implies opcache.file_cache_only=1 for a certain process that failed to 1894 | ; reattach to the shared memory (for Windows only). Explicitly enabled file 1895 | ; cache is required. 1896 | ;opcache.file_cache_fallback=1 1897 | 1898 | ; Enables or disables copying of PHP code (text segment) into HUGE PAGES. 1899 | ; This should improve performance, but requires appropriate OS configuration. 1900 | ;opcache.huge_code_pages=0 1901 | 1902 | ; Validate cached file permissions. 1903 | ;opcache.validate_permission=0 1904 | 1905 | ; Prevent name collisions in chroot'ed environment. 1906 | ;opcache.validate_root=0 1907 | 1908 | ; If specified, it produces opcode dumps for debugging different stages of 1909 | ; optimizations. 1910 | ;opcache.opt_debug_level=0 1911 | 1912 | [curl] 1913 | ; A default value for the CURLOPT_CAINFO option. This is required to be an 1914 | ; absolute path. 1915 | ;curl.cainfo = 1916 | 1917 | [openssl] 1918 | ; The location of a Certificate Authority (CA) file on the local filesystem 1919 | ; to use when verifying the identity of SSL/TLS peers. Most users should 1920 | ; not specify a value for this directive as PHP will attempt to use the 1921 | ; OS-managed cert stores in its absence. If specified, this value may still 1922 | ; be overridden on a per-stream basis via the "cafile" SSL stream context 1923 | ; option. 1924 | ;openssl.cafile= 1925 | 1926 | ; If openssl.cafile is not specified or if the CA file is not found, the 1927 | ; directory pointed to by openssl.capath is searched for a suitable 1928 | ; certificate. This value must be a correctly hashed certificate directory. 1929 | ; Most users should not specify a value for this directive as PHP will 1930 | ; attempt to use the OS-managed cert stores in its absence. If specified, 1931 | ; this value may still be overridden on a per-stream basis via the "capath" 1932 | ; SSL stream context option. 1933 | ;openssl.capath= 1934 | 1935 | ; Local Variables: 1936 | ; tab-width: 4 1937 | ; End: -------------------------------------------------------------------------------- /src/API.php: -------------------------------------------------------------------------------- 1 | router = new Router(); 14 | } 15 | 16 | function handleRequest() { 17 | header('Content-Type: application/json'); 18 | header("Cache-Control: public, max-age=21600"); 19 | 20 | 21 | // Check request has initial requirements (good method/parameters). 22 | if (!Req::requestPreflight()) { 23 | return; 24 | } 25 | 26 | // Route request, check response 27 | $response = new JsonResponse($this->router->route()); 28 | if ($response->isHoldingNull()) { 29 | echo new Error(404, "Nothing was found for that request."); 30 | return; 31 | } 32 | 33 | // Send out data 34 | echo $response; 35 | } 36 | } -------------------------------------------------------------------------------- /src/controller/AuthorController.php: -------------------------------------------------------------------------------- 1 | database = $database; 12 | } 13 | 14 | public function getAuthor() { 15 | if (Req::checkIdParam()) { 16 | $author = $this->database->getUser($_GET['id']); 17 | if (!is_null($author) && $author !== false) { 18 | return new Author($author); 19 | } 20 | } 21 | 22 | return NULL; 23 | } 24 | 25 | public function findAuthor() { 26 | if (Req::checkNameParam()) { 27 | $author = $this->database->findUser($_GET['name']); 28 | if (!is_null($author) && $author !== false) { 29 | return new Author($author); 30 | } 31 | } 32 | 33 | return NULL; 34 | } 35 | } -------------------------------------------------------------------------------- /src/controller/ResourceCategoryController.php: -------------------------------------------------------------------------------- 1 | database = $database; 12 | } 13 | 14 | public function listResourceCategories() { 15 | $out = array(); 16 | 17 | $categories = $this->database->listResourceCategories(); 18 | 19 | if (is_null($categories)) { 20 | return NULL; 21 | } 22 | 23 | foreach ($categories as $category) { 24 | array_push($out, new ResourceCategory($category)); 25 | } 26 | 27 | return $out; 28 | } 29 | } -------------------------------------------------------------------------------- /src/controller/ResourceController.php: -------------------------------------------------------------------------------- 1 | database = $database; 12 | } 13 | 14 | public function listResources() { 15 | $out = array(); 16 | 17 | $resources = $this->database->listResources(Req::category(), Req::page()); 18 | 19 | if (is_null($resources)) { 20 | return NULL; 21 | } 22 | 23 | foreach ($resources as $resource) { 24 | array_push($out, new Resource($resource)); 25 | } 26 | 27 | return $out; 28 | } 29 | 30 | public function getResource() { 31 | if (Req::checkIdParam()) { 32 | $resource = $this->database->getResource(Req::id()); 33 | 34 | if (!is_null($resource) && $resource !== false) { 35 | return new Resource($resource); 36 | } 37 | } 38 | 39 | return NULL; 40 | } 41 | 42 | public function getResourcesByAuthor() { 43 | $out = array(); 44 | 45 | if (Req::checkIdParam()) { 46 | $resources = $this->database->getResourcesByUser(Req::id(), Req::page()); 47 | 48 | if (is_null($resources)) { 49 | return NULL; 50 | } 51 | 52 | foreach ($resources as $resource) { 53 | array_push($out, new Resource($resource)); 54 | } 55 | } 56 | 57 | return $out; 58 | } 59 | } -------------------------------------------------------------------------------- /src/controller/ResourceUpdateController.php: -------------------------------------------------------------------------------- 1 | database = $database; 12 | } 13 | 14 | public function getResourceUpdate() { 15 | if (Req::checkIdParam()) { 16 | $update = $this->database->getResourceUpdate($_GET['id']); 17 | if (!is_null($update) && $update !== false) { 18 | return new ResourceUpdate($update); 19 | } 20 | } 21 | 22 | return NULL; 23 | } 24 | 25 | public function getResourceUpdates() { 26 | $out = array(); 27 | 28 | if (Req::checkIdParam()) { 29 | $updates = $this->database->getResourceUpdates($_GET['id'], Req::page()); 30 | if (is_null($updates)) return NULL; 31 | 32 | foreach ($updates as $update) { 33 | array_push($out, new ResourceUpdate($update)); 34 | } 35 | } 36 | 37 | return $out; 38 | } 39 | } -------------------------------------------------------------------------------- /src/controller/index.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/imports.php: -------------------------------------------------------------------------------- 1 | handleRequest(); -------------------------------------------------------------------------------- /src/object/Author.php: -------------------------------------------------------------------------------- 1 | user; 15 | $identities = $payload->ident; 16 | 17 | $this->id = $author['user_id']; 18 | $this->username = $author['username']; 19 | $this->resource_count = $author['resource_count']; 20 | $this->avatar = Icons::getUserIcon($this->id, $author['avatar_date'], $author['gravatar']); 21 | 22 | $this->identities = array(); 23 | if ($author['allow_view_identities'] == 'everyone') { 24 | for ($idx = 0; $idx < count($identities); $idx ++) { 25 | $this->identities[$identities[$idx][0]] = $identities[$idx][1]; 26 | } 27 | } 28 | 29 | if (empty($this->identities)) { 30 | $this->identities = new \stdClass(); 31 | } 32 | } 33 | } -------------------------------------------------------------------------------- /src/object/Error.php: -------------------------------------------------------------------------------- 1 | $code, 12 | "message" => $message 13 | )); 14 | 15 | $this->code = $code; 16 | } 17 | 18 | public function __toString() { 19 | http_response_code($this->code); 20 | return parent::__toString(); 21 | } 22 | } -------------------------------------------------------------------------------- /src/object/JsonResponse.php: -------------------------------------------------------------------------------- 1 | data = $data; 9 | } 10 | 11 | public function __toString() { 12 | try { 13 | return json_encode($this->data) . "\n"; 14 | } catch (\Exception $ignored) { 15 | return ''; 16 | } 17 | } 18 | 19 | public function isHoldingNull() { 20 | return is_null($this->data); 21 | } 22 | } -------------------------------------------------------------------------------- /src/object/Resource.php: -------------------------------------------------------------------------------- 1 | id = $resource['resource_id']; 23 | $this->title = $resource['title']; 24 | $this->tag = $resource['tag_line']; 25 | $this->current_version = $resource['version_string']; 26 | 27 | $category = new \stdClass(); 28 | $category->id = $resource['resource_category_id']; 29 | $category->title = $resource['category_title']; 30 | $this->category = $category; 31 | 32 | for ($idx = 0; $idx < count($resource['fields']); $idx++) { 33 | $field = $resource['fields'][$idx]; 34 | 35 | switch ($field['field_id']) { 36 | case 'native_mc_version': 37 | $this->native_minecraft_version = self::cleanupVersion($field['actual_field_value']); 38 | break; 39 | case 'mc_versions': 40 | $versions = array_map( 41 | function($version) { 42 | return self::cleanupVersion($version); 43 | }, 44 | unserialize($field['actual_field_value']) 45 | ); 46 | $this->supported_minecraft_versions = array_values($versions); 47 | break; 48 | } 49 | } 50 | 51 | $this->icon_link = Icons::getResourceIcon($this->id, $resource['icon_date']); 52 | 53 | $this->author = array( 54 | 'id' => $resource['user_id'], 55 | 'username' => $resource['username'] 56 | ); 57 | 58 | $this->premium = array( 59 | 'price' => $resource['price'], 60 | 'currency' => $resource['currency'] 61 | ); 62 | 63 | $this->stats = array( 64 | 'downloads' => $resource['download_count'], 65 | 'updates' => $resource['update_count'], 66 | 'reviews' => array( 67 | 'unique' => $resource['rating_count'], 68 | 'total' => $resource['review_count'] 69 | ), 70 | 'rating' => strval(round($resource['rating_avg'], 1)) 71 | ); 72 | 73 | $this->external_download_url = $resource['download_url']; 74 | 75 | $this->description = $resource['message']; 76 | } 77 | 78 | private static function cleanupVersion($value) { 79 | if (strtolower($value) != 'legacy') { 80 | $value = str_replace('_', '.', $value); 81 | } 82 | 83 | return $value; 84 | } 85 | } 86 | -------------------------------------------------------------------------------- /src/object/ResourceCategory.php: -------------------------------------------------------------------------------- 1 | id = $update['resource_category_id']; 11 | $this->title = $update['category_title']; 12 | $this->description = $update['category_description']; 13 | } 14 | } -------------------------------------------------------------------------------- /src/object/ResourceUpdate.php: -------------------------------------------------------------------------------- 1 | id = $update['resource_update_id']; 13 | $this->resource_id = $update['resource_id']; 14 | $this->resource_version = $update['version_string']; 15 | $this->title = $update['title']; 16 | $this->message = $update['message']; 17 | } 18 | } -------------------------------------------------------------------------------- /src/object/index.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/openapi.yaml: -------------------------------------------------------------------------------- 1 | openapi: '3.0.0' 2 | info: 3 | version: '0.2' 4 | title: 'SpigotMC Xenforo Resource Manager API' 5 | description: Exposes resource/author information via a simple JSON REST API 6 | servers: 7 | - url: https://api.spigotmc.org/simple/0.2 8 | paths: 9 | /index.php?action=listResources: 10 | parameters: 11 | - name: category 12 | description: The category ID from which to draw resources 13 | in: query 14 | required: false 15 | schema: 16 | type: integer 17 | - name: page 18 | description: The page of results to get 19 | in: query 20 | required: false 21 | schema: 22 | type: integer 23 | get: 24 | summary: Obtain a list of all resources 25 | responses: 26 | '200': 27 | description: An object with pagination info and a resources array containing the collected resource information 28 | content: 29 | application/json: 30 | schema: 31 | $ref: '#/components/schemas/PageableResources' 32 | /index.php?action=getResource: 33 | parameters: 34 | - name: id 35 | description: The resource ID 36 | in: query 37 | required: true 38 | schema: 39 | type: integer 40 | get: 41 | summary: Obtain a resource 42 | responses: 43 | '200': 44 | description: An object containing information about the located resource 45 | content: 46 | application/json: 47 | schema: 48 | $ref: '#/components/schemas/Resource' 49 | /index.php?action=getResourcesByAuthor: 50 | parameters: 51 | - name: id 52 | description: The author/user id 53 | in: query 54 | required: true 55 | schema: 56 | type: integer 57 | - name: page 58 | description: The page of results to get 59 | in: query 60 | schema: 61 | type: integer 62 | get: 63 | summary: Obtain a list of all resources by a specific author/user 64 | responses: 65 | '200': 66 | description: An object with pagination info and a resources array containing the collected resource information 67 | content: 68 | application/json: 69 | schema: 70 | $ref: '#/components/schemas/PageableResources' 71 | /index.php?action=listResourceCategories: 72 | get: 73 | summary: Obtain a list of all resource categories 74 | responses: 75 | '200': 76 | description: An array containing objects describing each resource category 77 | content: 78 | application/json: 79 | schema: 80 | $ref: '#/components/schemas/ArrayOfResourceCategories' 81 | /index.php?action=getResourceUpdate: 82 | parameters: 83 | - name: id 84 | description: The resource update ID 85 | in: query 86 | required: true 87 | schema: 88 | type: integer 89 | get: 90 | summary: Obtain a specific update to a resource 91 | responses: 92 | '200': 93 | description: An object containing information about an update to a resource 94 | content: 95 | application/json: 96 | schema: 97 | $ref: '#/components/schemas/ResourceUpdate' 98 | /index.php?action=getResourceUpdates: 99 | parameters: 100 | - name: id 101 | description: The resource ID 102 | in: query 103 | required: true 104 | schema: 105 | type: integer 106 | - name: page 107 | description: The page of results to get 108 | in: query 109 | required: false 110 | schema: 111 | type: integer 112 | - name: sort 113 | description: The method to sort by (default 'asc') 114 | in: query 115 | required: false 116 | schema: 117 | type: string 118 | get: 119 | summary: Obtain all the updates to a resource 120 | responses: 121 | '200': 122 | description: An object with pagination info and an updates array containing the collected update information 123 | content: 124 | application/json: 125 | schema: 126 | $ref: '#/components/schemas/PageableResourceUpdates' 127 | /index.php?action=getAuthor: 128 | parameters: 129 | - name: id 130 | description: The author ID 131 | in: query 132 | required: true 133 | schema: 134 | type: integer 135 | get: 136 | summary: Obtain an author/user by their id 137 | responses: 138 | '200': 139 | description: An object containing information about an author/user 140 | content: 141 | application/json: 142 | schema: 143 | $ref: '#/components/schemas/Author' 144 | /index.php?action=findAuthor: 145 | parameters: 146 | - name: id 147 | description: The author username 148 | in: query 149 | required: true 150 | schema: 151 | type: string 152 | get: 153 | summary: Obtain an author/user by their id 154 | responses: 155 | '200': 156 | description: An object containing information about an author/user 157 | content: 158 | application/json: 159 | schema: 160 | $ref: '#/components/schemas/Author' 161 | components: 162 | schemas: 163 | PaginationInfo: 164 | type: object 165 | properties: 166 | current_page: 167 | type: integer 168 | total_pages: 169 | type: integer 170 | items_per_page: 171 | type: integer 172 | results: 173 | type: integer 174 | total_results: 175 | type: integer 176 | Resource: 177 | type: object 178 | properties: 179 | id: 180 | type: string 181 | title: 182 | type: string 183 | tag: 184 | type: string 185 | current_version: 186 | type: string 187 | native_minecraft_version: 188 | type: string 189 | nullable: true 190 | supported_minecraft_versions: 191 | type: array 192 | items: 193 | type: string 194 | icon_link: 195 | type: string 196 | author: 197 | type: object 198 | properties: 199 | id: 200 | type: string 201 | username: 202 | type: string 203 | premium: 204 | type: object 205 | properties: 206 | price: 207 | type: string 208 | currency: 209 | type: string 210 | stats: 211 | type: object 212 | properties: 213 | downloads: 214 | type: string 215 | updates: 216 | type: string 217 | reviews: 218 | type: object 219 | properties: 220 | unique: 221 | type: string 222 | total: 223 | type: string 224 | rating: 225 | type: string 226 | description: 227 | type: string 228 | ArrayOfResources: 229 | type: array 230 | items: 231 | $ref: '#/components/schemas/Resource' 232 | PageableResources: 233 | type: object 234 | properties: 235 | pagination: 236 | $ref: '#/components/schemas/PaginationInfo' 237 | resources: 238 | $ref: '#/components/schemas/ArrayOfResources' 239 | ResourceUpdate: 240 | type: object 241 | properties: 242 | id: 243 | type: string 244 | resource_id: 245 | type: string 246 | resource_version: 247 | type: string 248 | title: 249 | type: string 250 | message: 251 | type: string 252 | ArrayOfResourceUpdates: 253 | type: array 254 | items: 255 | $ref: '#/components/schemas/ResourceUpdate' 256 | PageableResourceUpdates: 257 | type: object 258 | properties: 259 | pagination: 260 | $ref: '#/components/schemas/PaginationInfo' 261 | resources: 262 | $ref: '#/components/schemas/ArrayOfResourceUpdates' 263 | ResourceCategory: 264 | type: object 265 | properties: 266 | id: 267 | type: string 268 | title: 269 | type: string 270 | description: 271 | type: string 272 | ArrayOfResourceCategories: 273 | type: array 274 | items: 275 | $ref: '#/components/schemas/ResourceCategory' 276 | Author: 277 | type: object 278 | properties: 279 | id: 280 | type: string 281 | username: 282 | type: string 283 | resource_count: 284 | type: string 285 | identities: 286 | type: array 287 | items: 288 | type: string 289 | avatar: 290 | type: string -------------------------------------------------------------------------------- /src/support/Config.php: -------------------------------------------------------------------------------- 1 | 'root', 8 | 'MYSQL_PASSWORD' => 'root', 9 | 'MYSQL_HOSTNAME' => 'localhost', 10 | 'MYSQL_PORT' => 3306, 11 | 'MYSQL_DATABASE' => 'database', 12 | 13 | // set PUBLIC_PATH to the root the XenForo installation, including trailing slash 14 | 'PUBLIC_PATH' => 'https://www.spigotmc.org/', 15 | 16 | // set PUBLIC_PATH_STATIC to the static asset site, including trailing slash 17 | 'PUBLIC_PATH_STATIC' => "https://static.spigotmc.org/" 18 | ); 19 | } 20 | -------------------------------------------------------------------------------- /src/support/Database.php: -------------------------------------------------------------------------------- 1 | conn = new \PDO( 12 | sprintf( 13 | "mysql:host=%s;port=%s;dbname=%s", 14 | $hostname, 15 | $port, 16 | $database 17 | ), 18 | $username, 19 | $password, 20 | array( 21 | \PDO::ATTR_PERSISTENT => true 22 | ) 23 | ); 24 | 25 | $this->conn->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_WARNING); 26 | } catch (\Exception $ignored) { 27 | $this->conn = NULL; 28 | } 29 | } 30 | 31 | public static function initializeViaConfig() { 32 | return new Database( 33 | Config::$data['MYSQL_USERNAME'], 34 | Config::$data['MYSQL_PASSWORD'], 35 | Config::$data['MYSQL_HOSTNAME'], 36 | Config::$data['MYSQL_PORT'], 37 | Config::$data['MYSQL_DATABASE'] 38 | ); 39 | } 40 | 41 | public function listResources($category, $page) { 42 | $page = $page == 1 ? 0 : 10 * ($page - 1); 43 | 44 | if (!is_null($this->conn)) { 45 | $categoryClause = is_null($category) ? '' : 'AND r.resource_category_id = :resource_category_id'; 46 | 47 | $resStmt = $this->conn->prepare($this->_resource(sprintf('%s LIMIT 10 OFFSET :offset', $categoryClause))); 48 | $resStmt->bindParam(':offset', $page, \PDO::PARAM_INT); 49 | 50 | if (!empty($categoryClause)) { 51 | $resStmt->bindParam(':resource_category_id', $category); 52 | } 53 | 54 | if ($resStmt->execute()) { 55 | $resources = $resStmt->fetchAll(); 56 | 57 | for ($i = 0; $i < count($resources); $i++) { 58 | $resource = $resources[$i]; 59 | $resource['fields'] = $this->_resource_fields($resource['resource_id']); 60 | $resources[$i] = $resource; 61 | } 62 | 63 | return $resources; 64 | } 65 | } 66 | 67 | return NULL; 68 | } 69 | 70 | public function getResource($resource_id) { 71 | if (!is_null($this->conn)) { 72 | $resStmt = $this->conn->prepare($this->_resource('AND r.resource_id = :resource_id LIMIT 1')); 73 | $resStmt->bindParam(':resource_id', $resource_id); 74 | 75 | if ($resStmt->execute()) { 76 | $resource = $resStmt->fetch(); 77 | if (!is_null($resource) && $resource !== false) { 78 | $resource['fields'] = $this->_resource_fields($resource['resource_id']); 79 | return $resource; 80 | } 81 | } 82 | } 83 | 84 | return NULL; 85 | } 86 | 87 | public function getResourcesByUser($user_id, $page) { 88 | $page = $page == 1 ? 0 : 10 * ($page - 1); 89 | 90 | if (!is_null($this->conn)) { 91 | $resStmt = $this->conn->prepare($this->_resource('AND r.user_id = :user_id LIMIT 10 OFFSET :offset')); 92 | $resStmt->bindParam(':user_id', $user_id); 93 | $resStmt->bindParam(':offset', $page, \PDO::PARAM_INT); 94 | 95 | if ($resStmt->execute()) { 96 | $resources = $resStmt->fetchAll(); 97 | 98 | for ($i = 0; $i < count($resources); $i++) { 99 | $resource = $resources[$i]; 100 | $resource['fields'] = $this->_resource_fields($resource['resource_id']); 101 | $resources[$i] = $resource; 102 | } 103 | 104 | return $resources; 105 | } 106 | } 107 | 108 | return NULL; 109 | } 110 | 111 | public function listResourceCategories() { 112 | if (!is_null($this->conn)) { 113 | $catStmt = $this->conn->prepare("SELECT resource_category_id, category_title, category_description FROM xf_resource_category"); 114 | 115 | if ($catStmt->execute()) { 116 | return $catStmt->fetchAll(); 117 | } 118 | } 119 | 120 | return NULL; 121 | } 122 | 123 | public function getResourceUpdate($update_id) { 124 | if (!is_null($this->conn)) { 125 | $updateStmt = $this->conn->prepare($this->_resource_update('AND r.resource_update_id = :resource_update_id LIMIT 1')); 126 | $updateStmt->bindParam(':resource_update_id', $update_id); 127 | 128 | if ($updateStmt->execute()) { 129 | return $updateStmt->fetch(); 130 | } 131 | } 132 | 133 | return NULL; 134 | } 135 | 136 | public function getResourceUpdates($resource_id, $page) { 137 | $page = $page == 1 ? 0 : 10 * ($page - 1); 138 | 139 | if (!is_null($this->conn)) { 140 | $updatesStmt = $this->conn->prepare($this->_resource_update('AND r.resource_id = :resource_id LIMIT 10 OFFSET :offset')); 141 | $updatesStmt->bindParam(':resource_id', $resource_id); 142 | $updatesStmt->bindParam(':offset', $page, \PDO::PARAM_INT); 143 | 144 | if ($updatesStmt->execute()) { 145 | return $updatesStmt->fetchAll(); 146 | } 147 | } 148 | 149 | return NULL; 150 | } 151 | 152 | public function getUser($user_id) { 153 | if (!is_null($this->conn)) { 154 | $userStmt = $this->conn->prepare( 155 | "SELECT u.user_id, u.username, u.resource_count, u.avatar_date, u.gravatar, up.allow_view_identities 156 | FROM xf_user u 157 | INNER JOIN xf_user_privacy up 158 | ON up.user_id = u.user_id 159 | WHERE u.user_id = :user_id 160 | GROUP BY u.user_id" 161 | ); 162 | 163 | $userStmt->bindParam(':user_id', $user_id); 164 | 165 | $identStmt = $this->conn->prepare( 166 | "SELECT ufv.field_id, ufv.field_value 167 | FROM xf_user_field_value ufv 168 | INNER JOIN xf_user u 169 | ON u.user_id = ufv.user_id 170 | INNER JOIN xf_user_field uf 171 | ON uf.field_id = ufv.field_id AND uf.display_group = 'contact' 172 | WHERE ufv.user_id = :user_id AND ufv.field_value IS NOT NULL AND ufv.field_value != ''" 173 | ); 174 | 175 | $identStmt->bindParam(':user_id', $user_id); 176 | 177 | if ($userStmt->execute() && $identStmt->execute()) { 178 | $fetched = $userStmt->fetch(); 179 | if (!is_null($fetched) && $fetched !== false) { 180 | $out = new \stdClass(); 181 | $out->user = $fetched; 182 | $out->ident = $identStmt->fetchAll(); 183 | return $out; 184 | } 185 | } 186 | } 187 | 188 | return NULL; 189 | } 190 | 191 | public function findUser($username) { 192 | if (!is_null($this->conn)) { 193 | $userIdStmt = $this->conn->prepare("SELECT user_id FROM xf_user WHERE username = :username LIMIT 1"); 194 | $userIdStmt->bindParam(':username', $username); 195 | 196 | if ($userIdStmt->execute()) { 197 | $fetched = $userIdStmt->fetch(); 198 | if (!is_null($fetched) && $fetched !== false) { 199 | return $this->getUser($fetched['user_id']); 200 | } 201 | } 202 | } 203 | 204 | return NULL; 205 | } 206 | 207 | private function _resource($suffix) { 208 | return sprintf( 209 | "SELECT r.resource_id, r.title, r.tag_line, r.user_id, r.username, r.price, r.currency, r.download_count, r.update_count, r.rating_count, r.review_count, r.rating_avg, r.icon_date, rv.version_string, rv.download_url, ru.message, rc.resource_category_id, rc.category_title 210 | FROM xf_resource r 211 | INNER JOIN xf_resource_version rv 212 | ON r.current_version_id = rv.resource_version_id 213 | INNER JOIN xf_resource_update ru 214 | ON r.description_update_id = ru.resource_update_id 215 | INNER JOIN xf_resource_category rc 216 | ON r.resource_category_id = rc.resource_category_id 217 | WHERE r.resource_state = 'visible' %s", 218 | $suffix 219 | ); 220 | } 221 | 222 | private function _resource_fields($resource_id) { 223 | if (!is_null($this->conn)) { 224 | $fieldsStmt = $this->conn->prepare( 225 | "SELECT rfv.field_id, rfv.field_value as actual_field_value, rf.field_choices as possible_field_values 226 | FROM xf_resource_field_value rfv 227 | INNER JOIN xf_resource_field rf 228 | ON rf.field_id = rfv.field_id 229 | WHERE rfv.resource_id = :resource_id" 230 | ); 231 | 232 | $fieldsStmt->bindParam(':resource_id', $resource_id); 233 | 234 | if ($fieldsStmt->execute()) { 235 | $fields = $fieldsStmt->fetchAll(); 236 | if (!is_null($fields) && $fields !== false) { 237 | return $fields; 238 | } 239 | } 240 | } 241 | 242 | return NULL; 243 | } 244 | 245 | private function _resource_update($suffix) { 246 | return sprintf( 247 | "SELECT r.resource_update_id, r.resource_id, rv.version_string, r.title, r.message 248 | FROM xf_resource_update r 249 | INNER JOIN xf_resource_version rv ON r.resource_update_id = rv.resource_update_id 250 | WHERE r.message_state = 'visible' %s", 251 | $suffix 252 | ); 253 | } 254 | } -------------------------------------------------------------------------------- /src/support/Router.php: -------------------------------------------------------------------------------- 1 | actions = array( 20 | "listResources", 21 | "getResource", 22 | "getResourcesByAuthor", 23 | "listResourceCategories", 24 | "getResourceUpdate", 25 | "getResourceUpdates", 26 | "getAuthor", 27 | "findAuthor" 28 | ); 29 | 30 | $database = Database::initializeViaConfig(); 31 | 32 | $this->resourceController = new ResourceController($database); 33 | $this->resourceCategoryController = new ResourceCategoryController($database); 34 | $this->resourceUpdateController = new ResourceUpdateController($database); 35 | $this->authorController = new AuthorController($database); 36 | } 37 | 38 | public function route() { 39 | $action = $_GET['action']; 40 | 41 | if (!in_array($action, $this->actions)) { 42 | $validActions = trim(implode(", ", $this->actions)); 43 | echo new Error(400, "Invalid action. Valid actions: $validActions"); 44 | exit(); 45 | } 46 | 47 | return $this->$action(); 48 | } 49 | 50 | private function listResources() { 51 | return $this->resourceController->listResources(); 52 | } 53 | 54 | private function getResource() { 55 | return $this->resourceController->getResource(); 56 | } 57 | 58 | private function getResourcesByAuthor() { 59 | return $this->resourceController->getResourcesByAuthor(); 60 | } 61 | 62 | private function listResourceCategories() { 63 | return $this->resourceCategoryController->listResourceCategories(); 64 | } 65 | 66 | private function getResourceUpdate() { 67 | return $this->resourceUpdateController->getResourceUpdate(); 68 | } 69 | 70 | private function getResourceUpdates() { 71 | return $this->resourceUpdateController->getResourceUpdates(); 72 | } 73 | 74 | private function getAuthor() { 75 | return $this->authorController->getAuthor(); 76 | } 77 | 78 | private function findAuthor() { 79 | return $this->authorController->findAuthor(); 80 | } 81 | } -------------------------------------------------------------------------------- /src/support/index.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/util/IconUtil.php: -------------------------------------------------------------------------------- 1 | 0) { 71 | return $value; 72 | } 73 | 74 | return 1; 75 | } 76 | 77 | public static function category() { 78 | $value = $_GET['category'] ?? null; 79 | 80 | if (!is_null($value) && is_numeric($value)) { 81 | return $value; 82 | } 83 | 84 | return NULL; 85 | } 86 | } 87 | -------------------------------------------------------------------------------- /src/util/index.html: -------------------------------------------------------------------------------- 1 | --------------------------------------------------------------------------------