/** * Reviews and adjusts plugin settings * * @return void * @api */ protected function processSettings() { // Image type: // possible values: "jpg", "png", "gif" // jpg doesn't support transparency (transparent bg option ends up white) // png isn't supported by old browsers (see http://www.libpng.org/pub/png/pngstatus.html) // gif may not be supported by your GD Lib. $this->settings['imageFormat'] = $this->settings['imageFormat'] ? $this->settings['imageFormat'] : 'png'; // true = generate pseudo-random string, false = use dictionary // dictionary is easier to recognise // - both for humans and computers, so use random string if you're paranoid. $this->settings['useWordsList'] = $this->settings['useWordsList'] ? TRUE : FALSE; // if your server is NOT set up to deny web access to files beginning ".ht" // then you should ensure the dictionary file is kept outside the web directory // eg: if www.foo.com/index.html points to c:\website\www\index.html // then the dictionary should be placed in c:\website\dict.txt // test your server's config by trying to access the dictionary through a web browser // you should NOT be able to view the contents. // can leave this blank if not using dictionary $this->settings['wordsListLocation'] = \SJBR\SrFreecap\Utility\LocalizationUtility::getWordsListLocation($this->settings['defaultWordsList']); // Used for non-dictionary word generation and to calculate image width $this->settings['maxWordLength'] = $this->settings['maxWordLength'] ? $this->settings['maxWordLength'] : 6; // Maximum times a user can refresh the image // on a 6500 word dictionary, I think 15-50 is enough to not annoy users and make BF unfeasble. // further notes re: BF attacks in "avoid brute force attacks" section, below // on the other hand, those attempting OCR will find the ability to request new images // very useful; if they can't crack one, just grab an easier target... // for the ultra-paranoid, setting it to <5 will still work for most users $this->settings['maxAttempts'] = $this->settings['maxAttempts'] ? $this->settings['maxAttempts'] : 50; // List of fonts to use // font size should be around 35 pixels wide for each character. // you can use my GD fontmaker script at www.puremango.co.uk to create your own fonts // There are other programs to can create GD fonts, but my script allows a greater // degree of control over exactly how wide each character is, and is therefore // recommended for 'special' uses. For normal use of GD fonts, // the GDFontGenerator @ http://www.philiplb.de is excellent for convering ttf to GD // the fonts included with freeCap *only* include lowercase alphabetic characters // so are not suitable for most other uses // to increase security, you really should add other fonts if ($this->settings['generateNumbers']) { $this->settings['fontLocations'] = array('EXT:' . $this->extensionKey . '/Resources/Private/Captcha/Fonts/anonymous.gdf'); } else { $this->settings['fontLocations'] = array('EXT:' . $this->extensionKey . '/Resources/Private/Captcha/Fonts/freecap_font1.gdf', 'EXT:' . $this->extensionKey . '/Resources/Private/Captcha/Fonts/freecap_font2.gdf', 'EXT:' . $this->extensionKey . '/Resources/Private/Captcha/Fonts/freecap_font3.gdf', 'EXT:' . $this->extensionKey . '/Resources/Private/Captcha/Fonts/freecap_font4.gdf', 'EXT:' . $this->extensionKey . '/Resources/Private/Captcha/Fonts/freecap_font5.gdf'); } if ($this->settings['fontFiles']) { $this->settings['fontLocations'] = \TYPO3\CMS\Core\Utility\GeneralUtility::trimExplode(',', $this->settings['fontFiles'], 1); } for ($i = 0; $i < sizeof($this->settings['fontLocations']); $i++) { if (substr($this->settings['fontLocations'][$i], 0, 4) == 'EXT:') { $this->settings['fontLocations'][$i] = \TYPO3\CMS\Core\Utility\GeneralUtility::getFileAbsFileName($this->settings['fontLocations'][$i]); } else { $this->settings['fontLocations'][$i] = PATH_site . 'uploads/' . \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::getCN($this->extensionKey) . '/' . $this->settings['fontLocations'][$i]; } } // Text color // 0 = one random color for all letters // 1 = different random color for each letter if ($this->settings['textColor']) { $this->settings['textColor'] = 1; } else { $this->settings['textColor'] = 0; } // Text position $this->settings['textPosition'] = array(); $this->settings['textPosition']['horizontal'] = $this->settings['textHorizontalPosition'] ? intval($this->settings['textHorizontalPosition']) : 32; $this->settings['textPosition']['vertical'] = $this->settings['textVerticalPosition'] ? intval($this->settings['textVerticalPosition']) : 15; // Text morphing factor $this->settings['morphFactor'] = $this->settings['morphFactor'] ? $this->settings['morphFactor'] : 0; // Limits for text color $this->settings['colorMaximum'] = array(); if (isset($this->settings['colorMaximumDarkness'])) { $this->settings['colorMaximum']['darkness'] = intval($this->settings['colorMaximumDarkness']); } if (isset($this->settings['colorMaximumLightness'])) { $this->settings['colorMaximum']['lightness'] = intval($this->settings['colorMaximumLightness']); } // Background // Many thanks to http://ocr-research.org.ua and http://sam.zoy.org/pwntcha/ for testing // for jpgs, 'transparent' is white if (!in_array($this->settings['backgroundType'], array('Transparent', 'White with grid', 'White with squiggles', 'Morphed image blocks'))) { $this->settings['backgroundType'] = 'White with grid'; } // Should we blur the background? (looks nicer, makes text easier to read, takes longer) $this->settings['backgroundBlur'] = $this->settings['backgroundBlur'] || !isset($this->settings['backgroundBlur']) ? TRUE : FALSE; // For background type 'Morphed image blocks', which images should we use? // If you add your own, make sure they're fairly 'busy' images (ie a lot of shapes in them) $this->settings['backgroundImages'] = array('EXT:' . $this->extensionKey . '/Resources/Private/Captcha/Images/freecap_im1.jpg', 'EXT:' . $this->extensionKey . '/Resources/Private/Captcha/Images/freecap_im2.jpg', 'EXT:' . $this->extensionKey . '/Resources/Private/Captcha/Images/freecap_im3.jpg', 'EXT:' . $this->extensionKey . '/Resources/Private/Captcha/Images/freecap_im4.jpg', 'EXT:' . $this->extensionKey . '/Resources/Private/Captcha/Images/freecap_im5.jpg'); // For non-transparent backgrounds only: // if 0, merges CAPTCHA with background // if 1, write CAPTCHA over background $this->settings['mergeWithBackground'] = $this->settings['mergeWithBackground'] ? 0 : 1; // Should we morph the background? (recommend yes, but takes a little longer to compute) $this->settings['backgroundMorph'] = $this->settings['backgroundMorph'] ? TRUE : FALSE; // Read each font and get font character widths $this->settings['fontWidths'] = array(); for ($i = 0; $i < sizeof($this->settings['fontLocations']); $i++) { $handle = fopen($this->settings['fontLocations'][$i], "r"); // Read header of GD font, up to char width $c_wid = fread($handle, 12); $this->settings['fontWidths'][$i] = ord($c_wid[8]) + ord($c_wid[9]) + ord($c_wid[10]) + ord($c_wid[11]); fclose($handle); } // Modify image width depending on maximum possible length of word // you shouldn't need to use words > 6 chars in length really. $this->settings['imageWidth'] = $this->settings['maxWordLength'] * (array_sum($this->settings['fontWidths']) / sizeof($this->settings['fontWidths'])) + (isset($this->settings['imageAdditionalWidth']) ? intval($this->settings['imageAdditionalWidth']) : 40); $this->settings['imageHeight'] = $this->settings['imageHeight'] ? $this->settings['imageHeight'] : 90; // Try to avoid the 'free p*rn' method of CAPTCHA circumvention // see www.wikipedia.com/captcha for more info // "To avoid spam, please do NOT enter the text if this site is not example.org"; // or more simply: // "for use only on example.org"; // reword or add lines as you please $this->settings['siteTag'] = $this->settings['siteTag'] ? explode('|', \TYPO3\CMS\Extbase\Utility\LocalizationUtility::translate('site_tag', $this->extensionName, isset($this->settings['siteTagDomain']) ? $this->settings['siteTagDomain'] : 'example.org')) : array(); // where to write the above: // 0=top // 1=bottom // 2=both $this->settings['siteTagPosition'] = isset($this->settings['siteTagPosition']) ? $this->settings['siteTagPosition'] : 1; }
/** * Builds an array of letter rendering files in the specified format * * @param string $word: the word to be spelled and played * @param string $extension: the audio file extension being used * @return array array of file names */ protected function getLetterRenderingFiles($word, $extension = 'wav') { $letterRenderingFiles = array(); // Split the word $letters = preg_split('//', $word, -1, PREG_SPLIT_NO_EMPTY); // Get the directory containing the wav files $voicesDirectory = LocalizationUtility::getVoicesDirectory(); // Assemble the file names foreach ($letters as $letter) { // Word lists are encoded in ISO-8859-1 (possibly in ISO-8859-2?) $file = $voicesDirectory . ($GLOBALS['TYPO3_CONF_VARS']['SYS']['UTF8filesystem'] ? utf8_encode($letter) : $letter) . '.' . $extension; if (is_file($file)) { $letterRenderingFiles[] = $file; } } return $letterRenderingFiles; }