ÿØÿà JFIF    ÿÛ „  ( %!1"%)+...383-7(-.+  -%%--------+------------/----------------------------ÿÀ  ¶" ÿÄ     ÿÄ @    !1AQaq‘¡"±ÁÑð2’BRráS‚ñ3b¢CT²Ò #cÿÄ    ÿÄ '   1!AQ2a"‘±#ÿÚ   ? ò(/p‘—–¢·,M|¯G»R£üešT. ôŸEoCFñ‡ 4ÔkåóxR|µÁ¨ÓDà!Ç´µ˜‡p ÍQ‹§!þž^õWsŒy  åÁ§$á«%ºq˜™JyyË0y«^Ϗ -3ÃÏËÈ£Æ\P’ä„s&•‹Üs üô'àWt¹pñCp$bÚF`·7.^)¾!)ÒÙ˜–ÅÏš^h¾ø³·ìe±ŒaeÖ—Í,e=B}Jéߦ$$½—šÙÜCC¯¶è8β–Åkèwx LÉngT±æ¹£Ócœ¿Í/©Éÿ ‰ÚCÒ­mq;Tt¶–}0"zÖPcd1š­¤tˆ„ÐÓâqú[™öUCŠ2޿د­É(¸ßúçšmW,Ò ºf‹Ån™ÄLêÁ8üÁkÁ€L¥ÍuJ1œôrÂSŒÓöt!7EUíïb)AËi¬â-ÙHk8òÁiXYwÅ)O^"ÇØriÛô{»wRUKÙÏÚlÓ¬€‚’שT ] ªb—ÊîKC^×M“xùäñz¬zJ× {4[¹M'IÆeH1LCWÕ]œûº WDæà°OÅ‚¹c²ÞuA–rL`HšpCez‡V’— Ž‚Ë„–ñ­'µR0ÕÖ=À:±G»C\nÆÉ5*¢ †3šhQ4ýÒi$Õ1"Ü]¢p-q3zcQ$ªö¨¥æf›‘»´ÝÚHá„e²JÇ–iÊ:·à¬Øc5Åk»Laª*wi [0Ówk ¦a¦0Õ²ÅÅ‚T¸’³q:Æ<¹ú Ò˜Æ}2VE•Ѐp¡Ô3Úº …h³^LJºçì¥Ánó|˜ÖˆÎˆ+« ¦dø‘Mº–d\ªDðÛ„Ì×LÝ——Ð9Ç|•FèçVm™¨€™3õS–9Äå¢<̉Ìm¢±`·º˜&Z²ž Ë®D«¶»6™‰©­HÈ Àá«h­i³04æ’hxœi3ï¨(ÓL·†‹¶ËpŒ ƒÜÒ? :õdsÀ –3æÓ·Üjâ¬9—]8n¼&]I F£¼…ì–—Œ0v°LǐÅfÛ2TÖ’aµ˜N@ÖBSÏ^à´4-±°b×nÈÈœÆD=KdŒø…ÄÈK,›ÖR§fjü$^ÔÎ!„6^ s:Üun\ôkCÞò÷<—Lúl Í›G¹ÀPá¼Nc¡šÒ…ÙWͳœ±vÊáЄ×9‹P‰cEØ‘™›µŸP<×g1 º©Ø¬wiÁ^l5× I/';Ë+´Z‡ÓÄFÕp[Èð’ HÄ ó 9¬Dl4“é±Ï”V=^Hð;žLädÉa‚°Ë,#/Ž~²BÔÛ QãñQtIeórVB,ÏÂf‹4#Μc‹É3ZIÖ Œ¢¥·üxa‡Ãçè„jŠ[5 Ä!U?,3žÎ×…ðdÓ÷háŠA‰ìÄ4÷ÃÜZÃE{‰®+W\ZÍE[‰»µk»MÝ­`¢©†˜ÃV‹-f¢¡†¢a«eŠ%«Y¨©q%jâd,Ôq`) ¤¦…šˆ ¦E>0Ùb²t–Ÿ  ÷jsςҒKÈcø(é›;k(’#ôŒQ ™C> õ³M9óºÆµ¤çâ;uÀ)5>RÔ¸fÓ~Ȧ—’-$fe«"FâUˆÊwµPÏu w+"åÉó¨6s™Û9(À¨ù©hE°½†n`m~“@©›p!Vkhµ Á1šbEqqÊ@ºèl›2 –Yã%‘‚hÛ{a¶‡ÅÞM²¬çL34®Çl]®‹ŽØŒm'RÜe35æöˆ­Á­ cP9šeÁköo´L³Ì=p8]”‡B¶,šº|ɏdzXˆØk*ÇÚ{#ñ‰pã(€¶‡9ý'šÜ³½¯kƒ†Â’ëSOƒ•Å®H6+a¢µˆ‹Y¨b˜b+XˆÖ!°u!¢"µˆˆn2ˆ Å0Ä`Å Ô®c(ÓÜGº•Ä»Œ âWî%q.áÐÄ÷î%umÍ£+ÜQ,Vn¦-GphU¸¢X­&,Gt ·K¢ÅÅ·¥RÄÊÉbKn N­R2g$VµÕó Qr#–ÓZUÏð0ÎtÙÀœz ëöo“Îk¯n„T°"SÞ+³/…€½"ižãO%Í%&Δâ‘ËØ´IˆÓ°Ë‰ÞM3.™yçÁzit›`4C`k¢¼á!álÄï sÂ[×!¤l¾æo"ƒIÔ'@ªu)3›ô®“@Z à¾] üœ'‡4¸PÞkÁ-qÄH‰ÓÍBd´ÿ —¹°ÄA&ÊUC„öz‚‚RæŠtf¬>˜ÑidšEçÑL÷áý¡V±h§­c¿¥¨ƒ@g¼…Ýö^ÞËc.ž„æ“I[ ª+·zÐÒÚ,½Ð»¶€C›7jk$๖€Ž¾ÅÙpp¶ÍþéΤ ½ØÎŒq ñpæžÅ¥#Øâ49ÃÂK^MYV“,¶Éz_òæ:…;Õ«¦I3âJ£¤û5$7Èxün\â]Êe¯(Ÿ&Ž‹¶2<6Ćf× æ¢ƱqWı[(ÙÂŽç‚T7¨@ÈÉÍß‚ïÙ"&3TYlGށ†)†#5ŠA©^T2ÆÁ†)©†©†¤yGXÁ†©"†)©¼ÅV WS†#©]R–r‹q5ÕbâWþBh¯u+ªÅÄ×ü„nÑ^êkªÁj‰jeœWˆÕÕ`µDµ2Ì+Ä µDµµ5Ô{¤Þ0RF’H÷AÛ<ÊÁ§ ƈæ0Ñ£ê4 öÚµ[¬/1²€â<-¬šö²r×0o×w ´xÐÒË„ g01¬„åEM蛇Ã\6µE›‘fÙO k÷CºnÓ1`iîÒ² áÂ!ÑLÄÿ ³¬\õ*:M=Ç»c‹2[‰ØsÕLò\ŒK L^™üÄN\¶#» Ç\……ßïIœÉ$¸ÎñÍ®ÔHÇ Ûí/´>Li”„†g^$ 7NÍÑÑ2M2ªNg=k½Ð}Ÿl6‡ —JWˆ”ÞéT·+µ¦üÂFè¢Vs6ýÆ4»2+2IÝ9ô9®ÇGÙÇ1+Ä8;*Õ§ž½D*îÑWÚçá3Ma¤·ˆ¥t}š²Ü…Q+Æüµ8HíS”üxGéÁˆ¦Ël„éÈ 5 µÄƒ6äÜ(kIš¯S†fÖ&¸®×v|Äyˆ*禌Éù@7-®Ä[]ÎÖ¿ê`º…=:…žJVnݳvðÖKE¼‚ »mà ÷f®:Ë ™–4rð¡4` ܹçž~‹C=œ…¾Ïj|VDtK.ƒ"9 Ï ­–éXá³6WÒïIL-Ї Ç PK*\ͥ>`` FUNDING.ymlnu[# Primary donations pages. custom: ["https://moodle.com/donations/", "https://fund.moodle.org"] PK*\݌'. SECURITY.mdnu[> [!IMPORTANT] > PLEASE DO NOT PUBLISH SECURITY FINDINGS PUBLICLY. If you discover a potential security issue, please report it via our [Security Submission Form](https://moodle.org/security/report). For more information about our security processes and responsible disclosure policy, see the [Security Procedures documentation](https://moodledev.io/general/development/process/security). PK*\a  PULL_REQUEST_TEMPLATE.txtnu[*** PLEASE DO NOT OPEN PULL REQUESTS VIA GITHUB *** The moodle.git repository at Github is just a mirror of the official repository. We do not accept pull requests at Github. See CONTRIBUTING.md guidelines for how to contribute patches for Moodle. Thank you. -- PK*\>66 workflows/web-installer-test.ymlnu[name: Web Installer Testing on: workflow_dispatch: jobs: InstallationTest: runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: os: [ubuntu-latest] php: [8.2, 8.4] steps: - name: Construct repository URL run: echo "REPOSITORY_URL=${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}" >> $GITHUB_ENV shell: bash - uses: moodlehq/moodle-webinstaller-test@main with: repository: ${{ env.REPOSITORY_URL }} branch: ${{ github.ref_name }} php: ${{ matrix.php }} PK*\2"~~workflows/onebyone.ymlnu[name: One by One Testing # Run all the individual unit tests one by one, with # fully independent PHPUnit executions. Useful to # detect issues with some tests that are using stuff # that has been made available by others, but is not # available when running individually. # # Note that we aren't using PHPUnit's own isolation # here but completely separated runs, one for each # test. # # The workflow will fail reporting all the tests # that have failed (and will pass if no failure is # detected, of course). # # It's only executed via workflow dispatch (automated # or manual), not by push/tag. And acceptd configuration # of phpunit, specially useful to run it with PHPUnit's # own isolation or any other option. on: workflow_dispatch: inputs: phpunit_extra_options: description: Additional options to apply to PHPUnit required: false default: '' env: chunks: 7 jobs: collect: name: Collect individual unit tests runs-on: ubuntu-latest outputs: matrix: ${{steps.individual-tests.outputs.matrix }} steps: - name: Checking out code uses: actions/checkout@v4 - name: Looking for all individual tests id: individual-tests run: | count=0 # Number of individual tests found. while read -r testfile; do # For each test file. while read -r testname; do # For each unit test in a file. count=$((count + 1)) # Sent it to the correct chunk file. chunk=$(((($count % $chunks)) + 1)) echo "$testname $testfile" >> ./chunk_$chunk.txt done < <(grep "function test_" "${testfile}" | sed -r "s/^.*function (test_[a-zA-Z0-9_]+).*/\1/") done < <(find . -name "*_test.php" -not -path "*/fixtures/*") # Generate the matrix to run tests. echo "matrix=$(ls -1 chunk_*.txt | jq -R -s -c 'split("\n")[:-1]')" >> $GITHUB_OUTPUT echo "$count individual tests collected in $chunks files" - name: Upload individual tests files uses: actions/upload-artifact@v4 with: name: individual_tests path: chunk_*.txt retention-days: 1 test: name: Run tests needs: collect runs-on: ubuntu-latest services: exttests: image: moodlehq/moodle-exttests ports: - 8080:80 redis: image: redis ports: - 6379:6379 strategy: fail-fast: false matrix: file: ${{ fromJson(needs.collect.outputs.matrix) }} steps: - name: Setting up DB pgsql uses: m4nu56/postgresql-action@v1 with: postgresql version: 14 postgresql db: test postgresql user: test postgresql password: test - name: Setting up PHP uses: shivammathur/setup-php@v2 with: php-version: 8.4 ini-values: max_input_vars=5000 coverage: none - name: Checking out code uses: actions/checkout@v4 - name: Download individual test files uses: actions/download-artifact@v4 with: name: individual_tests # Make all the chunk files available for the next steps. - name: Setting up PHPUnit env: dbtype: pgsql run: | echo "pathtophp=$(which php)" >> $GITHUB_ENV cp .github/workflows/config-template.php config.php mkdir ../moodledata sudo locale-gen en_AU.UTF-8 php admin/tool/phpunit/cli/init.php --no-composer-self-update - name: Run PHPUnit test (one by one) env: dbtype: pgsql run: | status=0 count=0 while read -r line; do # For each line in the chunk file count=$((count + 1)) filter="${line% *}" file="${line#* }" # Run the individual unit test and report problems if needed to. if ! php vendor/bin/phpunit \ --fail-on-empty-test-suite \ --fail-on-warning \ --fail-on-risky \ --filter "$filter" ${{ inputs.phpunit_extra_options }} \ "$file" >/dev/null 2>&1; then if [ $status -eq 0 ]; then echo "Problems found, list of PHPUnit commands failing:" fi echo "vendor/bin/phpunit --filter '${filter}' ${{ inputs.phpunit_extra_options }} $file" status=$((status + 1)) fi done < ${{ matrix.file }} echo "Finished: $count individual tests executed, $status tests failed" exit $status PK*\_Hqqworkflows/windows.ymlnu[name: Windows Testing on: workflow_dispatch: inputs: phpunit_extra_options: description: Additional options to apply to PHPUnit required: false default: '' env: php: 8.4 jobs: Grunt: runs-on: windows-latest steps: - name: Set git to use LF run: | git config --global core.autocrlf false git config --global core.eol lf - name: Checking out code uses: actions/checkout@v4 - name: Configuring node & npm uses: actions/setup-node@v4 with: node-version-file: '.nvmrc' - name: Installing node stuff run: npm ci - name: Running grunt run: npx grunt - name: Looking for uncommitted changes # Add all files to the git index and then run diff --cached to see all changes. # This ensures that we get the status of all files, including new files. # We ignore npm-shrinkwrap.json to make the tasks immune to npm changes. run: | git add . git reset -- npm-shrinkwrap.json git diff --cached --exit-code PHPUnit: runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: include: - os: windows-latest php: 8.4 # Ideally we should use mysql/mariadb, but they are 4x slower without tweaks and configuration # so let's run only postgres (1.5h vs 6h) only, If some day we want to improve the mysql runs, # this is the place to enable them. # db: mysqli db: pgsql extensions: exif, fileinfo, gd, intl, pgsql, mysql, redis, soap, sodium, zip - os: windows-latest php: 8.2 db: pgsql extensions: exif, fileinfo, gd, intl, pgsql, mysql, redis, soap, sodium, zip steps: - name: Setting up DB mysql if: ${{ matrix.db == 'mysqli' }} uses: shogo82148/actions-setup-mysql@v1 with: mysql-version: 8.4 user: test password: test - name: Creating DB mysql if: ${{ matrix.db == 'mysqli' }} run: mysql --host 127.0.0.1 -utest -ptest -e 'CREATE DATABASE IF NOT EXISTS test COLLATE = utf8mb4_bin;'; - name: Setting up DB pgsql if: ${{ matrix.db == 'pgsql' }} run: | # TODO: Remove these conf. modifications when php74 or php80 are lowest. # Change to old md5 auth, because php73 does not support it. # #password_encryption = scram-sha-256 (Get-Content "$env:PGDATA\postgresql.conf"). ` replace('#password_encryption = scram-sha-256', 'password_encryption = md5') | ` Set-Content "$env:PGDATA\postgresql.conf" (Get-Content "$env:PGDATA\pg_hba.conf"). ` replace('scram-sha-256', 'md5') | ` Set-Content "$env:PGDATA\pg_hba.conf" $pgService = Get-Service -Name postgresql* Set-Service -InputObject $pgService -Status running -StartupType automatic Start-Process -FilePath "$env:PGBIN\pg_isready" -Wait -PassThru & $env:PGBIN\psql --command="CREATE USER test PASSWORD 'test'" --command="\du" - name: Creating DB pgsql if: ${{ matrix.db == 'pgsql' }} run: | & $env:PGBIN\createdb --owner=test test $env:PGPASSWORD = 'test' & $env:PGBIN\psql --username=test --host=localhost --list test - name: Configuring git vars uses: rlespinasse/github-slug-action@v4 - name: Setting up PHP ${{ matrix.php }} uses: shivammathur/setup-php@v2 with: php-version: ${{ matrix.php }} extensions: ${{ matrix.extensions }} ini-values: max_input_vars=5000 coverage: none - name: Set git to use LF run: | git config --global core.autocrlf false git config --global core.eol lf - name: Checking out code from ${{ env.GITHUB_REF_SLUG }} uses: actions/checkout@v4 # Needs to be done after php is available, git configured and Moodle checkout has happened. - name: Setting up moodle-exttests service run: | git clone https://github.com/moodlehq/moodle-exttests.git nssm install php-built-in C:\tools\php\php.exe -S localhost:8080 -t D:\a\moodle\moodle\moodle-exttests nssm start php-built-in - name: Setting up redis service run: | choco install redis --version 5.0.7 --no-progress nssm install redis redis-server nssm start redis - name: Setting up PHPUnit env: dbtype: ${{ matrix.db }} shell: bash run: | echo "pathtophp=$(which php)" >> $GITHUB_ENV # Inject installed pathtophp to env. The template config needs it. cp .github/workflows/config-template.php config.php mkdir ../moodledata php admin/tool/phpunit/cli/init.php --no-composer-self-update - name: Running PHPUnit tests env: dbtype: ${{ matrix.db }} phpunit_options: ${{ secrets.phpunit_options }} run: vendor/bin/phpunit $phpunit_options ${{ inputs.phpunit_extra_options }} PK*\0Q!workflows/close-pull-requests.ymlnu[name: 'Close Pull Requests' on: pull_request_target: types: opened workflow_dispatch: jobs: close: # Avoid forks to run this job if: github.repository_owner == 'moodle' name: Close Pull Requests runs-on: ubuntu-latest steps: - uses: dessant/repo-lockdown@v4 with: process-only: prs close-pr: true skip-closed-pr-comment: true pr-comment: > **Please, don't open pull requests via GitHub.** This repository (moodle.git) at GitHub is just a mirror of the official Moodle repository. For how to contribute patches for Moodle see [CONTRIBUTING.md](https://github.com/moodle/moodle/blob/main/CONTRIBUTING.md). Closing this pull request. PK*\ workflows/push.ymlnu[name: Core on: push: branches-ignore: - main - MOODLE_[0-9]+_STABLE tags-ignore: - v[0-9]+.[0-9]+.[0-9]+* workflow_dispatch: inputs: phpunit_extra_options: description: Additional options to apply to PHPUnit required: false default: '' env: php: 8.4 jobs: Grunt: runs-on: ubuntu-24.04 steps: - name: Checking out code uses: actions/checkout@v4 - name: Configuring node & npm uses: actions/setup-node@v4 with: node-version-file: '.nvmrc' - name: Installing node stuff run: npm install - name: Running grunt run: npx grunt - name: Looking for uncommitted changes # Add all files to the git index and then run diff --cached to see all changes. # This ensures that we get the status of all files, including new files. # We ignore npm-shrinkwrap.json to make the tasks immune to npm changes. run: | git add . git reset -- npm-shrinkwrap.json git diff --cached --exit-code PHPUnit: runs-on: ${{ matrix.os }} services: exttests: image: moodlehq/moodle-exttests ports: - 8080:80 redis: image: redis ports: - 6379:6379 strategy: fail-fast: false matrix: include: # MySQL builds always run with the lowest PHP supported version. - os: ubuntu-24.04 php: 8.2 extensions: db: mysqli # PostgreSQL builds always run with the highest PHP supported version. - os: ubuntu-24.04 php: 8.4 db: pgsql steps: - name: Setting up DB mysql if: ${{ matrix.db == 'mysqli' }} uses: moodlehq/mysql-action@v1 with: collation server: utf8mb4_bin mysql version: 8.4 mysql database: test mysql user: test mysql password: test use tmpfs: true tmpfs size: '1024M' extra conf: --skip-log-bin - name: Setting up DB pgsql if: ${{ matrix.db == 'pgsql' }} uses: m4nu56/postgresql-action@v1 with: postgresql version: 14 postgresql db: test postgresql user: test postgresql password: test - name: Configuring git vars uses: rlespinasse/github-slug-action@v4 - name: Setting up PHP ${{ matrix.php }} uses: shivammathur/setup-php@v2 with: php-version: ${{ matrix.php }} extensions: ${{ matrix.extensions }} ini-values: max_input_vars=5000 coverage: none - name: Checking out code from ${{ env.GITHUB_REF_SLUG }} uses: actions/checkout@v4 - name: Setting up PHPUnit env: dbtype: ${{ matrix.db }} run: | echo "pathtophp=$(which php)" >> $GITHUB_ENV # Inject installed pathtophp to env. The template config needs it. cp .github/workflows/config-template.php config.php mkdir ../moodledata sudo locale-gen en_AU.UTF-8 php admin/tool/phpunit/cli/init.php --no-composer-self-update - name: Running PHPUnit tests env: dbtype: ${{ matrix.db }} phpunit_options: ${{ secrets.phpunit_options }} run: vendor/bin/phpunit $phpunit_options ${{ inputs.phpunit_extra_options }} - name: Git status run: git status PK*\ workflows/config-template.phpnu[. /** * Template configuraton file for github actions CI/CD. * * @package core * @copyright 2020 onwards Eloy Lafuente (stronk7) {@link https://stronk7.com} * @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ // This cannot be used out from a github actions workflow, so just exit. getenv('GITHUB_WORKFLOW') || die; // phpcs:ignore moodle.Files.MoodleInternal.MoodleInternalGlobalState unset($CFG); global $CFG; $CFG = new stdClass(); $CFG->dbtype = getenv('dbtype'); $CFG->dblibrary = 'native'; $CFG->dbhost = '127.0.0.1'; $CFG->dbname = 'test'; $CFG->dbuser = 'test'; $CFG->dbpass = 'test'; $CFG->prefix = 'm_'; $CFG->dboptions = ['dbcollation' => 'utf8mb4_bin']; $host = 'localhost'; $CFG->wwwroot = "http://{$host}"; $CFG->dataroot = realpath(dirname(__DIR__)) . '/moodledata'; $CFG->admin = 'admin'; $CFG->directorypermissions = 0777; // Debug options - possible to be controlled by flag in future. $CFG->debug = (E_ALL); // DEBUG_DEVELOPER. $CFG->debugdisplay = 1; $CFG->debugstringids = 1; // Add strings=1 to url to get string ids. $CFG->perfdebug = 15; $CFG->debugpageinfo = 1; $CFG->allowthemechangeonurl = 1; $CFG->passwordpolicy = 0; $CFG->cronclionly = 0; $CFG->pathtophp = getenv('pathtophp'); $CFG->phpunit_dataroot = realpath(dirname(__DIR__)) . '/phpunitdata'; $CFG->phpunit_prefix = 't_'; define('TEST_EXTERNAL_FILES_HTTP_URL', 'http://localhost:8080'); define('TEST_EXTERNAL_FILES_HTTPS_URL', 'http://localhost:8080'); define('TEST_SESSION_REDIS_HOST', 'localhost'); define('TEST_CACHESTORE_REDIS_TESTSERVERS', 'localhost'); // TODO: add others (solr, mongodb, memcached, ldap...). // Too much for now: define('PHPUNIT_LONGTEST', true); // Only leaves a few tests out and they are run later by CI. require_once(__DIR__ . '/lib/setup.php'); PK*\a^ moodlelogo.svgnu[Moodle_Logo_UseonBlack_RGBPK*\ͥ>`` FUNDING.ymlnu[PK*\݌'. SECURITY.mdnu[PK*\a  ]PULL_REQUEST_TEMPLATE.txtnu[PK*\>66 workflows/web-installer-test.ymlnu[PK*\2"~~5workflows/onebyone.ymlnu[PK*\_Hqqworkflows/windows.ymlnu[PK*\0Q!-workflows/close-pull-requests.ymlnu[PK*\ 1workflows/push.ymlnu[PK*\ >workflows/config-template.phpnu[PK*\a^  Imoodlelogo.svgnu[PK XT