Merge lp:~yoboy-leguesh/ubuntu-fr-doc/maj140505 into lp:ubuntu-fr-doc

Proposed by YoBoY
Status: Merged
Merged at revision: 128
Proposed branch: lp:~yoboy-leguesh/ubuntu-fr-doc/maj140505
Merge into: lp:ubuntu-fr-doc
Diff against target: 163832 lines (+79973/-50360)
1387 files modified
.htaccess.dist (+10/-11)
README (+1/-1)
UFR-modifications (+69/-0)
VERSION (+1/-1)
bin/.htaccess (+2/-2)
bin/dwpage.php (+4/-4)
bin/gittool.php (+340/-0)
bin/indexer.php (+1/-61)
bin/striplangs.php (+2/-2)
bin/unusedmedia.php (+0/-213)
bin/wantedpages.php (+2/-2)
conf/.htaccess (+0/-1)
conf/acronyms.conf (+1/-85)
conf/dokuwiki.php (+1/-2)
conf/entities.conf (+1/-1)
conf/interwiki.conf (+4/-98)
conf/local.protected.php.dist (+5/-5)
conf/mediameta.php (+1/-1)
conf/mime.conf (+3/-0)
conf/mysql.conf.php (+35/-35)
conf/mysql.conf.php.example (+70/-70)
conf/plugins.required.php (+6/-5)
conf/wordblock.conf (+1/-0)
doku.php (+6/-6)
feed.php (+47/-29)
inc/.htaccess (+0/-1)
inc/DifferenceEngine.php (+64/-23)
inc/EmailAddressValidator.php (+10/-10)
inc/FeedParser.php (+4/-4)
inc/HTTPClient.php (+200/-82)
inc/Input.class.php (+38/-1)
inc/JpegMeta.php (+11/-8)
inc/Mailer.class.php (+71/-44)
inc/PassHash.class.php (+120/-13)
inc/RemoteAPICore.php (+38/-17)
inc/SafeFN.class.php (+6/-6)
inc/SimplePie.php (+9843/-7370)
inc/Sitemapper.php (+2/-2)
inc/Tar.class.php (+631/-0)
inc/TarLib.class.php (+79/-787)
inc/actions.php (+74/-30)
inc/adLDAP.php (+0/-2442)
inc/auth.php (+379/-123)
inc/auth/ad.class.php (+0/-390)
inc/auth/basic.class.php (+0/-401)
inc/auth/ldap.class.php (+0/-486)
inc/auth/mysql.class.php (+0/-947)
inc/auth/pgsql.class.php (+0/-419)
inc/auth/plain.class.php (+0/-328)
inc/cache.php (+96/-30)
inc/changelog.php (+684/-178)
inc/cliopts.php (+16/-7)
inc/common.php (+367/-200)
inc/compatibility.php (+36/-0)
inc/config_cascade.php (+0/-3)
inc/confutils.php (+6/-2)
inc/events.php (+68/-33)
inc/farm.php (+2/-4)
inc/feedcreator.class.php (+75/-26)
inc/fetch.functions.php (+159/-0)
inc/form.php (+21/-21)
inc/fulltext.php (+59/-51)
inc/geshi.php (+44/-24)
inc/html.php (+514/-178)
inc/httputils.php (+84/-10)
inc/indexer.php (+256/-108)
inc/infoutils.php (+73/-15)
inc/init.php (+24/-22)
inc/io.php (+52/-22)
inc/lang/.htaccess (+0/-1)
inc/lang/af/jquery.ui.datepicker.js (+23/-0)
inc/lang/af/lang.php (+2/-3)
inc/lang/ar/denied.txt (+1/-1)
inc/lang/ar/jquery.ui.datepicker.js (+23/-0)
inc/lang/ar/lang.php (+27/-10)
inc/lang/ar/mailwrap.html (+13/-0)
inc/lang/ar/subscr_single.txt (+1/-1)
inc/lang/az/denied.txt (+1/-1)
inc/lang/az/jquery.ui.datepicker.js (+23/-0)
inc/lang/az/lang.php (+4/-12)
inc/lang/bg/backlinks.txt (+1/-1)
inc/lang/bg/denied.txt (+1/-1)
inc/lang/bg/jquery.ui.datepicker.js (+24/-0)
inc/lang/bg/lang.php (+39/-54)
inc/lang/bg/register.txt (+1/-1)
inc/lang/bg/resendpwd.txt (+1/-1)
inc/lang/bg/subscr_single.txt (+1/-1)
inc/lang/bn/admin.txt (+3/-0)
inc/lang/bn/adminplugins.txt (+1/-0)
inc/lang/bn/backlinks.txt (+3/-0)
inc/lang/bn/conflict.txt (+5/-0)
inc/lang/bn/denied.txt (+3/-0)
inc/lang/bn/diff.txt (+3/-0)
inc/lang/bn/draft.txt (+5/-0)
inc/lang/bn/edit.txt (+1/-0)
inc/lang/bn/editrev.txt (+2/-0)
inc/lang/bn/index.txt (+3/-0)
inc/lang/bn/lang.php (+160/-0)
inc/lang/ca-valencia/denied.txt (+1/-1)
inc/lang/ca-valencia/lang.php (+6/-13)
inc/lang/ca/denied.txt (+1/-1)
inc/lang/ca/jquery.ui.datepicker.js (+23/-0)
inc/lang/ca/lang.php (+110/-20)
inc/lang/ca/mailwrap.html (+13/-0)
inc/lang/ca/resetpwd.txt (+3/-0)
inc/lang/ca/subscr_digest.txt (+21/-0)
inc/lang/ca/subscr_form.txt (+3/-0)
inc/lang/ca/subscr_list.txt (+21/-0)
inc/lang/cs/denied.txt (+1/-1)
inc/lang/cs/jquery.ui.datepicker.js (+23/-0)
inc/lang/cs/lang.php (+30/-10)
inc/lang/cs/registermail.txt (+1/-1)
inc/lang/da/denied.txt (+1/-1)
inc/lang/da/jquery.ui.datepicker.js (+23/-0)
inc/lang/da/lang.php (+19/-8)
inc/lang/da/subscr_single.txt (+1/-1)
inc/lang/de-informal/denied.txt (+1/-1)
inc/lang/de-informal/install.html (+7/-7)
inc/lang/de-informal/jquery.ui.datepicker.js (+23/-0)
inc/lang/de-informal/lang.php (+44/-28)
inc/lang/de-informal/locked.txt (+1/-1)
inc/lang/de-informal/password.txt (+1/-1)
inc/lang/de-informal/register.txt (+2/-2)
inc/lang/de-informal/subscr_single.txt (+1/-1)
inc/lang/de/admin.txt (+1/-1)
inc/lang/de/backlinks.txt (+1/-1)
inc/lang/de/denied.txt (+1/-1)
inc/lang/de/install.html (+6/-6)
inc/lang/de/jquery.ui.datepicker.js (+23/-0)
inc/lang/de/lang.php (+49/-29)
inc/lang/de/locked.txt (+1/-1)
inc/lang/de/password.txt (+1/-1)
inc/lang/de/register.txt (+2/-2)
inc/lang/de/subscr_single.txt (+1/-1)
inc/lang/el/denied.txt (+0/-1)
inc/lang/el/jquery.ui.datepicker.js (+23/-0)
inc/lang/el/lang.php (+36/-12)
inc/lang/el/mailwrap.html (+13/-0)
inc/lang/el/resetpwd.txt (+3/-0)
inc/lang/en/denied.txt (+1/-1)
inc/lang/en/lang.php (+27/-8)
inc/lang/en/subscr_single.txt (+1/-1)
inc/lang/eo/admin.txt (+2/-2)
inc/lang/eo/adminplugins.txt (+1/-1)
inc/lang/eo/denied.txt (+1/-1)
inc/lang/eo/diff.txt (+1/-1)
inc/lang/eo/draft.txt (+1/-1)
inc/lang/eo/edit.txt (+1/-1)
inc/lang/eo/editrev.txt (+1/-1)
inc/lang/eo/jquery.ui.datepicker.js (+23/-0)
inc/lang/eo/lang.php (+31/-13)
inc/lang/eo/subscr_single.txt (+1/-1)
inc/lang/es/denied.txt (+2/-1)
inc/lang/es/jquery.ui.datepicker.js (+23/-0)
inc/lang/es/lang.php (+43/-17)
inc/lang/es/subscr_single.txt (+2/-2)
inc/lang/et/adminplugins.txt (+1/-0)
inc/lang/et/denied.txt (+2/-1)
inc/lang/et/index.txt (+1/-1)
inc/lang/et/jquery.ui.datepicker.js (+23/-0)
inc/lang/et/lang.php (+115/-9)
inc/lang/et/resetpwd.txt (+3/-0)
inc/lang/et/subscr_digest.txt (+21/-0)
inc/lang/et/subscr_form.txt (+3/-0)
inc/lang/et/subscr_list.txt (+19/-0)
inc/lang/et/subscr_single.txt (+23/-0)
inc/lang/et/uploadmail.txt (+16/-0)
inc/lang/eu/denied.txt (+2/-1)
inc/lang/eu/jquery.ui.datepicker.js (+23/-0)
inc/lang/eu/lang.php (+5/-6)
inc/lang/fa/denied.txt (+2/-1)
inc/lang/fa/jquery.ui.datepicker.js (+59/-0)
inc/lang/fa/lang.php (+17/-16)
inc/lang/fi/denied.txt (+2/-1)
inc/lang/fi/jquery.ui.datepicker.js (+23/-0)
inc/lang/fi/lang.php (+23/-8)
inc/lang/fo/denied.txt (+2/-1)
inc/lang/fo/jquery.ui.datepicker.js (+23/-0)
inc/lang/fo/lang.php (+2/-3)
inc/lang/fr/admin.txt (+1/-2)
inc/lang/fr/adminplugins.txt (+1/-1)
inc/lang/fr/backlinks.txt (+1/-1)
inc/lang/fr/conflict.txt (+2/-2)
inc/lang/fr/denied.txt (+2/-1)
inc/lang/fr/diff.txt (+1/-1)
inc/lang/fr/draft.txt (+2/-2)
inc/lang/fr/edit.txt (+1/-1)
inc/lang/fr/index.txt (+2/-2)
inc/lang/fr/install.html (+7/-7)
inc/lang/fr/jquery.ui.datepicker.js (+25/-0)
inc/lang/fr/lang.php (+121/-96)
inc/lang/fr/locked.txt (+1/-1)
inc/lang/fr/mailtext.txt (+1/-1)
inc/lang/fr/mailwrap.html (+1/-1)
inc/lang/fr/newpage.txt (+1/-1)
inc/lang/fr/norev.txt (+1/-1)
inc/lang/fr/password.txt (+1/-1)
inc/lang/fr/preview.txt (+1/-1)
inc/lang/fr/pwconfirm.txt (+4/-4)
inc/lang/fr/read.txt (+1/-1)
inc/lang/fr/register.txt (+1/-1)
inc/lang/fr/registermail.txt (+3/-3)
inc/lang/fr/resendpwd.txt (+1/-1)
inc/lang/fr/stopwords.txt (+2/-2)
inc/lang/fr/subscr_digest.txt (+2/-2)
inc/lang/fr/subscr_form.txt (+1/-1)
inc/lang/fr/subscr_list.txt (+1/-1)
inc/lang/fr/subscr_single.txt (+2/-2)
inc/lang/fr/uploadmail.txt (+2/-2)
inc/lang/gl/denied.txt (+1/-1)
inc/lang/gl/jquery.ui.datepicker.js (+23/-0)
inc/lang/gl/lang.php (+14/-6)
inc/lang/gl/mailwrap.html (+13/-0)
inc/lang/gl/resetpwd.txt (+3/-0)
inc/lang/he/denied.txt (+2/-1)
inc/lang/he/jquery.ui.datepicker.js (+23/-0)
inc/lang/he/lang.php (+69/-10)
inc/lang/he/subscr_single.txt (+1/-1)
inc/lang/hi/diff.txt (+3/-0)
inc/lang/hi/jquery.ui.datepicker.js (+23/-0)
inc/lang/hi/lang.php (+11/-10)
inc/lang/hr/denied.txt (+0/-1)
inc/lang/hr/jquery.ui.datepicker.js (+23/-0)
inc/lang/hr/lang.php (+4/-5)
inc/lang/hu-formal/admin.txt (+3/-0)
inc/lang/hu-formal/adminplugins.txt (+1/-0)
inc/lang/hu-formal/backlinks.txt (+3/-0)
inc/lang/hu-formal/conflict.txt (+5/-0)
inc/lang/hu-formal/denied.txt (+4/-0)
inc/lang/hu-formal/diff.txt (+3/-0)
inc/lang/hu-formal/draft.txt (+5/-0)
inc/lang/hu-formal/edit.txt (+1/-0)
inc/lang/hu-formal/editrev.txt (+2/-0)
inc/lang/hu-formal/index.txt (+3/-0)
inc/lang/hu-formal/lang.php (+27/-0)
inc/lang/hu/denied.txt (+1/-1)
inc/lang/hu/diff.txt (+1/-1)
inc/lang/hu/draft.txt (+1/-1)
inc/lang/hu/edit.txt (+1/-1)
inc/lang/hu/install.html (+2/-2)
inc/lang/hu/jquery.ui.datepicker.js (+23/-0)
inc/lang/hu/lang.php (+130/-61)
inc/lang/hu/locked.txt (+1/-1)
inc/lang/hu/mailwrap.html (+13/-0)
inc/lang/hu/norev.txt (+1/-1)
inc/lang/hu/preview.txt (+1/-2)
inc/lang/hu/pwconfirm.txt (+2/-2)
inc/lang/hu/read.txt (+1/-2)
inc/lang/hu/register.txt (+1/-1)
inc/lang/hu/resendpwd.txt (+1/-1)
inc/lang/hu/resetpwd.txt (+3/-0)
inc/lang/hu/searchpage.txt (+1/-1)
inc/lang/hu/subscr_digest.txt (+1/-2)
inc/lang/hu/subscr_list.txt (+2/-3)
inc/lang/hu/subscr_single.txt (+1/-1)
inc/lang/ia/denied.txt (+2/-1)
inc/lang/ia/lang.php (+5/-8)
inc/lang/ia/subscr_single.txt (+1/-1)
inc/lang/id-ni/lang.php (+1/-1)
inc/lang/id/adminplugins.txt (+1/-0)
inc/lang/id/denied.txt (+1/-1)
inc/lang/id/jquery.ui.datepicker.js (+23/-0)
inc/lang/id/lang.php (+150/-19)
inc/lang/id/resetpwd.txt (+3/-0)
inc/lang/id/subscr_digest.txt (+17/-0)
inc/lang/is/jquery.ui.datepicker.js (+23/-0)
inc/lang/is/lang.php (+2/-3)
inc/lang/it/denied.txt (+1/-2)
inc/lang/it/jquery.ui.datepicker.js (+23/-0)
inc/lang/it/lang.php (+26/-10)
inc/lang/it/subscr_single.txt (+1/-1)
inc/lang/ja/denied.txt (+1/-1)
inc/lang/ja/jquery.ui.datepicker.js (+23/-0)
inc/lang/ja/lang.php (+31/-13)
inc/lang/ja/mailwrap.html (+13/-0)
inc/lang/ja/subscr_digest.txt (+1/-1)
inc/lang/ja/subscr_list.txt (+1/-1)
inc/lang/ja/subscr_single.txt (+1/-1)
inc/lang/ka/admin.txt (+4/-0)
inc/lang/ka/adminplugins.txt (+1/-0)
inc/lang/ka/backlinks.txt (+4/-0)
inc/lang/ka/conflict.txt (+5/-0)
inc/lang/ka/denied.txt (+3/-0)
inc/lang/ka/diff.txt (+3/-0)
inc/lang/ka/draft.txt (+3/-0)
inc/lang/ka/edit.txt (+2/-0)
inc/lang/ka/editrev.txt (+2/-0)
inc/lang/ka/index.txt (+1/-0)
inc/lang/ka/lang.php (+117/-0)
inc/lang/kk/jquery.ui.datepicker.js (+23/-0)
inc/lang/kk/lang.php (+17/-1)
inc/lang/km/denied.txt (+1/-0)
inc/lang/km/jquery.ui.datepicker.js (+23/-0)
inc/lang/km/lang.php (+2/-21)
inc/lang/ko/admin.txt (+2/-2)
inc/lang/ko/adminplugins.txt (+1/-1)
inc/lang/ko/backlinks.txt (+2/-2)
inc/lang/ko/conflict.txt (+5/-5)
inc/lang/ko/denied.txt (+2/-1)
inc/lang/ko/diff.txt (+1/-1)
inc/lang/ko/draft.txt (+2/-2)
inc/lang/ko/edit.txt (+1/-1)
inc/lang/ko/editrev.txt (+1/-1)
inc/lang/ko/index.txt (+1/-1)
inc/lang/ko/install.html (+22/-15)
inc/lang/ko/jquery.ui.datepicker.js (+23/-0)
inc/lang/ko/lang.php (+167/-145)
inc/lang/ko/locked.txt (+2/-2)
inc/lang/ko/login.txt (+1/-1)
inc/lang/ko/mailtext.txt (+11/-11)
inc/lang/ko/mailwrap.html (+12/-12)
inc/lang/ko/newpage.txt (+1/-1)
inc/lang/ko/norev.txt (+2/-2)
inc/lang/ko/password.txt (+7/-7)
inc/lang/ko/preview.txt (+1/-1)
inc/lang/ko/pwconfirm.txt (+4/-4)
inc/lang/ko/read.txt (+1/-2)
inc/lang/ko/recent.txt (+1/-1)
inc/lang/ko/register.txt (+1/-1)
inc/lang/ko/registermail.txt (+11/-11)
inc/lang/ko/resendpwd.txt (+2/-2)
inc/lang/ko/resetpwd.txt (+1/-1)
inc/lang/ko/revisions.txt (+2/-2)
inc/lang/ko/searchpage.txt (+2/-2)
inc/lang/ko/showrev.txt (+2/-2)
inc/lang/ko/stopwords.txt (+3/-3)
inc/lang/ko/subscr_digest.txt (+10/-10)
inc/lang/ko/subscr_list.txt (+5/-5)
inc/lang/ko/subscr_single.txt (+12/-12)
inc/lang/ko/updateprofile.txt (+2/-2)
inc/lang/ko/uploadmail.txt (+11/-11)
inc/lang/ku/denied.txt (+1/-1)
inc/lang/ku/lang.php (+5/-26)
inc/lang/la/denied.txt (+2/-1)
inc/lang/la/lang.php (+4/-7)
inc/lang/la/subscr_digest.txt (+1/-1)
inc/lang/la/subscr_single.txt (+1/-1)
inc/lang/lb/denied.txt (+2/-1)
inc/lang/lb/jquery.ui.datepicker.js (+23/-0)
inc/lang/lb/lang.php (+3/-4)
inc/lang/lt/denied.txt (+1/-1)
inc/lang/lt/jquery.ui.datepicker.js (+23/-0)
inc/lang/lt/lang.php (+3/-10)
inc/lang/lv/denied.txt (+1/-3)
inc/lang/lv/jquery.ui.datepicker.js (+23/-0)
inc/lang/lv/lang.php (+20/-6)
inc/lang/lv/mailwrap.html (+13/-0)
inc/lang/lv/resetpwd.txt (+3/-0)
inc/lang/mg/denied.txt (+1/-1)
inc/lang/mg/lang.php (+2/-16)
inc/lang/mk/jquery.ui.datepicker.js (+23/-0)
inc/lang/mk/lang.php (+5/-8)
inc/lang/mr/denied.txt (+2/-1)
inc/lang/mr/lang.php (+4/-6)
inc/lang/ms/jquery.ui.datepicker.js (+23/-0)
inc/lang/ms/lang.php (+1/-1)
inc/lang/ne/denied.txt (+2/-1)
inc/lang/ne/lang.php (+11/-18)
inc/lang/nl/denied.txt (+2/-1)
inc/lang/nl/edit.txt (+1/-1)
inc/lang/nl/jquery.ui.datepicker.js (+23/-0)
inc/lang/nl/lang.php (+35/-10)
inc/lang/nl/mailtext.txt (+2/-2)
inc/lang/nl/password.txt (+1/-1)
inc/lang/nl/read.txt (+1/-1)
inc/lang/nl/resendpwd.txt (+1/-1)
inc/lang/nl/subscr_form.txt (+1/-1)
inc/lang/nl/subscr_list.txt (+1/-1)
inc/lang/no/denied.txt (+2/-1)
inc/lang/no/jquery.ui.datepicker.js (+23/-0)
inc/lang/no/lang.php (+43/-11)
inc/lang/no/resetpwd.txt (+3/-0)
inc/lang/no/subscr_digest.txt (+1/-1)
inc/lang/no/subscr_list.txt (+1/-1)
inc/lang/no/subscr_single.txt (+1/-1)
inc/lang/pl/denied.txt (+1/-1)
inc/lang/pl/jquery.ui.datepicker.js (+23/-0)
inc/lang/pl/lang.php (+28/-11)
inc/lang/pt-br/denied.txt (+2/-1)
inc/lang/pt-br/editrev.txt (+1/-1)
inc/lang/pt-br/index.txt (+1/-1)
inc/lang/pt-br/jquery.ui.datepicker.js (+23/-0)
inc/lang/pt-br/lang.php (+25/-7)
inc/lang/pt/denied.txt (+2/-1)
inc/lang/pt/jquery.ui.datepicker.js (+22/-0)
inc/lang/pt/lang.php (+60/-58)
inc/lang/pt/subscr_single.txt (+1/-1)
inc/lang/ro/admin.txt (+1/-1)
inc/lang/ro/adminplugins.txt (+1/-1)
inc/lang/ro/backlinks.txt (+0/-1)
inc/lang/ro/conflict.txt (+5/-4)
inc/lang/ro/denied.txt (+2/-2)
inc/lang/ro/diff.txt (+3/-4)
inc/lang/ro/draft.txt (+8/-5)
inc/lang/ro/edit.txt (+1/-2)
inc/lang/ro/editrev.txt (+2/-1)
inc/lang/ro/index.txt (+2/-2)
inc/lang/ro/install.html (+9/-9)
inc/lang/ro/jquery.ui.datepicker.js (+26/-0)
inc/lang/ro/lang.php (+173/-174)
inc/lang/ro/locked.txt (+2/-1)
inc/lang/ro/login.txt (+4/-4)
inc/lang/ro/mailtext.txt (+13/-12)
inc/lang/ro/newpage.txt (+2/-2)
inc/lang/ro/norev.txt (+4/-4)
inc/lang/ro/password.txt (+4/-4)
inc/lang/ro/preview.txt (+1/-2)
inc/lang/ro/pwconfirm.txt (+10/-9)
inc/lang/ro/read.txt (+2/-2)
inc/lang/ro/recent.txt (+3/-5)
inc/lang/ro/register.txt (+2/-1)
inc/lang/ro/registermail.txt (+8/-7)
inc/lang/ro/resendpwd.txt (+3/-1)
inc/lang/ro/resetpwd.txt (+2/-2)
inc/lang/ro/revisions.txt (+5/-4)
inc/lang/ro/searchpage.txt (+1/-1)
inc/lang/ro/showrev.txt (+1/-1)
inc/lang/ro/stopwords.txt (+4/-2)
inc/lang/ro/subscr_digest.txt (+9/-9)
inc/lang/ro/subscr_form.txt (+2/-1)
inc/lang/ro/subscr_list.txt (+8/-8)
inc/lang/ro/subscr_single.txt (+11/-11)
inc/lang/ro/updateprofile.txt (+2/-1)
inc/lang/ro/uploadmail.txt (+7/-5)
inc/lang/ru/admin.txt (+1/-1)
inc/lang/ru/denied.txt (+2/-1)
inc/lang/ru/diff.txt (+1/-1)
inc/lang/ru/jquery.ui.datepicker.js (+23/-0)
inc/lang/ru/lang.php (+58/-34)
inc/lang/ru/mailtext.txt (+9/-9)
inc/lang/ru/norev.txt (+0/-1)
inc/lang/ru/password.txt (+1/-2)
inc/lang/ru/pwconfirm.txt (+1/-1)
inc/lang/ru/registermail.txt (+8/-8)
inc/lang/ru/subscr_digest.txt (+2/-2)
inc/lang/ru/subscr_list.txt (+2/-2)
inc/lang/ru/subscr_single.txt (+2/-3)
inc/lang/ru/uploadmail.txt (+9/-9)
inc/lang/sk/denied.txt (+2/-1)
inc/lang/sk/jquery.ui.datepicker.js (+23/-0)
inc/lang/sk/lang.php (+22/-9)
inc/lang/sl/denied.txt (+2/-1)
inc/lang/sl/jquery.ui.datepicker.js (+24/-0)
inc/lang/sl/lang.php (+32/-9)
inc/lang/sl/resetpwd.txt (+1/-0)
inc/lang/sq/denied.txt (+2/-1)
inc/lang/sq/jquery.ui.datepicker.js (+23/-0)
inc/lang/sq/lang.php (+5/-8)
inc/lang/sq/subscr_single.txt (+1/-1)
inc/lang/sr/denied.txt (+1/-1)
inc/lang/sr/jquery.ui.datepicker.js (+23/-0)
inc/lang/sr/lang.php (+4/-5)
inc/lang/sv/denied.txt (+1/-1)
inc/lang/sv/jquery.ui.datepicker.js (+23/-0)
inc/lang/sv/lang.php (+89/-9)
inc/lang/sv/mailwrap.html (+13/-0)
inc/lang/sv/resetpwd.txt (+3/-0)
inc/lang/sv/subscr_digest.txt (+19/-0)
inc/lang/sv/subscr_form.txt (+3/-0)
inc/lang/sv/subscr_single.txt (+23/-0)
inc/lang/th/denied.txt (+2/-1)
inc/lang/th/jquery.ui.datepicker.js (+23/-0)
inc/lang/th/lang.php (+3/-10)
inc/lang/tr/adminplugins.txt (+1/-0)
inc/lang/tr/denied.txt (+1/-1)
inc/lang/tr/jquery.ui.datepicker.js (+23/-0)
inc/lang/tr/lang.php (+77/-6)
inc/lang/tr/resetpwd.txt (+3/-0)
inc/lang/uk/denied.txt (+1/-1)
inc/lang/uk/jquery.ui.datepicker.js (+24/-0)
inc/lang/uk/lang.php (+21/-7)
inc/lang/vi/denied.txt (+2/-1)
inc/lang/vi/jquery.ui.datepicker.js (+23/-0)
inc/lang/vi/lang.php (+101/-126)
inc/lang/zh-tw/adminplugins.txt (+1/-1)
inc/lang/zh-tw/backlinks.txt (+1/-1)
inc/lang/zh-tw/denied.txt (+1/-1)
inc/lang/zh-tw/diff.txt (+1/-1)
inc/lang/zh-tw/edit.txt (+1/-1)
inc/lang/zh-tw/editrev.txt (+1/-1)
inc/lang/zh-tw/index.txt (+2/-2)
inc/lang/zh-tw/install.html (+5/-5)
inc/lang/zh-tw/jquery.ui.datepicker.js (+23/-0)
inc/lang/zh-tw/lang.php (+80/-62)
inc/lang/zh-tw/locked.txt (+1/-1)
inc/lang/zh-tw/login.txt (+1/-2)
inc/lang/zh-tw/mailtext.txt (+3/-3)
inc/lang/zh-tw/norev.txt (+1/-1)
inc/lang/zh-tw/password.txt (+1/-1)
inc/lang/zh-tw/preview.txt (+1/-1)
inc/lang/zh-tw/pwconfirm.txt (+7/-7)
inc/lang/zh-tw/read.txt (+1/-1)
inc/lang/zh-tw/register.txt (+1/-2)
inc/lang/zh-tw/registermail.txt (+4/-4)
inc/lang/zh-tw/resendpwd.txt (+1/-1)
inc/lang/zh-tw/resetpwd.txt (+1/-1)
inc/lang/zh-tw/revisions.txt (+1/-1)
inc/lang/zh-tw/stopwords.txt (+5/-5)
inc/lang/zh-tw/subscr_digest.txt (+4/-4)
inc/lang/zh-tw/subscr_form.txt (+1/-1)
inc/lang/zh-tw/subscr_list.txt (+4/-4)
inc/lang/zh-tw/subscr_single.txt (+4/-4)
inc/lang/zh-tw/updateprofile.txt (+1/-1)
inc/lang/zh-tw/uploadmail.txt (+3/-3)
inc/lang/zh/denied.txt (+2/-1)
inc/lang/zh/jquery.ui.datepicker.js (+23/-0)
inc/lang/zh/lang.php (+35/-10)
inc/lessc.inc.php (+3675/-0)
inc/load.php (+17/-2)
inc/mail.php (+9/-8)
inc/media.php (+244/-94)
inc/pageutils.php (+42/-23)
inc/parser/code.php (+4/-4)
inc/parser/handler.php (+187/-134)
inc/parser/lexer.php (+211/-207)
inc/parser/metadata.php (+446/-459)
inc/parser/parser.php (+97/-50)
inc/parser/renderer.php (+65/-50)
inc/parser/xhtml.php (+198/-64)
inc/parser/xhtmlsummary.php (+0/-1)
inc/parserutils.php (+43/-113)
inc/phpseclib/Crypt_AES.php (+188/-0)
inc/phpseclib/Crypt_Base.php (+1989/-0)
inc/phpseclib/Crypt_Hash.php (+823/-0)
inc/phpseclib/Crypt_Rijndael.php (+1374/-0)
inc/phpseclib/LICENSE (+21/-0)
inc/phpseclib/Math_BigInteger.php (+3651/-0)
inc/phpseclib/update.sh (+8/-0)
inc/plugin.php (+44/-21)
inc/plugincontroller.class.php (+96/-24)
inc/pluginutils.php (+61/-0)
inc/remote.php (+4/-1)
inc/search.php (+99/-274)
inc/subscription.php (+698/-407)
inc/template.php (+245/-92)
inc/toolbar.php (+4/-2)
inc/utf8.php (+19/-0)
lib/exe/ajax.php (+33/-37)
lib/exe/css.php (+328/-104)
lib/exe/detail.php (+12/-9)
lib/exe/fetch.php (+89/-195)
lib/exe/indexer.php (+32/-106)
lib/exe/js.php (+46/-5)
lib/exe/mediamanager.php (+15/-14)
lib/exe/opensearch.php (+1/-1)
lib/exe/xmlrpc.php (+2/-2)
lib/images/_deprecated.txt (+1/-11)
lib/images/fileicons/README (+2/-0)
lib/images/fileicons/index.php (+19/-0)
lib/images/smileys/index.php (+48/-0)
lib/plugins/acl/action.php (+88/-0)
lib/plugins/acl/admin.php (+13/-18)
lib/plugins/acl/ajax.php (+0/-57)
lib/plugins/acl/lang/ar/lang.php (+2/-2)
lib/plugins/acl/lang/bg/lang.php (+2/-2)
lib/plugins/acl/lang/ca/lang.php (+1/-0)
lib/plugins/acl/lang/cs/lang.php (+4/-2)
lib/plugins/acl/lang/da/lang.php (+2/-2)
lib/plugins/acl/lang/de-informal/lang.php (+7/-4)
lib/plugins/acl/lang/de/help.txt (+1/-1)
lib/plugins/acl/lang/de/lang.php (+5/-5)
lib/plugins/acl/lang/el/lang.php (+3/-5)
lib/plugins/acl/lang/en/help.txt (+3/-6)
lib/plugins/acl/lang/eo/lang.php (+3/-2)
lib/plugins/acl/lang/es/lang.php (+3/-2)
lib/plugins/acl/lang/et/help.txt (+9/-0)
lib/plugins/acl/lang/et/lang.php (+13/-4)
lib/plugins/acl/lang/fa/lang.php (+4/-2)
lib/plugins/acl/lang/fi/lang.php (+3/-2)
lib/plugins/acl/lang/fr/help.txt (+9/-7)
lib/plugins/acl/lang/fr/lang.php (+17/-15)
lib/plugins/acl/lang/gl/lang.php (+1/-0)
lib/plugins/acl/lang/he/lang.php (+2/-2)
lib/plugins/acl/lang/hi/lang.php (+0/-7)
lib/plugins/acl/lang/hu/lang.php (+11/-9)
lib/plugins/acl/lang/id-ni/lang.php (+0/-7)
lib/plugins/acl/lang/id/lang.php (+2/-2)
lib/plugins/acl/lang/it/lang.php (+2/-2)
lib/plugins/acl/lang/ja/lang.php (+3/-2)
lib/plugins/acl/lang/kk/lang.php (+4/-0)
lib/plugins/acl/lang/ko/help.txt (+6/-9)
lib/plugins/acl/lang/ko/lang.php (+9/-9)
lib/plugins/acl/lang/lb/lang.php (+0/-6)
lib/plugins/acl/lang/ms/lang.php (+0/-6)
lib/plugins/acl/lang/ne/lang.php (+3/-2)
lib/plugins/acl/lang/nl/help.txt (+3/-6)
lib/plugins/acl/lang/nl/lang.php (+6/-4)
lib/plugins/acl/lang/no/lang.php (+3/-3)
lib/plugins/acl/lang/pl/lang.php (+2/-2)
lib/plugins/acl/lang/pt-br/lang.php (+3/-2)
lib/plugins/acl/lang/pt/lang.php (+2/-2)
lib/plugins/acl/lang/ru/help.txt (+6/-5)
lib/plugins/acl/lang/ru/lang.php (+4/-3)
lib/plugins/acl/lang/sk/lang.php (+2/-2)
lib/plugins/acl/lang/sl/lang.php (+3/-2)
lib/plugins/acl/lang/sv/lang.php (+4/-4)
lib/plugins/acl/lang/tr/lang.php (+3/-2)
lib/plugins/acl/lang/uk/lang.php (+2/-2)
lib/plugins/acl/lang/vi/help.txt (+12/-12)
lib/plugins/acl/lang/vi/lang.php (+31/-40)
lib/plugins/acl/lang/zh-tw/help.txt (+6/-6)
lib/plugins/acl/lang/zh-tw/lang.php (+13/-12)
lib/plugins/acl/lang/zh/lang.php (+2/-2)
lib/plugins/acl/plugin.info.txt (+1/-1)
lib/plugins/acl/remote.php (+30/-0)
lib/plugins/acl/rtl.css (+0/-40)
lib/plugins/acl/script.js (+6/-12)
lib/plugins/acl/style.css (+29/-30)
lib/plugins/action.php (+5/-5)
lib/plugins/auth.php (+453/-0)
lib/plugins/authad/action.php (+91/-0)
lib/plugins/authad/adLDAP/adLDAP.php (+951/-0)
lib/plugins/authad/adLDAP/classes/adLDAPComputers.php (+153/-0)
lib/plugins/authad/adLDAP/classes/adLDAPContacts.php (+294/-0)
lib/plugins/authad/adLDAP/classes/adLDAPExchange.php (+390/-0)
lib/plugins/authad/adLDAP/classes/adLDAPFolders.php (+179/-0)
lib/plugins/authad/adLDAP/classes/adLDAPGroups.php (+631/-0)
lib/plugins/authad/adLDAP/classes/adLDAPUsers.php (+682/-0)
lib/plugins/authad/adLDAP/classes/adLDAPUtils.php (+264/-0)
lib/plugins/authad/adLDAP/collections/adLDAPCollection.php (+137/-0)
lib/plugins/authad/adLDAP/collections/adLDAPComputerCollection.php (+46/-0)
lib/plugins/authad/adLDAP/collections/adLDAPContactCollection.php (+46/-0)
lib/plugins/authad/adLDAP/collections/adLDAPGroupCollection.php (+46/-0)
lib/plugins/authad/adLDAP/collections/adLDAPUserCollection.php (+46/-0)
lib/plugins/authad/auth.php (+574/-0)
lib/plugins/authad/conf/default.php (+15/-0)
lib/plugins/authad/conf/metadata.php (+15/-0)
lib/plugins/authad/lang/ar/settings.php (+12/-0)
lib/plugins/authad/lang/bg/settings.php (+19/-0)
lib/plugins/authad/lang/cs/settings.php (+19/-0)
lib/plugins/authad/lang/da/settings.php (+20/-0)
lib/plugins/authad/lang/de-informal/settings.php (+21/-0)
lib/plugins/authad/lang/de/lang.php (+8/-0)
lib/plugins/authad/lang/de/settings.php (+23/-0)
lib/plugins/authad/lang/el/settings.php (+8/-0)
lib/plugins/authad/lang/en/lang.php (+10/-0)
lib/plugins/authad/lang/en/settings.php (+15/-0)
lib/plugins/authad/lang/eo/lang.php (+8/-0)
lib/plugins/authad/lang/eo/settings.php (+20/-0)
lib/plugins/authad/lang/es/lang.php (+8/-0)
lib/plugins/authad/lang/es/settings.php (+23/-0)
lib/plugins/authad/lang/fi/settings.php (+9/-0)
lib/plugins/authad/lang/fr/lang.php (+8/-0)
lib/plugins/authad/lang/fr/settings.php (+21/-0)
lib/plugins/authad/lang/hu/settings.php (+21/-0)
lib/plugins/authad/lang/it/settings.php (+18/-0)
lib/plugins/authad/lang/ja/settings.php (+20/-0)
lib/plugins/authad/lang/ko/lang.php (+8/-0)
lib/plugins/authad/lang/ko/settings.php (+21/-0)
lib/plugins/authad/lang/nl/lang.php (+8/-0)
lib/plugins/authad/lang/nl/settings.php (+21/-0)
lib/plugins/authad/lang/no/settings.php (+9/-0)
lib/plugins/authad/lang/pl/settings.php (+20/-0)
lib/plugins/authad/lang/pt-br/settings.php (+22/-0)
lib/plugins/authad/lang/pt/settings.php (+12/-0)
lib/plugins/authad/lang/ru/lang.php (+8/-0)
lib/plugins/authad/lang/ru/settings.php (+18/-0)
lib/plugins/authad/lang/sk/settings.php (+20/-0)
lib/plugins/authad/lang/sl/settings.php (+11/-0)
lib/plugins/authad/lang/sv/settings.php (+12/-0)
lib/plugins/authad/lang/zh-tw/settings.php (+19/-0)
lib/plugins/authad/lang/zh/settings.php (+21/-0)
lib/plugins/authad/plugin.info.txt (+7/-0)
lib/plugins/authldap/auth.php (+549/-0)
lib/plugins/authldap/conf/default.php (+20/-0)
lib/plugins/authldap/conf/metadata.php (+19/-0)
lib/plugins/authldap/lang/ar/settings.php (+13/-0)
lib/plugins/authldap/lang/bg/settings.php (+20/-0)
lib/plugins/authldap/lang/cs/settings.php (+22/-0)
lib/plugins/authldap/lang/da/settings.php (+15/-0)
lib/plugins/authldap/lang/de-informal/settings.php (+28/-0)
lib/plugins/authldap/lang/de/settings.php (+28/-0)
lib/plugins/authldap/lang/en/settings.php (+23/-0)
lib/plugins/authldap/lang/eo/settings.php (+27/-0)
lib/plugins/authldap/lang/es/settings.php (+27/-0)
lib/plugins/authldap/lang/et/settings.php (+9/-0)
lib/plugins/authldap/lang/fi/settings.php (+11/-0)
lib/plugins/authldap/lang/fr/settings.php (+28/-0)
lib/plugins/authldap/lang/he/settings.php (+8/-0)
lib/plugins/authldap/lang/hu/settings.php (+28/-0)
lib/plugins/authldap/lang/it/settings.php (+19/-0)
lib/plugins/authldap/lang/ja/settings.php (+24/-0)
lib/plugins/authldap/lang/ko/settings.php (+27/-0)
lib/plugins/authldap/lang/nl/settings.php (+28/-0)
lib/plugins/authldap/lang/no/settings.php (+9/-0)
lib/plugins/authldap/lang/pl/settings.php (+16/-0)
lib/plugins/authldap/lang/pt-br/settings.php (+28/-0)
lib/plugins/authldap/lang/pt/settings.php (+18/-0)
lib/plugins/authldap/lang/ru/settings.php (+19/-0)
lib/plugins/authldap/lang/sk/settings.php (+27/-0)
lib/plugins/authldap/lang/sl/settings.php (+10/-0)
lib/plugins/authldap/lang/sv/settings.php (+19/-0)
lib/plugins/authldap/lang/zh-tw/settings.php (+26/-0)
lib/plugins/authldap/lang/zh/settings.php (+28/-0)
lib/plugins/authldap/plugin.info.txt (+7/-0)
lib/plugins/authmysql/auth.php (+980/-0)
lib/plugins/authmysql/conf/default.php (+34/-0)
lib/plugins/authmysql/conf/metadata.php (+34/-0)
lib/plugins/authmysql/lang/bg/settings.php (+19/-0)
lib/plugins/authmysql/lang/cs/settings.php (+42/-0)
lib/plugins/authmysql/lang/da/settings.php (+27/-0)
lib/plugins/authmysql/lang/de-informal/settings.php (+43/-0)
lib/plugins/authmysql/lang/de/settings.php (+42/-0)
lib/plugins/authmysql/lang/en/settings.php (+39/-0)
lib/plugins/authmysql/lang/eo/settings.php (+41/-0)
lib/plugins/authmysql/lang/es/settings.php (+35/-0)
lib/plugins/authmysql/lang/fr/settings.php (+42/-0)
lib/plugins/authmysql/lang/hu/settings.php (+43/-0)
lib/plugins/authmysql/lang/it/settings.php (+8/-0)
lib/plugins/authmysql/lang/ja/settings.php (+42/-0)
lib/plugins/authmysql/lang/ko/settings.php (+43/-0)
lib/plugins/authmysql/lang/nl/settings.php (+42/-0)
lib/plugins/authmysql/lang/pl/settings.php (+14/-0)
lib/plugins/authmysql/lang/pt-br/settings.php (+43/-0)
lib/plugins/authmysql/lang/pt/settings.php (+23/-0)
lib/plugins/authmysql/lang/ru/settings.php (+43/-0)
lib/plugins/authmysql/lang/sk/settings.php (+42/-0)
lib/plugins/authmysql/lang/sl/settings.php (+11/-0)
lib/plugins/authmysql/lang/sv/settings.php (+26/-0)
lib/plugins/authmysql/lang/zh-tw/settings.php (+42/-0)
lib/plugins/authmysql/lang/zh/settings.php (+42/-0)
lib/plugins/authmysql/plugin.info.txt (+7/-0)
lib/plugins/authpgsql/auth.php (+420/-0)
lib/plugins/authpgsql/conf/default.php (+33/-0)
lib/plugins/authpgsql/conf/metadata.php (+33/-0)
lib/plugins/authpgsql/lang/bg/settings.php (+13/-0)
lib/plugins/authpgsql/lang/cs/settings.php (+38/-0)
lib/plugins/authpgsql/lang/da/settings.php (+22/-0)
lib/plugins/authpgsql/lang/de-informal/settings.php (+39/-0)
lib/plugins/authpgsql/lang/de/settings.php (+38/-0)
lib/plugins/authpgsql/lang/en/settings.php (+33/-0)
lib/plugins/authpgsql/lang/eo/settings.php (+37/-0)
lib/plugins/authpgsql/lang/es/settings.php (+9/-0)
lib/plugins/authpgsql/lang/fr/settings.php (+38/-0)
lib/plugins/authpgsql/lang/hu/settings.php (+39/-0)
lib/plugins/authpgsql/lang/ja/settings.php (+38/-0)
lib/plugins/authpgsql/lang/ko/settings.php (+39/-0)
lib/plugins/authpgsql/lang/nl/settings.php (+38/-0)
lib/plugins/authpgsql/lang/pt-br/settings.php (+39/-0)
lib/plugins/authpgsql/lang/pt/settings.php (+22/-0)
lib/plugins/authpgsql/lang/ru/settings.php (+34/-0)
lib/plugins/authpgsql/lang/sk/settings.php (+38/-0)
lib/plugins/authpgsql/lang/sl/settings.php (+17/-0)
lib/plugins/authpgsql/lang/sv/settings.php (+29/-0)
lib/plugins/authpgsql/lang/zh-tw/settings.php (+38/-0)
lib/plugins/authpgsql/lang/zh/settings.php (+38/-0)
lib/plugins/authpgsql/plugin.info.txt (+7/-0)
lib/plugins/authplain/auth.php (+354/-0)
lib/plugins/authplain/plugin.info.txt (+7/-0)
lib/plugins/backlinks/README (+1/-0)
lib/plugins/backlinks/VERSION (+0/-1)
lib/plugins/backlinks/plugin.info.txt (+7/-0)
lib/plugins/backlinks/syntax.php (+21/-31)
lib/plugins/captcha/README (+25/-0)
lib/plugins/captcha/action.php (+74/-63)
lib/plugins/captcha/conf/default.php (+8/-5)
lib/plugins/captcha/conf/metadata.php (+8/-6)
lib/plugins/captcha/fonts/README (+8/-0)
lib/plugins/captcha/helper.php (+212/-58)
lib/plugins/captcha/img.php (+6/-5)
lib/plugins/captcha/lang/ar/lang.php (+12/-0)
lib/plugins/captcha/lang/ar/settings.php (+21/-0)
lib/plugins/captcha/lang/da/lang.php (+12/-0)
lib/plugins/captcha/lang/da/settings.php (+22/-0)
lib/plugins/captcha/lang/de-informal/lang.php (+12/-0)
lib/plugins/captcha/lang/de-informal/settings.php (+22/-0)
lib/plugins/captcha/lang/de/lang.php (+8/-7)
lib/plugins/captcha/lang/de/settings.php (+19/-14)
lib/plugins/captcha/lang/en/lang.php (+2/-1)
lib/plugins/captcha/lang/en/settings.php (+5/-1)
lib/plugins/captcha/lang/eo/lang.php (+10/-8)
lib/plugins/captcha/lang/eo/settings.php (+20/-16)
lib/plugins/captcha/lang/es/lang.php (+12/-0)
lib/plugins/captcha/lang/es/settings.php (+21/-0)
lib/plugins/captcha/lang/fr/lang.php (+10/-7)
lib/plugins/captcha/lang/fr/settings.php (+20/-15)
lib/plugins/captcha/lang/hu/lang.php (+12/-0)
lib/plugins/captcha/lang/hu/settings.php (+23/-0)
lib/plugins/captcha/lang/ja/lang.php (+13/-0)
lib/plugins/captcha/lang/ja/settings.php (+23/-0)
lib/plugins/captcha/lang/ko/lang.php (+13/-0)
lib/plugins/captcha/lang/ko/settings.php (+23/-0)
lib/plugins/captcha/lang/nl/lang.php (+14/-0)
lib/plugins/captcha/lang/nl/settings.php (+24/-0)
lib/plugins/captcha/lang/pl/lang.php (+12/-0)
lib/plugins/captcha/lang/pl/settings.php (+19/-0)
lib/plugins/captcha/lang/pt-br/lang.php (+12/-0)
lib/plugins/captcha/lang/pt-br/settings.php (+22/-0)
lib/plugins/captcha/lang/pt/lang.php (+12/-0)
lib/plugins/captcha/lang/pt/settings.php (+22/-0)
lib/plugins/captcha/lang/sk/lang.php (+9/-7)
lib/plugins/captcha/lang/sk/settings.php (+19/-14)
lib/plugins/captcha/lang/tr/settings.php (+10/-0)
lib/plugins/captcha/lang/zh/lang.php (+13/-0)
lib/plugins/captcha/lang/zh/settings.php (+23/-0)
lib/plugins/captcha/plugin.info.txt (+1/-1)
lib/plugins/captcha/script.js (+8/-8)
lib/plugins/captcha/style.css (+8/-0)
lib/plugins/captcha/wav.php (+35/-25)
lib/plugins/cloud/VERSION (+0/-1)
lib/plugins/cloud/lang/eo/settings.php (+7/-9)
lib/plugins/cloud/lang/fr/settings.php (+10/-0)
lib/plugins/cloud/lang/ja/settings.php (+10/-0)
lib/plugins/cloud/lang/ko/settings.php (+10/-0)
lib/plugins/cloud/lang/nl/settings.php (+10/-0)
lib/plugins/cloud/lang/ru/settings.php (+9/-0)
lib/plugins/cloud/lang/zh/settings.php (+10/-0)
lib/plugins/cloud/plugin.info.txt (+1/-1)
lib/plugins/cloud/style.css (+21/-21)
lib/plugins/cloud/syntax.php (+16/-6)
lib/plugins/config/admin.php (+273/-271)
lib/plugins/config/lang/ar/lang.php (+50/-52)
lib/plugins/config/lang/bg/lang.php (+2/-9)
lib/plugins/config/lang/ca-valencia/lang.php (+0/-3)
lib/plugins/config/lang/ca/lang.php (+50/-47)
lib/plugins/config/lang/cs/lang.php (+13/-5)
lib/plugins/config/lang/da/lang.php (+0/-3)
lib/plugins/config/lang/de-informal/lang.php (+80/-78)
lib/plugins/config/lang/de/lang.php (+35/-38)
lib/plugins/config/lang/el/lang.php (+57/-49)
lib/plugins/config/lang/en/intro.txt (+1/-1)
lib/plugins/config/lang/en/lang.php (+25/-28)
lib/plugins/config/lang/eo/lang.php (+0/-3)
lib/plugins/config/lang/es/lang.php (+1/-3)
lib/plugins/config/lang/et/lang.php (+0/-2)
lib/plugins/config/lang/eu/lang.php (+0/-3)
lib/plugins/config/lang/fa/lang.php (+1/-3)
lib/plugins/config/lang/fi/lang.php (+6/-3)
lib/plugins/config/lang/fr/intro.txt (+5/-5)
lib/plugins/config/lang/fr/lang.php (+89/-86)
lib/plugins/config/lang/gl/lang.php (+58/-50)
lib/plugins/config/lang/he/lang.php (+0/-3)
lib/plugins/config/lang/hr/lang.php (+0/-8)
lib/plugins/config/lang/hu/lang.php (+66/-56)
lib/plugins/config/lang/ia/lang.php (+0/-3)
lib/plugins/config/lang/id/lang.php (+0/-7)
lib/plugins/config/lang/is/lang.php (+0/-1)
lib/plugins/config/lang/it/lang.php (+1/-3)
lib/plugins/config/lang/ja/lang.php (+5/-5)
lib/plugins/config/lang/kk/lang.php (+0/-6)
lib/plugins/config/lang/ko/intro.txt (+8/-7)
lib/plugins/config/lang/ko/lang.php (+55/-60)
lib/plugins/config/lang/la/lang.php (+0/-3)
lib/plugins/config/lang/lb/lang.php (+0/-6)
lib/plugins/config/lang/lv/lang.php (+47/-49)
lib/plugins/config/lang/mk/lang.php (+0/-6)
lib/plugins/config/lang/mr/lang.php (+0/-3)
lib/plugins/config/lang/ms/lang.php (+0/-6)
lib/plugins/config/lang/ne/lang.php (+0/-2)
lib/plugins/config/lang/nl/lang.php (+1/-4)
lib/plugins/config/lang/no/lang.php (+0/-3)
lib/plugins/config/lang/pl/lang.php (+0/-3)
lib/plugins/config/lang/pt-br/lang.php (+1/-3)
lib/plugins/config/lang/pt/lang.php (+0/-3)
lib/plugins/config/lang/ro/lang.php (+0/-3)
lib/plugins/config/lang/ru/lang.php (+5/-3)
lib/plugins/config/lang/sk/lang.php (+0/-3)
lib/plugins/config/lang/sl/lang.php (+0/-3)
lib/plugins/config/lang/sq/lang.php (+0/-3)
lib/plugins/config/lang/sr/lang.php (+0/-3)
lib/plugins/config/lang/sv/lang.php (+53/-48)
lib/plugins/config/lang/th/lang.php (+0/-1)
lib/plugins/config/lang/tr/lang.php (+23/-25)
lib/plugins/config/lang/uk/lang.php (+0/-3)
lib/plugins/config/lang/vi/lang.php (+0/-5)
lib/plugins/config/lang/zh-tw/intro.txt (+5/-5)
lib/plugins/config/lang/zh-tw/lang.php (+39/-32)
lib/plugins/config/lang/zh/lang.php (+0/-3)
lib/plugins/config/plugin.info.txt (+1/-1)
lib/plugins/config/rtl.css (+0/-45)
lib/plugins/config/settings/config.class.php (+1154/-984)
lib/plugins/config/settings/config.metadata.php (+44/-40)
lib/plugins/config/settings/extra.class.php (+169/-135)
lib/plugins/config/style.css (+4/-9)
lib/plugins/extension/action.php (+85/-0)
lib/plugins/extension/admin.php (+155/-0)
lib/plugins/extension/all.less (+37/-0)
lib/plugins/extension/helper/extension.php (+1093/-0)
lib/plugins/extension/helper/gui.php (+193/-0)
lib/plugins/extension/helper/list.php (+568/-0)
lib/plugins/extension/helper/repository.php (+191/-0)
lib/plugins/extension/images/license.txt (+4/-0)
lib/plugins/extension/lang/de/intro_install.txt (+1/-0)
lib/plugins/extension/lang/de/intro_plugins.txt (+1/-0)
lib/plugins/extension/lang/de/intro_search.txt (+1/-0)
lib/plugins/extension/lang/de/intro_templates.txt (+1/-0)
lib/plugins/extension/lang/de/lang.php (+88/-0)
lib/plugins/extension/lang/en/intro_install.txt (+1/-0)
lib/plugins/extension/lang/en/intro_plugins.txt (+1/-0)
lib/plugins/extension/lang/en/intro_search.txt (+1/-0)
lib/plugins/extension/lang/en/intro_templates.txt (+1/-0)
lib/plugins/extension/lang/en/lang.php (+99/-0)
lib/plugins/extension/lang/eo/intro_install.txt (+1/-0)
lib/plugins/extension/lang/eo/intro_plugins.txt (+1/-0)
lib/plugins/extension/lang/eo/intro_search.txt (+1/-0)
lib/plugins/extension/lang/eo/intro_templates.txt (+1/-0)
lib/plugins/extension/lang/eo/lang.php (+87/-0)
lib/plugins/extension/lang/es/lang.php (+52/-0)
lib/plugins/extension/lang/fr/intro_install.txt (+1/-0)
lib/plugins/extension/lang/fr/intro_plugins.txt (+1/-0)
lib/plugins/extension/lang/fr/intro_search.txt (+1/-0)
lib/plugins/extension/lang/fr/intro_templates.txt (+1/-0)
lib/plugins/extension/lang/fr/lang.php (+87/-0)
lib/plugins/extension/lang/ja/intro_install.txt (+1/-0)
lib/plugins/extension/lang/ja/intro_plugins.txt (+1/-0)
lib/plugins/extension/lang/ja/intro_search.txt (+1/-0)
lib/plugins/extension/lang/ja/intro_templates.txt (+1/-0)
lib/plugins/extension/lang/ja/lang.php (+54/-0)
lib/plugins/extension/lang/ko/intro_install.txt (+1/-0)
lib/plugins/extension/lang/ko/intro_plugins.txt (+1/-0)
lib/plugins/extension/lang/ko/intro_search.txt (+1/-0)
lib/plugins/extension/lang/ko/intro_templates.txt (+1/-0)
lib/plugins/extension/lang/ko/lang.php (+88/-0)
lib/plugins/extension/lang/nl/intro_install.txt (+1/-0)
lib/plugins/extension/lang/nl/intro_plugins.txt (+1/-0)
lib/plugins/extension/lang/nl/intro_search.txt (+1/-0)
lib/plugins/extension/lang/nl/intro_templates.txt (+1/-0)
lib/plugins/extension/lang/nl/lang.php (+87/-0)
lib/plugins/extension/lang/ru/lang.php (+60/-0)
lib/plugins/extension/lang/sk/lang.php (+58/-0)
lib/plugins/extension/lang/zh/intro_install.txt (+1/-0)
lib/plugins/extension/lang/zh/intro_plugins.txt (+1/-0)
lib/plugins/extension/lang/zh/intro_search.txt (+1/-0)
lib/plugins/extension/lang/zh/intro_templates.txt (+1/-0)
lib/plugins/extension/lang/zh/lang.php (+72/-0)
lib/plugins/extension/plugin.info.txt (+7/-0)
lib/plugins/extension/script.js (+113/-0)
lib/plugins/extension/style.less (+363/-0)
lib/plugins/info/lang/sl/lang.php (+0/-12)
lib/plugins/info/plugin.info.txt (+1/-1)
lib/plugins/info/syntax.php (+44/-30)
lib/plugins/orphanswanted/VERSION (+0/-1)
lib/plugins/orphanswanted/conf/default.php (+9/-0)
lib/plugins/orphanswanted/conf/metadata.php (+10/-0)
lib/plugins/orphanswanted/helper.php (+62/-46)
lib/plugins/orphanswanted/lang/de-informal/settings.php (+10/-0)
lib/plugins/orphanswanted/lang/de/settings.php (+10/-0)
lib/plugins/orphanswanted/lang/en/settings.php (+10/-0)
lib/plugins/orphanswanted/plugin.info.txt (+1/-1)
lib/plugins/pagelist/helper.php (+16/-10)
lib/plugins/pagelist/lang/nl/lang.php (+16/-0)
lib/plugins/pagelist/lang/nl/settings.php (+36/-0)
lib/plugins/pagelist/lang/pt/lang.php (+15/-0)
lib/plugins/pagelist/lang/pt/settings.php (+35/-0)
lib/plugins/pagelist/lang/zh-tw/lang.php (+1/-1)
lib/plugins/pagelist/lang/zh-tw/settings.php (+3/-1)
lib/plugins/pagelist/lang/zh/lang.php (+15/-0)
lib/plugins/pagelist/lang/zh/settings.php (+35/-0)
lib/plugins/pagelist/plugin.info.txt (+3/-3)
lib/plugins/pagelist/style.css (+3/-1)
lib/plugins/pageredirect/.travis.yml (+13/-0)
lib/plugins/pageredirect/README.md (+30/-0)
lib/plugins/pageredirect/_test/instructions.test.php (+48/-0)
lib/plugins/pageredirect/_test/pageredirect_test.php (+8/-0)
lib/plugins/pageredirect/action.php (+89/-59)
lib/plugins/pageredirect/lang/ja/lang.php (+9/-0)
lib/plugins/pageredirect/lang/ja/settings.php (+8/-0)
lib/plugins/pageredirect/plugin.info.txt (+2/-2)
lib/plugins/pageredirect/syntax.php (+79/-30)
lib/plugins/plugin/admin.php (+0/-151)
lib/plugins/plugin/classes/ap_delete.class.php (+0/-28)
lib/plugins/plugin/classes/ap_download.class.php (+0/-295)
lib/plugins/plugin/classes/ap_enable.class.php (+0/-51)
lib/plugins/plugin/classes/ap_info.class.php (+0/-144)
lib/plugins/plugin/classes/ap_manage.class.php (+0/-206)
lib/plugins/plugin/classes/ap_update.class.php (+0/-38)
lib/plugins/plugin/lang/af/lang.php (+0/-13)
lib/plugins/plugin/lang/ar/admin_plugin.txt (+0/-4)
lib/plugins/plugin/lang/ar/lang.php (+0/-53)
lib/plugins/plugin/lang/bg/admin_plugin.txt (+0/-3)
lib/plugins/plugin/lang/bg/lang.php (+0/-54)
lib/plugins/plugin/lang/ca-valencia/admin_plugin.txt (+0/-4)
lib/plugins/plugin/lang/ca-valencia/lang.php (+0/-53)
lib/plugins/plugin/lang/ca/admin_plugin.txt (+0/-3)
lib/plugins/plugin/lang/ca/lang.php (+0/-53)
lib/plugins/plugin/lang/cs/admin_plugin.txt (+0/-3)
lib/plugins/plugin/lang/cs/lang.php (+0/-61)
lib/plugins/plugin/lang/da/admin_plugin.txt (+0/-5)
lib/plugins/plugin/lang/da/lang.php (+0/-60)
lib/plugins/plugin/lang/de-informal/admin_plugin.txt (+0/-3)
lib/plugins/plugin/lang/de-informal/lang.php (+0/-56)
lib/plugins/plugin/lang/de/admin_plugin.txt (+0/-5)
lib/plugins/plugin/lang/de/lang.php (+0/-66)
lib/plugins/plugin/lang/el/admin_plugin.txt (+0/-5)
lib/plugins/plugin/lang/el/lang.php (+0/-60)
lib/plugins/plugin/lang/en/admin_plugin.txt (+0/-5)
lib/plugins/plugin/lang/en/lang.php (+0/-78)
lib/plugins/plugin/lang/eo/admin_plugin.txt (+0/-3)
lib/plugins/plugin/lang/eo/lang.php (+0/-59)
lib/plugins/plugin/lang/es/admin_plugin.txt (+0/-3)
lib/plugins/plugin/lang/es/lang.php (+0/-71)
lib/plugins/plugin/lang/et/lang.php (+0/-32)
lib/plugins/plugin/lang/eu/admin_plugin.txt (+0/-3)
lib/plugins/plugin/lang/eu/lang.php (+0/-52)
lib/plugins/plugin/lang/fa/admin_plugin.txt (+0/-3)
lib/plugins/plugin/lang/fa/lang.php (+0/-56)
lib/plugins/plugin/lang/fi/admin_plugin.txt (+0/-3)
lib/plugins/plugin/lang/fi/lang.php (+0/-54)
lib/plugins/plugin/lang/fr/admin_plugin.txt (+0/-4)
lib/plugins/plugin/lang/fr/lang.php (+0/-67)
lib/plugins/plugin/lang/gl/admin_plugin.txt (+0/-3)
lib/plugins/plugin/lang/gl/lang.php (+0/-52)
lib/plugins/plugin/lang/he/admin_plugin.txt (+0/-5)
lib/plugins/plugin/lang/he/lang.php (+0/-55)
lib/plugins/plugin/lang/hi/lang.php (+0/-12)
lib/plugins/plugin/lang/hr/lang.php (+0/-8)
lib/plugins/plugin/lang/hu/admin_plugin.txt (+0/-4)
lib/plugins/plugin/lang/hu/lang.php (+0/-56)
lib/plugins/plugin/lang/ia/admin_plugin.txt (+0/-3)
lib/plugins/plugin/lang/ia/lang.php (+0/-51)
lib/plugins/plugin/lang/id-ni/lang.php (+0/-7)
lib/plugins/plugin/lang/id/lang.php (+0/-31)
lib/plugins/plugin/lang/is/lang.php (+0/-47)
lib/plugins/plugin/lang/it/admin_plugin.txt (+0/-3)
lib/plugins/plugin/lang/it/lang.php (+0/-63)
lib/plugins/plugin/lang/ja/admin_plugin.txt (+0/-5)
lib/plugins/plugin/lang/ja/lang.php (+0/-57)
lib/plugins/plugin/lang/kk/lang.php (+0/-6)
lib/plugins/plugin/lang/ko/admin_plugin.txt (+0/-5)
lib/plugins/plugin/lang/ko/lang.php (+0/-58)
lib/plugins/plugin/lang/la/admin_plugin.txt (+0/-3)
lib/plugins/plugin/lang/la/lang.php (+0/-50)
lib/plugins/plugin/lang/lb/admin_plugin.txt (+0/-4)
lib/plugins/plugin/lang/lb/lang.php (+0/-6)
lib/plugins/plugin/lang/lt/admin_plugin.txt (+0/-3)
lib/plugins/plugin/lang/lt/lang.php (+0/-13)
lib/plugins/plugin/lang/lv/admin_plugin.txt (+0/-3)
lib/plugins/plugin/lang/lv/lang.php (+0/-50)
lib/plugins/plugin/lang/mk/lang.php (+0/-43)
lib/plugins/plugin/lang/mr/admin_plugin.txt (+0/-4)
lib/plugins/plugin/lang/mr/lang.php (+0/-53)
lib/plugins/plugin/lang/ms/lang.php (+0/-6)
lib/plugins/plugin/lang/ne/lang.php (+0/-45)
lib/plugins/plugin/lang/nl/admin_plugin.txt (+0/-3)
lib/plugins/plugin/lang/nl/lang.php (+0/-62)
lib/plugins/plugin/lang/no/admin_plugin.txt (+0/-3)
lib/plugins/plugin/lang/no/lang.php (+0/-63)
lib/plugins/plugin/lang/pl/admin_plugin.txt (+0/-5)
lib/plugins/plugin/lang/pl/lang.php (+0/-63)
lib/plugins/plugin/lang/pt-br/admin_plugin.txt (+0/-3)
lib/plugins/plugin/lang/pt-br/lang.php (+0/-64)
lib/plugins/plugin/lang/pt/admin_plugin.txt (+0/-3)
lib/plugins/plugin/lang/pt/lang.php (+0/-55)
lib/plugins/plugin/lang/ro/admin_plugin.txt (+0/-3)
lib/plugins/plugin/lang/ro/lang.php (+0/-59)
lib/plugins/plugin/lang/ru/admin_plugin.txt (+0/-5)
lib/plugins/plugin/lang/ru/lang.php (+0/-65)
lib/plugins/plugin/lang/sk/admin_plugin.txt (+0/-4)
lib/plugins/plugin/lang/sk/lang.php (+0/-54)
lib/plugins/plugin/lang/sl/admin_plugin.txt (+0/-3)
lib/plugins/plugin/lang/sl/lang.php (+0/-54)
lib/plugins/plugin/lang/sq/admin_plugin.txt (+0/-3)
lib/plugins/plugin/lang/sq/lang.php (+0/-50)
lib/plugins/plugin/lang/sr/admin_plugin.txt (+0/-3)
lib/plugins/plugin/lang/sr/lang.php (+0/-52)
lib/plugins/plugin/lang/sv/admin_plugin.txt (+0/-5)
lib/plugins/plugin/lang/sv/lang.php (+0/-63)
lib/plugins/plugin/lang/th/admin_plugin.txt (+0/-3)
lib/plugins/plugin/lang/th/lang.php (+0/-50)
lib/plugins/plugin/lang/tr/admin_plugin.txt (+0/-3)
lib/plugins/plugin/lang/tr/lang.php (+0/-53)
lib/plugins/plugin/lang/uk/admin_plugin.txt (+0/-7)
lib/plugins/plugin/lang/uk/lang.php (+0/-58)
lib/plugins/plugin/lang/vi/lang.php (+0/-5)
lib/plugins/plugin/lang/zh-tw/admin_plugin.txt (+0/-3)
lib/plugins/plugin/lang/zh-tw/lang.php (+0/-58)
lib/plugins/plugin/lang/zh/admin_plugin.txt (+0/-5)
lib/plugins/plugin/lang/zh/lang.php (+0/-63)
lib/plugins/plugin/plugin.info.txt (+0/-7)
lib/plugins/plugin/rtl.css (+0/-51)
lib/plugins/plugin/style.css (+0/-195)
lib/plugins/popularity/action.php (+6/-3)
lib/plugins/popularity/admin.php (+6/-6)
lib/plugins/popularity/helper.php (+24/-6)
lib/plugins/popularity/lang/ar/lang.php (+3/-2)
lib/plugins/popularity/lang/bg/lang.php (+3/-2)
lib/plugins/popularity/lang/ca/lang.php (+1/-0)
lib/plugins/popularity/lang/cs/lang.php (+5/-2)
lib/plugins/popularity/lang/da/lang.php (+3/-2)
lib/plugins/popularity/lang/da/submitted.txt (+1/-1)
lib/plugins/popularity/lang/de-informal/intro.txt (+1/-1)
lib/plugins/popularity/lang/de-informal/lang.php (+5/-2)
lib/plugins/popularity/lang/de/intro.txt (+1/-1)
lib/plugins/popularity/lang/de/lang.php (+3/-2)
lib/plugins/popularity/lang/el/lang.php (+4/-2)
lib/plugins/popularity/lang/eo/lang.php (+3/-2)
lib/plugins/popularity/lang/es/lang.php (+4/-2)
lib/plugins/popularity/lang/et/lang.php (+0/-7)
lib/plugins/popularity/lang/fa/lang.php (+4/-2)
lib/plugins/popularity/lang/fi/lang.php (+3/-2)
lib/plugins/popularity/lang/fr/intro.txt (+5/-5)
lib/plugins/popularity/lang/fr/lang.php (+9/-6)
lib/plugins/popularity/lang/fr/submitted.txt (+2/-1)
lib/plugins/popularity/lang/gl/lang.php (+1/-0)
lib/plugins/popularity/lang/he/lang.php (+3/-2)
lib/plugins/popularity/lang/hi/lang.php (+3/-2)
lib/plugins/popularity/lang/hr/lang.php (+0/-8)
lib/plugins/popularity/lang/hu/lang.php (+4/-2)
lib/plugins/popularity/lang/id/lang.php (+0/-6)
lib/plugins/popularity/lang/it/lang.php (+3/-2)
lib/plugins/popularity/lang/ja/lang.php (+4/-2)
lib/plugins/popularity/lang/kk/lang.php (+0/-6)
lib/plugins/popularity/lang/ko/intro.txt (+7/-7)
lib/plugins/popularity/lang/ko/lang.php (+12/-11)
lib/plugins/popularity/lang/ko/submitted.txt (+1/-1)
lib/plugins/popularity/lang/lb/lang.php (+0/-6)
lib/plugins/popularity/lang/mk/lang.php (+0/-6)
lib/plugins/popularity/lang/ms/lang.php (+0/-6)
lib/plugins/popularity/lang/ne/lang.php (+3/-2)
lib/plugins/popularity/lang/nl/lang.php (+6/-4)
lib/plugins/popularity/lang/no/lang.php (+4/-3)
lib/plugins/popularity/lang/pl/lang.php (+3/-2)
lib/plugins/popularity/lang/pt-br/lang.php (+4/-2)
lib/plugins/popularity/lang/pt/lang.php (+3/-2)
lib/plugins/popularity/lang/ru/intro.txt (+2/-2)
lib/plugins/popularity/lang/ru/lang.php (+4/-2)
lib/plugins/popularity/lang/ru/submitted.txt (+2/-1)
lib/plugins/popularity/lang/sk/lang.php (+3/-2)
lib/plugins/popularity/lang/sl/lang.php (+3/-2)
lib/plugins/popularity/lang/sv/lang.php (+5/-4)
lib/plugins/popularity/lang/tr/lang.php (+5/-2)
lib/plugins/popularity/lang/uk/lang.php (+3/-2)
lib/plugins/popularity/lang/vi/lang.php (+0/-5)
lib/plugins/popularity/lang/zh-tw/intro.txt (+7/-8)
lib/plugins/popularity/lang/zh-tw/lang.php (+8/-6)
lib/plugins/popularity/lang/zh-tw/submitted.txt (+1/-1)
lib/plugins/popularity/lang/zh/lang.php (+3/-2)
lib/plugins/popularity/plugin.info.txt (+2/-2)
lib/plugins/revert/admin.php (+12/-13)
lib/plugins/revert/lang/af/lang.php (+0/-5)
lib/plugins/revert/lang/ar/lang.php (+5/-2)
lib/plugins/revert/lang/bg/lang.php (+3/-1)
lib/plugins/revert/lang/ca/lang.php (+1/-0)
lib/plugins/revert/lang/cs/lang.php (+7/-3)
lib/plugins/revert/lang/da/lang.php (+3/-2)
lib/plugins/revert/lang/de-informal/intro.txt (+2/-2)
lib/plugins/revert/lang/de-informal/lang.php (+12/-8)
lib/plugins/revert/lang/de/intro.txt (+2/-2)
lib/plugins/revert/lang/de/lang.php (+7/-5)
lib/plugins/revert/lang/el/lang.php (+4/-5)
lib/plugins/revert/lang/eo/lang.php (+3/-2)
lib/plugins/revert/lang/es/lang.php (+4/-2)
lib/plugins/revert/lang/et/lang.php (+6/-4)
lib/plugins/revert/lang/fa/lang.php (+4/-2)
lib/plugins/revert/lang/fi/lang.php (+3/-2)
lib/plugins/revert/lang/fr/intro.txt (+2/-2)
lib/plugins/revert/lang/fr/lang.php (+9/-5)
lib/plugins/revert/lang/gl/lang.php (+1/-0)
lib/plugins/revert/lang/he/lang.php (+3/-2)
lib/plugins/revert/lang/hi/lang.php (+0/-7)
lib/plugins/revert/lang/hr/lang.php (+0/-8)
lib/plugins/revert/lang/hu/lang.php (+8/-5)
lib/plugins/revert/lang/id-ni/lang.php (+0/-7)
lib/plugins/revert/lang/id/lang.php (+0/-7)
lib/plugins/revert/lang/it/lang.php (+3/-2)
lib/plugins/revert/lang/ja/lang.php (+4/-1)
lib/plugins/revert/lang/kk/lang.php (+0/-6)
lib/plugins/revert/lang/ko/intro.txt (+2/-2)
lib/plugins/revert/lang/ko/lang.php (+14/-14)
lib/plugins/revert/lang/lb/lang.php (+0/-6)
lib/plugins/revert/lang/lt/lang.php (+0/-7)
lib/plugins/revert/lang/mk/lang.php (+0/-6)
lib/plugins/revert/lang/ms/lang.php (+0/-6)
lib/plugins/revert/lang/ne/lang.php (+3/-2)
lib/plugins/revert/lang/nl/lang.php (+5/-3)
lib/plugins/revert/lang/no/lang.php (+7/-3)
lib/plugins/revert/lang/pl/lang.php (+3/-1)
lib/plugins/revert/lang/pt-br/lang.php (+4/-2)
lib/plugins/revert/lang/pt/lang.php (+3/-2)
lib/plugins/revert/lang/ru/lang.php (+5/-2)
lib/plugins/revert/lang/sk/intro.txt (+3/-0)
lib/plugins/revert/lang/sk/lang.php (+4/-3)
lib/plugins/revert/lang/sl/lang.php (+3/-2)
lib/plugins/revert/lang/sv/lang.php (+8/-4)
lib/plugins/revert/lang/tr/lang.php (+4/-2)
lib/plugins/revert/lang/uk/lang.php (+3/-2)
lib/plugins/revert/lang/vi/lang.php (+0/-5)
lib/plugins/revert/lang/zh-tw/intro.txt (+1/-1)
lib/plugins/revert/lang/zh-tw/lang.php (+7/-5)
lib/plugins/revert/lang/zh/lang.php (+2/-2)
lib/plugins/revert/plugin.info.txt (+2/-2)
lib/plugins/safefnrecode/action.php (+2/-2)
lib/plugins/safefnrecode/plugin.info.txt (+1/-1)
lib/plugins/syntax.php (+10/-176)
lib/plugins/tag/README (+1/-1)
lib/plugins/tag/_test/topic_and_tagrefine.test.php (+107/-0)
lib/plugins/tag/_test/topic_sort.test.php (+59/-0)
lib/plugins/tag/action.php (+6/-40)
lib/plugins/tag/admin.php (+0/-65)
lib/plugins/tag/ajax.php (+0/-142)
lib/plugins/tag/conf/default.php (+0/-1)
lib/plugins/tag/conf/metadata.php (+1/-2)
lib/plugins/tag/helper.php (+53/-35)
lib/plugins/tag/lang/ar/lang.php (+15/-13)
lib/plugins/tag/lang/ar/settings.php (+17/-14)
lib/plugins/tag/lang/cs/settings.php (+0/-1)
lib/plugins/tag/lang/de-informal/lang.php (+15/-0)
lib/plugins/tag/lang/de-informal/settings.php (+21/-0)
lib/plugins/tag/lang/de/lang.php (+12/-12)
lib/plugins/tag/lang/de/settings.php (+15/-23)
lib/plugins/tag/lang/en/intro.txt (+0/-14)
lib/plugins/tag/lang/en/lang.php (+6/-1)
lib/plugins/tag/lang/en/settings.php (+1/-1)
lib/plugins/tag/lang/eo/lang.php (+15/-0)
lib/plugins/tag/lang/eo/settings.php (+21/-0)
lib/plugins/tag/lang/es/intro.txt (+0/-14)
lib/plugins/tag/lang/es/lang.php (+0/-1)
lib/plugins/tag/lang/es/settings.php (+1/-2)
lib/plugins/tag/lang/fr/lang.php (+11/-12)
lib/plugins/tag/lang/fr/settings.php (+18/-25)
lib/plugins/tag/lang/hu/lang.php (+15/-0)
lib/plugins/tag/lang/hu/settings.php (+18/-8)
lib/plugins/tag/lang/ja/lang.php (+13/-9)
lib/plugins/tag/lang/ja/settings.php (+18/-9)
lib/plugins/tag/lang/ko/lang.php (+15/-0)
lib/plugins/tag/lang/ko/settings.php (+21/-0)
lib/plugins/tag/lang/nl/lang.php (+15/-0)
lib/plugins/tag/lang/nl/settings.php (+21/-0)
lib/plugins/tag/lang/ru/lang.php (+14/-0)
lib/plugins/tag/lang/ru/settings.php (+19/-0)
lib/plugins/tag/lang/sv/lang.php (+15/-0)
lib/plugins/tag/lang/sv/settings.php (+21/-0)
lib/plugins/tag/lang/zh-tw/intro.txt (+0/-11)
lib/plugins/tag/lang/zh-tw/lang.php (+10/-3)
lib/plugins/tag/lang/zh-tw/settings.php (+7/-5)
lib/plugins/tag/lang/zh/lang.php (+22/-0)
lib/plugins/tag/lang/zh/settings.php (+29/-0)
lib/plugins/tag/plugin.info.txt (+2/-2)
lib/plugins/tag/script.js (+15/-127)
lib/plugins/tag/style.css (+5/-0)
lib/plugins/tag/syntax/count.php (+3/-3)
lib/plugins/tag/syntax/searchtags.php (+279/-0)
lib/plugins/tag/syntax/tag.php (+2/-2)
lib/plugins/tag/syntax/tagpage.php (+97/-0)
lib/plugins/tag/syntax/topic.php (+2/-4)
lib/plugins/testing/_test/dummy_plugin_integration_test.test.php (+0/-32)
lib/plugins/testing/_test/dummy_plugin_test.test.php (+0/-9)
lib/plugins/testing/action.php (+0/-19)
lib/plugins/testing/plugin.info.txt (+0/-7)
lib/plugins/usermanager/admin.php (+643/-219)
lib/plugins/usermanager/lang/ar/lang.php (+3/-2)
lib/plugins/usermanager/lang/bg/lang.php (+6/-5)
lib/plugins/usermanager/lang/ca-valencia/lang.php (+1/-1)
lib/plugins/usermanager/lang/ca/lang.php (+1/-0)
lib/plugins/usermanager/lang/cs/import.txt (+9/-0)
lib/plugins/usermanager/lang/cs/lang.php (+22/-3)
lib/plugins/usermanager/lang/da/lang.php (+21/-2)
lib/plugins/usermanager/lang/de-informal/import.txt (+7/-0)
lib/plugins/usermanager/lang/de-informal/lang.php (+21/-2)
lib/plugins/usermanager/lang/de/import.txt (+8/-0)
lib/plugins/usermanager/lang/de/lang.php (+29/-6)
lib/plugins/usermanager/lang/el/lang.php (+4/-5)
lib/plugins/usermanager/lang/en/import.txt (+9/-0)
lib/plugins/usermanager/lang/en/lang.php (+20/-0)
lib/plugins/usermanager/lang/eo/import.txt (+9/-0)
lib/plugins/usermanager/lang/eo/lang.php (+22/-2)
lib/plugins/usermanager/lang/es/lang.php (+7/-2)
lib/plugins/usermanager/lang/et/lang.php (+6/-3)
lib/plugins/usermanager/lang/fa/lang.php (+4/-2)
lib/plugins/usermanager/lang/fi/lang.php (+3/-2)
lib/plugins/usermanager/lang/fr/edit.txt (+1/-1)
lib/plugins/usermanager/lang/fr/import.txt (+11/-0)
lib/plugins/usermanager/lang/fr/lang.php (+36/-12)
lib/plugins/usermanager/lang/gl/lang.php (+1/-0)
lib/plugins/usermanager/lang/he/lang.php (+3/-2)
lib/plugins/usermanager/lang/hi/lang.php (+0/-7)
lib/plugins/usermanager/lang/hr/lang.php (+0/-8)
lib/plugins/usermanager/lang/hu/import.txt (+9/-0)
lib/plugins/usermanager/lang/hu/lang.php (+28/-6)
lib/plugins/usermanager/lang/id-ni/lang.php (+0/-7)
lib/plugins/usermanager/lang/id/lang.php (+3/-2)
lib/plugins/usermanager/lang/it/lang.php (+6/-2)
lib/plugins/usermanager/lang/ja/import.txt (+10/-0)
lib/plugins/usermanager/lang/ja/lang.php (+28/-5)
lib/plugins/usermanager/lang/kk/lang.php (+3/-0)
lib/plugins/usermanager/lang/ko/add.txt (+1/-1)
lib/plugins/usermanager/lang/ko/delete.txt (+1/-1)
lib/plugins/usermanager/lang/ko/edit.txt (+1/-1)
lib/plugins/usermanager/lang/ko/import.txt (+9/-0)
lib/plugins/usermanager/lang/ko/intro.txt (+1/-1)
lib/plugins/usermanager/lang/ko/lang.php (+45/-25)
lib/plugins/usermanager/lang/ko/list.txt (+1/-1)
lib/plugins/usermanager/lang/lb/lang.php (+0/-6)
lib/plugins/usermanager/lang/ms/lang.php (+0/-6)
lib/plugins/usermanager/lang/ne/lang.php (+3/-2)
lib/plugins/usermanager/lang/nl/import.txt (+8/-0)
lib/plugins/usermanager/lang/nl/lang.php (+23/-4)
lib/plugins/usermanager/lang/no/lang.php (+4/-3)
lib/plugins/usermanager/lang/pl/lang.php (+3/-2)
lib/plugins/usermanager/lang/pt-br/lang.php (+25/-2)
lib/plugins/usermanager/lang/pt/import.txt (+9/-0)
lib/plugins/usermanager/lang/pt/lang.php (+15/-2)
lib/plugins/usermanager/lang/ru/import.txt (+9/-0)
lib/plugins/usermanager/lang/ru/lang.php (+21/-3)
lib/plugins/usermanager/lang/sk/import.txt (+9/-0)
lib/plugins/usermanager/lang/sk/lang.php (+22/-3)
lib/plugins/usermanager/lang/sl/lang.php (+23/-2)
lib/plugins/usermanager/lang/sv/lang.php (+18/-4)
lib/plugins/usermanager/lang/tr/lang.php (+4/-2)
lib/plugins/usermanager/lang/uk/lang.php (+2/-2)
lib/plugins/usermanager/lang/vi/lang.php (+0/-5)
lib/plugins/usermanager/lang/zh-tw/import.txt (+9/-0)
lib/plugins/usermanager/lang/zh-tw/lang.php (+45/-13)
lib/plugins/usermanager/lang/zh/import.txt (+7/-0)
lib/plugins/usermanager/lang/zh/lang.php (+24/-2)
lib/plugins/usermanager/plugin.info.txt (+2/-2)
lib/plugins/usermanager/style.css (+13/-0)
lib/scripts/behaviour.js (+40/-38)
lib/scripts/compatibility.js (+30/-7)
lib/scripts/cookie.js (+1/-1)
lib/scripts/edit.js (+13/-7)
lib/scripts/editor.js (+5/-4)
lib/scripts/fileuploaderextended.js (+2/-1)
lib/scripts/helpers.js (+15/-19)
lib/scripts/jquery/jquery-migrate.js (+521/-0)
lib/scripts/jquery/jquery-migrate.min.js (+2/-0)
lib/scripts/jquery/jquery-ui-theme/smoothness.css (+962/-352)
lib/scripts/jquery/jquery-ui.js (+12389/-9148)
lib/scripts/jquery/jquery-ui.min.js (+7/-414)
lib/scripts/jquery/jquery.cookie.js (+94/-40)
lib/scripts/jquery/jquery.js (+7139/-6396)
lib/scripts/jquery/jquery.min.js (+5/-4)
lib/scripts/jquery/update.sh (+25/-7)
lib/scripts/linkwiz.js (+27/-13)
lib/scripts/media.js (+0/-19)
lib/scripts/page.js (+4/-2)
lib/scripts/qsearch.js (+176/-124)
lib/scripts/textselection.js (+13/-15)
lib/scripts/toolbar.js (+29/-15)
lib/scripts/tree.js (+17/-3)
lib/scripts/tw-sack.js (+1/-0)
lib/styles/geshi.less (+127/-0)
lib/styles/screen.css (+10/-23)
lib/tpl/default/_admin.css (+0/-48)
lib/tpl/default/_fileuploader.css (+0/-111)
lib/tpl/default/_linkwiz.css (+0/-40)
lib/tpl/default/_mediamanager.css (+0/-475)
lib/tpl/default/_mediaoptions.css (+0/-18)
lib/tpl/default/_subscription.css (+0/-21)
lib/tpl/default/_tabs.css (+0/-50)
lib/tpl/default/design.css (+0/-853)
lib/tpl/default/detail.php (+0/-86)
lib/tpl/default/footer.html (+0/-41)
lib/tpl/default/layout.css (+0/-79)
lib/tpl/default/main.php (+0/-135)
lib/tpl/default/media.css (+0/-224)
lib/tpl/default/mediamanager.php (+0/-45)
lib/tpl/default/print.css (+0/-228)
lib/tpl/default/rtl.css (+0/-162)
lib/tpl/default/style.ini (+0/-77)
lib/tpl/default/template.info.txt (+0/-7)
lib/tpl/dokuwiki/css/_admin.css (+1/-1)
lib/tpl/dokuwiki/css/_diff.css (+74/-2)
lib/tpl/dokuwiki/css/_edit.css (+6/-7)
lib/tpl/dokuwiki/css/_fileuploader.css (+4/-4)
lib/tpl/dokuwiki/css/_footnotes.css (+1/-1)
lib/tpl/dokuwiki/css/_forms.css (+17/-2)
lib/tpl/dokuwiki/css/_media_fullscreen.css (+20/-21)
lib/tpl/dokuwiki/css/_media_popup.css (+7/-6)
lib/tpl/dokuwiki/css/_modal.css (+5/-5)
lib/tpl/dokuwiki/css/_search.css (+3/-3)
lib/tpl/dokuwiki/css/_tabs.css (+7/-7)
lib/tpl/dokuwiki/css/_toc.css (+1/-1)
lib/tpl/dokuwiki/css/basic.css (+0/-421)
lib/tpl/dokuwiki/css/basic.less (+466/-0)
lib/tpl/dokuwiki/css/content.css (+0/-362)
lib/tpl/dokuwiki/css/content.less (+394/-0)
lib/tpl/dokuwiki/css/design.css (+0/-404)
lib/tpl/dokuwiki/css/design.less (+439/-0)
lib/tpl/dokuwiki/css/includes.css (+0/-4)
lib/tpl/dokuwiki/css/mixins.less (+10/-0)
lib/tpl/dokuwiki/css/mobile.css (+0/-284)
lib/tpl/dokuwiki/css/mobile.less (+326/-0)
lib/tpl/dokuwiki/css/pagetools.css (+0/-334)
lib/tpl/dokuwiki/css/pagetools.less (+234/-0)
lib/tpl/dokuwiki/css/print.css (+59/-40)
lib/tpl/dokuwiki/css/structure.css (+0/-81)
lib/tpl/dokuwiki/css/structure.less (+89/-0)
lib/tpl/dokuwiki/detail.php (+19/-43)
lib/tpl/dokuwiki/main.php (+24/-11)
lib/tpl/dokuwiki/mediamanager.php (+1/-1)
lib/tpl/dokuwiki/script.js (+5/-6)
lib/tpl/dokuwiki/style.ini (+32/-22)
lib/tpl/dokuwiki/template.info.txt (+1/-1)
lib/tpl/dokuwiki/tpl_footer.php (+2/-1)
lib/tpl/dokuwiki/tpl_header.php (+2/-2)
lib/tpl/ubuntu-2010/main.php (+1/-1)
To merge this branch: bzr merge lp:~yoboy-leguesh/ubuntu-fr-doc/maj140505
Reviewer Review Type Date Requested Status
Ubuntu-fr-webteam Pending
Review via email: mp+223154@code.launchpad.net

