- Added comprehensive AI Assistant system (aiassist/ directory): * Vector search and embedding capabilities * Typebot proxy integration * Elastic search functionality * Message classification and chat history * MCP proxy for external integrations - Implemented Court Status API (GetCourtStatus.php): * Real-time court document status checking * Integration with external court systems * Comprehensive error handling and logging - Enhanced S3 integration: * Improved file backup system with metadata * Batch processing capabilities * Enhanced error logging and recovery * Copy operations with URL fixing - Added Telegram contact creation API - Improved error logging across all modules - Enhanced callback system for AI responses - Extensive backup file storage with timestamps - Updated documentation and README files - File storage improvements: * Thousands of backup files with proper metadata * Fix operations for broken file references * Project-specific backup and recovery systems * Comprehensive file integrity checking Total: 26,461+ files added/modified including AWS SDK, vendor dependencies, and extensive backup system.
71 lines
2.2 KiB
PHP
71 lines
2.2 KiB
PHP
<?php
|
|
|
|
/**
|
|
* Validates the HTML attribute ID.
|
|
* @warning Even though this is the id processor, it
|
|
* will ignore the directive Attr:IDBlacklist, since it will only
|
|
* go according to the ID accumulator. Since the accumulator is
|
|
* automatically generated, it will have already absorbed the
|
|
* blacklist. If you're hacking around, make sure you use load()!
|
|
*/
|
|
|
|
class HTMLPurifier_AttrDef_HTML_ID extends HTMLPurifier_AttrDef
|
|
{
|
|
|
|
// ref functionality disabled, since we also have to verify
|
|
// whether or not the ID it refers to exists
|
|
|
|
public function validate($id, $config, $context) {
|
|
|
|
if (!$config->get('Attr', 'EnableID')) return false;
|
|
|
|
$id = trim($id); // trim it first
|
|
|
|
if ($id === '') return false;
|
|
|
|
$prefix = $config->get('Attr', 'IDPrefix');
|
|
if ($prefix !== '') {
|
|
$prefix .= $config->get('Attr', 'IDPrefixLocal');
|
|
// prevent re-appending the prefix
|
|
if (strpos($id, $prefix) !== 0) $id = $prefix . $id;
|
|
} elseif ($config->get('Attr', 'IDPrefixLocal') !== '') {
|
|
trigger_error('%Attr.IDPrefixLocal cannot be used unless '.
|
|
'%Attr.IDPrefix is set', E_USER_WARNING);
|
|
}
|
|
|
|
//if (!$this->ref) {
|
|
$id_accumulator =& $context->get('IDAccumulator');
|
|
if (isset($id_accumulator->ids[$id])) return false;
|
|
//}
|
|
|
|
// we purposely avoid using regex, hopefully this is faster
|
|
|
|
if (ctype_alpha($id)) {
|
|
$result = true;
|
|
} else {
|
|
if (!ctype_alpha(@$id[0])) return false;
|
|
$trim = trim( // primitive style of regexps, I suppose
|
|
$id,
|
|
'A..Za..z0..9:-._'
|
|
);
|
|
$result = ($trim === '');
|
|
}
|
|
|
|
$regexp = $config->get('Attr', 'IDBlacklistRegexp');
|
|
if ($regexp && preg_match($regexp, $id)) {
|
|
return false;
|
|
}
|
|
|
|
if (/*!$this->ref && */$result) $id_accumulator->add($id);
|
|
|
|
// if no change was made to the ID, return the result
|
|
// else, return the new id if stripping whitespace made it
|
|
// valid, or return false.
|
|
return $result ? $id : false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// vim: et sw=4 sts=4
|