Description of the change

Mise à jour vers Dokuwiki 2014-05-05
Correction de divers petits bugs

To post a comment you must log in.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file '.htaccess.dist'
2--- .htaccess.dist 2011-01-24 08:52:15 +0000
3+++ .htaccess.dist 2014-06-14 13:58:29 +0000
4@@ -8,14 +8,22 @@
5 <Files ~ "^([\._]ht|README$|VERSION$|COPYING$)">
6 Order allow,deny
7 Deny from all
8- Satisfy All
9 </Files>
10
11 ## Uncomment these rules if you want to have nice URLs using
12 ## $conf['userewrite'] = 1 - not needed for rewrite mode 2
13 #RewriteEngine on
14 #
15-## Not all installations will require the following line. If you do,
16+#RewriteRule ^_media/(.*) lib/exe/fetch.php?media=$1 [QSA,L]
17+#RewriteRule ^_detail/(.*) lib/exe/detail.php?media=$1 [QSA,L]
18+#RewriteRule ^_export/([^/]+)/(.*) doku.php?do=export_$1&id=$2 [QSA,L]
19+#RewriteRule ^$ doku.php [L]
20+#RewriteCond %{REQUEST_FILENAME} !-f
21+#RewriteCond %{REQUEST_FILENAME} !-d
22+#RewriteRule (.*) doku.php?id=$1 [QSA,L]
23+#RewriteRule ^index.php$ doku.php
24+#
25+## Not all installations will require the following line. If you do,
26 ## change "/dokuwiki" to the path to your dokuwiki directory relative
27 ## to your document root.
28 #RewriteBase /dokuwiki
29@@ -25,12 +33,3 @@
30 ## rules if your server setup allows HTTPS.
31 #RewriteCond %{HTTPS} !=on
32 #RewriteRule ^lib/exe/xmlrpc.php$ https://%{SERVER_NAME}%{REQUEST_URI} [L,R=301]
33-#
34-#RewriteRule ^_media/(.*) lib/exe/fetch.php?media=$1 [QSA,L]
35-#RewriteRule ^_detail/(.*) lib/exe/detail.php?media=$1 [QSA,L]
36-#RewriteRule ^_export/([^/]+)/(.*) doku.php?do=export_$1&id=$2 [QSA,L]
37-#RewriteRule ^$ doku.php [L]
38-#RewriteCond %{REQUEST_FILENAME} !-f
39-#RewriteCond %{REQUEST_FILENAME} !-d
40-#RewriteRule (.*) doku.php?id=$1 [QSA,L]
41-#RewriteRule ^index.php$ doku.php
42
43=== modified file 'README'
44--- README 2012-01-29 10:04:35 +0000
45+++ README 2014-06-14 13:58:29 +0000
46@@ -4,7 +4,7 @@
47 For Installation Instructions see
48 http://www.dokuwiki.org/install
49
50-DokuWiki - 2004-2012 (c) Andreas Gohr <andi@splitbrain.org>
51+DokuWiki - 2004-2014 (c) Andreas Gohr <andi@splitbrain.org>
52 and the DokuWiki Community
53 See COPYING and file headers for license info
54
55
56=== added file 'UFR-modifications'
57--- UFR-modifications 1970-01-01 00:00:00 +0000
58+++ UFR-modifications 2014-06-14 13:58:29 +0000
59@@ -0,0 +1,69 @@
60+/**
61+ * Modifications apportées par rapport à Dokuwiki
62+ *
63+ * Ensemble des éléments à modifier pour obtenir la version de Dokuwiki utilisée
64+ * par http://doc.ubuntu-fr.org
65+ *
66+ * version du 08/06/2014
67+ */
68+
69+*--------------------------------------------------
70+* Plugins ajoutés
71+*--------------------------------------------------
72+backlinks2
73+box
74+captcha
75+cloud
76+forcepreview
77+mediaplus
78+note
79+orphanswanted
80+pagelist
81+pageredirect
82+tag
83+tagnotes
84+varnish
85+
86+*--------------------------------------------------
87+* Fichiers modifiés
88+*--------------------------------------------------
89+conf/mime.conf
90+doku.php
91+inc/io.php
92+inc/pageutils.php
93+inc/search.php
94+inc/template.php
95+lib/exe/indexer.php
96+
97+*--------------------------------------------------
98+* Fichiers ajoutés
99+*--------------------------------------------------
100+favicon.ico
101+maintenance-search.php
102+robots.txt.dist
103+bin/update_indexer.sh
104+conf/acl.auth.php
105+conf/acronyms.local.conf
106+conf/entities.local.conf
107+conf/interwiki.local.conf
108+conf/lang/fr/edit.txt
109+conf/lang/fr/mailtext.txt
110+conf/license.local.php
111+conf/local.php
112+conf/local.protected.php.dist
113+conf/mysql.conf.php
114+conf/plugins.local.php
115+conf/scheme.local.conf
116+conf/userscript.js
117+inc/preload.php
118+lib/images/link_icon.gif
119+lib/images/interwiki/apps.png
120+lib/images/interwiki/du.png
121+lib/images/interwiki/gufr.png
122+lib/images/interwiki/man.png
123+lib/images/interwiki/pu.png
124+lib/images/interwiki/wu.png
125+lib/images/toolbar/apt_url.png
126+lib/images/toolbar/editer_fichier.png
127+lib/images/toolbar/install_paquet.png
128+
129
130=== modified file 'VERSION'
131--- VERSION 2012-10-21 21:14:10 +0000
132+++ VERSION 2014-06-14 13:58:29 +0000
133@@ -1,1 +1,1 @@
134-2012-10-13 "Adora Belle"
135+2014-05-05 "Ponder Stibbons"
136
137=== modified file 'bin/.htaccess'
138--- bin/.htaccess 2007-12-12 03:37:21 +0000
139+++ bin/.htaccess 2014-06-14 13:58:29 +0000
140@@ -1,2 +1,2 @@
141-order allow,deny
142-deny from all
143+order allow,deny
144+deny from all
145
146=== modified file 'bin/dwpage.php'
147--- bin/dwpage.php 2012-10-21 21:14:10 +0000
148+++ bin/dwpage.php 2014-06-14 13:58:29 +0000
149@@ -13,7 +13,7 @@
150 function usage($action) {
151 switch ( $action ) {
152 case 'checkout':
153- print "Usage: dwpage.php [opts] checkout <wiki:page> [working_file]
154+ print "Usage: dwpage.php [opts] checkout <wiki:page> [working_file]
155
156 Checks out a file from the repository, using the wiki id and obtaining
157 a lock for the page.
158@@ -30,7 +30,7 @@
159 ";
160 break;
161 case 'commit':
162- print "Usage: dwpage.php [opts] -m \"Msg\" commit <working_file> <wiki:page>
163+ print "Usage: dwpage.php [opts] -m \"Msg\" commit <working_file> <wiki:page>
164
165 Checks in the working_file into the repository using the specified
166 wiki id, archiving the previous version.
167@@ -46,7 +46,7 @@
168 ";
169 break;
170 case 'lock':
171- print "Usage: dwpage.php [opts] lock <wiki:page>
172+ print "Usage: dwpage.php [opts] lock <wiki:page>
173
174 Obtains or updates a lock for a wiki page
175
176@@ -59,7 +59,7 @@
177 ";
178 break;
179 case 'unlock':
180- print "Usage: dwpage.php [opts] unlock <wiki:page>
181+ print "Usage: dwpage.php [opts] unlock <wiki:page>
182
183 Removes a lock for a wiki page.
184
185
186=== added file 'bin/gittool.php'
187--- bin/gittool.php 1970-01-01 00:00:00 +0000
188+++ bin/gittool.php 2014-06-14 13:58:29 +0000
189@@ -0,0 +1,340 @@
190+#!/usr/bin/php
191+<?php
192+
193+if('cli' != php_sapi_name()) die();
194+ini_set('memory_limit', '128M');
195+if(!defined('DOKU_INC')) define('DOKU_INC', realpath(dirname(__FILE__).'/../').'/');
196+define('NOSESSION', 1);
197+require_once(DOKU_INC.'inc/init.php');
198+
199+$GitToolCLI = new GitToolCLI();
200+
201+array_shift($argv);
202+$command = array_shift($argv);
203+
204+switch($command) {
205+ case '':
206+ case 'help':
207+ $GitToolCLI->cmd_help();
208+ break;
209+ case 'clone':
210+ $GitToolCLI->cmd_clone($argv);
211+ break;
212+ case 'install':
213+ $GitToolCLI->cmd_install($argv);
214+ break;
215+ case 'repo':
216+ case 'repos':
217+ $GitToolCLI->cmd_repos();
218+ break;
219+ default:
220+ $GitToolCLI->cmd_git($command, $argv);
221+}
222+
223+/**
224+ * Easily manage DokuWiki git repositories
225+ *
226+ * @author Andreas Gohr <andi@splitbrain.org>
227+ */
228+class GitToolCLI {
229+ private $color = true;
230+
231+ public function cmd_help() {
232+ echo <<<EOF
233+Usage: gittool.php <command> [parameters]
234+
235+Manage git repositories for DokuWiki and its plugins and templates.
236+
237+EXAMPLE
238+
239+$> ./bin/gittool.php clone gallery template:ach
240+$> ./bin/gittool.php repos
241+$> ./bin/gittool.php origin -v
242+
243+COMMANDS
244+
245+help
246+ This help screen
247+
248+clone <extensions>
249+ Tries to install a known plugin or template (prefix with template:) via
250+ git. Uses the DokuWiki.org plugin repository to find the proper git
251+ repository. Multiple extensions can be given as parameters
252+
253+install <extensions>
254+ The same as clone, but when no git source repository can be found, the
255+ extension is installed via download
256+
257+repos
258+ Lists all git repositories found in this DokuWiki installation
259+
260+<any>
261+ Any unknown commands are assumed to be arguments to git and will be
262+ executed in all repositories found within this DokuWiki installation
263+
264+EOF;
265+ }
266+
267+ /**
268+ * Tries to install the given extensions using git clone
269+ *
270+ * @param $extensions
271+ */
272+ public function cmd_clone($extensions) {
273+ $errors = array();
274+ $succeeded = array();
275+
276+ foreach($extensions as $ext) {
277+ $repo = $this->getSourceRepo($ext);
278+
279+ if(!$repo) {
280+ $this->msg_error("could not find a repository for $ext");
281+ $errors[] = $ext;
282+ } else {
283+ if($this->cloneExtension($ext, $repo)) {
284+ $succeeded[] = $ext;
285+ } else {
286+ $errors[] = $ext;
287+ }
288+ }
289+ }
290+
291+ echo "\n";
292+ if($succeeded) $this->msg_success('successfully cloned the following extensions: '.join(', ', $succeeded));
293+ if($errors) $this->msg_error('failed to clone the following extensions: '.join(', ', $errors));
294+ }
295+
296+ /**
297+ * Tries to install the given extensions using git clone with fallback to install
298+ *
299+ * @param $extensions
300+ */
301+ public function cmd_install($extensions) {
302+ $errors = array();
303+ $succeeded = array();
304+
305+ foreach($extensions as $ext) {
306+ $repo = $this->getSourceRepo($ext);
307+
308+ if(!$repo) {
309+ $this->msg_info("could not find a repository for $ext");
310+ if($this->downloadExtension($ext)) {
311+ $succeeded[] = $ext;
312+ } else {
313+ $errors[] = $ext;
314+ }
315+ } else {
316+ if($this->cloneExtension($ext, $repo)) {
317+ $succeeded[] = $ext;
318+ } else {
319+ $errors[] = $ext;
320+ }
321+ }
322+ }
323+
324+ echo "\n";
325+ if($succeeded) $this->msg_success('successfully installed the following extensions: '.join(', ', $succeeded));
326+ if($errors) $this->msg_error('failed to install the following extensions: '.join(', ', $errors));
327+ }
328+
329+ /**
330+ * Executes the given git command in every repository
331+ *
332+ * @param $cmd
333+ * @param $arg
334+ */
335+ public function cmd_git($cmd, $arg) {
336+ $repos = $this->findRepos();
337+
338+ $shell = array_merge(array('git', $cmd), $arg);
339+ $shell = array_map('escapeshellarg', $shell);
340+ $shell = join(' ', $shell);
341+
342+ foreach($repos as $repo) {
343+ if(!@chdir($repo)) {
344+ $this->msg_error("Could not change into $repo");
345+ continue;
346+ }
347+
348+ echo "\n";
349+ $this->msg_info("executing $shell in $repo");
350+ $ret = 0;
351+ system($shell, $ret);
352+
353+ if($ret == 0) {
354+ $this->msg_success("git succeeded in $repo");
355+ } else {
356+ $this->msg_error("git failed in $repo");
357+ }
358+ }
359+ }
360+
361+ /**
362+ * Simply lists the repositories
363+ */
364+ public function cmd_repos() {
365+ $repos = $this->findRepos();
366+ foreach($repos as $repo) {
367+ echo "$repo\n";
368+ }
369+ }
370+
371+ /**
372+ * Install extension from the given download URL
373+ *
374+ * @param string $ext
375+ * @return bool
376+ */
377+ private function downloadExtension($ext) {
378+ /** @var helper_plugin_extension_extension $plugin */
379+ $plugin = plugin_load('helper', 'extension_extension');
380+ if(!$ext) die("extension plugin not available, can't continue");
381+ $plugin->setExtension($ext);
382+
383+ $url = $plugin->getDownloadURL();
384+ if(!$url) {
385+ $this->msg_error("no download URL for $ext");
386+ return false;
387+ }
388+
389+ $ok = false;
390+ try {
391+ $this->msg_info("installing $ext via download from $url");
392+ $ok = $plugin->installFromURL($url);
393+ } catch(Exception $e) {
394+ $this->msg_error($e->getMessage());
395+ }
396+
397+ if($ok) {
398+ $this->msg_success("installed $ext via download");
399+ return true;
400+ } else {
401+ $this->msg_success("failed to install $ext via download");
402+ return false;
403+ }
404+ }
405+
406+ /**
407+ * Clones the extension from the given repository
408+ *
409+ * @param string $ext
410+ * @param string $repo
411+ * @return bool
412+ */
413+ private function cloneExtension($ext, $repo) {
414+ if(substr($ext, 0, 9) == 'template:') {
415+ $target = fullpath(tpl_incdir().'../'.substr($ext, 9));
416+ } else {
417+ $target = DOKU_PLUGIN.$ext;
418+ }
419+
420+ $this->msg_info("cloning $ext from $repo to $target");
421+ $ret = 0;
422+ system("git clone $repo $target", $ret);
423+ if($ret === 0) {
424+ $this->msg_success("cloning of $ext succeeded");
425+ return true;
426+ } else {
427+ $this->msg_error("cloning of $ext failed");
428+ return false;
429+ }
430+ }
431+
432+ /**
433+ * Returns all git repositories in this DokuWiki install
434+ *
435+ * Looks in root, template and plugin directories only.
436+ *
437+ * @return array
438+ */
439+ private function findRepos() {
440+ $this->msg_info('Looking for .git directories');
441+ $data = array_merge(
442+ glob(DOKU_INC.'.git', GLOB_ONLYDIR),
443+ glob(DOKU_PLUGIN.'*/.git', GLOB_ONLYDIR),
444+ glob(fullpath(tpl_incdir().'../').'/*/.git', GLOB_ONLYDIR)
445+ );
446+
447+ if(!$data) {
448+ $this->msg_error('Found no .git directories');
449+ } else {
450+ $this->msg_success('Found '.count($data).' .git directories');
451+ }
452+ $data = array_map('fullpath', array_map('dirname', $data));
453+ return $data;
454+ }
455+
456+ /**
457+ * Returns the repository for the given extension
458+ *
459+ * @param $extension
460+ * @return bool|string
461+ */
462+ private function getSourceRepo($extension) {
463+ /** @var helper_plugin_extension_extension $ext */
464+ $ext = plugin_load('helper', 'extension_extension');
465+ if(!$ext) die("extension plugin not available, can't continue");
466+ $ext->setExtension($extension);
467+
468+ $repourl = $ext->getSourcerepoURL();
469+ if(!$repourl) return false;
470+
471+ // match github repos
472+ if(preg_match('/github\.com\/([^\/]+)\/([^\/]+)/i', $repourl, $m)) {
473+ $user = $m[1];
474+ $repo = $m[2];
475+ return 'https://github.com/'.$user.'/'.$repo.'.git';
476+ }
477+
478+ // match gitorious repos
479+ if(preg_match('/gitorious.org\/([^\/]+)\/([^\/]+)?/i', $repourl, $m)) {
480+ $user = $m[1];
481+ $repo = $m[2];
482+ if(!$repo) $repo = $user;
483+
484+ return 'https://git.gitorious.org/'.$user.'/'.$repo.'.git';
485+ }
486+
487+ // match bitbucket repos - most people seem to use mercurial there though
488+ if(preg_match('/bitbucket\.org\/([^\/]+)\/([^\/]+)/i', $repourl, $m)) {
489+ $user = $m[1];
490+ $repo = $m[2];
491+ return 'https://bitbucket.org/'.$user.'/'.$repo.'.git';
492+ }
493+
494+ return false;
495+ }
496+
497+ /**
498+ * Print an error message
499+ *
500+ * @param $string
501+ */
502+ private function msg_error($string) {
503+ if($this->color) echo "\033[31m"; // red
504+ echo "E: $string\n";
505+ if($this->color) echo "\033[37m"; // reset
506+ }
507+
508+ /**
509+ * Print a success message
510+ *
511+ * @param $string
512+ */
513+ private function msg_success($string) {
514+ if($this->color) echo "\033[32m"; // green
515+ echo "S: $string\n";
516+ if($this->color) echo "\033[37m"; // reset
517+ }
518+
519+ /**
520+ * Print an info message
521+ *
522+ * @param $string
523+ */
524+ private function msg_info($string) {
525+ if($this->color) echo "\033[36m"; // cyan
526+ echo "I: $string\n";
527+ if($this->color) echo "\033[37m"; // reset
528+ }
529+}
530\ No newline at end of file
531
532=== modified file 'bin/indexer.php'
533--- bin/indexer.php 2012-01-29 10:04:35 +0000
534+++ bin/indexer.php 2014-06-14 13:58:29 +0000
535@@ -5,11 +5,6 @@
536 ini_set('memory_limit','128M');
537 if(!defined('DOKU_INC')) define('DOKU_INC',realpath(dirname(__FILE__).'/../').'/');
538 require_once(DOKU_INC.'inc/init.php');
539-require_once(DOKU_INC.'inc/common.php');
540-require_once(DOKU_INC.'inc/pageutils.php');
541-require_once(DOKU_INC.'inc/search.php');
542-require_once(DOKU_INC.'inc/indexer.php');
543-require_once(DOKU_INC.'inc/auth.php');
544 require_once(DOKU_INC.'inc/cliopts.php');
545 session_write_close();
546
547@@ -67,10 +62,6 @@
548
549 function _update(){
550 global $conf;
551- global $INDEXER;
552-
553- $INDEXER = idx_get_indexer();
554-
555 $data = array();
556 _quietecho("Searching pages... ");
557 search($data,$conf['datadir'],'search_allpages',array('skipacl' => true));
558@@ -82,7 +73,6 @@
559 }
560
561 function _index($id){
562- global $INDEXER;
563 global $CLEAR;
564 global $QUIET;
565
566@@ -92,62 +82,12 @@
567 }
568
569 /**
570- * lock the indexer system
571- */
572-function _lock(){
573- global $conf;
574- $lock = $conf['lockdir'].'/_indexer.lock';
575- $said = false;
576- while(!@mkdir($lock, $conf['dmode'])){
577- if(time()-@filemtime($lock) > 60*5){
578- // looks like a stale lock - remove it
579- @rmdir($lock);
580- }else{
581- if($said){
582- _quietecho(".");
583- }else{
584- _quietecho("Waiting for lockfile (max. 5 min)");
585- $said = true;
586- }
587- sleep(15);
588- }
589- }
590- if($conf['dperm']) chmod($lock, $conf['dperm']);
591- if($said) _quietecho("\n");
592-}
593-
594-/**
595- * unlock the indexer sytem
596- */
597-function _unlock(){
598- global $conf;
599- $lock = $conf['lockdir'].'/_indexer.lock';
600- @rmdir($lock);
601-}
602-
603-/**
604 * Clear all index files
605 */
606 function _clearindex(){
607- global $conf;
608- _lock();
609 _quietecho("Clearing index... ");
610- io_saveFile($conf['indexdir'].'/page.idx','');
611- io_saveFile($conf['indexdir'].'/title.idx','');
612- io_saveFile($conf['indexdir'].'/pageword.idx','');
613- io_saveFile($conf['indexdir'].'/metadata.idx','');
614- $dir = @opendir($conf['indexdir']);
615- if($dir!==false){
616- while(($f = readdir($dir)) !== false){
617- if(substr($f,-4)=='.idx' &&
618- (substr($f,0,1)=='i' || substr($f,0,1)=='w'
619- || substr($f,-6)=='_w.idx' || substr($f,-6)=='_i.idx' || substr($f,-6)=='_p.idx'))
620- @unlink($conf['indexdir']."/$f");
621- }
622- }
623- @unlink($conf['indexdir'].'/lengths.idx');
624+ idx_get_indexer()->clear();
625 _quietecho("done.\n");
626- _unlock();
627 }
628
629 function _quietecho($msg) {
630
631=== modified file 'bin/striplangs.php' (properties changed: -x to +x)
632--- bin/striplangs.php 2012-01-29 10:04:35 +0000
633+++ bin/striplangs.php 2014-06-14 13:58:29 +0000
634@@ -15,7 +15,7 @@
635 function usage($show_examples = false) {
636 print "Usage: striplangs.php [-h [-x]] [-e] [-k lang1[,lang2]..[,langN]]
637
638- Removes all languages from the instalation, besides the ones
639+ Removes all languages from the installation, besides the ones
640 after the -k option. English language is never removed!
641
642 OPTIONS
643@@ -127,7 +127,7 @@
644
645 // ! always enforce 'en' lang when using '--keep' (DW relies on it)
646 if ( !isset($langs['en']) ) {
647- $langs[]='en';
648+ $langs[]='en';
649 }
650 } elseif ( $OPTS->has('e') or $OPTS->has('english') ) {
651 // '--english' was specified strip everything besides 'en'
652
653=== removed file 'bin/unusedmedia.php'
654--- bin/unusedmedia.php 2011-01-24 08:52:15 +0000
655+++ bin/unusedmedia.php 1970-01-01 00:00:00 +0000
656@@ -1,213 +0,0 @@
657-#!/usr/bin/php
658-<?php
659-if ('cli' != php_sapi_name()) die();
660-
661-#------------------------------------------------------------------------------
662-ini_set('memory_limit','128M');
663-if(!defined('DOKU_INC')) define('DOKU_INC',realpath(dirname(__FILE__).'/../').'/');
664-
665-$_SERVER['REMOTE_USER'] = 'docbot';
666-
667-require_once DOKU_INC.'inc/init.php';
668-require_once DOKU_INC.'inc/common.php';
669-require_once DOKU_INC.'inc/search.php';
670-require_once DOKU_INC.'inc/cliopts.php';
671-require_once DOKU_INC.'inc/media.php';
672-
673-#------------------------------------------------------------------------------
674-function usage() {
675- print "Usage: unusedmedia.php
676-
677- Outputs a list of media files not used (files on our server but with
678- no link on the pages ).
679-
680- OPTIONS
681- -h, --help get help
682- -d, --delete delete the media files
683-";
684-}
685-
686-#------------------------------------------------------------------------------
687-define ('DW_DIR_CONTINUE',1);
688-define ('DW_DIR_NS',2);
689-define ('DW_DIR_PAGE',3);
690-
691-#------------------------------------------------------------------------------
692-function dw_dir_filter($entry, $basepath) {
693- if ($entry == '.' || $entry == '..' ) {
694- return DW_DIR_CONTINUE;
695- }
696- if ( is_dir($basepath . '/' . $entry) ) {
697- if ( strpos($entry, '_') === 0 ) {
698- return DW_DIR_CONTINUE;
699- }
700- return DW_DIR_NS;
701- }
702- if ( preg_match('/\.txt$/',$entry) ) {
703- return DW_DIR_PAGE;
704- }
705- return DW_DIR_CONTINUE;
706-}
707-
708-#------------------------------------------------------------------------------
709-function dw_get_pages($dir) {
710- static $trunclen = NULL;
711- if ( !$trunclen ) {
712- global $conf;
713- $trunclen = strlen($conf['datadir'].':');
714- }
715-
716- if ( !is_dir($dir) ) {
717- fwrite( STDERR, "Unable to read directory $dir\n");
718- exit(1);
719- }
720-
721- $pages = array();
722- $dh = opendir($dir);
723- while ( false !== ( $entry = readdir($dh) ) ) {
724- $status = dw_dir_filter($entry, $dir);
725- if ( $status == DW_DIR_CONTINUE ) {
726- continue;
727- } else if ( $status == DW_DIR_NS ) {
728- $pages = array_merge($pages, dw_get_pages($dir . '/' . $entry));
729- } else {
730- $page = array(
731- 'id' => pathID(substr($dir.'/'.$entry,$trunclen)),
732- 'file'=> $dir.'/'.$entry,
733- );
734- $pages[] = $page;
735- }
736- }
737- closedir($dh);
738- return $pages;
739-}
740-
741-#------------------------------------------------------------------------------
742-function dw_images_links($page) {
743- global $conf;
744- $instructions = p_get_instructions(file_get_contents($page['file']));
745- $links = array();
746- $cns = getNS($page['id']);
747- $exists = false;
748- foreach($instructions as $ins){
749- if($ins[0] == 'internalmedia' ){
750- $src = $ins[1][0];
751- resolve_mediaid($cns,$src,$exists);
752- if ( $exists ) {
753- list($src) = explode('#',$src); //record images without hashs
754- $links[] = $src;
755- }
756- }
757- }
758- return $links;
759-}
760-
761-
762-#------------------------------------------------------------------------------
763-function dw_dir_imgfilter($entry, $basepath) {
764- if ($entry == '.' || $entry == '..' ) {
765- return DW_DIR_CONTINUE;
766- }
767- if ( is_dir($basepath . '/' . $entry) ) {
768- if ( strpos($entry, '_') === 0 ) {
769- return DW_DIR_CONTINUE;
770- }
771- return DW_DIR_NS;
772- }
773- if ( $entry == '_files.index' || $entry == '_dirs.index') {
774- return DW_DIR_CONTINUE;
775- }
776- return DW_DIR_PAGE;
777-}
778-
779-#------------------------------------------------------------------------------
780-function dw_get_images($dir) {
781- static $trunclen = NULL;
782- if ( !$trunclen ) {
783- global $conf;
784- $trunclen = strlen($conf['mediadir'].':');
785- }
786-
787- if ( !is_dir($dir) ) {
788- fwrite( STDERR, "Unable to read directory $dir\n");
789- exit(1);
790- }
791-
792- $images = array();
793- $dh = opendir($dir);
794- while ( false !== ( $entry = readdir($dh) ) ) {
795- $status = dw_dir_imgfilter($entry, $dir);
796- if ( $status == DW_DIR_CONTINUE ) {
797- continue;
798- } else if ( $status == DW_DIR_NS ) {
799- $images = array_merge($images, dw_get_images($dir . '/' . $entry));
800- } else {
801- $images[] = pathID(substr($dir.'/'.$entry,$trunclen));
802- }
803- }
804- closedir($dh);
805- return $images;
806-}
807-
808-
809-
810-#------------------------------------------------------------------------------
811-$OPTS = Doku_Cli_Opts::getOptions(__FILE__,'hd',array('help','delete'));
812-
813-if ( $OPTS->isError() ) {
814- fwrite( STDERR, $OPTS->getMessage() . "\n");
815- exit(1);
816-}
817-
818-if ( $OPTS->has('h') or $OPTS->has('help') ) {
819- usage();
820- exit(0);
821-}
822-
823-$delete = false;
824-if ( $OPTS->has('d') or $OPTS->has('delete') ) {
825- $delete = true;
826-}
827-
828-$START_MEDIA_DIR = $conf['mediadir'];
829-$START_DIR = $conf['datadir'];
830-
831-if ( $OPTS->numArgs() == 1 ) {
832- $START_DIR .= '/' . $OPTS->arg(0);
833-}
834-
835-#------------------------------------------------------------------------------
836-$MEDIA_FILES = array();
837-$MEDIA_FILES = dw_get_images($START_MEDIA_DIR);
838-sort($MEDIA_FILES);
839-print count($MEDIA_FILES)." fichiers multimedias enregistrés.\n";
840-
841-
842-$USED_FILES = array();
843-foreach ( dw_get_pages($START_DIR) as $WIKI_PAGE ) {
844- $USED_FILES = array_merge($USED_FILES,dw_images_links($WIKI_PAGE));
845-}
846-$USED_FILES = array_unique($USED_FILES);
847-sort($USED_FILES);
848-print count($USED_FILES)." fichiers multimedias utilisés.\n";
849-
850-$NO_USE_FILES = array();
851-$NO_USE_FILES = array_diff($MEDIA_FILES, $USED_FILES);
852-
853-foreach ( $NO_USE_FILES as $NO_USE_FILE ) {
854- if ($delete) {
855- $file = mediaFN($NO_USE_FILE);
856- $deleted = false;
857- $deleted = @unlink($file);
858- if($deleted){
859- addMediaLogEntry(time(), $NO_USE_FILE, DOKU_CHANGE_TYPE_DELETE);
860- $nsdel = io_sweepNS($NO_USE_FILE,'mediadir');
861- }
862- if($deleted) {
863- print $NO_USE_FILE." --- deleted ---\n";
864- }
865- } else {
866- print $NO_USE_FILE."\n";
867- }
868-}
869-exit(0);
870
871=== modified file 'bin/wantedpages.php'
872--- bin/wantedpages.php 2010-03-02 21:22:02 +0000
873+++ bin/wantedpages.php 2014-06-14 13:58:29 +0000
874@@ -49,7 +49,7 @@
875
876 #------------------------------------------------------------------------------
877 function dw_get_pages($dir) {
878- static $trunclen = NULL;
879+ static $trunclen = null;
880 if ( !$trunclen ) {
881 global $conf;
882 $trunclen = strlen($conf['datadir'].':');
883@@ -92,7 +92,7 @@
884 $mid = $ins[1][0];
885 resolve_pageid($cns,$mid,$exists);
886 if ( !$exists ) {
887- list($mid) = explode('#',$mid); //record pages without hashs
888+ list($mid) = explode('#',$mid); //record pages without hashs
889 $links[] = $mid;
890 }
891 }
892
893=== modified file 'conf/.htaccess'
894--- conf/.htaccess 2012-01-29 10:04:35 +0000
895+++ conf/.htaccess 2014-06-14 13:58:29 +0000
896@@ -1,4 +1,3 @@
897 ## no access to the conf directory
898 order allow,deny
899 deny from all
900-Satisfy All
901
902=== modified file 'conf/acronyms.conf'
903--- conf/acronyms.conf 2012-01-29 10:04:35 +0000
904+++ conf/acronyms.conf 2014-06-14 13:58:29 +0000
905@@ -4,142 +4,58 @@
906 AFAICS As far as I can see
907 AFAIK As far as I know
908 AFAIR As far as I remember
909-AJAX Asynchronous JavaScript and XML
910-AIM AOL (America Online) Instant Messenger
911-AOL America Online
912 API Application Programming Interface
913 ASAP As soon as possible
914 ASCII American Standard Code for Information Interchange
915-ASP Active Server Pages
916 BTW By the way
917-CGI Common Gateway Interface
918 CMS Content Management System
919 CSS Cascading Style Sheets
920-CVS Concurrent Versions System
921-DBA Database Administrator
922-DHCP Dynamic Host Configuration Protocol
923-DHTML Dynamic HyperText Markup Language
924-DMCA Digital Millenium Copyright Act
925 DNS Domain Name System
926-DOM Document Object Model
927-DTD Document Type Definition
928 EOF End of file
929 EOL End of line
930 EOM End of message
931 EOT End of text
932-ESMTP Extended Simple Mail Transfer Protocol
933 FAQ Frequently Asked Questions
934-FDL GNU Free Documentation License
935 FTP File Transfer Protocol
936 FOSS Free & Open-Source Software
937 FLOSS Free/Libre and Open Source Software
938 FUD Fear, Uncertainty, and Doubt
939 GB Gigabyte
940 GHz Gigahertz
941-GIF Graphics Interchange Format
942 GPL GNU General Public License
943 GUI Graphical User Interface
944 HTML HyperText Markup Language
945-HTTP Hyper Text Transfer Protocol
946 IANAL I am not a lawyer (but)
947-ICANN Internet Corporation for Assigned Names and Numbers
948-ICQ I seek you (Instant Messenger)
949-IE5 Internet Explorer 5
950-IE6 Internet Explorer 6
951 IE Internet Explorer
952 IIRC If I remember correctly
953-IIS Internet Information Services
954-IMAP Internet Message Access Protocol
955 IMHO In my humble opinion
956 IMO In my opinion
957 IOW In other words
958 IRC Internet Relay Chat
959 IRL In real life
960-ISO International Organization for Standardization
961-ISP Internet Service Provider
962-JDK Java Development Kit
963-JPEG Joint Photographics Experts Group
964-JPG Joint Photographics Experts Group
965-JS JavaScript
966 KISS Keep it simple stupid
967 LAN Local Area Network
968-LDAP Lightweight Directory Access Protocol
969 LGPL GNU Lesser General Public License
970 LOL Laughing out loud
971 MathML Mathematical Markup Language
972 MB Megabyte
973 MHz Megahertz
974-MIME Multipurpose Internet Mail Extension
975-MIT Massachusetts Institute of Technology
976-MML Mathematical Markup Language
977-MP3 Moving Picture Experts Group Layer 3
978-MPEG Moving Picture Experts Group
979-MSDN Microsoft Developer Network
980-MS Microsoft
981 MSIE Microsoft Internet Explorer
982-NIS Network Information Service
983-NS4.7 Netscape 4.7
984-NS4 Netscape 4
985-NS6 Netscape 6
986-NS7 Netscape 7
987 OMG Oh my God
988-OPML Outline Processor Markup Language
989 OS Operating System
990 OSS Open Source Software
991 OTOH On the other hand
992-P2P Peer to Peer
993-PDA Personal Digital Assistant
994-PDF Portable Document Format
995-Perl Practical Extraction and Report Language
996-PERL Practical Extraction and Report Language
997-PHP Hypertext Preprocessor
998-PICS Platform for Internet Content Selection
999-PIN Personal Identification Number
1000 PITA Pain in the Ass
1001-PNG Portable Network Graphics
1002-POP3 Post Office Protocol 3
1003-POP Post Office Protocol
1004-QoS Quality of Service
1005-RAID Redundant Array of Inexpensive Disks
1006-RDF Resource Description Framework
1007 RFC Request for Comments
1008 ROTFL Rolling on the floor laughing
1009-RPC Remote Procedure Call
1010-RSS Rich Site Summary
1011 RTFM Read The Fine Manual
1012-RTF Rich Text File
1013-SCSI Small Computer System Interface
1014-SDK Software Development Kit
1015-SGML Standard General Markup Language
1016-SMIL Synchronized Multimedia Integration Language
1017-SMTP Simple Mail Transfer Protocol
1018-SOAP Simple Object Access Protocol
1019 spec specification
1020-SQL Structured Query Language
1021-SSH Secure Shell
1022-SSI Server Side Includes
1023-SSL Secure Sockets Layer
1024-SVG Scalable Vector Graphics
1025 TIA Thanks in advance
1026-TIFF Tagged Image File Format
1027-TLD Top Level Domain
1028+TL;DR Too long; didn't read
1029 TOC Table of Contents
1030 URI Uniform Resource Identifier
1031 URL Uniform Resource Locator
1032-URN Uniform Resource Name
1033-VBA Visual Basic for Applications
1034-VB Visual Basic
1035 W3C World Wide Web Consortium
1036-WAN Wide Area Network
1037-WAP Wireless Access Protocol
1038-WML Wireless Markup Language
1039 WTF? What the f***
1040-WWW World Wide Web
1041 WYSIWYG What You See Is What You Get
1042-XHTML Extensible HyperText Markup Language
1043-XML Extensible Markup Language
1044-XSD XML (Extensible Markup Language) Schema Definition
1045-XSL Extensible Stylesheet Language
1046-XSLT Extensible Stylesheet Language Transformations
1047-XUL XML User Interface Language
1048 YMMV Your mileage may vary
1049
1050=== modified file 'conf/dokuwiki.php'
1051--- conf/dokuwiki.php 2012-10-21 21:14:10 +0000
1052+++ conf/dokuwiki.php 2014-06-14 13:58:29 +0000
1053@@ -54,7 +54,7 @@
1054 /* Authentication Settings */
1055 $conf['useacl'] = 0; //Use Access Control Lists to restrict access?
1056 $conf['autopasswd'] = 1; //autogenerate passwords and email them to user
1057-$conf['authtype'] = 'plain'; //which authentication backend should be used
1058+$conf['authtype'] = 'authplain'; //which authentication backend should be used
1059 $conf['passcrypt'] = 'smd5'; //Used crypt method (smd5,md5,sha1,ssha,crypt,mysql,my411)
1060 $conf['defaultgroup']= 'user'; //Default groups new Users are added to
1061 $conf['superuser'] = '!!not set!!'; //The admin can be user or @group or comma separated list user1,@group1,user2
1062@@ -96,7 +96,6 @@
1063 /* Media Settings */
1064 $conf['mediarevisions'] = 1; //enable/disable media revisions
1065 $conf['refcheck'] = 1; //check for references before deleting media files
1066-$conf['refshow'] = 0; //how many references should be shown, 5 is a good value
1067 $conf['gdlib'] = 2; //the GDlib version (0, 1 or 2) 2 tries to autodetect
1068 $conf['im_convert'] = ''; //path to ImageMagicks convert (will be used instead of GD)
1069 $conf['jpg_quality'] = '70'; //quality of compression when scaling jpg images (0-100)
1070
1071=== modified file 'conf/entities.conf'
1072--- conf/entities.conf 2008-05-16 19:50:25 +0000
1073+++ conf/entities.conf 2014-06-14 13:58:29 +0000
1074@@ -2,7 +2,7 @@
1075 #
1076 # Order does matter!
1077 #
1078-# You can use HTML entities here, but it is not recomended because it may break
1079+# You can use HTML entities here, but it is not recommended because it may break
1080 # non-HTML renderers. Use UTF-8 chars directly instead.
1081
1082 <-> ↔
1083
1084=== modified file 'conf/interwiki.conf'
1085--- conf/interwiki.conf 2012-01-29 10:04:35 +0000
1086+++ conf/interwiki.conf 2014-06-14 13:58:29 +0000
1087@@ -5,7 +5,7 @@
1088 # no further encoding is done
1089 # If no placeholder is defined the urlencoded name is appended to the URL
1090
1091-# To prevent losing your added InterWiki shortcuts after an upgrade,
1092+# To prevent losing your added InterWiki shortcuts after an upgrade,
1093 # you should add new ones to interwiki.local.conf
1094
1095 wp http://en.wikipedia.org/wiki/{NAME}
1096@@ -17,115 +17,21 @@
1097 wpmeta http://meta.wikipedia.org/wiki/{NAME}
1098 doku http://www.dokuwiki.org/
1099 dokubug http://bugs.dokuwiki.org/index.php?do=details&amp;task_id=
1100-rfc http://www.cs.ccu.edu.tw/~chm91u/rfc2html.php?in=
1101+rfc http://tools.ietf.org/html/rfc
1102 man http://man.cx/
1103 amazon http://www.amazon.com/exec/obidos/ASIN/{URL}/splitbrain-20/
1104 amazon.de http://www.amazon.de/exec/obidos/ASIN/{URL}/splitbrain-21/
1105 amazon.uk http://www.amazon.co.uk/exec/obidos/ASIN/
1106 paypal https://www.paypal.com/cgi-bin/webscr?cmd=_xclick&amp;business=
1107 phpfn http://www.php.net/{NAME}
1108-coral http://{HOST}.{PORT}.nyud.net:8090/{PATH}?{QUERY}
1109+coral http://{HOST}.{PORT}.nyud.net:8090{PATH}?{QUERY}
1110 freecache http://freecache.org/{NAME}
1111 sb http://www.splitbrain.org/go/
1112 skype skype:{NAME}
1113 google.de http://www.google.de/search?q=
1114 go http://www.google.com/search?q={URL}&amp;btnI=lucky
1115+user :user:{NAME}
1116
1117 # To support VoIP/SIP links
1118 callto callto://{NAME}
1119
1120-# Standards from http://usemod.com/intermap.txt follow
1121-
1122-AbbeNormal http://www.ourpla.net/cgi-bin/pikie.cgi?
1123-AcadWiki http://xarch.tu-graz.ac.at/autocad/wiki/
1124-Acronym http://www.acronymfinder.com/af-query.asp?String=exact&amp;Acronym=
1125-Advogato http://www.advogato.org/
1126-AIWiki http://www.ifi.unizh.ch/ailab/aiwiki/aiw.cgi?
1127-ALife http://news.alife.org/wiki/index.php?
1128-AndStuff http://andstuff.org/wiki.php?
1129-Annotation http://bayle.stanford.edu/crit/nph-med.cgi/
1130-AnnotationWiki http://www.seedwiki.com/page.cfm?wikiid=368&amp;doc=
1131-AwarenessWiki http://taoriver.net/aware/
1132-BenefitsWiki http://www.benefitslink.com/cgi-bin/wiki.cgi?
1133-BridgesWiki http://c2.com/w2/bridges/
1134-C2find http://c2.com/cgi/wiki?FindPage&amp;value=
1135-Cache http://www.google.com/search?q=cache:
1136-CLiki http://ww.telent.net/cliki/
1137-CmWiki http://www.ourpla.net/cgi-bin/wiki.pl?
1138-CreationMatters http://www.ourpla.net/cgi-bin/wiki.pl?
1139-DejaNews http://www.deja.com/=dnc/getdoc.xp?AN=
1140-DeWikiPedia http://www.wikipedia.de/wiki.cgi?
1141-Dictionary http://www.dict.org/bin/Dict?Database=*&amp;Form=Dict1&amp;Strategy=*&amp;Query=
1142-DiveIntoOsx http://diveintoosx.org/
1143-DocBook http://docbook.org/wiki/moin.cgi/
1144-DolphinWiki http://www.object-arts.com/wiki/html/Dolphin/
1145-EfnetCeeWiki http://purl.net/wiki/c/
1146-EfnetCppWiki http://purl.net/wiki/cpp/
1147-EfnetPythonWiki http://purl.net/wiki/python/
1148-EfnetXmlWiki http://purl.net/wiki/xml/
1149-EljWiki http://elj.sourceforge.net/phpwiki/index.php/
1150-EmacsWiki http://www.emacswiki.org/cgi-bin/wiki.pl?
1151-FinalEmpire http://final-empire.sourceforge.net/cgi-bin/wiki.pl?
1152-Foldoc http://www.foldoc.org/foldoc/foldoc.cgi?
1153-FoxWiki http://fox.wikis.com/wc.dll?Wiki~
1154-FreeBSDman http://www.FreeBSD.org/cgi/man.cgi?apropos=1&amp;query=
1155-Google http://www.google.com/search?q=
1156-GoogleGroups http://groups.google.com/groups?q=
1157-GreenCheese http://www.greencheese.org/
1158-HammondWiki http://www.dairiki.org/HammondWiki/index.php3?
1159-Haribeau http://wiki.haribeau.de/cgi-bin/wiki.pl?
1160-IAWiki http://www.IAwiki.net/
1161-IMDB http://us.imdb.com/Title?
1162-JargonFile http://sunir.org/apps/meta.pl?wiki=JargonFile&amp;redirect=
1163-JiniWiki http://www.cdegroot.com/cgi-bin/jini?
1164-JspWiki http://www.ecyrd.com/JSPWiki/Wiki.jsp?page=
1165-KmWiki http://www.voght.com/cgi-bin/pywiki?
1166-KnowHow http://www2.iro.umontreal.ca/~paquetse/cgi-bin/wiki.cgi?
1167-LanifexWiki http://opt.lanifex.com/cgi-bin/wiki.pl?
1168-LegoWiki http://www.object-arts.com/wiki/html/Lego-Robotics/
1169-LinuxWiki http://www.linuxwiki.de/
1170-LugKR http://lug-kr.sourceforge.net/cgi-bin/lugwiki.pl?
1171-MathSongsWiki http://SeedWiki.com/page.cfm?wikiid=237&amp;doc=
1172-MbTest http://www.usemod.com/cgi-bin/mbtest.pl?
1173-MeatBall http://www.usemod.com/cgi-bin/mb.pl?
1174-MetaWiki http://sunir.org/apps/meta.pl?
1175-MetaWikiPedia http://meta.wikipedia.com/wiki/
1176-MoinMoin http://purl.net/wiki/moin/
1177-MuWeb http://www.dunstable.com/scripts/MuWebWeb?
1178-NetVillage http://www.netbros.com/?
1179-OpenWiki http://openwiki.com/?
1180-OrgPatterns http://www.bell-labs.com/cgi-user/OrgPatterns/OrgPatterns?
1181-PangalacticOrg http://www.pangalactic.org/Wiki/
1182-PersonalTelco http://www.personaltelco.net/index.cgi/
1183-PhpWiki http://phpwiki.sourceforge.net/phpwiki/index.php?
1184-Pikie http://pikie.darktech.org/cgi/pikie?
1185-PPR http://c2.com/cgi/wiki?
1186-PurlNet http://purl.oclc.org/NET/
1187-PythonInfo http://www.python.org/cgi-bin/moinmoin/
1188-PythonWiki http://www.pythonwiki.de/
1189-PyWiki http://www.voght.com/cgi-bin/pywiki?
1190-SeaPig http://www.seapig.org/
1191-SeattleWireless http://seattlewireless.net/?
1192-SenseisLibrary http://senseis.xmp.net/?
1193-Shakti http://cgi.algonet.se/htbin/cgiwrap/pgd/ShaktiWiki/
1194-SourceForge http://sourceforge.net/{NAME}
1195-Squeak http://minnow.cc.gatech.edu/squeak/
1196-StrikiWiki http://ch.twi.tudelft.nl/~mostert/striki/teststriki.pl?
1197-SVGWiki http://www.protocol7.com/svg-wiki/default.asp?
1198-Tavi http://tavi.sourceforge.net/index.php?
1199-TmNet http://www.technomanifestos.net/?
1200-TMwiki http://www.EasyTopicMaps.com/?page=
1201-TWiki http://twiki.org/cgi-bin/view/{NAME}
1202-TwistedWiki http://purl.net/wiki/twisted/
1203-Unreal http://wiki.beyondunreal.com/wiki/
1204-UseMod http://www.usemod.com/cgi-bin/wiki.pl?
1205-VisualWorks http://wiki.cs.uiuc.edu/VisualWorks/
1206-WebDevWikiNL http://www.promo-it.nl/WebDevWiki/index.php?page=
1207-WebSeitzWiki http://webseitz.fluxent.com/wiki/
1208-Why http://clublet.com/c/c/why?
1209-Wiki http://c2.com/cgi/wiki?
1210-WikiPedia http://www.wikipedia.com/wiki/
1211-WikiWorld http://WikiWorld.com/wiki/index.php/
1212-YpsiEyeball http://sknkwrks.dyndns.org:1957/writewiki/wiki.pl?
1213-ZWiki http://www.zwiki.org/
1214-
1215
1216=== modified file 'conf/local.protected.php.dist'
1217--- conf/local.protected.php.dist 2011-04-17 12:17:45 +0000
1218+++ conf/local.protected.php.dist 2014-06-14 13:58:29 +0000
1219@@ -18,11 +18,11 @@
1220 */
1221 //$conf['authtype'] = 'mysql';
1222 //$conf['passcrypt'] = 'sha1';
1223-//$conf['auth']['mysql']['server'] = '';
1224-//$conf['auth']['mysql']['user'] = '';
1225-//$conf['auth']['mysql']['password'] = '';
1226-//$conf['auth']['mysql']['database'] = '';
1227-//$conf['auth']['mysql']['prefix'] = '';
1228+//$conf['plugin']['authmysql']['server'] = '';
1229+//$conf['plugin']['authmysql']['user'] = '';
1230+//$conf['plugin']['authmysql']['password'] = '';
1231+//$conf['plugin']['authmysql']['database'] = '';
1232+//$conf['plugin']['authmysql']['prefix'] = '';
1233 //@include(DOKU_CONF.'mysql.conf.php');
1234 $conf['authtype']='plain';
1235 $conf['useacl'] =1;
1236
1237=== modified file 'conf/mediameta.php'
1238--- conf/mediameta.php 2012-01-29 10:04:35 +0000
1239+++ conf/mediameta.php 2014-06-14 13:58:29 +0000
1240@@ -5,7 +5,7 @@
1241 * following contents:
1242 * fieldname - Where data will be saved (EXIF or IPTC field)
1243 * label - key to lookup in the $lang var, if not found printed as is
1244- * htmltype - 'text' or 'textarea'
1245+ * htmltype - 'text', 'textarea' or 'date'
1246 * lookups - array additional fields to lookup the data (EXIF or IPTC fields)
1247 *
1248 * The fields are not ordered continously to make inserting additional items
1249
1250=== modified file 'conf/mime.conf'
1251--- conf/mime.conf 2012-10-21 21:14:10 +0000
1252+++ conf/mime.conf 2014-06-14 13:58:29 +0000
1253@@ -13,6 +13,9 @@
1254 mp3 audio/mpeg
1255 ogg audio/ogg
1256 wav audio/wav
1257+webm video/webm
1258+ogv video/ogg
1259+mp4 video/mp4
1260
1261 #tgz !application/octet-stream
1262 #tar !application/x-gtar
1263
1264=== modified file 'conf/mysql.conf.php'
1265--- conf/mysql.conf.php 2011-02-12 14:38:30 +0000
1266+++ conf/mysql.conf.php 2014-06-14 13:58:29 +0000
1267@@ -21,46 +21,46 @@
1268 * options carefully, otherwise you won't be able to access you
1269 * database.
1270 */
1271-//$conf['auth']['mysql']['server'] = '';
1272-//$conf['auth']['mysql']['user'] = '';
1273-//$conf['auth']['mysql']['password'] = '';
1274-//$conf['auth']['mysql']['database'] = '';
1275-//$conf['auth']['mysql']['prefix'] = '';
1276+//$conf['plugin']['authmysql']['server'] = '';
1277+//$conf['plugin']['authmysql']['user'] = '';
1278+//$conf['plugin']['authmysql']['password'] = '';
1279+//$conf['plugin']['authmysql']['database'] = '';
1280+//$conf['plugin']['authmysql']['prefix'] = '';
1281
1282 /* variable to change the prefix of the tables
1283 */
1284-$db_prefix = $conf['auth']['mysql']['prefix'];
1285+$db_prefix = $conf['plugin']['authmysql']['prefix'];
1286
1287 /* This option enables debug messages in the mysql module. It is
1288 * mostly usefull for system admins.
1289 */
1290-$conf['auth']['mysql']['debug'] = 0;
1291+$conf['plugin']['authmysql']['debug'] = 0;
1292
1293 /* Normally password encryption is done by DokuWiki (recommended) but for
1294 * some reasons it might be usefull to let the database do the encryption.
1295 * Set 'forwardClearPass' to '1' and the cleartext password is forwarded to
1296 * the database, otherwise the encrypted one.
1297 */
1298-$conf['auth']['mysql']['forwardClearPass'] = 0;
1299+$conf['plugin']['authmysql']['forwardClearPass'] = 0;
1300
1301 /* Multiple table operations will be protected by locks. This array tolds
1302 * the module which tables to lock. If you use any aliases for table names
1303 * these array must also contain these aliases. Any unamed alias will cause
1304 * a warning during operation. See the example below.
1305 */
1306-$conf['auth']['mysql']['TablesToLock']= array("${db_prefix}users", "${db_prefix}users AS u", "${db_prefix}groups", "${db_prefix}groups AS g");
1307+$conf['plugin']['authmysql']['TablesToLock']= array("${db_prefix}users", "${db_prefix}users AS u", "${db_prefix}groups", "${db_prefix}groups AS g");
1308
1309 /***********************************************************************/
1310 /* Basic SQL statements for user authentication (required) */
1311 /***********************************************************************/
1312
1313-$conf['auth']['mysql']['checkPass'] = "SELECT u.password AS pass
1314+$conf['plugin']['authmysql']['checkPass'] = "SELECT u.password AS pass
1315 FROM ${db_prefix}users AS u, ${db_prefix}groups AS g
1316 WHERE u.group_id = g.g_id
1317 AND u.username = '%{user}'
1318 AND g.g_title != 'Guest'";
1319
1320-$conf['auth']['mysql']['getUserInfo'] = "SELECT password AS pass,
1321+$conf['plugin']['authmysql']['getUserInfo'] = "SELECT password AS pass,
1322 realname AS name,
1323 email AS mail,
1324 id,
1325@@ -70,7 +70,7 @@
1326 WHERE u.group_id = g.g_id
1327 AND u.username = '%{user}'";
1328
1329-$conf['auth']['mysql']['getGroups'] = "SELECT g.g_title as `group`
1330+$conf['plugin']['authmysql']['getGroups'] = "SELECT g.g_title as `group`
1331 FROM ${db_prefix}users AS u,
1332 ${db_prefix}groups AS g
1333 WHERE u.group_id = g.g_id
1334@@ -80,34 +80,34 @@
1335 /* Additional minimum SQL statements to use the user manager */
1336 /***********************************************************************/
1337
1338-$conf['auth']['mysql']['getUsers'] = "SELECT DISTINCT u.username AS user
1339+$conf['plugin']['authmysql']['getUsers'] = "SELECT DISTINCT u.username AS user
1340 FROM ${db_prefix}users AS u,
1341 ${db_prefix}groups AS g
1342 WHERE u.group_id = g.g_id";
1343-$conf['auth']['mysql']['FilterLogin'] = "u.username LIKE '%{user}'";
1344-$conf['auth']['mysql']['FilterName'] = "u.realname LIKE '%{name}'";
1345-$conf['auth']['mysql']['FilterEmail'] = "u.email LIKE '%{email}'";
1346-$conf['auth']['mysql']['FilterGroup'] = "g.g_title LIKE '%{group}'";
1347-$conf['auth']['mysql']['SortOrder'] = "ORDER BY u.username";
1348+$conf['plugin']['authmysql']['FilterLogin'] = "u.username LIKE '%{user}'";
1349+$conf['plugin']['authmysql']['FilterName'] = "u.realname LIKE '%{name}'";
1350+$conf['plugin']['authmysql']['FilterEmail'] = "u.email LIKE '%{email}'";
1351+$conf['plugin']['authmysql']['FilterGroup'] = "g.g_title LIKE '%{group}'";
1352+$conf['plugin']['authmysql']['SortOrder'] = "ORDER BY u.username";
1353
1354 /***********************************************************************/
1355 /* Additional SQL statements to add new users with the user manager */
1356 /***********************************************************************/
1357
1358
1359-$conf['auth']['mysql']['addUser'] = "INSERT INTO ${db_prefix}users
1360+$conf['plugin']['authmysql']['addUser'] = "INSERT INTO ${db_prefix}users
1361 (username, password, email, realname, language, registered, registration_ip, last_visit)
1362 VALUES ('%{user}', '%{pass}', '%{email}', '%{name}', 'Francais', %{time}, '%{ip}', %{time})";
1363
1364-$conf['auth']['mysql']['addGroup'] = "INSERT INTO ${db_prefix}groups (g_title) VALUES ('%{group}')";
1365+$conf['plugin']['authmysql']['addGroup'] = "INSERT INTO ${db_prefix}groups (g_title) VALUES ('%{group}')";
1366
1367-$conf['auth']['mysql']['addUserGroup']= "UPDATE ${db_prefix}users
1368+$conf['plugin']['authmysql']['addUserGroup']= "UPDATE ${db_prefix}users
1369 SET group_id=%{gid}
1370 WHERE id='%{uid}'";
1371
1372-$conf['auth']['mysql']['delGroup'] = "DELETE FROM ${db_prefix}groups WHERE g_id='%{gid}'";
1373+$conf['plugin']['authmysql']['delGroup'] = "DELETE FROM ${db_prefix}groups WHERE g_id='%{gid}'";
1374
1375-$conf['auth']['mysql']['getUserID'] = "SELECT id FROM ${db_prefix}users WHERE username='%{user}'";
1376+$conf['plugin']['authmysql']['getUserID'] = "SELECT id FROM ${db_prefix}users WHERE username='%{user}'";
1377
1378 /***********************************************************************/
1379 /* Additional SQL statements to delete users with the user manager */
1380@@ -118,7 +118,7 @@
1381 * %{user} user's login name
1382 * %{uid} id of a user dataset
1383 */
1384-//$conf['auth']['mysql']['delUser'] = "DELETE FROM users
1385+//$conf['plugin']['authmysql']['delUser'] = "DELETE FROM users
1386 // WHERE uid='%{uid}'";
1387
1388 /* This statement should remove all connections from a user to any group
1389@@ -126,22 +126,22 @@
1390 * Following patterns will be replaced:
1391 * %{uid} id of a user dataset
1392 */
1393-//$conf['auth']['mysql']['delUserRefs'] = "DELETE FROM usergroup
1394+//$conf['plugin']['authmysql']['delUserRefs'] = "DELETE FROM usergroup
1395 // WHERE uid='%{uid}'";
1396
1397 /***********************************************************************/
1398 /* Additional SQL statements to modify users with the user manager */
1399 /***********************************************************************/
1400
1401-$conf['auth']['mysql']['updateUser'] = "UPDATE ${db_prefix}users SET";
1402-$conf['auth']['mysql']['UpdateLogin'] = "username='%{user}'";
1403-$conf['auth']['mysql']['UpdatePass'] = "password='%{pass}'";
1404-$conf['auth']['mysql']['UpdateEmail'] = "email='%{email}'";
1405-$conf['auth']['mysql']['UpdateName'] = "realname='%{name}'";
1406-$conf['auth']['mysql']['UpdateTarget']= "WHERE id=%{uid}";
1407-
1408-$conf['auth']['mysql']['delUserGroup']= "UPDATE ${db_prefix}users SET g_id=4 WHERE id=%{uid}";
1409-
1410-$conf['auth']['mysql']['getGroupID'] = "SELECT g_id AS id FROM ${db_prefix}groups WHERE g_title='%{group}'";
1411+$conf['plugin']['authmysql']['updateUser'] = "UPDATE ${db_prefix}users SET";
1412+$conf['plugin']['authmysql']['UpdateLogin'] = "username='%{user}'";
1413+$conf['plugin']['authmysql']['UpdatePass'] = "password='%{pass}'";
1414+$conf['plugin']['authmysql']['UpdateEmail'] = "email='%{email}'";
1415+$conf['plugin']['authmysql']['UpdateName'] = "realname='%{name}'";
1416+$conf['plugin']['authmysql']['UpdateTarget']= "WHERE id=%{uid}";
1417+
1418+$conf['plugin']['authmysql']['delUserGroup']= "UPDATE ${db_prefix}users SET g_id=4 WHERE id=%{uid}";
1419+
1420+$conf['plugin']['authmysql']['getGroupID'] = "SELECT g_id AS id FROM ${db_prefix}groups WHERE g_title='%{group}'";
1421
1422
1423
1424=== modified file 'conf/mysql.conf.php.example'
1425--- conf/mysql.conf.php.example 2011-01-24 08:52:15 +0000
1426+++ conf/mysql.conf.php.example 2014-06-14 13:58:29 +0000
1427@@ -1,6 +1,6 @@
1428 <?php
1429 /*
1430- * This is an example configuration for the mysql auth module.
1431+ * This is an example configuration for the mysql auth plugin.
1432 *
1433 * This SQL statements are optimized for following table structure.
1434 * If you use a different one you have to change them accordingly.
1435@@ -23,29 +23,29 @@
1436 * options carefully, otherwise you won't be able to access you
1437 * database.
1438 */
1439-$conf['auth']['mysql']['server'] = '';
1440-$conf['auth']['mysql']['user'] = '';
1441-$conf['auth']['mysql']['password'] = '';
1442-$conf['auth']['mysql']['database'] = '';
1443+$conf['plugin']['authmysql']['server'] = '';
1444+$conf['plugin']['authmysql']['user'] = '';
1445+$conf['plugin']['authmysql']['password'] = '';
1446+$conf['plugin']['authmysql']['database'] = '';
1447
1448-/* This option enables debug messages in the mysql module. It is
1449- * mostly usefull for system admins.
1450+/* This option enables debug messages in the mysql plugin. It is
1451+ * mostly useful for system admins.
1452 */
1453-$conf['auth']['mysql']['debug'] = 0;
1454+$conf['plugin']['authmysql']['debug'] = 0;
1455
1456 /* Normally password encryption is done by DokuWiki (recommended) but for
1457 * some reasons it might be usefull to let the database do the encryption.
1458 * Set 'forwardClearPass' to '1' and the cleartext password is forwarded to
1459 * the database, otherwise the encrypted one.
1460 */
1461-$conf['auth']['mysql']['forwardClearPass'] = 0;
1462+$conf['plugin']['authmysql']['forwardClearPass'] = 0;
1463
1464 /* Multiple table operations will be protected by locks. This array tolds
1465- * the module which tables to lock. If you use any aliases for table names
1466+ * the plugin which tables to lock. If you use any aliases for table names
1467 * these array must also contain these aliases. Any unamed alias will cause
1468 * a warning during operation. See the example below.
1469 */
1470-$conf['auth']['mysql']['TablesToLock']= array("users", "users AS u","groups", "groups AS g", "usergroup", "usergroup AS ug");
1471+$conf['plugin']['authmysql']['TablesToLock']= array("users", "users AS u","groups", "groups AS g", "usergroup", "usergroup AS ug");
1472
1473 /***********************************************************************/
1474 /* Basic SQL statements for user authentication (required) */
1475@@ -56,19 +56,19 @@
1476 * of the user. If the result table is empty or contains more than one
1477 * row, access will be denied.
1478 *
1479- * The module access the password as 'pass' so a alias might be necessary.
1480+ * The plugin accesses the password as 'pass' so a alias might be necessary.
1481 *
1482 * Following patters will be replaced:
1483 * %{user} user name
1484 * %{pass} encrypted or clear text password (depends on 'encryptPass')
1485 * %{dgroup} default group name
1486 */
1487-$conf['auth']['mysql']['checkPass'] = "SELECT pass
1488- FROM usergroup AS ug
1489- JOIN users AS u ON u.uid=ug.uid
1490- JOIN groups AS g ON g.gid=ug.gid
1491- WHERE login='%{user}'
1492- AND name='%{dgroup}'";
1493+$conf['plugin']['authmysql']['checkPass'] = "SELECT pass
1494+ FROM usergroup AS ug
1495+ JOIN users AS u ON u.uid=ug.uid
1496+ JOIN groups AS g ON g.gid=ug.gid
1497+ WHERE login='%{user}'
1498+ AND name='%{dgroup}'";
1499
1500 /* This statement should return a table with exact one row containing
1501 * information about one user. The field needed are:
1502@@ -82,23 +82,23 @@
1503 * Following patters will be replaced:
1504 * %{user} user name
1505 */
1506-$conf['auth']['mysql']['getUserInfo'] = "SELECT pass, CONCAT(firstname,' ',lastname) AS name, email AS mail
1507- FROM users
1508- WHERE login='%{user}'";
1509+$conf['plugin']['authmysql']['getUserInfo'] = "SELECT pass, CONCAT(firstname,' ',lastname) AS name, email AS mail
1510+ FROM users
1511+ WHERE login='%{user}'";
1512
1513 /* This statement is used to get all groups a user is member of. The
1514 * result should be a table containing all groups the given user is
1515- * member of. The module access the group name as 'group' so a alias
1516+ * member of. The plugin accesses the group name as 'group' so an alias
1517 * might be nessecary.
1518 *
1519 * Following patters will be replaced:
1520 * %{user} user name
1521 */
1522-$conf['auth']['mysql']['getGroups'] = "SELECT name as `group`
1523- FROM groups g, users u, usergroup ug
1524- WHERE u.uid = ug.uid
1525- AND g.gid = ug.gid
1526- AND u.login='%{user}'";
1527+$conf['plugin']['authmysql']['getGroups'] = "SELECT name as `group`
1528+ FROM groups g, users u, usergroup ug
1529+ WHERE u.uid = ug.uid
1530+ AND g.gid = ug.gid
1531+ AND u.login='%{user}'";
1532
1533 /***********************************************************************/
1534 /* Additional minimum SQL statements to use the user manager */
1535@@ -106,7 +106,7 @@
1536
1537 /* This statement should return a table containing all user login names
1538 * that meet certain filter criteria. The filter expressions will be added
1539- * case dependend by the module. At the end a sort expression will be added.
1540+ * case dependend by the plugin. At the end a sort expression will be added.
1541 * Important is that this list contains no double entries fo a user. Each
1542 * user name is only allowed once in the table.
1543 *
1544@@ -118,15 +118,15 @@
1545 * %{email} in FilterEmail user's email address
1546 * %{group} in FilterGroup group name
1547 */
1548-$conf['auth']['mysql']['getUsers'] = "SELECT DISTINCT login AS user
1549- FROM users AS u
1550- LEFT JOIN usergroup AS ug ON u.uid=ug.uid
1551- LEFT JOIN groups AS g ON ug.gid=g.gid";
1552-$conf['auth']['mysql']['FilterLogin'] = "login LIKE '%{user}'";
1553-$conf['auth']['mysql']['FilterName'] = "CONCAT(firstname,' ',lastname) LIKE '%{name}'";
1554-$conf['auth']['mysql']['FilterEmail'] = "email LIKE '%{email}'";
1555-$conf['auth']['mysql']['FilterGroup'] = "name LIKE '%{group}'";
1556-$conf['auth']['mysql']['SortOrder'] = "ORDER BY login";
1557+$conf['plugin']['authmysql']['getUsers'] = "SELECT DISTINCT login AS user
1558+ FROM users AS u
1559+ LEFT JOIN usergroup AS ug ON u.uid=ug.uid
1560+ LEFT JOIN groups AS g ON ug.gid=g.gid";
1561+$conf['plugin']['authmysql']['FilterLogin'] = "login LIKE '%{user}'";
1562+$conf['plugin']['authmysql']['FilterName'] = "CONCAT(firstname,' ',lastname) LIKE '%{name}'";
1563+$conf['plugin']['authmysql']['FilterEmail'] = "email LIKE '%{email}'";
1564+$conf['plugin']['authmysql']['FilterGroup'] = "name LIKE '%{group}'";
1565+$conf['plugin']['authmysql']['SortOrder'] = "ORDER BY login";
1566
1567 /***********************************************************************/
1568 /* Additional SQL statements to add new users with the user manager */
1569@@ -141,18 +141,18 @@
1570 * %{email} email address
1571 * %{name} user's full name
1572 */
1573-$conf['auth']['mysql']['addUser'] = "INSERT INTO users
1574- (login, pass, email, firstname, lastname)
1575- VALUES ('%{user}', '%{pass}', '%{email}',
1576- SUBSTRING_INDEX('%{name}',' ', 1),
1577- SUBSTRING_INDEX('%{name}',' ', -1))";
1578+$conf['plugin']['authmysql']['addUser'] = "INSERT INTO users
1579+ (login, pass, email, firstname, lastname)
1580+ VALUES ('%{user}', '%{pass}', '%{email}',
1581+ SUBSTRING_INDEX('%{name}',' ', 1),
1582+ SUBSTRING_INDEX('%{name}',' ', -1))";
1583
1584 /* This statement should add a group to the database.
1585 * Following patterns will be replaced:
1586 * %{group} group name
1587 */
1588-$conf['auth']['mysql']['addGroup'] = "INSERT INTO groups (name)
1589- VALUES ('%{group}')";
1590+$conf['plugin']['authmysql']['addGroup'] = "INSERT INTO groups (name)
1591+ VALUES ('%{group}')";
1592
1593 /* This statement should connect a user to a group (a user become member
1594 * of that group).
1595@@ -162,26 +162,26 @@
1596 * %{group} group name
1597 * %{gid} id of a group dataset
1598 */
1599-$conf['auth']['mysql']['addUserGroup']= "INSERT INTO usergroup (uid, gid)
1600- VALUES ('%{uid}', '%{gid}')";
1601+$conf['plugin']['authmysql']['addUserGroup']= "INSERT INTO usergroup (uid, gid)
1602+ VALUES ('%{uid}', '%{gid}')";
1603
1604 /* This statement should remove a group fom the database.
1605 * Following patterns will be replaced:
1606 * %{group} group name
1607 * %{gid} id of a group dataset
1608 */
1609-$conf['auth']['mysql']['delGroup'] = "DELETE FROM groups
1610- WHERE gid='%{gid}'";
1611+$conf['plugin']['authmysql']['delGroup'] = "DELETE FROM groups
1612+ WHERE gid='%{gid}'";
1613
1614 /* This statement should return the database index of a given user name.
1615- * The module will access the index with the name 'id' so a alias might be
1616+ * The plugin will access the index with the name 'id' so a alias might be
1617 * necessary.
1618 * following patters will be replaced:
1619 * %{user} user name
1620 */
1621-$conf['auth']['mysql']['getUserID'] = "SELECT uid AS id
1622- FROM users
1623- WHERE login='%{user}'";
1624+$conf['plugin']['authmysql']['getUserID'] = "SELECT uid AS id
1625+ FROM users
1626+ WHERE login='%{user}'";
1627
1628 /***********************************************************************/
1629 /* Additional SQL statements to delete users with the user manager */
1630@@ -192,16 +192,16 @@
1631 * %{user} user's login name
1632 * %{uid} id of a user dataset
1633 */
1634-$conf['auth']['mysql']['delUser'] = "DELETE FROM users
1635- WHERE uid='%{uid}'";
1636+$conf['plugin']['authmysql']['delUser'] = "DELETE FROM users
1637+ WHERE uid='%{uid}'";
1638
1639 /* This statement should remove all connections from a user to any group
1640 * (a user quits membership of all groups).
1641 * Following patterns will be replaced:
1642 * %{uid} id of a user dataset
1643 */
1644-$conf['auth']['mysql']['delUserRefs'] = "DELETE FROM usergroup
1645- WHERE uid='%{uid}'";
1646+$conf['plugin']['authmysql']['delUserRefs'] = "DELETE FROM usergroup
1647+ WHERE uid='%{uid}'";
1648
1649 /***********************************************************************/
1650 /* Additional SQL statements to modify users with the user manager */
1651@@ -218,13 +218,13 @@
1652 * %{name} user's full name
1653 * %{uid} user id that should be updated
1654 */
1655-$conf['auth']['mysql']['updateUser'] = "UPDATE users SET";
1656-$conf['auth']['mysql']['UpdateLogin'] = "login='%{user}'";
1657-$conf['auth']['mysql']['UpdatePass'] = "pass='%{pass}'";
1658-$conf['auth']['mysql']['UpdateEmail'] = "email='%{email}'";
1659-$conf['auth']['mysql']['UpdateName'] = "firstname=SUBSTRING_INDEX('%{name}',' ', 1),
1660- lastname=SUBSTRING_INDEX('%{name}',' ', -1)";
1661-$conf['auth']['mysql']['UpdateTarget']= "WHERE uid=%{uid}";
1662+$conf['plugin']['authmysql']['updateUser'] = "UPDATE users SET";
1663+$conf['plugin']['authmysql']['UpdateLogin'] = "login='%{user}'";
1664+$conf['plugin']['authmysql']['UpdatePass'] = "pass='%{pass}'";
1665+$conf['plugin']['authmysql']['UpdateEmail'] = "email='%{email}'";
1666+$conf['plugin']['authmysql']['UpdateName'] = "firstname=SUBSTRING_INDEX('%{name}',' ', 1),
1667+ lastname=SUBSTRING_INDEX('%{name}',' ', -1)";
1668+$conf['plugin']['authmysql']['UpdateTarget']= "WHERE uid=%{uid}";
1669
1670 /* This statement should remove a single connection from a user to a
1671 * group (a user quits membership of that group).
1672@@ -235,19 +235,19 @@
1673 * %{group} group name
1674 * %{gid} id of a group dataset
1675 */
1676-$conf['auth']['mysql']['delUserGroup']= "DELETE FROM usergroup
1677- WHERE uid='%{uid}'
1678- AND gid='%{gid}'";
1679+$conf['plugin']['authmysql']['delUserGroup']= "DELETE FROM usergroup
1680+ WHERE uid='%{uid}'
1681+ AND gid='%{gid}'";
1682
1683 /* This statement should return the database index of a given group name.
1684- * The module will access the index with the name 'id' so a alias might
1685+ * The plugin will access the index with the name 'id' so a alias might
1686 * be necessary.
1687 *
1688 * Following patters will be replaced:
1689 * %{group} group name
1690 */
1691-$conf['auth']['mysql']['getGroupID'] = "SELECT gid AS id
1692- FROM groups
1693- WHERE name='%{group}'";
1694+$conf['plugin']['authmysql']['getGroupID'] = "SELECT gid AS id
1695+ FROM groups
1696+ WHERE name='%{group}'";
1697
1698
1699
1700=== modified file 'conf/plugins.required.php'
1701--- conf/plugins.required.php 2012-01-29 10:04:35 +0000
1702+++ conf/plugins.required.php 2014-06-14 13:58:29 +0000
1703@@ -4,8 +4,9 @@
1704 * from changes by the extention manager. These settings will override any local settings.
1705 * It is not recommended to change this file, as it is overwritten on DokuWiki upgrades.
1706 */
1707-$plugins['acl'] = 1;
1708-$plugins['plugin'] = 1;
1709-$plugins['config'] = 1;
1710-$plugins['usermanager'] = 1;
1711-$plugins['revert'] = 1;
1712+$plugins['acl'] = 1;
1713+$plugins['authplain'] = 1;
1714+$plugins['extension'] = 1;
1715+$plugins['config'] = 1;
1716+$plugins['usermanager'] = 1;
1717+$plugins['template:dokuwiki'] = 1; // not a plugin, but this should not be uninstalled either
1718
1719=== modified file 'conf/wordblock.conf'
1720--- conf/wordblock.conf 2012-01-29 10:04:35 +0000
1721+++ conf/wordblock.conf 2014-06-14 13:58:29 +0000
1722@@ -30,3 +30,4 @@
1723 flatsinmumbai\.co\.in
1724 https?:\/\/(\S*?)penny-?stock
1725 mattressreview\.biz
1726+(just|simply) (my|a) profile (site|webpage|page)
1727
1728=== modified file 'doku.php'
1729--- doku.php 2012-10-21 21:14:10 +0000
1730+++ doku.php 2014-06-14 13:58:29 +0000
1731@@ -9,7 +9,7 @@
1732 */
1733
1734 // update message version
1735-$updateVersion = 38;
1736+$updateVersion = 44;
1737
1738 // xdebug_start_profiling();
1739
1740@@ -34,7 +34,7 @@
1741 require_once(DOKU_INC.'inc/init.php');
1742
1743 //import variables
1744-$_REQUEST['id'] = str_replace("\xC2\xAD", '', $INPUT->str('id')); //soft-hyphen
1745+$INPUT->set('id', str_replace("\xC2\xAD", '', $INPUT->str('id'))); //soft-hyphen
1746 $QUERY = trim($INPUT->str('id'));
1747 $ID = getID();
1748
1749@@ -52,10 +52,10 @@
1750 $SUF = cleanText($INPUT->post->str('suffix'));
1751 $SUM = $INPUT->post->str('summary');
1752
1753-//make infos about the selected page available
1754+//make info about the selected page available
1755 $INFO = pageinfo();
1756
1757-//export minimal infos to JS, plugins can add more
1758+//export minimal info to JS, plugins can add more
1759 $JSINFO['id'] = $ID;
1760 $JSINFO['namespace'] = (string) $INFO['namespace'];
1761
1762@@ -85,8 +85,8 @@
1763 //close session
1764 session_write_close();
1765
1766-//do the work
1767-act_dispatch($ACT);
1768+//do the work (picks up what to do from global env)
1769+act_dispatch();
1770
1771 $tmp = array(); // No event data
1772 trigger_event('DOKUWIKI_DONE', $tmp);
1773
1774=== modified file 'feed.php'
1775--- feed.php 2012-10-21 21:14:10 +0000
1776+++ feed.php 2014-06-14 13:58:29 +0000
1777@@ -15,13 +15,19 @@
1778 //close session
1779 session_write_close();
1780
1781+//feed disabled?
1782+if(!actionOK('rss')) {
1783+ http_status(404);
1784+ echo '<error>RSS feed is disabled.</error>';
1785+ exit;
1786+}
1787+
1788 // get params
1789 $opt = rss_parseOptions();
1790
1791 // the feed is dynamic - we need a cache for each combo
1792 // (but most people just use the default feed so it's still effective)
1793-$cache = getCacheName(join('', array_values($opt)).$_SERVER['REMOTE_USER'], '.feed');
1794-$key = join('', array_values($opt)).$_SERVER['REMOTE_USER'];
1795+$key = join('', array_values($opt)).'$'.$_SERVER['REMOTE_USER'].'$'.$_SERVER['HTTP_HOST'].$_SERVER['SERVER_PORT'];
1796 $cache = new cache($key, '.feed');
1797
1798 // prepare cache depends
1799@@ -135,12 +141,10 @@
1800
1801 $opt['guardmail'] = ($conf['mailguard'] != '' && $conf['mailguard'] != 'none');
1802
1803- $type = valid_input_set(
1804- 'type', array(
1805- 'rss', 'rss2', 'atom', 'atom1', 'rss1',
1806- 'default' => $conf['rss_type']
1807- ),
1808- $_REQUEST
1809+ $type = $INPUT->valid(
1810+ 'type',
1811+ array( 'rss', 'rss2', 'atom', 'atom1', 'rss1'),
1812+ $conf['rss_type']
1813 );
1814 switch($type) {
1815 case 'rss':
1816@@ -182,7 +186,7 @@
1817 function rss_buildItems(&$rss, &$data, $opt) {
1818 global $conf;
1819 global $lang;
1820- /* @var auth_basic $auth */
1821+ /* @var DokuWiki_Auth_Plugin $auth */
1822 global $auth;
1823
1824 $eventData = array(
1825@@ -209,12 +213,14 @@
1826 // add date
1827 if($ditem['date']) {
1828 $date = $ditem['date'];
1829+ } elseif ($ditem['media']) {
1830+ $date = @filemtime(mediaFN($id));
1831+ } elseif (@file_exists(wikiFN($id))) {
1832+ $date = @filemtime(wikiFN($id));
1833 } elseif($meta['date']['modified']) {
1834 $date = $meta['date']['modified'];
1835- } else if ($ditem['media']) {
1836- $date = @filemtime(mediaFN($id));
1837 } else {
1838- $date = @filemtime(wikiFN($id));
1839+ $date = 0;
1840 }
1841 if($date) $item->date = date('r', $date);
1842
1843@@ -240,7 +246,7 @@
1844 ), '&', true
1845 );
1846 } else {
1847- $item->link = wl($id, 'rev='.$date, true, '&', true);
1848+ $item->link = wl($id, 'rev='.$date, true, '&');
1849 }
1850 break;
1851 case 'rev':
1852@@ -291,18 +297,19 @@
1853 case 'diff':
1854 case 'htmldiff':
1855 if($ditem['media']) {
1856- $revs = getRevisions($id, 0, 1, 8192, true);
1857+ $medialog = new MediaChangeLog($id);
1858+ $revs = $medialog->getRevisions(0, 1);
1859 $rev = $revs[0];
1860 $src_r = '';
1861 $src_l = '';
1862
1863 if($size = media_image_preview_size($id, false, new JpegMeta(mediaFN($id)), 300)) {
1864- $more = 'w='.$size[0].'&h='.$size[1].'t='.@filemtime(mediaFN($id));
1865- $src_r = ml($id, $more);
1866+ $more = 'w='.$size[0].'&h='.$size[1].'&t='.@filemtime(mediaFN($id));
1867+ $src_r = ml($id, $more, true, '&amp;', true);
1868 }
1869 if($rev && $size = media_image_preview_size($id, $rev, new JpegMeta(mediaFN($id, $rev)), 300)) {
1870 $more = 'rev='.$rev.'&w='.$size[0].'&h='.$size[1];
1871- $src_l = ml($id, $more);
1872+ $src_l = ml($id, $more, true, '&amp;', true);
1873 }
1874 $content = '';
1875 if($src_r) {
1876@@ -316,18 +323,20 @@
1877
1878 } else {
1879 require_once(DOKU_INC.'inc/DifferenceEngine.php');
1880- $revs = getRevisions($id, 0, 1);
1881+ $pagelog = new PageChangeLog($id);
1882+ $revs = $pagelog->getRevisions(0, 1);
1883 $rev = $revs[0];
1884
1885 if($rev) {
1886- $df = new Diff(explode("\n", htmlspecialchars(rawWiki($id, $rev))),
1887- explode("\n", htmlspecialchars(rawWiki($id, ''))));
1888+ $df = new Diff(explode("\n", rawWiki($id, $rev)),
1889+ explode("\n", rawWiki($id, '')));
1890 } else {
1891 $df = new Diff(array(''),
1892- explode("\n", htmlspecialchars(rawWiki($id, ''))));
1893+ explode("\n", rawWiki($id, '')));
1894 }
1895
1896 if($opt['item_content'] == 'htmldiff') {
1897+ // note: no need to escape diff output, TableDiffFormatter provides 'safe' html
1898 $tdf = new TableDiffFormatter();
1899 $content = '<table>';
1900 $content .= '<tr><th colspan="2" width="50%">'.$rev.'</th>';
1901@@ -335,22 +344,27 @@
1902 $content .= $tdf->format($df);
1903 $content .= '</table>';
1904 } else {
1905+ // note: diff output must be escaped, UnifiedDiffFormatter provides plain text
1906 $udf = new UnifiedDiffFormatter();
1907- $content = "<pre>\n".$udf->format($df)."\n</pre>";
1908+ $content = "<pre>\n".hsc($udf->format($df))."\n</pre>";
1909 }
1910 }
1911 break;
1912 case 'html':
1913 if($ditem['media']) {
1914 if($size = media_image_preview_size($id, false, new JpegMeta(mediaFN($id)))) {
1915- $more = 'w='.$size[0].'&h='.$size[1].'t='.@filemtime(mediaFN($id));
1916- $src = ml($id, $more);
1917+ $more = 'w='.$size[0].'&h='.$size[1].'&t='.@filemtime(mediaFN($id));
1918+ $src = ml($id, $more, true, '&amp;', true);
1919 $content = '<img src="'.$src.'" alt="'.$id.'" />';
1920 } else {
1921 $content = '';
1922 }
1923 } else {
1924- $content = p_wiki_xhtml($id, $date, false);
1925+ if (@filemtime(wikiFN($id)) === $date) {
1926+ $content = p_wiki_xhtml($id, '', false);
1927+ } else {
1928+ $content = p_wiki_xhtml($id, $date, false);
1929+ }
1930 // no TOC in feeds
1931 $content = preg_replace('/(<!-- TOC START -->).*(<!-- TOC END -->)/s', '', $content);
1932
1933@@ -370,8 +384,8 @@
1934 default:
1935 if($ditem['media']) {
1936 if($size = media_image_preview_size($id, false, new JpegMeta(mediaFN($id)))) {
1937- $more = 'w='.$size[0].'&h='.$size[1].'t='.@filemtime(mediaFN($id));
1938- $src = ml($id, $more);
1939+ $more = 'w='.$size[0].'&h='.$size[1].'&t='.@filemtime(mediaFN($id));
1940+ $src = ml($id, $more, true, '&amp;', true);
1941 $content = '<img src="'.$src.'" alt="'.$id.'" />';
1942 } else {
1943 $content = '';
1944@@ -468,8 +482,12 @@
1945 $ns = str_replace(':', '/', $ns);
1946
1947 $data = array();
1948- sort($data);
1949- search($data, $conf['datadir'], 'search_list', '', $ns);
1950+ $search_opts = array(
1951+ 'depth' => 1,
1952+ 'pagesonly' => true,
1953+ 'listfiles' => true
1954+ );
1955+ search($data, $conf['datadir'], 'search_universal', $search_opts, $ns);
1956
1957 return $data;
1958 }
1959
1960=== modified file 'inc/.htaccess'
1961--- inc/.htaccess 2012-01-29 10:04:35 +0000
1962+++ inc/.htaccess 2014-06-14 13:58:29 +0000
1963@@ -1,4 +1,3 @@
1964 ## no access to the inc directory
1965 order allow,deny
1966 deny from all
1967-Satisfy All
1968
1969=== modified file 'inc/DifferenceEngine.php'
1970--- inc/DifferenceEngine.php 2012-10-21 21:14:10 +0000
1971+++ inc/DifferenceEngine.php 2014-06-14 13:58:29 +0000
1972@@ -797,7 +797,7 @@
1973
1974 function _lines($lines, $prefix = ' ') {
1975 foreach ($lines as $line)
1976- echo "$prefix $line\n";
1977+ echo "$prefix ".$this->_escape($line)."\n";
1978 }
1979
1980 function _context($lines) {
1981@@ -816,6 +816,19 @@
1982 echo "---\n";
1983 $this->_added($closing);
1984 }
1985+
1986+ /**
1987+ * Escape string
1988+ *
1989+ * Override this method within other formatters if escaping required.
1990+ * Base class requires $str to be returned WITHOUT escaping.
1991+ *
1992+ * @param $str string Text string to escape
1993+ * @return string The escaped string.
1994+ */
1995+ function _escape($str){
1996+ return $str;
1997+ }
1998 }
1999
2000 /**
2001@@ -871,13 +884,13 @@
2002 function _flushGroup($new_tag) {
2003 if ($this->_group !== '') {
2004 if ($this->_tag == 'mark')
2005- $this->_line .= '<strong '.HTMLDiff::css('diff-mark').'>'.$this->_group.'</strong>';
2006+ $this->_line .= '<strong '.HTMLDiff::css('diff-mark').'>'.$this->_escape($this->_group).'</strong>';
2007 elseif ($this->_tag == 'add')
2008- $this->_line .= '<span '.HTMLDiff::css('diff-addedline').'>'.$this->_group.'</span>';
2009+ $this->_line .= '<span '.HTMLDiff::css('diff-addedline').'>'.$this->_escape($this->_group).'</span>';
2010 elseif ($this->_tag == 'del')
2011- $this->_line .= '<span '.HTMLDiff::css('diff-deletedline').'><del>'.$this->_group.'</del></span>';
2012+ $this->_line .= '<span '.HTMLDiff::css('diff-deletedline').'><del>'.$this->_escape($this->_group).'</del></span>';
2013 else
2014- $this->_line .= $this->_group;
2015+ $this->_line .= $this->_escape($this->_group);
2016 }
2017 $this->_group = '';
2018 $this->_tag = $new_tag;
2019@@ -912,6 +925,10 @@
2020 $this->_flushLine('~done');
2021 return $this->_lines;
2022 }
2023+
2024+ function _escape($str){
2025+ return hsc($str);
2026+ }
2027 }
2028
2029 class WordLevelDiff extends MappedDiff {
2030@@ -996,6 +1013,8 @@
2031 * "Unified" diff formatter.
2032 *
2033 * This class formats the diff in classic "unified diff" format.
2034+ *
2035+ * NOTE: output is plain text and unsafe for use in HTML without escaping.
2036 */
2037 class UnifiedDiffFormatter extends DiffFormatter {
2038
2039@@ -1029,6 +1048,7 @@
2040 *
2041 */
2042 class TableDiffFormatter extends DiffFormatter {
2043+ var $colspan = 2;
2044
2045 function __construct() {
2046 $this->leading_context_lines = 2;
2047@@ -1053,8 +1073,8 @@
2048 global $lang;
2049 $l1 = $lang['line'].' '.$xbeg;
2050 $l2 = $lang['line'].' '.$ybeg;
2051- $r = '<tr><td '.HTMLDiff::css('diff-blockheader').' colspan="2">'.$l1.":</td>\n".
2052- '<td '.HTMLDiff::css('diff-blockheader').' colspan="2">'.$l2.":</td>\n".
2053+ $r = '<tr><td '.HTMLDiff::css('diff-blockheader').' colspan="'.$this->colspan.'">'.$l1.":</td>\n".
2054+ '<td '.HTMLDiff::css('diff-blockheader').' colspan="'.$this->colspan.'">'.$l2.":</td>\n".
2055 "</tr>\n";
2056 return $r;
2057 }
2058@@ -1069,25 +1089,38 @@
2059 function _lines($lines, $prefix=' ', $color="white") {
2060 }
2061
2062- function addedLine($line) {
2063- return '<td>+</td><td '.HTMLDiff::css('diff-addedline').'>' . $line.'</td>';
2064+ function addedLine($line,$escaped=false) {
2065+ if (!$escaped){
2066+ $line = $this->_escape($line);
2067+ }
2068+ return '<td '.HTMLDiff::css('diff-lineheader').'>+</td>'.
2069+ '<td '.HTMLDiff::css('diff-addedline').'>' . $line.'</td>';
2070 }
2071
2072- function deletedLine($line) {
2073- return '<td>-</td><td '.HTMLDiff::css('diff-deletedline').'>' . $line.'</td>';
2074+ function deletedLine($line,$escaped=false) {
2075+ if (!$escaped){
2076+ $line = $this->_escape($line);
2077+ }
2078+ return '<td '.HTMLDiff::css('diff-lineheader').'>-</td>'.
2079+ '<td '.HTMLDiff::css('diff-deletedline').'>' . $line.'</td>';
2080 }
2081
2082 function emptyLine() {
2083- return '<td colspan="2">&#160;</td>';
2084+ return '<td colspan="'.$this->colspan.'">&#160;</td>';
2085 }
2086
2087 function contextLine($line) {
2088- return '<td> </td><td '.HTMLDiff::css('diff-context').'>'.$line.'</td>';
2089+ return '<td '.HTMLDiff::css('diff-lineheader').'>&#160;</td>'.
2090+ '<td '.HTMLDiff::css('diff-context').'>'.$this->_escape($line).'</td>';
2091 }
2092
2093 function _added($lines) {
2094+ $this->_addedLines($lines,false);
2095+ }
2096+
2097+ function _addedLines($lines,$escaped=false){
2098 foreach ($lines as $line) {
2099- print('<tr>' . $this->emptyLine() . $this->addedLine($line) . "</tr>\n");
2100+ print('<tr>' . $this->emptyLine() . $this->addedLine($line,$escaped) . "</tr>\n");
2101 }
2102 }
2103
2104@@ -1104,15 +1137,19 @@
2105 }
2106
2107 function _changed($orig, $closing) {
2108- $diff = new WordLevelDiff($orig, $closing);
2109+ $diff = new WordLevelDiff($orig, $closing); // this escapes the diff data
2110 $del = $diff->orig();
2111 $add = $diff->closing();
2112
2113 while ($line = array_shift($del)) {
2114 $aline = array_shift($add);
2115- print('<tr>' . $this->deletedLine($line) . $this->addedLine($aline) . "</tr>\n");
2116+ print('<tr>' . $this->deletedLine($line,true) . $this->addedLine($aline,true) . "</tr>\n");
2117 }
2118- $this->_added($add); # If any leftovers
2119+ $this->_addedLines($add,true); # If any leftovers
2120+ }
2121+
2122+ function _escape($str) {
2123+ return hsc($str);
2124 }
2125 }
2126
2127@@ -1121,7 +1158,7 @@
2128 *
2129 */
2130 class InlineDiffFormatter extends DiffFormatter {
2131- var $colspan = 4;
2132+ var $colspan = 2;
2133
2134 function __construct() {
2135 $this->leading_context_lines = 2;
2136@@ -1167,28 +1204,32 @@
2137
2138 function _added($lines) {
2139 foreach ($lines as $line) {
2140- print('<tr><td colspan="'.$this->colspan.'" '.HTMLDiff::css('diff-addedline').'>'. $line . "</td></tr>\n");
2141+ print('<tr><td '.HTMLDiff::css('diff-lineheader').'>&#160;</td><td '.HTMLDiff::css('diff-addedline').'>'. $this->_escape($line) . "</td></tr>\n");
2142 }
2143 }
2144
2145 function _deleted($lines) {
2146 foreach ($lines as $line) {
2147- print('<tr><td colspan="'.$this->colspan.'" '.HTMLDiff::css('diff-deletedline').'><del>' . $line . "</del></td></tr>\n");
2148+ print('<tr><td '.HTMLDiff::css('diff-lineheader').'>&#160;</td><td '.HTMLDiff::css('diff-deletedline').'><del>' . $this->_escape($line) . "</del></td></tr>\n");
2149 }
2150 }
2151
2152 function _context($lines) {
2153 foreach ($lines as $line) {
2154- print('<tr><td colspan="'.$this->colspan.'" '.HTMLDiff::css('diff-context').'>'.$line."</td></tr>\n");
2155+ print('<tr><td '.HTMLDiff::css('diff-lineheader').'>&#160;</td><td '.HTMLDiff::css('diff-context').'>'. $this->_escape($line) ."</td></tr>\n");
2156 }
2157 }
2158
2159 function _changed($orig, $closing) {
2160- $diff = new InlineWordLevelDiff($orig, $closing);
2161+ $diff = new InlineWordLevelDiff($orig, $closing); // this escapes the diff data
2162 $add = $diff->inline();
2163
2164 foreach ($add as $line)
2165- print('<tr><td colspan="'.$this->colspan.'">'.$line."</td></tr>\n");
2166+ print('<tr><td '.HTMLDiff::css('diff-lineheader').'>&#160;</td><td>'.$line."</td></tr>\n");
2167+ }
2168+
2169+ function _escape($str) {
2170+ return hsc($str);
2171 }
2172 }
2173
2174
2175=== modified file 'inc/EmailAddressValidator.php'
2176--- inc/EmailAddressValidator.php 2012-01-29 10:04:35 +0000
2177+++ inc/EmailAddressValidator.php 2014-06-14 13:58:29 +0000
2178@@ -15,8 +15,8 @@
2179
2180 /**
2181 * Check email address validity
2182- * @param strEmailAddress Email address to be checked
2183- * @return True if email is valid, false if not
2184+ * @param string $strEmailAddress Email address to be checked
2185+ * @return bool True if email is valid, false if not
2186 */
2187 public function check_email_address($strEmailAddress) {
2188
2189@@ -82,8 +82,8 @@
2190
2191 /**
2192 * Checks email section before "@" symbol for validity
2193- * @param strLocalPortion Text to be checked
2194- * @return True if local portion is valid, false if not
2195+ * @param string $strLocalPortion Text to be checked
2196+ * @return bool True if local portion is valid, false if not
2197 */
2198 protected function check_local_portion($strLocalPortion) {
2199 // Local portion can only be from 1 to 64 characters, inclusive.
2200@@ -113,8 +113,8 @@
2201
2202 /**
2203 * Checks email section after "@" symbol for validity
2204- * @param strDomainPortion Text to be checked
2205- * @return True if domain portion is valid, false if not
2206+ * @param string $strDomainPortion Text to be checked
2207+ * @return bool True if domain portion is valid, false if not
2208 */
2209 protected function check_domain_portion($strDomainPortion) {
2210 // Total domain can only be from 1 to 255 characters, inclusive
2211@@ -172,10 +172,10 @@
2212
2213 /**
2214 * Check given text length is between defined bounds
2215- * @param strText Text to be checked
2216- * @param intMinimum Minimum acceptable length
2217- * @param intMaximum Maximum acceptable length
2218- * @return True if string is within bounds (inclusive), false if not
2219+ * @param string $strText Text to be checked
2220+ * @param int $intMinimum Minimum acceptable length
2221+ * @param int $intMaximum Maximum acceptable length
2222+ * @return bool True if string is within bounds (inclusive), false if not
2223 */
2224 protected function check_text_length($strText, $intMinimum, $intMaximum) {
2225 // Minimum and maximum are both inclusive
2226
2227=== modified file 'inc/FeedParser.php'
2228--- inc/FeedParser.php 2012-01-29 10:04:35 +0000
2229+++ inc/FeedParser.php 2014-06-14 13:58:29 +0000
2230@@ -15,8 +15,8 @@
2231 /**
2232 * Constructor. Set some defaults
2233 */
2234- function FeedParser(){
2235- $this->SimplePie();
2236+ function __construct(){
2237+ parent::__construct();
2238 $this->enable_cache(false);
2239 $this->set_file_class('FeedParser_File');
2240 }
2241@@ -47,8 +47,8 @@
2242 *
2243 * We ignore all given parameters - they are set in DokuHTTPClient
2244 */
2245- function FeedParser_File($url, $timeout=10, $redirects=5,
2246- $headers=null, $useragent=null, $force_fsockopen=false) {
2247+ function __construct($url, $timeout=10, $redirects=5,
2248+ $headers=null, $useragent=null, $force_fsockopen=false) {
2249 $this->http = new DokuHTTPClient();
2250 $this->success = $this->http->sendRequest($url);
2251
2252
2253=== modified file 'inc/HTTPClient.php'
2254--- inc/HTTPClient.php 2012-10-21 21:14:10 +0000
2255+++ inc/HTTPClient.php 2014-06-14 13:58:29 +0000
2256@@ -150,6 +150,7 @@
2257 *
2258 * @param string $url The URL to fetch
2259 * @param bool $sloppy304 Return body on 304 not modified
2260+ * @return bool|string response body, false on error
2261 * @author Andreas Gohr <andi@splitbrain.org>
2262 */
2263 function get($url,$sloppy304=false){
2264@@ -170,6 +171,7 @@
2265 * @param string $url The URL to fetch
2266 * @param array $data Associative array of parameters
2267 * @param bool $sloppy304 Return body on 304 not modified
2268+ * @return bool|string response body, false on error
2269 * @author Andreas Gohr <andi@splitbrain.org>
2270 */
2271 function dget($url,$data,$sloppy304=false){
2272@@ -187,6 +189,9 @@
2273 *
2274 * Returns the resulting page or false on an error;
2275 *
2276+ * @param string $url The URL to fetch
2277+ * @param array $data Associative array of parameters
2278+ * @return bool|string response body, false on error
2279 * @author Andreas Gohr <andi@splitbrain.org>
2280 */
2281 function post($url,$data){
2282@@ -215,6 +220,9 @@
2283 $this->start = $this->_time();
2284 $this->error = '';
2285 $this->status = 0;
2286+ $this->status = 0;
2287+ $this->resp_body = '';
2288+ $this->resp_headers = array();
2289
2290 // don't accept gzip if truncated bodies might occur
2291 if($this->max_bodysize &&
2292@@ -246,7 +254,13 @@
2293 }
2294
2295 // add SSL stream prefix if needed - needs SSL support in PHP
2296- if($port == 443 || $this->proxy_ssl) $server = 'ssl://'.$server;
2297+ if($port == 443 || $this->proxy_ssl) {
2298+ if(!in_array('ssl', stream_get_transports())) {
2299+ $this->status = -200;
2300+ $this->error = 'This PHP version does not support SSL - cannot connect to server';
2301+ }
2302+ $server = 'ssl://'.$server;
2303+ }
2304
2305 // prepare headers
2306 $headers = $this->headers;
2307@@ -254,11 +268,7 @@
2308 if(!empty($uri['port'])) $headers['Host'].= ':'.$uri['port'];
2309 $headers['User-Agent'] = $this->agent;
2310 $headers['Referer'] = $this->referer;
2311- if ($this->keep_alive) {
2312- $headers['Connection'] = 'Keep-Alive';
2313- } else {
2314- $headers['Connection'] = 'Close';
2315- }
2316+
2317 if($method == 'POST'){
2318 if(is_array($data)){
2319 if($headers['Content-Type'] == 'multipart/form-data'){
2320@@ -299,6 +309,21 @@
2321 return false;
2322 }
2323
2324+ // try establish a CONNECT tunnel for SSL
2325+ try {
2326+ if($this->_ssltunnel($socket, $request_url)){
2327+ // no keep alive for tunnels
2328+ $this->keep_alive = false;
2329+ // tunnel is authed already
2330+ if(isset($headers['Proxy-Authentication'])) unset($headers['Proxy-Authentication']);
2331+ }
2332+ } catch (HTTPClientException $e) {
2333+ $this->status = $e->getCode();
2334+ $this->error = $e->getMessage();
2335+ fclose($socket);
2336+ return false;
2337+ }
2338+
2339 // keep alive?
2340 if ($this->keep_alive) {
2341 self::$connections[$connectionId] = $socket;
2342@@ -307,6 +332,15 @@
2343 }
2344 }
2345
2346+ if ($this->keep_alive && !$this->proxy_host) {
2347+ // RFC 2068, section 19.7.1: A client MUST NOT send the Keep-Alive
2348+ // connection token to a proxy server. We still do keep the connection the
2349+ // proxy alive (well except for CONNECT tunnels)
2350+ $headers['Connection'] = 'Keep-Alive';
2351+ } else {
2352+ $headers['Connection'] = 'Close';
2353+ }
2354+
2355 try {
2356 //set non-blocking
2357 stream_set_blocking($socket, false);
2358@@ -342,7 +376,7 @@
2359
2360 // get Status
2361 if (!preg_match('/^HTTP\/(\d\.\d)\s*(\d+).*?\n/', $r_headers, $m))
2362- throw new HTTPClientException('Server returned bad answer');
2363+ throw new HTTPClientException('Server returned bad answer '.$r_headers);
2364
2365 $this->status = $m[2];
2366
2367@@ -427,9 +461,33 @@
2368 $byte = $this->_readData($socket, 2, 'chunk'); // read trailing \r\n
2369 }
2370 } while ($chunk_size && !$abort);
2371- }elseif($this->max_bodysize){
2372- // read just over the max_bodysize
2373- $r_body = $this->_readData($socket, $this->max_bodysize+1, 'response', true);
2374+ }elseif(isset($this->resp_headers['content-length']) && !isset($this->resp_headers['transfer-encoding'])){
2375+ /* RFC 2616
2376+ * If a message is received with both a Transfer-Encoding header field and a Content-Length
2377+ * header field, the latter MUST be ignored.
2378+ */
2379+
2380+ // read up to the content-length or max_bodysize
2381+ // for keep alive we need to read the whole message to clean up the socket for the next read
2382+ if(!$this->keep_alive && $this->max_bodysize && $this->max_bodysize < $this->resp_headers['content-length']){
2383+ $length = $this->max_bodysize;
2384+ }else{
2385+ $length = $this->resp_headers['content-length'];
2386+ }
2387+
2388+ $r_body = $this->_readData($socket, $length, 'response (content-length limited)', true);
2389+ }elseif( !isset($this->resp_headers['transfer-encoding']) && $this->max_bodysize && !$this->keep_alive){
2390+ $r_body = $this->_readData($socket, $this->max_bodysize, 'response (content-length limited)', true);
2391+ }else{
2392+ // read entire socket
2393+ $r_size = 0;
2394+ while (!feof($socket)) {
2395+ $r_body .= $this->_readData($socket, 4096, 'response (unlimited)', true);
2396+ }
2397+ }
2398+
2399+ // recheck body size, we might had to read the whole body, so we abort late or trim here
2400+ if($this->max_bodysize){
2401 if(strlen($r_body) > $this->max_bodysize){
2402 if ($this->max_bodysize_abort) {
2403 throw new HTTPClientException('Allowed response size exceeded');
2404@@ -437,16 +495,6 @@
2405 $this->error = 'Allowed response size exceeded';
2406 }
2407 }
2408- }elseif(isset($this->resp_headers['content-length']) &&
2409- !isset($this->resp_headers['transfer-encoding'])){
2410- // read up to the content-length
2411- $r_body = $this->_readData($socket, $this->resp_headers['content-length'], 'response', true);
2412- }else{
2413- // read entire socket
2414- $r_size = 0;
2415- while (!feof($socket)) {
2416- $r_body .= $this->_readData($socket, 4096, 'response', true);
2417- }
2418 }
2419
2420 } catch (HTTPClientException $err) {
2421@@ -485,19 +533,60 @@
2422 }
2423
2424 /**
2425+ * Tries to establish a CONNECT tunnel via Proxy
2426+ *
2427+ * Protocol, Servername and Port will be stripped from the request URL when a successful CONNECT happened
2428+ *
2429+ * @param resource &$socket
2430+ * @param string &$requesturl
2431+ * @throws HTTPClientException when a tunnel is needed but could not be established
2432+ * @return bool true if a tunnel was established
2433+ */
2434+ function _ssltunnel(&$socket, &$requesturl){
2435+ if(!$this->proxy_host) return false;
2436+ $requestinfo = parse_url($requesturl);
2437+ if($requestinfo['scheme'] != 'https') return false;
2438+ if(!$requestinfo['port']) $requestinfo['port'] = 443;
2439+
2440+ // build request
2441+ $request = "CONNECT {$requestinfo['host']}:{$requestinfo['port']} HTTP/1.0".HTTP_NL;
2442+ $request .= "Host: {$requestinfo['host']}".HTTP_NL;
2443+ if($this->proxy_user) {
2444+ $request .= 'Proxy-Authorization: Basic '.base64_encode($this->proxy_user.':'.$this->proxy_pass).HTTP_NL;
2445+ }
2446+ $request .= HTTP_NL;
2447+
2448+ $this->_debug('SSL Tunnel CONNECT',$request);
2449+ $this->_sendData($socket, $request, 'SSL Tunnel CONNECT');
2450+
2451+ // read headers from socket
2452+ $r_headers = '';
2453+ do{
2454+ $r_line = $this->_readLine($socket, 'headers');
2455+ $r_headers .= $r_line;
2456+ }while($r_line != "\r\n" && $r_line != "\n");
2457+
2458+ $this->_debug('SSL Tunnel Response',$r_headers);
2459+ if(preg_match('/^HTTP\/1\.[01] 200/i',$r_headers)){
2460+ if (stream_socket_enable_crypto($socket, true, STREAM_CRYPTO_METHOD_SSLv3_CLIENT)) {
2461+ $requesturl = $requestinfo['path'];
2462+ return true;
2463+ }
2464+ }
2465+
2466+ throw new HTTPClientException('Failed to establish secure proxy connection', -150);
2467+ }
2468+
2469+ /**
2470 * Safely write data to a socket
2471 *
2472- * @param handle $socket An open socket handle
2473- * @param string $data The data to write
2474- * @param string $message Description of what is being read
2475+ * @param resource $socket An open socket handle
2476+ * @param string $data The data to write
2477+ * @param string $message Description of what is being read
2478+ * @throws HTTPClientException
2479 * @author Tom N Harris <tnharris@whoopdedo.org>
2480 */
2481 function _sendData($socket, $data, $message) {
2482- // select parameters
2483- $sel_r = null;
2484- $sel_w = array($socket);
2485- $sel_e = null;
2486-
2487 // send request
2488 $towrite = strlen($data);
2489 $written = 0;
2490@@ -509,15 +598,21 @@
2491 if(feof($socket))
2492 throw new HTTPClientException("Socket disconnected while writing $message");
2493
2494- // wait for stream ready or timeout
2495- self::selecttimeout($this->timeout - $time_used, $sec, $usec);
2496- if(@stream_select($sel_r, $sel_w, $sel_e, $sec, $usec) !== false){
2497- // write to stream
2498- $nbytes = fwrite($socket, substr($data,$written,4096));
2499- if($nbytes === false)
2500- throw new HTTPClientException("Failed writing to socket while sending $message", -100);
2501- $written += $nbytes;
2502+ // select parameters
2503+ $sel_r = null;
2504+ $sel_w = array($socket);
2505+ $sel_e = null;
2506+ // wait for stream ready or timeout (1sec)
2507+ if(@stream_select($sel_r,$sel_w,$sel_e,1) === false){
2508+ usleep(1000);
2509+ continue;
2510 }
2511+
2512+ // write to stream
2513+ $nbytes = fwrite($socket, substr($data,$written,4096));
2514+ if($nbytes === false)
2515+ throw new HTTPClientException("Failed writing to socket while sending $message", -100);
2516+ $written += $nbytes;
2517 }
2518 }
2519
2520@@ -527,18 +622,15 @@
2521 * Reads up to a given number of bytes or throws an exception if the
2522 * response times out or ends prematurely.
2523 *
2524- * @param handle $socket An open socket handle in non-blocking mode
2525- * @param int $nbytes Number of bytes to read
2526- * @param string $message Description of what is being read
2527- * @param bool $ignore_eof End-of-file is not an error if this is set
2528+ * @param resource $socket An open socket handle in non-blocking mode
2529+ * @param int $nbytes Number of bytes to read
2530+ * @param string $message Description of what is being read
2531+ * @param bool $ignore_eof End-of-file is not an error if this is set
2532+ * @throws HTTPClientException
2533+ * @return string
2534 * @author Tom N Harris <tnharris@whoopdedo.org>
2535 */
2536 function _readData($socket, $nbytes, $message, $ignore_eof = false) {
2537- // select parameters
2538- $sel_r = array($socket);
2539- $sel_w = null;
2540- $sel_e = null;
2541-
2542 $r_data = '';
2543 // Does not return immediately so timeout and eof can be checked
2544 if ($nbytes < 0) $nbytes = 0;
2545@@ -547,8 +639,8 @@
2546 $time_used = $this->_time() - $this->start;
2547 if ($time_used > $this->timeout)
2548 throw new HTTPClientException(
2549- sprintf('Timeout while reading %s (%.3fs)', $message, $time_used),
2550- -100);
2551+ sprintf('Timeout while reading %s after %d bytes (%.3fs)', $message,
2552+ strlen($r_data), $time_used), -100);
2553 if(feof($socket)) {
2554 if(!$ignore_eof)
2555 throw new HTTPClientException("Premature End of File (socket) while reading $message");
2556@@ -556,15 +648,21 @@
2557 }
2558
2559 if ($to_read > 0) {
2560- // wait for stream ready or timeout
2561- self::selecttimeout($this->timeout - $time_used, $sec, $usec);
2562- if(@stream_select($sel_r, $sel_w, $sel_e, $sec, $usec) !== false){
2563- $bytes = fread($socket, $to_read);
2564- if($bytes === false)
2565- throw new HTTPClientException("Failed reading from socket while reading $message", -100);
2566- $r_data .= $bytes;
2567- $to_read -= strlen($bytes);
2568+ // select parameters
2569+ $sel_r = array($socket);
2570+ $sel_w = null;
2571+ $sel_e = null;
2572+ // wait for stream ready or timeout (1sec)
2573+ if(@stream_select($sel_r,$sel_w,$sel_e,1) === false){
2574+ usleep(1000);
2575+ continue;
2576 }
2577+
2578+ $bytes = fread($socket, $to_read);
2579+ if($bytes === false)
2580+ throw new HTTPClientException("Failed reading from socket while reading $message", -100);
2581+ $r_data .= $bytes;
2582+ $to_read -= strlen($bytes);
2583 }
2584 } while ($to_read > 0 && strlen($r_data) < $nbytes);
2585 return $r_data;
2586@@ -575,31 +673,34 @@
2587 *
2588 * Always returns a complete line, including the terminating \n.
2589 *
2590- * @param handle $socket An open socket handle in non-blocking mode
2591- * @param string $message Description of what is being read
2592+ * @param resource $socket An open socket handle in non-blocking mode
2593+ * @param string $message Description of what is being read
2594+ * @throws HTTPClientException
2595+ * @return string
2596 * @author Tom N Harris <tnharris@whoopdedo.org>
2597 */
2598 function _readLine($socket, $message) {
2599- // select parameters
2600- $sel_r = array($socket);
2601- $sel_w = null;
2602- $sel_e = null;
2603-
2604 $r_data = '';
2605 do {
2606 $time_used = $this->_time() - $this->start;
2607 if ($time_used > $this->timeout)
2608 throw new HTTPClientException(
2609- sprintf('Timeout while reading %s (%.3fs)', $message, $time_used),
2610+ sprintf('Timeout while reading %s (%.3fs) >%s<', $message, $time_used, $r_data),
2611 -100);
2612 if(feof($socket))
2613 throw new HTTPClientException("Premature End of File (socket) while reading $message");
2614
2615- // wait for stream ready or timeout
2616- self::selecttimeout($this->timeout - $time_used, $sec, $usec);
2617- if(@stream_select($sel_r, $sel_w, $sel_e, $sec, $usec) !== false){
2618- $r_data = fgets($socket, 1024);
2619+ // select parameters
2620+ $sel_r = array($socket);
2621+ $sel_w = null;
2622+ $sel_e = null;
2623+ // wait for stream ready or timeout (1sec)
2624+ if(@stream_select($sel_r,$sel_w,$sel_e,1) === false){
2625+ usleep(1000);
2626+ continue;
2627 }
2628+
2629+ $r_data = fgets($socket, 1024);
2630 } while (!preg_match('/\n$/',$r_data));
2631 return $r_data;
2632 }
2633@@ -607,10 +708,26 @@
2634 /**
2635 * print debug info
2636 *
2637+ * Uses _debug_text or _debug_html depending on the SAPI name
2638+ *
2639 * @author Andreas Gohr <andi@splitbrain.org>
2640 */
2641 function _debug($info,$var=null){
2642 if(!$this->debug) return;
2643+ if(php_sapi_name() == 'cli'){
2644+ $this->_debug_text($info, $var);
2645+ }else{
2646+ $this->_debug_html($info, $var);
2647+ }
2648+ }
2649+
2650+ /**
2651+ * print debug info as HTML
2652+ *
2653+ * @param $info
2654+ * @param null $var
2655+ */
2656+ function _debug_html($info, $var=null){
2657 print '<b>'.$info.'</b> '.($this->_time() - $this->start).'s<br />';
2658 if(!is_null($var)){
2659 ob_start();
2660@@ -622,6 +739,18 @@
2661 }
2662
2663 /**
2664+ * prints debug info as plain text
2665+ *
2666+ * @param $info
2667+ * @param null $var
2668+ */
2669+ function _debug_text($info, $var=null){
2670+ print '*'.$info.'* '.($this->_time() - $this->start)."s\n";
2671+ if(!is_null($var)) print_r($var);
2672+ print "\n-----------------------------------------------\n";
2673+ }
2674+
2675+ /**
2676 * Return current timestamp in microsecond resolution
2677 */
2678 static function _time(){
2679@@ -630,14 +759,6 @@
2680 }
2681
2682 /**
2683- * Calculate seconds and microseconds
2684- */
2685- static function selecttimeout($time, &$sec, &$usec){
2686- $sec = floor($time);
2687- $usec = (int)(($time - $sec) * 1000000);
2688- }
2689-
2690- /**
2691 * convert given header string to Header array
2692 *
2693 * All Keys are lowercased.
2694@@ -692,7 +813,7 @@
2695 $headers .= "$key=$val; ";
2696 }
2697 $headers = substr($headers, 0, -2);
2698- if ($headers !== '') $headers = "Cookie: $headers".HTTP_NL;
2699+ if ($headers) $headers = "Cookie: $headers".HTTP_NL;
2700 return $headers;
2701 }
2702
2703@@ -702,12 +823,7 @@
2704 * @author Andreas Gohr <andi@splitbrain.org>
2705 */
2706 function _postEncode($data){
2707- $url = '';
2708- foreach($data as $key => $val){
2709- if($url) $url .= '&';
2710- $url .= urlencode($key).'='.urlencode($val);
2711- }
2712- return $url;
2713+ return http_build_query($data,'','&');
2714 }
2715
2716 /**
2717@@ -743,6 +859,8 @@
2718 /**
2719 * Generates a unique identifier for a connection.
2720 *
2721+ * @param string $server
2722+ * @param string $port
2723 * @return string unique identifier
2724 */
2725 function _uniqueConnectionId($server, $port) {
2726
2727=== modified file 'inc/Input.class.php'
2728--- inc/Input.class.php 2012-10-21 21:14:10 +0000
2729+++ inc/Input.class.php 2014-06-14 13:58:29 +0000
2730@@ -15,6 +15,8 @@
2731 public $post;
2732 /** @var GetInput Access $_GET parameters */
2733 public $get;
2734+ /** @var ServerInput Access $_SERVER parameters */
2735+ public $server;
2736
2737 protected $access;
2738
2739@@ -25,6 +27,7 @@
2740 $this->access = &$_REQUEST;
2741 $this->post = new PostInput();
2742 $this->get = new GetInput();
2743+ $this->server = new ServerInput();
2744 }
2745
2746 /**
2747@@ -141,6 +144,26 @@
2748 }
2749
2750 /**
2751+ * Access a request parameter and make sure it is has a valid value
2752+ *
2753+ * Please note that comparisons to the valid values are not done typesafe (request vars
2754+ * are always strings) however the function will return the correct type from the $valids
2755+ * array when an match was found.
2756+ *
2757+ * @param string $name Parameter name
2758+ * @param array $valids Array of valid values
2759+ * @param mixed $default Default to return if parameter isn't set or not valid
2760+ * @return null|mixed
2761+ */
2762+ public function valid($name, $valids, $default = null) {
2763+ if(!isset($this->access[$name])) return $default;
2764+ if(is_array($this->access[$name])) return $default; // we don't allow arrays
2765+ $found = array_search($this->access[$name], $valids);
2766+ if($found !== false) return $valids[$found]; // return the valid value for type safety
2767+ return $default;
2768+ }
2769+
2770+ /**
2771 * Access a request parameter as bool
2772 *
2773 * Note: $nonempty is here for interface consistency and makes not much sense for booleans
2774@@ -238,7 +261,6 @@
2775
2776 /**
2777 * Internal class used for $_GET access in Input class
2778-
2779 */
2780 class GetInput extends Input {
2781 protected $access;
2782@@ -261,3 +283,18 @@
2783 $_REQUEST[$name] = $value;
2784 }
2785 }
2786+
2787+/**
2788+ * Internal class used for $_SERVER access in Input class
2789+ */
2790+class ServerInput extends Input {
2791+ protected $access;
2792+
2793+ /**
2794+ * Initialize the $access array, remove subclass members
2795+ */
2796+ function __construct() {
2797+ $this->access = &$_SERVER;
2798+ }
2799+
2800+}
2801
2802=== modified file 'inc/JpegMeta.php'
2803--- inc/JpegMeta.php 2012-10-21 21:14:10 +0000
2804+++ inc/JpegMeta.php 2014-06-14 13:58:29 +0000
2805@@ -161,7 +161,7 @@
2806 if($info != false) break;
2807 }
2808
2809- if($info === false) $info = $alt;
2810+ if($info === false) $info = '';
2811 if(is_array($info)){
2812 if(isset($info['val'])){
2813 $info = $info['val'];
2814@@ -874,7 +874,7 @@
2815 /*************************************************************/
2816
2817 /*************************************************************/
2818- function _dispose() {
2819+ function _dispose($fileName = "") {
2820 $this->_fileName = $fileName;
2821
2822 $this->_fp = null;
2823@@ -975,7 +975,7 @@
2824
2825 if ($capture) {
2826 if ($length)
2827- $this->_markers[$count]['data'] =& fread($this->_fp, $length);
2828+ $this->_markers[$count]['data'] = fread($this->_fp, $length);
2829 else
2830 $this->_markers[$count]['data'] = "";
2831 }
2832@@ -1452,7 +1452,7 @@
2833 if ($this->_markers[$i]['marker'] == 0xE1) {
2834 $signature = $this->_getFixedString($this->_markers[$i]['data'], 0, 29);
2835 if ($signature == "http://ns.adobe.com/xap/1.0/\0") {
2836- $data =& substr($this->_markers[$i]['data'], 29);
2837+ $data = substr($this->_markers[$i]['data'], 29);
2838 break;
2839 }
2840 }
2841@@ -2183,7 +2183,8 @@
2842 }
2843
2844 while ($j < $count) {
2845- $this->_putString($value, $j * 4, "\0\0\0\0");
2846+ $v = "\0\0\0\0";
2847+ $this->_putString($value, $j * 4, $v);
2848 $j++;
2849 }
2850 break;
2851@@ -2206,7 +2207,8 @@
2852 }
2853
2854 while ($j < $count) {
2855- $this->_putString($value, $j * 8, "\0\0\0\0\0\0\0\0");
2856+ $v = "\0\0\0\0\0\0\0\0";
2857+ $this->_putString($value, $j * 8, $v);
2858 $j++;
2859 }
2860 break;
2861@@ -2335,7 +2337,7 @@
2862 function _readIPTC(&$data, $pos = 0) {
2863 $totalLength = strlen($data);
2864
2865- $IPTCTags =& $this->_iptcTagNames();
2866+ $IPTCTags = $this->_iptcTagNames();
2867
2868 while ($pos < ($totalLength - 5)) {
2869 $signature = $this->_getShort($data, $pos);
2870@@ -2927,7 +2929,8 @@
2871 $length = strlen($data) - $pos;
2872 }
2873
2874- return substr($data, $pos, $length);
2875+ $rv = substr($data, $pos, $length);
2876+ return $rv;
2877 }
2878
2879 /*************************************************************/
2880
2881=== modified file 'inc/Mailer.class.php'
2882--- inc/Mailer.class.php 2012-10-21 21:14:10 +0000
2883+++ inc/Mailer.class.php 2014-06-14 13:58:29 +0000
2884@@ -39,11 +39,14 @@
2885 */
2886 public function __construct() {
2887 global $conf;
2888+ /* @var Input $INPUT */
2889+ global $INPUT;
2890
2891 $server = parse_url(DOKU_URL, PHP_URL_HOST);
2892+ if(strpos($server,'.') === false) $server = $server.'.localhost';
2893
2894- $this->partid = md5(uniqid(rand(), true)).'@'.$server;
2895- $this->boundary = '----------'.md5(uniqid(rand(), true));
2896+ $this->partid = substr(md5(uniqid(rand(), true)),0, 8).'@'.$server;
2897+ $this->boundary = '__________'.md5(uniqid(rand(), true));
2898
2899 $listid = join('.', array_reverse(explode('/', DOKU_BASE))).$server;
2900 $listid = strtolower(trim($listid, '.'));
2901@@ -51,12 +54,13 @@
2902 $this->allowhtml = (bool)$conf['htmlmail'];
2903
2904 // add some default headers for mailfiltering FS#2247
2905- $this->setHeader('X-Mailer', 'DokuWiki '.getVersion());
2906- $this->setHeader('X-DokuWiki-User', $_SERVER['REMOTE_USER']);
2907+ $this->setHeader('X-Mailer', 'DokuWiki');
2908+ $this->setHeader('X-DokuWiki-User', $INPUT->server->str('REMOTE_USER'));
2909 $this->setHeader('X-DokuWiki-Title', $conf['title']);
2910 $this->setHeader('X-DokuWiki-Server', $server);
2911 $this->setHeader('X-Auto-Response-Suppress', 'OOF');
2912 $this->setHeader('List-Id', $conf['title'].' <'.$listid.'>');
2913+ $this->setHeader('Date', date('r'), false);
2914 }
2915
2916 /**
2917@@ -137,7 +141,13 @@
2918 }
2919
2920 // empty value deletes
2921- $value = trim($value);
2922+ if(is_array($value)){
2923+ $value = array_map('trim', $value);
2924+ $value = array_filter($value);
2925+ if(!$value) $value = '';
2926+ }else{
2927+ $value = trim($value);
2928+ }
2929 if($value === '') {
2930 if(isset($this->headers[$header])) unset($this->headers[$header]);
2931 } else {
2932@@ -173,6 +183,9 @@
2933 public function setBody($text, $textrep = null, $htmlrep = null, $html = null, $wrap = true) {
2934 global $INFO;
2935 global $conf;
2936+ /* @var Input $INPUT */
2937+ global $INPUT;
2938+
2939 $htmlrep = (array)$htmlrep;
2940 $textrep = (array)$textrep;
2941
2942@@ -192,7 +205,7 @@
2943 // copy over all replacements missing for HTML (autolink URLs)
2944 foreach($textrep as $key => $value) {
2945 if(isset($htmlrep[$key])) continue;
2946- if(preg_match('/^https?:\/\//i', $value)) {
2947+ if(media_isexternal($value)) {
2948 $htmlrep[$key] = '<a href="'.hsc($value).'">'.hsc($value).'</a>';
2949 } else {
2950 $htmlrep[$key] = hsc($value);
2951@@ -210,24 +223,24 @@
2952 $cip = gethostsbyaddrs($ip);
2953 $trep = array(
2954 'DATE' => dformat(),
2955- 'BROWSER' => $_SERVER['HTTP_USER_AGENT'],
2956+ 'BROWSER' => $INPUT->server->str('HTTP_USER_AGENT'),
2957 'IPADDRESS' => $ip,
2958 'HOSTNAME' => $cip,
2959 'TITLE' => $conf['title'],
2960 'DOKUWIKIURL' => DOKU_URL,
2961- 'USER' => $_SERVER['REMOTE_USER'],
2962+ 'USER' => $INPUT->server->str('REMOTE_USER'),
2963 'NAME' => $INFO['userinfo']['name'],
2964 'MAIL' => $INFO['userinfo']['mail'],
2965 );
2966 $trep = array_merge($trep, (array)$textrep);
2967 $hrep = array(
2968 'DATE' => '<i>'.hsc(dformat()).'</i>',
2969- 'BROWSER' => hsc($_SERVER['HTTP_USER_AGENT']),
2970+ 'BROWSER' => hsc($INPUT->server->str('HTTP_USER_AGENT')),
2971 'IPADDRESS' => '<code>'.hsc($ip).'</code>',
2972 'HOSTNAME' => '<code>'.hsc($cip).'</code>',
2973 'TITLE' => hsc($conf['title']),
2974 'DOKUWIKIURL' => '<a href="'.DOKU_URL.'">'.DOKU_URL.'</a>',
2975- 'USER' => hsc($_SERVER['REMOTE_USER']),
2976+ 'USER' => hsc($INPUT->server->str('REMOTE_USER')),
2977 'NAME' => hsc($INFO['userinfo']['name']),
2978 'MAIL' => '<a href="mailto:"'.hsc($INFO['userinfo']['mail']).'">'.
2979 hsc($INFO['userinfo']['mail']).'</a>',
2980@@ -269,8 +282,8 @@
2981 /**
2982 * Add the To: recipients
2983 *
2984- * @see setAddress
2985- * @param string $address Multiple adresses separated by commas
2986+ * @see cleanAddress
2987+ * @param string|array $address Multiple adresses separated by commas or as array
2988 */
2989 public function to($address) {
2990 $this->setHeader('To', $address, false);
2991@@ -279,8 +292,8 @@
2992 /**
2993 * Add the Cc: recipients
2994 *
2995- * @see setAddress
2996- * @param string $address Multiple adresses separated by commas
2997+ * @see cleanAddress
2998+ * @param string|array $address Multiple adresses separated by commas or as array
2999 */
3000 public function cc($address) {
3001 $this->setHeader('Cc', $address, false);
3002@@ -289,8 +302,8 @@
3003 /**
3004 * Add the Bcc: recipients
3005 *
3006- * @see setAddress
3007- * @param string $address Multiple adresses separated by commas
3008+ * @see cleanAddress
3009+ * @param string|array $address Multiple adresses separated by commas or as array
3010 */
3011 public function bcc($address) {
3012 $this->setHeader('Bcc', $address, false);
3013@@ -302,7 +315,7 @@
3014 * This is set to $conf['mailfrom'] when not specified so you shouldn't need
3015 * to call this function
3016 *
3017- * @see setAddress
3018+ * @see cleanAddress
3019 * @param string $address from address
3020 */
3021 public function from($address) {
3022@@ -325,20 +338,22 @@
3023 * for headers. Addresses may not contain Non-ASCII data!
3024 *
3025 * Example:
3026- * setAddress("föö <foo@bar.com>, me@somewhere.com","TBcc");
3027+ * cc("föö <foo@bar.com>, me@somewhere.com","TBcc");
3028 *
3029- * @param string $address Multiple adresses separated by commas
3030+ * @param string|array $addresses Multiple adresses separated by commas or as array
3031 * @return bool|string the prepared header (can contain multiple lines)
3032 */
3033- public function cleanAddress($address) {
3034+ public function cleanAddress($addresses) {
3035 // No named recipients for To: in Windows (see FS#652)
3036 $names = (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') ? false : true;
3037
3038- $address = preg_replace('/[\r\n\0]+/', ' ', $address); // remove attack vectors
3039-
3040 $headers = '';
3041- $parts = explode(',', $address);
3042- foreach($parts as $part) {
3043+ if(!is_array($addresses)){
3044+ $addresses = explode(',', $addresses);
3045+ }
3046+
3047+ foreach($addresses as $part) {
3048+ $part = preg_replace('/[\r\n\0]+/', ' ', $part); // remove attack vectors
3049 $part = trim($part);
3050
3051 // parse address
3052@@ -378,7 +393,7 @@
3053 $text = utf8_strip($text);
3054 }
3055
3056- if(!utf8_isASCII($text)) {
3057+ if(strpos($text, ',') !== false || !utf8_isASCII($text)) {
3058 $text = '=?UTF-8?B?'.base64_encode($text).'?=';
3059 }
3060 } else {
3061@@ -392,6 +407,7 @@
3062 $headers .= $text.' '.$addr;
3063 }
3064
3065+ $headers = trim($headers);
3066 if(empty($headers)) return false;
3067
3068 return $headers;
3069@@ -408,6 +424,8 @@
3070 $part = 1;
3071 // embedded attachments
3072 foreach($this->attach as $media) {
3073+ $media['name'] = str_replace(':', '_', cleanID($media['name'], true));
3074+
3075 // create content id
3076 $cid = 'part'.$part.'.'.$this->partid;
3077
3078@@ -417,13 +435,13 @@
3079 }
3080
3081 $mime .= '--'.$this->boundary.MAILHEADER_EOL;
3082- $mime .= 'Content-Type: '.$media['mime'].';'.MAILHEADER_EOL;
3083- $mime .= 'Content-Transfer-Encoding: base64'.MAILHEADER_EOL;
3084- $mime .= "Content-ID: <$cid>".MAILHEADER_EOL;
3085+ $mime .= $this->wrappedHeaderLine('Content-Type', $media['mime'].'; id="'.$cid.'"');
3086+ $mime .= $this->wrappedHeaderLine('Content-Transfer-Encoding', 'base64');
3087+ $mime .= $this->wrappedHeaderLine('Content-ID',"<$cid>");
3088 if($media['embed']) {
3089- $mime .= 'Content-Disposition: inline; filename="'.$media['name'].'"'.MAILHEADER_EOL;
3090+ $mime .= $this->wrappedHeaderLine('Content-Disposition', 'inline; filename='.$media['name']);
3091 } else {
3092- $mime .= 'Content-Disposition: attachment; filename="'.$media['name'].'"'.MAILHEADER_EOL;
3093+ $mime .= $this->wrappedHeaderLine('Content-Disposition', 'attachment; filename='.$media['name']);
3094 }
3095 $mime .= MAILHEADER_EOL; //end of headers
3096 $mime .= chunk_split(base64_encode($media['data']), 74, MAILHEADER_EOL);
3097@@ -460,7 +478,7 @@
3098 if(!$this->html && !count($this->attach)) { // we can send a simple single part message
3099 $this->headers['Content-Type'] = 'text/plain; charset=UTF-8';
3100 $this->headers['Content-Transfer-Encoding'] = 'base64';
3101- $body .= chunk_split(base64_encode($this->text), 74, MAILHEADER_EOL);
3102+ $body .= chunk_split(base64_encode($this->text), 72, MAILHEADER_EOL);
3103 } else { // multi part it is
3104 $body .= "This is a multi-part message in MIME format.".MAILHEADER_EOL;
3105
3106@@ -475,10 +493,11 @@
3107 $body .= 'Content-Type: text/plain; charset=UTF-8'.MAILHEADER_EOL;
3108 $body .= 'Content-Transfer-Encoding: base64'.MAILHEADER_EOL;
3109 $body .= MAILHEADER_EOL;
3110- $body .= chunk_split(base64_encode($this->text), 74, MAILHEADER_EOL);
3111+ $body .= chunk_split(base64_encode($this->text), 72, MAILHEADER_EOL);
3112 $body .= '--'.$this->boundary.'XX'.MAILHEADER_EOL;
3113 $body .= 'Content-Type: multipart/related;'.MAILHEADER_EOL.
3114- ' boundary="'.$this->boundary.'"'.MAILHEADER_EOL;
3115+ ' boundary="'.$this->boundary.'";'.MAILHEADER_EOL.
3116+ ' type="text/html"'.MAILHEADER_EOL;
3117 $body .= MAILHEADER_EOL;
3118 }
3119
3120@@ -486,7 +505,7 @@
3121 $body .= 'Content-Type: text/html; charset=UTF-8'.MAILHEADER_EOL;
3122 $body .= 'Content-Transfer-Encoding: base64'.MAILHEADER_EOL;
3123 $body .= MAILHEADER_EOL;
3124- $body .= chunk_split(base64_encode($this->html), 74, MAILHEADER_EOL);
3125+ $body .= chunk_split(base64_encode($this->html), 72, MAILHEADER_EOL);
3126 $body .= MAILHEADER_EOL;
3127 $body .= $attachments;
3128 $body .= '--'.$this->boundary.'--'.MAILHEADER_EOL;
3129@@ -508,7 +527,7 @@
3130
3131 // clean up addresses
3132 if(empty($this->headers['From'])) $this->from($conf['mailfrom']);
3133- $addrs = array('To', 'From', 'Cc', 'Bcc');
3134+ $addrs = array('To', 'From', 'Cc', 'Bcc', 'Reply-To', 'Sender');
3135 foreach($addrs as $addr) {
3136 if(isset($this->headers[$addr])) {
3137 $this->headers[$addr] = $this->cleanAddress($this->headers[$addr]);
3138@@ -541,10 +560,17 @@
3139 }
3140 }
3141
3142- // wrap headers
3143- foreach($this->headers as $key => $val) {
3144- $this->headers[$key] = wordwrap($val, 78, MAILHEADER_EOL.' ');
3145- }
3146+ }
3147+
3148+ /**
3149+ * Returns a complete, EOL terminated header line, wraps it if necessary
3150+ *
3151+ * @param $key
3152+ * @param $val
3153+ * @return string
3154+ */
3155+ protected function wrappedHeaderLine($key, $val){
3156+ return wordwrap("$key: $val", 78, MAILHEADER_EOL.' ').MAILHEADER_EOL;
3157 }
3158
3159 /**
3160@@ -555,7 +581,8 @@
3161 protected function prepareHeaders() {
3162 $headers = '';
3163 foreach($this->headers as $key => $val) {
3164- $headers .= "$key: $val".MAILHEADER_EOL;
3165+ if ($val === '' || is_null($val)) continue;
3166+ $headers .= $this->wrappedHeaderLine($key, $val);
3167 }
3168 return $headers;
3169 }
3170@@ -618,16 +645,16 @@
3171 ) return false;
3172
3173 // The To: header is special
3174- if(isset($this->headers['To'])) {
3175- $to = $this->headers['To'];
3176+ if(array_key_exists('To', $this->headers)) {
3177+ $to = (string)$this->headers['To'];
3178 unset($this->headers['To']);
3179 } else {
3180 $to = '';
3181 }
3182
3183 // so is the subject
3184- if(isset($this->headers['Subject'])) {
3185- $subject = $this->headers['Subject'];
3186+ if(array_key_exists('Subject', $this->headers)) {
3187+ $subject = (string)$this->headers['Subject'];
3188 unset($this->headers['Subject']);
3189 } else {
3190 $subject = '';
3191
3192=== modified file 'inc/PassHash.class.php'
3193--- inc/PassHash.class.php 2012-10-21 21:14:10 +0000
3194+++ inc/PassHash.class.php 2014-06-14 13:58:29 +0000
3195@@ -4,7 +4,7 @@
3196 *
3197 * This class implements various mechanisms used to hash passwords
3198 *
3199- * @author Andreas Gohr <andi@splitbrain.org>
3200+ * @author Andreas Gohr <andi@splitbrain.org>
3201 * @license LGPL2
3202 */
3203 class PassHash {
3204@@ -58,6 +58,12 @@
3205 } elseif(substr($hash, 0, 6) == '{SMD5}') {
3206 $method = 'lsmd5';
3207 $salt = substr(base64_decode(substr($hash, 6)), 16);
3208+ } elseif(preg_match('/^:B:(.+?):.{32}$/', $hash, $m)) {
3209+ $method = 'mediawiki';
3210+ $salt = $m[1];
3211+ } elseif(preg_match('/^\$6\$(.+?)\$/', $hash, $m)) {
3212+ $method = 'sha512';
3213+ $salt = $m[1];
3214 } elseif($len == 32) {
3215 $method = 'md5';
3216 } elseif($len == 40) {
3217@@ -92,7 +98,7 @@
3218 $salt = '';
3219 $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
3220 for($i = 0; $i < $len; $i++) {
3221- $salt .= $chars[mt_rand(0, 61)];
3222+ $salt .= $chars[$this->random(0, 61)];
3223 }
3224 return $salt;
3225 }
3226@@ -101,14 +107,18 @@
3227 * Initialize the passed variable with a salt if needed.
3228 *
3229 * If $salt is not null, the value is kept, but the lenght restriction is
3230- * applied.
3231+ * applied (unless, $cut is false).
3232 *
3233 * @param string &$salt The salt, pass null if you want one generated
3234- * @param int $len The length of the salt
3235+ * @param int $len The length of the salt
3236+ * @param bool $cut Apply length restriction to existing salt?
3237 */
3238- public function init_salt(&$salt, $len = 32) {
3239- if(is_null($salt)) $salt = $this->gen_salt($len);
3240- if(strlen($salt) > $len) $salt = substr($salt, 0, $len);
3241+ public function init_salt(&$salt, $len = 32, $cut = true) {
3242+ if(is_null($salt)) {
3243+ $salt = $this->gen_salt($len);
3244+ $cut = true; // for new hashes we alway apply length restriction
3245+ }
3246+ if(strlen($salt) > $len && $cut) $salt = substr($salt, 0, $len);
3247 }
3248
3249 // Password hashing methods follow below
3250@@ -263,7 +273,7 @@
3251 *
3252 * This method was used by old MySQL systems
3253 *
3254- * @link http://www.php.net/mysql
3255+ * @link http://www.php.net/mysql
3256 * @author <soren at byu dot edu>
3257 * @param string $clear The clear text to hash
3258 * @return string Hashed password
3259@@ -327,9 +337,9 @@
3260 * an exception.
3261 *
3262 * @link http://www.openwall.com/phpass/
3263- * @param string $clear The clear text to hash
3264- * @param string $salt The salt to use, null for random
3265- * @param string $magic The hash identifier (P or H)
3266+ * @param string $clear The clear text to hash
3267+ * @param string $salt The salt to use, null for random
3268+ * @param string $magic The hash identifier (P or H)
3269 * @param int $compute The iteration count for new passwords
3270 * @throws Exception
3271 * @return string Hashed password
3272@@ -430,8 +440,8 @@
3273 * will break. When no salt is given, the iteration count can be set
3274 * through the $compute variable.
3275 *
3276- * @param string $clear The clear text to hash
3277- * @param string $salt The salt to use, null for random
3278+ * @param string $clear The clear text to hash
3279+ * @param string $salt The salt to use, null for random
3280 * @param int $compute The iteration count (between 4 and 31)
3281 * @throws Exception
3282 * @return string Hashed password
3283@@ -450,4 +460,101 @@
3284 return crypt($clear, $salt);
3285 }
3286
3287+ /**
3288+ * Password hashing method SHA512
3289+ *
3290+ * This is only supported on PHP 5.3.2 or higher and will throw an exception if
3291+ * the needed crypt support is not available
3292+ *
3293+ * @param string $clear The clear text to hash
3294+ * @param string $salt The salt to use, null for random
3295+ * @return string Hashed password
3296+ * @throws Exception
3297+ */
3298+ public function hash_sha512($clear, $salt = null) {
3299+ if(!defined('CRYPT_SHA512') || CRYPT_SHA512 != 1) {
3300+ throw new Exception('This PHP installation has no SHA512 support');
3301+ }
3302+ $this->init_salt($salt, 8, false);
3303+ return crypt($clear, '$6$'.$salt.'$');
3304+ }
3305+
3306+ /**
3307+ * Password hashing method 'mediawiki'
3308+ *
3309+ * Uses salted MD5, this is referred to as Method B in MediaWiki docs. Unsalted md5
3310+ * method 'A' is not supported.
3311+ *
3312+ * @link http://www.mediawiki.org/wiki/Manual_talk:User_table#user_password_column
3313+ * @param string $clear The clear text to hash
3314+ * @param string $salt The salt to use, null for random
3315+ * @return string Hashed password
3316+ */
3317+ public function hash_mediawiki($clear, $salt = null) {
3318+ $this->init_salt($salt, 8, false);
3319+ return ':B:'.$salt.':'.md5($salt.'-'.md5($clear));
3320+ }
3321+
3322+ /**
3323+ * Wraps around native hash_hmac() or reimplents it
3324+ *
3325+ * This is not directly used as password hashing method, and thus isn't callable via the
3326+ * verify_hash() method. It should be used to create signatures and might be used in other
3327+ * password hashing methods.
3328+ *
3329+ * @see hash_hmac()
3330+ * @author KC Cloyd
3331+ * @link http://www.php.net/manual/en/function.hash-hmac.php#93440
3332+ *
3333+ * @param string $algo Name of selected hashing algorithm (i.e. "md5", "sha256", "haval160,4",
3334+ * etc..) See hash_algos() for a list of supported algorithms.
3335+ * @param string $data Message to be hashed.
3336+ * @param string $key Shared secret key used for generating the HMAC variant of the message digest.
3337+ * @param bool $raw_output When set to TRUE, outputs raw binary data. FALSE outputs lowercase hexits.
3338+ *
3339+ * @return string
3340+ */
3341+ public static function hmac($algo, $data, $key, $raw_output = false) {
3342+ // use native function if available and not in unit test
3343+ if(function_exists('hash_hmac') && !defined('SIMPLE_TEST')){
3344+ return hash_hmac($algo, $data, $key, $raw_output);
3345+ }
3346+
3347+ $algo = strtolower($algo);
3348+ $pack = 'H' . strlen($algo('test'));
3349+ $size = 64;
3350+ $opad = str_repeat(chr(0x5C), $size);
3351+ $ipad = str_repeat(chr(0x36), $size);
3352+
3353+ if(strlen($key) > $size) {
3354+ $key = str_pad(pack($pack, $algo($key)), $size, chr(0x00));
3355+ } else {
3356+ $key = str_pad($key, $size, chr(0x00));
3357+ }
3358+
3359+ for($i = 0; $i < strlen($key) - 1; $i++) {
3360+ $opad[$i] = $opad[$i] ^ $key[$i];
3361+ $ipad[$i] = $ipad[$i] ^ $key[$i];
3362+ }
3363+
3364+ $output = $algo($opad . pack($pack, $algo($ipad . $data)));
3365+
3366+ return ($raw_output) ? pack($pack, $output) : $output;
3367+ }
3368+
3369+ /**
3370+ * Use DokuWiki's secure random generator if available
3371+ *
3372+ * @param $min
3373+ * @param $max
3374+ *
3375+ * @return int
3376+ */
3377+ protected function random($min, $max){
3378+ if(function_exists('auth_random')){
3379+ return auth_random($min, $max);
3380+ }else{
3381+ return mt_rand($min, $max);
3382+ }
3383+ }
3384 }
3385
3386=== modified file 'inc/RemoteAPICore.php'
3387--- inc/RemoteAPICore.php 2012-10-21 21:14:10 +0000
3388+++ inc/RemoteAPICore.php 2014-06-14 13:58:29 +0000
3389@@ -3,7 +3,7 @@
3390 /**
3391 * Increased whenever the API is changed
3392 */
3393-define('DOKU_API_VERSION', 7);
3394+define('DOKU_API_VERSION', 9);
3395
3396 class RemoteAPICore {
3397
3398@@ -24,6 +24,10 @@
3399 'return' => 'int',
3400 'doc' => 'Tries to login with the given credentials and sets auth cookies.',
3401 'public' => '1'
3402+ ), 'dokuwiki.logoff' => array(
3403+ 'args' => array(),
3404+ 'return' => 'int',
3405+ 'doc' => 'Tries to logoff by expiring auth cookies and the associated PHP session.'
3406 ), 'dokuwiki.getPagelist' => array(
3407 'args' => array('string', 'array'),
3408 'return' => 'array',
3409@@ -48,7 +52,7 @@
3410 'public' => '1'
3411 ), 'dokuwiki.appendPage' => array(
3412 'args' => array('string', 'string', 'array'),
3413- 'return' => 'int',
3414+ 'return' => 'bool',
3415 'doc' => 'Append text to a wiki page.'
3416 ), 'wiki.getPage' => array(
3417 'args' => array('string'),
3418@@ -88,12 +92,12 @@
3419 ), 'wiki.getPageInfo' => array(
3420 'args' => array('string'),
3421 'return' => 'array',
3422- 'doc' => 'Returns a struct with infos about the page.',
3423+ 'doc' => 'Returns a struct with info about the page.',
3424 'name' => 'pageInfo'
3425 ), 'wiki.getPageInfoVersion' => array(
3426 'args' => array('string', 'int'),
3427 'return' => 'array',
3428- 'doc' => 'Returns a struct with infos about the page.',
3429+ 'doc' => 'Returns a struct with info about the page.',
3430 'name' => 'pageInfo'
3431 ), 'wiki.getPageVersions' => array(
3432 'args' => array('string', 'int'),
3433@@ -102,7 +106,7 @@
3434 'name' => 'pageVersions'
3435 ), 'wiki.putPage' => array(
3436 'args' => array('string', 'string', 'array'),
3437- 'return' => 'int',
3438+ 'return' => 'bool',
3439 'doc' => 'Saves a wiki page.'
3440 ), 'wiki.listLinks' => array(
3441 'args' => array('string'),
3442@@ -136,7 +140,7 @@
3443 ), 'wiki.getAttachmentInfo' => array(
3444 'args' => array('string'),
3445 'return' => 'array',
3446- 'doc' => 'Returns a struct with infos about the attachment.'
3447+ 'doc' => 'Returns a struct with info about the attachment.'
3448 ), 'dokuwiki.getXMLRPCAPIVersion' => array(
3449 'args' => array(),
3450 'name' => 'getAPIVersion',
3451@@ -333,7 +337,6 @@
3452 if (!is_array($options)) $options = array();
3453 $options['skipacl'] = 0; // no ACL skipping for XMLRPC
3454
3455-
3456 if(auth_quickaclcheck($ns.':*') >= AUTH_READ) {
3457 $dir = utf8_encodeFN(str_replace(':', '/', $ns));
3458
3459@@ -344,6 +347,8 @@
3460
3461 for($i=0; $i<$len; $i++) {
3462 unset($data[$i]['meta']);
3463+ $data[$i]['perms'] = $data[$i]['perm'];
3464+ unset($data[$i]['perm']);
3465 $data[$i]['lastModified'] = $this->api->toDate($data[$i]['mtime']);
3466 }
3467 return $data;
3468@@ -370,10 +375,11 @@
3469 $file = wikiFN($id,$rev);
3470 $time = @filemtime($file);
3471 if(!$time){
3472- throw new RemoteException(10, 'The requested page does not exist', 121);
3473+ throw new RemoteException('The requested page does not exist', 121);
3474 }
3475
3476- $info = getRevisionInfo($id, $time, 1024);
3477+ $pagelog = new PageChangeLog($id, 1024);
3478+ $info = $pagelog->getRevisionInfo($time);
3479
3480 $data = array(
3481 'name' => $id,
3482@@ -440,7 +446,7 @@
3483 // run the indexer if page wasn't indexed yet
3484 idx_addPage($id);
3485
3486- return 0;
3487+ return true;
3488 }
3489
3490 /**
3491@@ -504,8 +510,8 @@
3492 }
3493
3494 /**
3495- * Returns the permissions of a given wiki page
3496- */
3497+ * Returns the permissions of a given wiki page
3498+ */
3499 function aclCheck($id) {
3500 $id = $this->resolvePageId($id);
3501 return auth_quickaclcheck($id);
3502@@ -645,16 +651,19 @@
3503 throw new RemoteException('Empty page ID', 131);
3504 }
3505
3506- $revisions = getRevisions($id, $first, $conf['recent']+1);
3507+ $pagelog = new PageChangeLog($id);
3508+ $revisions = $pagelog->getRevisions($first, $conf['recent']+1);
3509
3510 if(count($revisions)==0 && $first!=0) {
3511 $first=0;
3512- $revisions = getRevisions($id, $first, $conf['recent']+1);
3513+ $revisions = $pagelog->getRevisions($first, $conf['recent']+1);
3514 }
3515
3516 if(count($revisions)>0 && $first==0) {
3517 array_unshift($revisions, ''); // include current revision
3518- array_pop($revisions); // remove extra log entry
3519+ if ( count($revisions) > $conf['recent'] ){
3520+ array_pop($revisions); // remove extra log entry
3521+ }
3522 }
3523
3524 if(count($revisions) > $conf['recent']) {
3525@@ -669,7 +678,8 @@
3526 // case this can lead to less pages being returned than
3527 // specified via $conf['recent']
3528 if($time){
3529- $info = getRevisionInfo($id, $time, 1024);
3530+ $pagelog->setChunkSize(1024);
3531+ $info = $pagelog->getRevisionInfo($time);
3532 if(!empty($info)) {
3533 $data['user'] = $info['user'];
3534 $data['ip'] = $info['ip'];
3535@@ -764,11 +774,22 @@
3536 return $ok;
3537 }
3538
3539+ function logoff(){
3540+ global $conf;
3541+ global $auth;
3542+ if(!$conf['useacl']) return 0;
3543+ if(!$auth) return 0;
3544+
3545+ auth_logoff();
3546+
3547+ return 1;
3548+ }
3549+
3550 private function resolvePageId($id) {
3551 $id = cleanID($id);
3552 if(empty($id)) {
3553 global $conf;
3554- $id = cleanID($conf['start']);
3555+ $id = cleanID($conf['start']);
3556 }
3557 return $id;
3558 }
3559
3560=== modified file 'inc/SafeFN.class.php'
3561--- inc/SafeFN.class.php 2012-10-21 21:14:10 +0000
3562+++ inc/SafeFN.class.php 2014-06-14 13:58:29 +0000
3563@@ -44,7 +44,7 @@
3564 *
3565 * @author Christopher Smith <chris@jalakai.co.uk>
3566 */
3567- public function encode($filename) {
3568+ public static function encode($filename) {
3569 return self::unicode_to_safe(utf8_to_unicode($filename));
3570 }
3571
3572@@ -73,15 +73,15 @@
3573 *
3574 * @author Christopher Smith <chris@jalakai.co.uk>
3575 */
3576- public function decode($filename) {
3577+ public static function decode($filename) {
3578 return unicode_to_utf8(self::safe_to_unicode(strtolower($filename)));
3579 }
3580
3581- public function validate_printable_utf8($printable_utf8) {
3582+ public static function validate_printable_utf8($printable_utf8) {
3583 return !preg_match('#[\x01-\x1f]#',$printable_utf8);
3584 }
3585
3586- public function validate_safe($safe) {
3587+ public static function validate_safe($safe) {
3588 return !preg_match('#[^'.self::$plain.self::$post_indicator.self::$pre_indicator.']#',$safe);
3589 }
3590
3591@@ -93,7 +93,7 @@
3592 *
3593 * @author Christopher Smith <chris@jalakai.co.uk>
3594 */
3595- private function unicode_to_safe($unicode) {
3596+ private static function unicode_to_safe($unicode) {
3597
3598 $safe = '';
3599 $converted = false;
3600@@ -126,7 +126,7 @@
3601 *
3602 * @author Christopher Smith <chris@jalakai.co.uk>
3603 */
3604- private function safe_to_unicode($safe) {
3605+ private static function safe_to_unicode($safe) {
3606
3607 $unicode = array();
3608 $split = preg_split('#(?=['.self::$post_indicator.self::$pre_indicator.'])#',$safe,-1,PREG_SPLIT_NO_EMPTY);
3609
3610=== modified file 'inc/SimplePie.php'
3611--- inc/SimplePie.php 2012-01-29 10:04:35 +0000
3612+++ inc/SimplePie.php 2014-06-14 13:58:29 +0000
3613@@ -5,7 +5,10 @@
3614 * A PHP-Based RSS and Atom Feed Framework.
3615 * Takes the hard work out of managing a complete RSS/Atom solution.
3616 *
3617- * Copyright (c) 2004-2011, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
3618+ * Please note: This file is automatically generated by a build script. The
3619+ * full original source is always available from http://simplepie.org/
3620+ *
3621+ * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
3622 * All rights reserved.
3623 *
3624 * Redistribution and use in source and binary forms, with or without modification, are
3625@@ -33,15 +36,13 @@
3626 * POSSIBILITY OF SUCH DAMAGE.
3627 *
3628 * @package SimplePie
3629- * @version 1.2.1
3630- * @copyright 2004-2011 Ryan Parman, Geoffrey Sneddon, Ryan McCue
3631+ * @version 1.3.1
3632+ * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue
3633 * @author Ryan Parman
3634 * @author Geoffrey Sneddon
3635 * @author Ryan McCue
3636 * @link http://simplepie.org/ SimplePie
3637- * @link http://simplepie.org/support/ Please submit all bug reports and feature requests to the SimplePie forums
3638 * @license http://www.opensource.org/licenses/bsd-license.php BSD License
3639- * @todo phpDoc comments
3640 */
3641
3642 /**
3643@@ -52,12 +53,13 @@
3644 /**
3645 * SimplePie Version
3646 */
3647-define('SIMPLEPIE_VERSION', '1.2.1-dev');
3648+define('SIMPLEPIE_VERSION', '1.3.1');
3649
3650 /**
3651 * SimplePie Build
3652+ * @todo Hardcode for release (there's no need to have to call SimplePie_Misc::get_build() only every load of simplepie.inc)
3653 */
3654-define('SIMPLEPIE_BUILD', '20111015034325');
3655+define('SIMPLEPIE_BUILD', '20121030175911');
3656
3657 /**
3658 * SimplePie Website URL
3659@@ -334,11 +336,31 @@
3660 define('SIMPLEPIE_NAMESPACE_MEDIARSS', 'http://search.yahoo.com/mrss/');
3661
3662 /**
3663- * Wrong Media RSS Namespace
3664+ * Wrong Media RSS Namespace. Caused by a long-standing typo in the spec.
3665 */
3666 define('SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG', 'http://search.yahoo.com/mrss');
3667
3668 /**
3669+ * Wrong Media RSS Namespace #2. New namespace introduced in Media RSS 1.5.
3670+ */
3671+define('SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG2', 'http://video.search.yahoo.com/mrss');
3672+
3673+/**
3674+ * Wrong Media RSS Namespace #3. A possible typo of the Media RSS 1.5 namespace.
3675+ */
3676+define('SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG3', 'http://video.search.yahoo.com/mrss/');
3677+
3678+/**
3679+ * Wrong Media RSS Namespace #4. New spec location after the RSS Advisory Board takes it over, but not a valid namespace.
3680+ */
3681+define('SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG4', 'http://www.rssboard.org/media-rss');
3682+
3683+/**
3684+ * Wrong Media RSS Namespace #5. A possible typo of the RSS Advisory Board URL.
3685+ */
3686+define('SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG5', 'http://www.rssboard.org/media-rss/');
3687+
3688+/**
3689 * iTunes RSS Namespace
3690 */
3691 define('SIMPLEPIE_NAMESPACE_ITUNES', 'http://www.itunes.com/dtds/podcast-1.0.dtd');
3692@@ -354,11 +376,6 @@
3693 define('SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY', 'http://www.iana.org/assignments/relation/');
3694
3695 /**
3696- * Whether we're running on PHP5
3697- */
3698-define('SIMPLEPIE_PHP5', version_compare(PHP_VERSION, '5.0.0', '>='));
3699-
3700-/**
3701 * No file source
3702 */
3703 define('SIMPLEPIE_FILE_SOURCE_NONE', 0);
3704@@ -392,6 +409,7 @@
3705 * SimplePie
3706 *
3707 * @package SimplePie
3708+ * @subpackage API
3709 */
3710 class SimplePie
3711 {
3712@@ -399,55 +417,55 @@
3713 * @var array Raw data
3714 * @access private
3715 */
3716- var $data = array();
3717+ public $data = array();
3718
3719 /**
3720 * @var mixed Error string
3721 * @access private
3722 */
3723- var $error;
3724+ public $error;
3725
3726 /**
3727 * @var object Instance of SimplePie_Sanitize (or other class)
3728 * @see SimplePie::set_sanitize_class()
3729 * @access private
3730 */
3731- var $sanitize;
3732+ public $sanitize;
3733
3734 /**
3735 * @var string SimplePie Useragent
3736 * @see SimplePie::set_useragent()
3737 * @access private
3738 */
3739- var $useragent = SIMPLEPIE_USERAGENT;
3740+ public $useragent = SIMPLEPIE_USERAGENT;
3741
3742 /**
3743 * @var string Feed URL
3744 * @see SimplePie::set_feed_url()
3745 * @access private
3746 */
3747- var $feed_url;
3748+ public $feed_url;
3749
3750 /**
3751 * @var object Instance of SimplePie_File to use as a feed
3752 * @see SimplePie::set_file()
3753 * @access private
3754 */
3755- var $file;
3756+ public $file;
3757
3758 /**
3759 * @var string Raw feed data
3760 * @see SimplePie::set_raw_data()
3761 * @access private
3762 */
3763- var $raw_data;
3764+ public $raw_data;
3765
3766 /**
3767 * @var int Timeout for fetching remote files
3768 * @see SimplePie::set_timeout()
3769 * @access private
3770 */
3771- var $timeout = 10;
3772+ public $timeout = 10;
3773
3774 /**
3775 * @var bool Forces fsockopen() to be used for remote files instead
3776@@ -455,7 +473,7 @@
3777 * @see SimplePie::force_fsockopen()
3778 * @access private
3779 */
3780- var $force_fsockopen = false;
3781+ public $force_fsockopen = false;
3782
3783 /**
3784 * @var bool Force the given data/URL to be treated as a feed no matter what
3785@@ -463,56 +481,49 @@
3786 * @see SimplePie::force_feed()
3787 * @access private
3788 */
3789- var $force_feed = false;
3790-
3791- /**
3792- * @var bool Enable/Disable XML dump
3793- * @see SimplePie::enable_xml_dump()
3794- * @access private
3795- */
3796- var $xml_dump = false;
3797+ public $force_feed = false;
3798
3799 /**
3800 * @var bool Enable/Disable Caching
3801 * @see SimplePie::enable_cache()
3802 * @access private
3803 */
3804- var $cache = true;
3805+ public $cache = true;
3806
3807 /**
3808 * @var int Cache duration (in seconds)
3809 * @see SimplePie::set_cache_duration()
3810 * @access private
3811 */
3812- var $cache_duration = 3600;
3813+ public $cache_duration = 3600;
3814
3815 /**
3816 * @var int Auto-discovery cache duration (in seconds)
3817 * @see SimplePie::set_autodiscovery_cache_duration()
3818 * @access private
3819 */
3820- var $autodiscovery_cache_duration = 604800; // 7 Days.
3821+ public $autodiscovery_cache_duration = 604800; // 7 Days.
3822
3823 /**
3824 * @var string Cache location (relative to executing script)
3825 * @see SimplePie::set_cache_location()
3826 * @access private
3827 */
3828- var $cache_location = './cache';
3829+ public $cache_location = './cache';
3830
3831 /**
3832 * @var string Function that creates the cache filename
3833 * @see SimplePie::set_cache_name_function()
3834 * @access private
3835 */
3836- var $cache_name_function = 'md5';
3837+ public $cache_name_function = 'md5';
3838
3839 /**
3840 * @var bool Reorder feed by date descending
3841 * @see SimplePie::enable_order_by_date()
3842 * @access private
3843 */
3844- var $order_by_date = true;
3845+ public $order_by_date = true;
3846
3847 /**
3848 * @var mixed Force input encoding to be set to the follow value
3849@@ -520,246 +531,132 @@
3850 * @see SimplePie::set_input_encoding()
3851 * @access private
3852 */
3853- var $input_encoding = false;
3854+ public $input_encoding = false;
3855
3856 /**
3857 * @var int Feed Autodiscovery Level
3858 * @see SimplePie::set_autodiscovery_level()
3859 * @access private
3860 */
3861- var $autodiscovery = SIMPLEPIE_LOCATOR_ALL;
3862-
3863- /**
3864- * @var string Class used for caching feeds
3865- * @see SimplePie::set_cache_class()
3866- * @access private
3867- */
3868- var $cache_class = 'SimplePie_Cache';
3869-
3870- /**
3871- * @var string Class used for locating feeds
3872- * @see SimplePie::set_locator_class()
3873- * @access private
3874- */
3875- var $locator_class = 'SimplePie_Locator';
3876-
3877- /**
3878- * @var string Class used for parsing feeds
3879- * @see SimplePie::set_parser_class()
3880- * @access private
3881- */
3882- var $parser_class = 'SimplePie_Parser';
3883-
3884- /**
3885- * @var string Class used for fetching feeds
3886- * @see SimplePie::set_file_class()
3887- * @access private
3888- */
3889- var $file_class = 'SimplePie_File';
3890-
3891- /**
3892- * @var string Class used for items
3893- * @see SimplePie::set_item_class()
3894- * @access private
3895- */
3896- var $item_class = 'SimplePie_Item';
3897-
3898- /**
3899- * @var string Class used for authors
3900- * @see SimplePie::set_author_class()
3901- * @access private
3902- */
3903- var $author_class = 'SimplePie_Author';
3904-
3905- /**
3906- * @var string Class used for categories
3907- * @see SimplePie::set_category_class()
3908- * @access private
3909- */
3910- var $category_class = 'SimplePie_Category';
3911-
3912- /**
3913- * @var string Class used for enclosures
3914- * @see SimplePie::set_enclosures_class()
3915- * @access private
3916- */
3917- var $enclosure_class = 'SimplePie_Enclosure';
3918-
3919- /**
3920- * @var string Class used for Media RSS <media:text> captions
3921- * @see SimplePie::set_caption_class()
3922- * @access private
3923- */
3924- var $caption_class = 'SimplePie_Caption';
3925-
3926- /**
3927- * @var string Class used for Media RSS <media:copyright>
3928- * @see SimplePie::set_copyright_class()
3929- * @access private
3930- */
3931- var $copyright_class = 'SimplePie_Copyright';
3932-
3933- /**
3934- * @var string Class used for Media RSS <media:credit>
3935- * @see SimplePie::set_credit_class()
3936- * @access private
3937- */
3938- var $credit_class = 'SimplePie_Credit';
3939-
3940- /**
3941- * @var string Class used for Media RSS <media:rating>
3942- * @see SimplePie::set_rating_class()
3943- * @access private
3944- */
3945- var $rating_class = 'SimplePie_Rating';
3946-
3947- /**
3948- * @var string Class used for Media RSS <media:restriction>
3949- * @see SimplePie::set_restriction_class()
3950- * @access private
3951- */
3952- var $restriction_class = 'SimplePie_Restriction';
3953-
3954- /**
3955- * @var string Class used for content-type sniffing
3956- * @see SimplePie::set_content_type_sniffer_class()
3957- * @access private
3958- */
3959- var $content_type_sniffer_class = 'SimplePie_Content_Type_Sniffer';
3960-
3961- /**
3962- * @var string Class used for item sources.
3963- * @see SimplePie::set_source_class()
3964- * @access private
3965- */
3966- var $source_class = 'SimplePie_Source';
3967-
3968- /**
3969- * @var mixed Set javascript query string parameter (false, or
3970- * anything type-cast to false, disables this feature)
3971- * @see SimplePie::set_javascript()
3972- * @access private
3973- */
3974- var $javascript = 'js';
3975+ public $autodiscovery = SIMPLEPIE_LOCATOR_ALL;
3976+
3977+ /**
3978+ * Class registry object
3979+ *
3980+ * @var SimplePie_Registry
3981+ */
3982+ public $registry;
3983
3984 /**
3985 * @var int Maximum number of feeds to check with autodiscovery
3986 * @see SimplePie::set_max_checked_feeds()
3987 * @access private
3988 */
3989- var $max_checked_feeds = 10;
3990+ public $max_checked_feeds = 10;
3991
3992 /**
3993 * @var array All the feeds found during the autodiscovery process
3994 * @see SimplePie::get_all_discovered_feeds()
3995 * @access private
3996 */
3997- var $all_discovered_feeds = array();
3998-
3999- /**
4000- * @var string Web-accessible path to the handler_favicon.php file.
4001- * @see SimplePie::set_favicon_handler()
4002- * @access private
4003- */
4004- var $favicon_handler = '';
4005+ public $all_discovered_feeds = array();
4006
4007 /**
4008 * @var string Web-accessible path to the handler_image.php file.
4009 * @see SimplePie::set_image_handler()
4010 * @access private
4011 */
4012- var $image_handler = '';
4013+ public $image_handler = '';
4014
4015 /**
4016 * @var array Stores the URLs when multiple feeds are being initialized.
4017 * @see SimplePie::set_feed_url()
4018 * @access private
4019 */
4020- var $multifeed_url = array();
4021+ public $multifeed_url = array();
4022
4023 /**
4024 * @var array Stores SimplePie objects when multiple feeds initialized.
4025 * @access private
4026 */
4027- var $multifeed_objects = array();
4028+ public $multifeed_objects = array();
4029
4030 /**
4031 * @var array Stores the get_object_vars() array for use with multifeeds.
4032 * @see SimplePie::set_feed_url()
4033 * @access private
4034 */
4035- var $config_settings = null;
4036+ public $config_settings = null;
4037
4038 /**
4039 * @var integer Stores the number of items to return per-feed with multifeeds.
4040 * @see SimplePie::set_item_limit()
4041 * @access private
4042 */
4043- var $item_limit = 0;
4044+ public $item_limit = 0;
4045
4046 /**
4047 * @var array Stores the default attributes to be stripped by strip_attributes().
4048 * @see SimplePie::strip_attributes()
4049 * @access private
4050 */
4051- var $strip_attributes = array('bgsound', 'class', 'expr', 'id', 'style', 'onclick', 'onerror', 'onfinish', 'onmouseover', 'onmouseout', 'onfocus', 'onblur', 'lowsrc', 'dynsrc');
4052+ public $strip_attributes = array('bgsound', 'class', 'expr', 'id', 'style', 'onclick', 'onerror', 'onfinish', 'onmouseover', 'onmouseout', 'onfocus', 'onblur', 'lowsrc', 'dynsrc');
4053
4054 /**
4055 * @var array Stores the default tags to be stripped by strip_htmltags().
4056 * @see SimplePie::strip_htmltags()
4057 * @access private
4058 */
4059- var $strip_htmltags = array('base', 'blink', 'body', 'doctype', 'embed', 'font', 'form', 'frame', 'frameset', 'html', 'iframe', 'input', 'marquee', 'meta', 'noscript', 'object', 'param', 'script', 'style');
4060+ public $strip_htmltags = array('base', 'blink', 'body', 'doctype', 'embed', 'font', 'form', 'frame', 'frameset', 'html', 'iframe', 'input', 'marquee', 'meta', 'noscript', 'object', 'param', 'script', 'style');
4061
4062 /**
4063 * The SimplePie class contains feed level data and options
4064 *
4065- * There are two ways that you can create a new SimplePie object. The first
4066- * is by passing a feed URL as a parameter to the SimplePie constructor
4067- * (as well as optionally setting the cache location and cache expiry). This
4068- * will initialise the whole feed with all of the default settings, and you
4069- * can begin accessing methods and properties immediately.
4070- *
4071- * The second way is to create the SimplePie object with no parameters
4072- * at all. This will enable you to set configuration options. After setting
4073+ * To use SimplePie, create the SimplePie object with no parameters. You can
4074+ * then set configuration options using the provided methods. After setting
4075 * them, you must initialise the feed using $feed->init(). At that point the
4076- * object's methods and properties will be available to you. This format is
4077- * what is used throughout this documentation.
4078- *
4079- * @access public
4080+ * object's methods and properties will be available to you.
4081+ *
4082+ * Previously, it was possible to pass in the feed URL along with cache
4083+ * options directly into the constructor. This has been removed as of 1.3 as
4084+ * it caused a lot of confusion.
4085+ *
4086 * @since 1.0 Preview Release
4087- * @param string $feed_url This is the URL you want to parse.
4088- * @param string $cache_location This is where you want the cache to be stored.
4089- * @param int $cache_duration This is the number of seconds that you want to store the cache file for.
4090 */
4091- function SimplePie($feed_url = null, $cache_location = null, $cache_duration = null)
4092+ public function __construct()
4093 {
4094+ if (version_compare(PHP_VERSION, '5.2', '<'))
4095+ {
4096+ trigger_error('PHP 4.x, 5.0 and 5.1 are no longer supported. Please upgrade to PHP 5.2 or newer.');
4097+ die();
4098+ }
4099+
4100 // Other objects, instances created here so we can set options on them
4101- $this->sanitize = new SimplePie_Sanitize;
4102-
4103- // Set options if they're passed to the constructor
4104- if ($cache_location !== null)
4105- {
4106- $this->set_cache_location($cache_location);
4107- }
4108-
4109- if ($cache_duration !== null)
4110- {
4111- $this->set_cache_duration($cache_duration);
4112- }
4113-
4114- // Only init the script if we're passed a feed URL
4115- if ($feed_url !== null)
4116- {
4117- $this->set_feed_url($feed_url);
4118- $this->init();
4119+ $this->sanitize = new SimplePie_Sanitize();
4120+ $this->registry = new SimplePie_Registry();
4121+
4122+ if (func_num_args() > 0)
4123+ {
4124+ $level = defined('E_USER_DEPRECATED') ? E_USER_DEPRECATED : E_USER_WARNING;
4125+ trigger_error('Passing parameters to the constructor is no longer supported. Please use set_feed_url(), set_cache_location(), and set_cache_location() directly.', $level);
4126+
4127+ $args = func_get_args();
4128+ switch (count($args)) {
4129+ case 3:
4130+ $this->set_cache_duration($args[2]);
4131+ case 2:
4132+ $this->set_cache_location($args[1]);
4133+ case 1:
4134+ $this->set_feed_url($args[0]);
4135+ $this->init();
4136+ }
4137 }
4138 }
4139
4140 /**
4141 * Used for converting object to a string
4142 */
4143- function __toString()
4144+ public function __toString()
4145 {
4146 return md5(serialize($this->data));
4147 }
4148@@ -767,7 +664,7 @@
4149 /**
4150 * Remove items that link back to this before destroying this object
4151 */
4152- function __destruct()
4153+ public function __destruct()
4154 {
4155 if ((version_compare(PHP_VERSION, '5.3', '<') || !gc_enabled()) && !ini_get('zend.ze1_compatibility_mode'))
4156 {
4157@@ -791,20 +688,21 @@
4158 }
4159
4160 /**
4161- * Force the given data/URL to be treated as a feed no matter what it
4162- * appears like
4163- *
4164- * @access public
4165+ * Force the given data/URL to be treated as a feed
4166+ *
4167+ * This tells SimplePie to ignore the content-type provided by the server.
4168+ * Be careful when using this option, as it will also disable autodiscovery.
4169+ *
4170 * @since 1.1
4171 * @param bool $enable Force the given data/URL to be treated as a feed
4172 */
4173- function force_feed($enable = false)
4174+ public function force_feed($enable = false)
4175 {
4176 $this->force_feed = (bool) $enable;
4177 }
4178
4179 /**
4180- * This is the URL of the feed you want to parse.
4181+ * Set the URL of the feed you want to parse
4182 *
4183 * This allows you to enter the URL of the feed you want to parse, or the
4184 * website you want to try to use auto-discovery on. This takes priority
4185@@ -814,37 +712,35 @@
4186 * of a string for the $url. Remember that with each additional feed comes
4187 * additional processing and resources.
4188 *
4189- * @access public
4190 * @since 1.0 Preview Release
4191- * @param mixed $url This is the URL (or array of URLs) that you want to parse.
4192- * @see SimplePie::set_raw_data()
4193+ * @see set_raw_data()
4194+ * @param string|array $url This is the URL (or array of URLs) that you want to parse.
4195 */
4196- function set_feed_url($url)
4197+ public function set_feed_url($url)
4198 {
4199+ $this->multifeed_url = array();
4200 if (is_array($url))
4201 {
4202- $this->multifeed_url = array();
4203 foreach ($url as $value)
4204 {
4205- $this->multifeed_url[] = SimplePie_Misc::fix_protocol($value, 1);
4206+ $this->multifeed_url[] = $this->registry->call('Misc', 'fix_protocol', array($value, 1));
4207 }
4208 }
4209 else
4210 {
4211- $this->feed_url = SimplePie_Misc::fix_protocol($url, 1);
4212+ $this->feed_url = $this->registry->call('Misc', 'fix_protocol', array($url, 1));
4213 }
4214 }
4215
4216 /**
4217- * Provides an instance of SimplePie_File to use as a feed
4218+ * Set an instance of {@see SimplePie_File} to use as a feed
4219 *
4220- * @access public
4221- * @param object &$file Instance of SimplePie_File (or subclass)
4222+ * @param SimplePie_File &$file
4223 * @return bool True on success, false on failure
4224 */
4225- function set_file(&$file)
4226+ public function set_file(&$file)
4227 {
4228- if (is_a($file, 'SimplePie_File'))
4229+ if ($file instanceof SimplePie_File)
4230 {
4231 $this->feed_url = $file->url;
4232 $this->file =& $file;
4233@@ -854,138 +750,113 @@
4234 }
4235
4236 /**
4237+ * Set the raw XML data to parse
4238+ *
4239 * Allows you to use a string of RSS/Atom data instead of a remote feed.
4240 *
4241 * If you have a feed available as a string in PHP, you can tell SimplePie
4242 * to parse that data string instead of a remote feed. Any set feed URL
4243 * takes precedence.
4244 *
4245- * @access public
4246 * @since 1.0 Beta 3
4247 * @param string $data RSS or Atom data as a string.
4248- * @see SimplePie::set_feed_url()
4249+ * @see set_feed_url()
4250 */
4251- function set_raw_data($data)
4252+ public function set_raw_data($data)
4253 {
4254 $this->raw_data = $data;
4255 }
4256
4257 /**
4258- * Allows you to override the default timeout for fetching remote feeds.
4259+ * Set the the default timeout for fetching remote feeds
4260 *
4261 * This allows you to change the maximum time the feed's server to respond
4262 * and send the feed back.
4263 *
4264- * @access public
4265 * @since 1.0 Beta 3
4266 * @param int $timeout The maximum number of seconds to spend waiting to retrieve a feed.
4267 */
4268- function set_timeout($timeout = 10)
4269+ public function set_timeout($timeout = 10)
4270 {
4271 $this->timeout = (int) $timeout;
4272 }
4273
4274 /**
4275- * Forces SimplePie to use fsockopen() instead of the preferred cURL
4276- * functions.
4277+ * Force SimplePie to use fsockopen() instead of cURL
4278 *
4279- * @access public
4280 * @since 1.0 Beta 3
4281 * @param bool $enable Force fsockopen() to be used
4282 */
4283- function force_fsockopen($enable = false)
4284+ public function force_fsockopen($enable = false)
4285 {
4286 $this->force_fsockopen = (bool) $enable;
4287 }
4288
4289 /**
4290- * Outputs the raw XML content of the feed, after it has gone through
4291- * SimplePie's filters.
4292- *
4293- * Used only for debugging, this function will output the XML content as
4294- * text/xml. When SimplePie reads in a feed, it does a bit of cleaning up
4295- * before trying to parse it. Many parts of the feed are re-written in
4296- * memory, and in the end, you have a parsable feed. XML dump shows you the
4297- * actual XML that SimplePie tries to parse, which may or may not be very
4298- * different from the original feed.
4299- *
4300- * @access public
4301- * @since 1.0 Preview Release
4302- * @param bool $enable Enable XML dump
4303- */
4304- function enable_xml_dump($enable = false)
4305- {
4306- $this->xml_dump = (bool) $enable;
4307- }
4308-
4309- /**
4310- * Enables/disables caching in SimplePie.
4311+ * Enable/disable caching in SimplePie.
4312 *
4313 * This option allows you to disable caching all-together in SimplePie.
4314 * However, disabling the cache can lead to longer load times.
4315 *
4316- * @access public
4317 * @since 1.0 Preview Release
4318 * @param bool $enable Enable caching
4319 */
4320- function enable_cache($enable = true)
4321+ public function enable_cache($enable = true)
4322 {
4323 $this->cache = (bool) $enable;
4324 }
4325
4326 /**
4327- * Set the length of time (in seconds) that the contents of a feed
4328- * will be cached.
4329+ * Set the length of time (in seconds) that the contents of a feed will be
4330+ * cached
4331 *
4332- * @access public
4333- * @param int $seconds The feed content cache duration.
4334+ * @param int $seconds The feed content cache duration
4335 */
4336- function set_cache_duration($seconds = 3600)
4337+ public function set_cache_duration($seconds = 3600)
4338 {
4339 $this->cache_duration = (int) $seconds;
4340 }
4341
4342 /**
4343- * Set the length of time (in seconds) that the autodiscovered feed
4344- * URL will be cached.
4345+ * Set the length of time (in seconds) that the autodiscovered feed URL will
4346+ * be cached
4347 *
4348- * @access public
4349 * @param int $seconds The autodiscovered feed URL cache duration.
4350 */
4351- function set_autodiscovery_cache_duration($seconds = 604800)
4352+ public function set_autodiscovery_cache_duration($seconds = 604800)
4353 {
4354 $this->autodiscovery_cache_duration = (int) $seconds;
4355 }
4356
4357 /**
4358- * Set the file system location where the cached files should be stored.
4359+ * Set the file system location where the cached files should be stored
4360 *
4361- * @access public
4362 * @param string $location The file system location.
4363 */
4364- function set_cache_location($location = './cache')
4365+ public function set_cache_location($location = './cache')
4366 {
4367 $this->cache_location = (string) $location;
4368 }
4369
4370 /**
4371- * Determines whether feed items should be sorted into reverse chronological order.
4372+ * Set whether feed items should be sorted into reverse chronological order
4373 *
4374- * @access public
4375 * @param bool $enable Sort as reverse chronological order.
4376 */
4377- function enable_order_by_date($enable = true)
4378+ public function enable_order_by_date($enable = true)
4379 {
4380 $this->order_by_date = (bool) $enable;
4381 }
4382
4383 /**
4384- * Allows you to override the character encoding reported by the feed.
4385- *
4386- * @access public
4387- * @param string $encoding Character encoding.
4388+ * Set the character encoding used to parse the feed
4389+ *
4390+ * This overrides the encoding reported by the feed, however it will fall
4391+ * back to the normal encoding detection if the override fails
4392+ *
4393+ * @param string $encoding Character encoding
4394 */
4395- function set_input_encoding($encoding = false)
4396+ public function set_input_encoding($encoding = false)
4397 {
4398 if ($encoding)
4399 {
4400@@ -1000,7 +871,6 @@
4401 /**
4402 * Set how much feed autodiscovery to do
4403 *
4404- * @access public
4405 * @see SIMPLEPIE_LOCATOR_NONE
4406 * @see SIMPLEPIE_LOCATOR_AUTODISCOVERY
4407 * @see SIMPLEPIE_LOCATOR_LOCAL_EXTENSION
4408@@ -1008,325 +878,168 @@
4409 * @see SIMPLEPIE_LOCATOR_REMOTE_EXTENSION
4410 * @see SIMPLEPIE_LOCATOR_REMOTE_BODY
4411 * @see SIMPLEPIE_LOCATOR_ALL
4412- * @param int $level Feed Autodiscovery Level (level can be a
4413- * combination of the above constants, see bitwise OR operator)
4414+ * @param int $level Feed Autodiscovery Level (level can be a combination of the above constants, see bitwise OR operator)
4415 */
4416- function set_autodiscovery_level($level = SIMPLEPIE_LOCATOR_ALL)
4417+ public function set_autodiscovery_level($level = SIMPLEPIE_LOCATOR_ALL)
4418 {
4419 $this->autodiscovery = (int) $level;
4420 }
4421
4422 /**
4423- * Allows you to change which class SimplePie uses for caching.
4424- * Useful when you are overloading or extending SimplePie's default classes.
4425- *
4426- * @access public
4427- * @param string $class Name of custom class.
4428- * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
4429- * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
4430- */
4431- function set_cache_class($class = 'SimplePie_Cache')
4432- {
4433- if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Cache'))
4434- {
4435- $this->cache_class = $class;
4436- return true;
4437- }
4438- return false;
4439- }
4440-
4441- /**
4442- * Allows you to change which class SimplePie uses for auto-discovery.
4443- * Useful when you are overloading or extending SimplePie's default classes.
4444- *
4445- * @access public
4446- * @param string $class Name of custom class.
4447- * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
4448- * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
4449- */
4450- function set_locator_class($class = 'SimplePie_Locator')
4451- {
4452- if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Locator'))
4453- {
4454- $this->locator_class = $class;
4455- return true;
4456- }
4457- return false;
4458- }
4459-
4460- /**
4461- * Allows you to change which class SimplePie uses for XML parsing.
4462- * Useful when you are overloading or extending SimplePie's default classes.
4463- *
4464- * @access public
4465- * @param string $class Name of custom class.
4466- * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
4467- * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
4468- */
4469- function set_parser_class($class = 'SimplePie_Parser')
4470- {
4471- if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Parser'))
4472- {
4473- $this->parser_class = $class;
4474- return true;
4475- }
4476- return false;
4477- }
4478-
4479- /**
4480- * Allows you to change which class SimplePie uses for remote file fetching.
4481- * Useful when you are overloading or extending SimplePie's default classes.
4482- *
4483- * @access public
4484- * @param string $class Name of custom class.
4485- * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
4486- * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
4487- */
4488- function set_file_class($class = 'SimplePie_File')
4489- {
4490- if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_File'))
4491- {
4492- $this->file_class = $class;
4493- return true;
4494- }
4495- return false;
4496- }
4497-
4498- /**
4499- * Allows you to change which class SimplePie uses for data sanitization.
4500- * Useful when you are overloading or extending SimplePie's default classes.
4501- *
4502- * @access public
4503- * @param string $class Name of custom class.
4504- * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
4505- * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
4506- */
4507- function set_sanitize_class($class = 'SimplePie_Sanitize')
4508- {
4509- if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Sanitize'))
4510- {
4511- $this->sanitize = new $class;
4512- return true;
4513- }
4514- return false;
4515- }
4516-
4517- /**
4518- * Allows you to change which class SimplePie uses for handling feed items.
4519- * Useful when you are overloading or extending SimplePie's default classes.
4520- *
4521- * @access public
4522- * @param string $class Name of custom class.
4523- * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
4524- * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
4525- */
4526- function set_item_class($class = 'SimplePie_Item')
4527- {
4528- if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Item'))
4529- {
4530- $this->item_class = $class;
4531- return true;
4532- }
4533- return false;
4534- }
4535-
4536- /**
4537- * Allows you to change which class SimplePie uses for handling author data.
4538- * Useful when you are overloading or extending SimplePie's default classes.
4539- *
4540- * @access public
4541- * @param string $class Name of custom class.
4542- * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
4543- * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
4544- */
4545- function set_author_class($class = 'SimplePie_Author')
4546- {
4547- if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Author'))
4548- {
4549- $this->author_class = $class;
4550- return true;
4551- }
4552- return false;
4553- }
4554-
4555- /**
4556- * Allows you to change which class SimplePie uses for handling category data.
4557- * Useful when you are overloading or extending SimplePie's default classes.
4558- *
4559- * @access public
4560- * @param string $class Name of custom class.
4561- * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
4562- * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
4563- */
4564- function set_category_class($class = 'SimplePie_Category')
4565- {
4566- if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Category'))
4567- {
4568- $this->category_class = $class;
4569- return true;
4570- }
4571- return false;
4572- }
4573-
4574- /**
4575- * Allows you to change which class SimplePie uses for feed enclosures.
4576- * Useful when you are overloading or extending SimplePie's default classes.
4577- *
4578- * @access public
4579- * @param string $class Name of custom class.
4580- * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
4581- * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
4582- */
4583- function set_enclosure_class($class = 'SimplePie_Enclosure')
4584- {
4585- if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Enclosure'))
4586- {
4587- $this->enclosure_class = $class;
4588- return true;
4589- }
4590- return false;
4591- }
4592-
4593- /**
4594- * Allows you to change which class SimplePie uses for <media:text> captions
4595- * Useful when you are overloading or extending SimplePie's default classes.
4596- *
4597- * @access public
4598- * @param string $class Name of custom class.
4599- * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
4600- * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
4601- */
4602- function set_caption_class($class = 'SimplePie_Caption')
4603- {
4604- if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Caption'))
4605- {
4606- $this->caption_class = $class;
4607- return true;
4608- }
4609- return false;
4610- }
4611-
4612- /**
4613- * Allows you to change which class SimplePie uses for <media:copyright>
4614- * Useful when you are overloading or extending SimplePie's default classes.
4615- *
4616- * @access public
4617- * @param string $class Name of custom class.
4618- * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
4619- * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
4620- */
4621- function set_copyright_class($class = 'SimplePie_Copyright')
4622- {
4623- if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Copyright'))
4624- {
4625- $this->copyright_class = $class;
4626- return true;
4627- }
4628- return false;
4629- }
4630-
4631- /**
4632- * Allows you to change which class SimplePie uses for <media:credit>
4633- * Useful when you are overloading or extending SimplePie's default classes.
4634- *
4635- * @access public
4636- * @param string $class Name of custom class.
4637- * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
4638- * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
4639- */
4640- function set_credit_class($class = 'SimplePie_Credit')
4641- {
4642- if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Credit'))
4643- {
4644- $this->credit_class = $class;
4645- return true;
4646- }
4647- return false;
4648- }
4649-
4650- /**
4651- * Allows you to change which class SimplePie uses for <media:rating>
4652- * Useful when you are overloading or extending SimplePie's default classes.
4653- *
4654- * @access public
4655- * @param string $class Name of custom class.
4656- * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
4657- * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
4658- */
4659- function set_rating_class($class = 'SimplePie_Rating')
4660- {
4661- if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Rating'))
4662- {
4663- $this->rating_class = $class;
4664- return true;
4665- }
4666- return false;
4667- }
4668-
4669- /**
4670- * Allows you to change which class SimplePie uses for <media:restriction>
4671- * Useful when you are overloading or extending SimplePie's default classes.
4672- *
4673- * @access public
4674- * @param string $class Name of custom class.
4675- * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
4676- * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
4677- */
4678- function set_restriction_class($class = 'SimplePie_Restriction')
4679- {
4680- if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Restriction'))
4681- {
4682- $this->restriction_class = $class;
4683- return true;
4684- }
4685- return false;
4686- }
4687-
4688- /**
4689- * Allows you to change which class SimplePie uses for content-type sniffing.
4690- * Useful when you are overloading or extending SimplePie's default classes.
4691- *
4692- * @access public
4693- * @param string $class Name of custom class.
4694- * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
4695- * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
4696- */
4697- function set_content_type_sniffer_class($class = 'SimplePie_Content_Type_Sniffer')
4698- {
4699- if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Content_Type_Sniffer'))
4700- {
4701- $this->content_type_sniffer_class = $class;
4702- return true;
4703- }
4704- return false;
4705- }
4706-
4707- /**
4708- * Allows you to change which class SimplePie uses item sources.
4709- * Useful when you are overloading or extending SimplePie's default classes.
4710- *
4711- * @access public
4712- * @param string $class Name of custom class.
4713- * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
4714- * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
4715- */
4716- function set_source_class($class = 'SimplePie_Source')
4717- {
4718- if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Source'))
4719- {
4720- $this->source_class = $class;
4721- return true;
4722- }
4723- return false;
4724- }
4725-
4726- /**
4727- * Allows you to override the default user agent string.
4728- *
4729- * @access public
4730+ * Get the class registry
4731+ *
4732+ * Use this to override SimplePie's default classes
4733+ * @see SimplePie_Registry
4734+ * @return SimplePie_Registry
4735+ */
4736+ public function &get_registry()
4737+ {
4738+ return $this->registry;
4739+ }
4740+
4741+ /**#@+
4742+ * Useful when you are overloading or extending SimplePie's default classes.
4743+ *
4744+ * @deprecated Use {@see get_registry()} instead
4745+ * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
4746+ * @param string $class Name of custom class
4747+ * @return boolean True on success, false otherwise
4748+ */
4749+ /**
4750+ * Set which class SimplePie uses for caching
4751+ */
4752+ public function set_cache_class($class = 'SimplePie_Cache')
4753+ {
4754+ return $this->registry->register('Cache', $class, true);
4755+ }
4756+
4757+ /**
4758+ * Set which class SimplePie uses for auto-discovery
4759+ */
4760+ public function set_locator_class($class = 'SimplePie_Locator')
4761+ {
4762+ return $this->registry->register('Locator', $class, true);
4763+ }
4764+
4765+ /**
4766+ * Set which class SimplePie uses for XML parsing
4767+ */
4768+ public function set_parser_class($class = 'SimplePie_Parser')
4769+ {
4770+ return $this->registry->register('Parser', $class, true);
4771+ }
4772+
4773+ /**
4774+ * Set which class SimplePie uses for remote file fetching
4775+ */
4776+ public function set_file_class($class = 'SimplePie_File')
4777+ {
4778+ return $this->registry->register('File', $class, true);
4779+ }
4780+
4781+ /**
4782+ * Set which class SimplePie uses for data sanitization
4783+ */
4784+ public function set_sanitize_class($class = 'SimplePie_Sanitize')
4785+ {
4786+ return $this->registry->register('Sanitize', $class, true);
4787+ }
4788+
4789+ /**
4790+ * Set which class SimplePie uses for handling feed items
4791+ */
4792+ public function set_item_class($class = 'SimplePie_Item')
4793+ {
4794+ return $this->registry->register('Item', $class, true);
4795+ }
4796+
4797+ /**
4798+ * Set which class SimplePie uses for handling author data
4799+ */
4800+ public function set_author_class($class = 'SimplePie_Author')
4801+ {
4802+ return $this->registry->register('Author', $class, true);
4803+ }
4804+
4805+ /**
4806+ * Set which class SimplePie uses for handling category data
4807+ */
4808+ public function set_category_class($class = 'SimplePie_Category')
4809+ {
4810+ return $this->registry->register('Category', $class, true);
4811+ }
4812+
4813+ /**
4814+ * Set which class SimplePie uses for feed enclosures
4815+ */
4816+ public function set_enclosure_class($class = 'SimplePie_Enclosure')
4817+ {
4818+ return $this->registry->register('Enclosure', $class, true);
4819+ }
4820+
4821+ /**
4822+ * Set which class SimplePie uses for `<media:text>` captions
4823+ */
4824+ public function set_caption_class($class = 'SimplePie_Caption')
4825+ {
4826+ return $this->registry->register('Caption', $class, true);
4827+ }
4828+
4829+ /**
4830+ * Set which class SimplePie uses for `<media:copyright>`
4831+ */
4832+ public function set_copyright_class($class = 'SimplePie_Copyright')
4833+ {
4834+ return $this->registry->register('Copyright', $class, true);
4835+ }
4836+
4837+ /**
4838+ * Set which class SimplePie uses for `<media:credit>`
4839+ */
4840+ public function set_credit_class($class = 'SimplePie_Credit')
4841+ {
4842+ return $this->registry->register('Credit', $class, true);
4843+ }
4844+
4845+ /**
4846+ * Set which class SimplePie uses for `<media:rating>`
4847+ */
4848+ public function set_rating_class($class = 'SimplePie_Rating')
4849+ {
4850+ return $this->registry->register('Rating', $class, true);
4851+ }
4852+
4853+ /**
4854+ * Set which class SimplePie uses for `<media:restriction>`
4855+ */
4856+ public function set_restriction_class($class = 'SimplePie_Restriction')
4857+ {
4858+ return $this->registry->register('Restriction', $class, true);
4859+ }
4860+
4861+ /**
4862+ * Set which class SimplePie uses for content-type sniffing
4863+ */
4864+ public function set_content_type_sniffer_class($class = 'SimplePie_Content_Type_Sniffer')
4865+ {
4866+ return $this->registry->register('Content_Type_Sniffer', $class, true);
4867+ }
4868+
4869+ /**
4870+ * Set which class SimplePie uses item sources
4871+ */
4872+ public function set_source_class($class = 'SimplePie_Source')
4873+ {
4874+ return $this->registry->register('Source', $class, true);
4875+ }
4876+ /**#@-*/
4877+
4878+ /**
4879+ * Set the user agent string
4880+ *
4881 * @param string $ua New user agent string.
4882 */
4883- function set_useragent($ua = SIMPLEPIE_USERAGENT)
4884+ public function set_useragent($ua = SIMPLEPIE_USERAGENT)
4885 {
4886 $this->useragent = (string) $ua;
4887 }
4888@@ -1334,10 +1047,9 @@
4889 /**
4890 * Set callback function to create cache filename with
4891 *
4892- * @access public
4893 * @param mixed $function Callback function
4894 */
4895- function set_cache_name_function($function = 'md5')
4896+ public function set_cache_name_function($function = 'md5')
4897 {
4898 if (is_callable($function))
4899 {
4900@@ -1346,31 +1058,14 @@
4901 }
4902
4903 /**
4904- * Set javascript query string parameter
4905- *
4906- * @access public
4907- * @param mixed $get Javascript query string parameter
4908- */
4909- function set_javascript($get = 'js')
4910- {
4911- if ($get)
4912- {
4913- $this->javascript = (string) $get;
4914- }
4915- else
4916- {
4917- $this->javascript = false;
4918- }
4919- }
4920-
4921- /**
4922- * Set options to make SP as fast as possible. Forgoes a
4923- * substantial amount of data sanitization in favor of speed.
4924- *
4925- * @access public
4926+ * Set options to make SP as fast as possible
4927+ *
4928+ * Forgoes a substantial amount of data sanitization in favor of speed. This
4929+ * turns SimplePie into a dumb parser of feeds.
4930+ *
4931 * @param bool $set Whether to set them or not
4932 */
4933- function set_stupidly_fast($set = false)
4934+ public function set_stupidly_fast($set = false)
4935 {
4936 if ($set)
4937 {
4938@@ -1386,20 +1081,19 @@
4939 /**
4940 * Set maximum number of feeds to check with autodiscovery
4941 *
4942- * @access public
4943 * @param int $max Maximum number of feeds to check
4944 */
4945- function set_max_checked_feeds($max = 10)
4946+ public function set_max_checked_feeds($max = 10)
4947 {
4948 $this->max_checked_feeds = (int) $max;
4949 }
4950
4951- function remove_div($enable = true)
4952+ public function remove_div($enable = true)
4953 {
4954 $this->sanitize->remove_div($enable);
4955 }
4956
4957- function strip_htmltags($tags = '', $encode = null)
4958+ public function strip_htmltags($tags = '', $encode = null)
4959 {
4960 if ($tags === '')
4961 {
4962@@ -1412,12 +1106,12 @@
4963 }
4964 }
4965
4966- function encode_instead_of_strip($enable = true)
4967+ public function encode_instead_of_strip($enable = true)
4968 {
4969 $this->sanitize->encode_instead_of_strip($enable);
4970 }
4971
4972- function strip_attributes($attribs = '')
4973+ public function strip_attributes($attribs = '')
4974 {
4975 if ($attribs === '')
4976 {
4977@@ -1426,12 +1120,34 @@
4978 $this->sanitize->strip_attributes($attribs);
4979 }
4980
4981- function set_output_encoding($encoding = 'UTF-8')
4982+ /**
4983+ * Set the output encoding
4984+ *
4985+ * Allows you to override SimplePie's output to match that of your webpage.
4986+ * This is useful for times when your webpages are not being served as
4987+ * UTF-8. This setting will be obeyed by {@see handle_content_type()}, and
4988+ * is similar to {@see set_input_encoding()}.
4989+ *
4990+ * It should be noted, however, that not all character encodings can support
4991+ * all characters. If your page is being served as ISO-8859-1 and you try
4992+ * to display a Japanese feed, you'll likely see garbled characters.
4993+ * Because of this, it is highly recommended to ensure that your webpages
4994+ * are served as UTF-8.
4995+ *
4996+ * The number of supported character encodings depends on whether your web
4997+ * host supports {@link http://php.net/mbstring mbstring},
4998+ * {@link http://php.net/iconv iconv}, or both. See
4999+ * {@link http://simplepie.org/wiki/faq/Supported_Character_Encodings} for
5000+ * more information.
The diff has been truncated for viewing.

Subscribers

People subscribed via source and target branches

to all changes: