| 1 | <?php |
| 2 | /** |
| 3 | SQSPELL_FUNCTIONS.PHP |
| 4 | -------------- |
| 5 | All SquirrelSpell-wide functions are in this file. |
| 6 | **/ |
| 7 | |
| 8 | function sqspell_makePage($title, $scriptsrc, $body){ |
| 9 | // |
| 10 | // GUI wrap-around for the OPTIONS page. |
| 11 | // |
| 12 | global $color, $SQSPELL_VERSION, $MOD; |
| 13 | displayPageHeader($color, "None"); |
| 14 | ?> |
| 15 | <br> |
| 16 | <?php if($scriptsrc) { ?> |
| 17 | <script type="text/javascript" src="js/<?php echo $scriptsrc ?>"></script> |
| 18 | <?php } ?> |
| 19 | <table width="95%" align="center" border="0" cellpadding="2" cellspacing="0"> |
| 20 | <tr> |
| 21 | <td bgcolor="<?php echo $color[9] ?>" align="center"> |
| 22 | <strong><?php echo $title ?></strong> |
| 23 | </td> |
| 24 | </tr> |
| 25 | <tr><td><hr></td></tr> |
| 26 | <tr><td> |
| 27 | <?php echo $body ?> |
| 28 | </td></tr> |
| 29 | <?php if ($MOD!="options_main"){ |
| 30 | // Generate a nice return-to-main link. |
| 31 | ?> |
| 32 | <tr><td><hr></td></tr> |
| 33 | <tr><td align="center"><a href="sqspell_options.php">Back to "SpellChecker Options" page</a></td></tr> |
| 34 | <?php } ?> |
| 35 | <tr><td><hr></td></tr> |
| 36 | <tr> |
| 37 | <td bgcolor="<?php echo $color[9] ?>" align="center"> |
| 38 | SquirrelSpell <?php echo $SQSPELL_VERSION ?> |
| 39 | </td> |
| 40 | </tr> |
| 41 | </table> |
| 42 | <?php |
| 43 | } |
| 44 | |
| 45 | function sqspell_makeWindow($onload, $title, $scriptsrc, $body){ |
| 46 | // |
| 47 | // GUI wrap-around for the pop-up window interface. |
| 48 | // |
| 49 | global $color, $SQSPELL_VERSION; |
| 50 | ?> |
| 51 | <html> |
| 52 | <head> |
| 53 | <title><?php echo $title ?></title> |
| 54 | <?php if ($scriptsrc){ ?> |
| 55 | <script type="text/javascript" src="js/<?php echo $scriptsrc ?>"></script> |
| 56 | <?php } ?> |
| 57 | </head> |
| 58 | <body text="<?php echo $color[8] ?>" |
| 59 | bgcolor="<?php echo $color[4] ?>" |
| 60 | link="<?php echo $color[7] ?>" |
| 61 | vlink="<?php echo $color[7] ?>" |
| 62 | alink="<?php echo $color[7] ?>"<?php |
| 63 | if ($onload) echo " onload=\"$onload\""; ?>> |
| 64 | <table width="100%" border="0" cellpadding="2"> |
| 65 | <tr> |
| 66 | <td bgcolor="<?php echo $color[9] ?>" align="center"> |
| 67 | <strong><?php echo $title ?></strong> |
| 68 | </td> |
| 69 | </tr> |
| 70 | <tr> |
| 71 | <td><hr></td> |
| 72 | </tr> |
| 73 | <tr> |
| 74 | <td> |
| 75 | <?php echo $body ?> |
| 76 | </td> |
| 77 | </tr> |
| 78 | <tr> |
| 79 | <td><hr></td> |
| 80 | </tr> |
| 81 | <tr> |
| 82 | <td bgcolor="<?php echo $color[9] ?>" align="center"> |
| 83 | SquirrelSpell <?php echo $SQSPELL_VERSION ?> |
| 84 | </td> |
| 85 | </tr> |
| 86 | </table> |
| 87 | </body> |
| 88 | </html> |
| 89 | <?php |
| 90 | } |
| 91 | |
| 92 | function sqspell_crypto($mode, $ckey, $input){ |
| 93 | // |
| 94 | // This function does the encryption and decryption of the user |
| 95 | // dictionary. It is only available when PHP is compiled |
| 96 | // --with-mcrypt. See doc/CRYPTO for more information. |
| 97 | // |
| 98 | if (!function_exists(mcrypt_generic)) return "PANIC"; |
| 99 | $td = mcrypt_module_open(MCRYPT_Blowfish, "", MCRYPT_MODE_ECB, ""); |
| 100 | $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size ($td), MCRYPT_RAND); |
| 101 | mcrypt_generic_init($td, $ckey, $iv); |
| 102 | switch ($mode){ |
| 103 | case "encrypt": |
| 104 | $crypto = mcrypt_generic($td, $input); |
| 105 | break; |
| 106 | case "decrypt": |
| 107 | $crypto = mdecrypt_generic($td, $input); |
| 108 | // See if it decrypted successfully. If so, it should contain |
| 109 | // the string "# SquirrelSpell". |
| 110 | if (!strstr($crypto, "# SquirrelSpell")) $crypto="PANIC"; |
| 111 | break; |
| 112 | } |
| 113 | mcrypt_generic_end ($td); |
| 114 | return $crypto; |
| 115 | } |
| 116 | |
| 117 | function sqspell_upgradeWordsFile($words_string){ |
| 118 | // |
| 119 | // This function transparently upgrades the 0.2 dictionary format to |
| 120 | // 0.3, since user-defined languages have been added in 0.3 and |
| 121 | // the new format keeps user dictionaries selection in the file. |
| 122 | // |
| 123 | global $SQSPELL_APP_DEFAULT, $SQSPELL_VERSION; |
| 124 | |
| 125 | // Define just one dictionary for this user -- the default. |
| 126 | // If the user wants more, s/he can set them up in personal |
| 127 | // preferences. See doc/UPGRADING for more info. |
| 128 | $new_words_string=substr_replace($words_string, "# SquirrelSpell User Dictionary $SQSPELL_VERSION\n# Last Revision: " . date("Y-m-d") . "\n# LANG: $SQSPELL_APP_DEFAULT\n# $SQSPELL_APP_DEFAULT", 0, strpos($words_string, "\n")) . "# End\n"; |
| 129 | sqspell_writeWords($new_words_string); |
| 130 | return $new_words_string; |
| 131 | } |
| 132 | |
| 133 | function sqspell_getSettings($words){ |
| 134 | // |
| 135 | // Right now it just returns an array with the dictionaries |
| 136 | // available to the user for spell-checking. It will probably |
| 137 | // do more in the future, as features are added. |
| 138 | // |
| 139 | global $SQSPELL_APP, $SQSPELL_APP_DEFAULT; |
| 140 | if (sizeof($SQSPELL_APP) > 1){ |
| 141 | // OK, so there are more than one dictionary option. |
| 142 | // Now load the user prefs. |
| 143 | if(!$words) $words=sqspell_getWords(); |
| 144 | if ($words){ |
| 145 | // find which dictionaries user wants to use |
| 146 | preg_match("/# LANG: (.*)/i", $words, $matches); |
| 147 | $langs=explode(", ", $matches[1]); |
| 148 | } else { |
| 149 | // User doesn't have a personal dictionary. Set him up with |
| 150 | // a default setting. |
| 151 | $langs[0]=$SQSPELL_APP_DEFAULT; |
| 152 | } |
| 153 | } else { |
| 154 | // There is only one dictionary defined system-wide. |
| 155 | $langs[0]=$SQSPELL_APP_DEFAULT; |
| 156 | } |
| 157 | return $langs; |
| 158 | } |
| 159 | |
| 160 | function sqspell_getLang($words, $lang){ |
| 161 | // |
| 162 | // Returns words of a specific user dictionary. |
| 163 | // |
| 164 | $start=strpos($words, "# $lang\n"); |
| 165 | if (!$start) return ""; |
| 166 | $end=strpos($words, "#", $start+1); |
| 167 | $lang_words = substr($words, $start, $end-$start); |
| 168 | return $lang_words; |
| 169 | } |
| 170 | |
| 171 | function sqspell_getWords(){ |
| 172 | // |
| 173 | // This baby operates the user dictionary. If the format is clear-text, |
| 174 | // then it just reads the file and returns it. However, if the file is |
| 175 | // encrypted, then it decrypts it, checks whether the decryption was |
| 176 | // successful, troubleshoots if not, then returns the clear-text dictionary |
| 177 | // to the app. |
| 178 | // |
| 179 | global $SQSPELL_WORDS_FILE, $SQSPELL_CRYPTO; |
| 180 | $words=""; |
| 181 | if (file_exists($SQSPELL_WORDS_FILE)){ |
| 182 | // Gobble it up. |
| 183 | $fp=fopen($SQSPELL_WORDS_FILE, "r"); |
| 184 | $words=fread($fp, filesize($SQSPELL_WORDS_FILE)); |
| 185 | fclose($fp); |
| 186 | } |
| 187 | // Check if this is an encrypted file by looking for |
| 188 | // the string "# SquirrelSpell" in it. |
| 189 | if ($words && !strstr($words, "# SquirrelSpell")){ |
| 190 | // This file is encrypted or mangled. Try to decrypt it. |
| 191 | // If fails, raise hell. |
| 192 | global $key, $onetimepad, $old_key; |
| 193 | if ($old_key) { |
| 194 | // an override in case user is trying to decrypt a dictionary |
| 195 | // with his old password |
| 196 | $clear_key=$old_key; |
| 197 | } else { |
| 198 | // get user's password (the key). |
| 199 | $clear_key = OneTimePadDecrypt($key, $onetimepad); |
| 200 | } |
| 201 | // decrypt |
| 202 | $words=sqspell_crypto("decrypt", $clear_key, $words); |
| 203 | if ($words=="PANIC"){ |
| 204 | // AAAAAAAAAAAH!!!!! OK, ok, breathe! |
| 205 | // Let's hope the decryption failed because the user changed his |
| 206 | // password. Bring up the option to key in the old password |
| 207 | // or wipe the file and start over if everything else fails. |
| 208 | $msg="<p> |
| 209 | <strong>ATTENTION:</strong><br> |
| 210 | SquirrelSpell was unable to decrypt your personal dictionary. This is most likely |
| 211 | due to the fact that you have changed your mailbox password. In order to proceed, |
| 212 | you will have to supply your old password so that SquirrelSpell can decrypt your |
| 213 | personal dictionary. It will be re-encrypted with your new password after this.<br> |
| 214 | If you haven't encrypted your dictionary, then it got mangled and is no longer |
| 215 | valid. You will have to delete it and start anew. This is also true if you don't |
| 216 | remember your old password -- without it, the encrypted data is no longer |
| 217 | accessible.</p> |
| 218 | <blockquote> |
| 219 | <form method=\"post\" onsubmit=\"return AYS()\"> |
| 220 | <input type=\"hidden\" name=\"MOD\" value=\"crypto_badkey\"> |
| 221 | <p><input type=\"checkbox\" name=\"delete_words\" value=\"ON\"> Delete my dictionary and start a new one<br> |
| 222 | Decrypt my dictionary with my old password: <input name=\"old_key\" size=\"10\"></p> |
| 223 | </blockquote> |
| 224 | <p align=\"center\"><input type=\"submit\" value=\"Proceed >>\"></p> |
| 225 | </form> |
| 226 | "; |
| 227 | // See if this happened in the pop-up window or when accessing |
| 228 | // the SpellChecker options page. |
| 229 | global $SCRIPT_NAME; |
| 230 | if (strstr($SCRIPT_NAME, "sqspell_options")) |
| 231 | sqspell_makePage("Error Decrypting Dictionary", "decrypt_error.js", $msg); |
| 232 | else sqspell_makeWindow(null, "Error Decrypting Dictionary", "decrypt_error.js", $msg); |
| 233 | exit; |
| 234 | } else { |
| 235 | // OK! Phew. Set the encryption flag to true so we can later on |
| 236 | // encrypt it again before saving to HDD. |
| 237 | $SQSPELL_CRYPTO=true; |
| 238 | } |
| 239 | } else { |
| 240 | // No encryption is used. Set $SQSPELL_CRYPTO to false, in case we have to |
| 241 | // save the dictionary later. |
| 242 | $SQSPELL_CRYPTO=false; |
| 243 | } |
| 244 | // Check if we need to upgrade the dictionary from version 0.2.x |
| 245 | if (strstr($words, "Dictionary v0.2")) $words=sqspell_upgradeWordsFile($words); |
| 246 | return $words; |
| 247 | } |
| 248 | |
| 249 | function sqspell_writeWords($words){ |
| 250 | // |
| 251 | // Writes user dictionary into the $username.words file, then changes mask |
| 252 | // to 0600. If encryption is needed -- does that, too. |
| 253 | // |
| 254 | global $SQSPELL_WORDS_FILE, $SQSPELL_CRYPTO; |
| 255 | // if $words is empty, create a template entry. |
| 256 | if (!$words) $words=sqspell_makeDummy(); |
| 257 | if ($SQSPELL_CRYPTO){ |
| 258 | // User wants to encrypt the file. So be it. |
| 259 | // get his password to use as a key. |
| 260 | global $key, $onetimepad; |
| 261 | $clear_key=OneTimePadDecrypt($key, $onetimepad); |
| 262 | // Try encrypting it. If fails, scream bloody hell. |
| 263 | $save_words = sqspell_crypto("encrypt", $clear_key, $words); |
| 264 | if ($save_words=="PANIC"){ |
| 265 | // AAAAAAAAH! I'm not handling this yet, since obviously |
| 266 | // the admin of the site forgot to compile the MCRYPT support in. |
| 267 | // I will add a handler for this case later, when I can come up |
| 268 | // with some work-around... Right now, do nothing. Let the Admin's |
| 269 | // head hurt.. ;))) |
| 270 | } |
| 271 | } else { |
| 272 | $save_words = $words; |
| 273 | } |
| 274 | $fp=fopen($SQSPELL_WORDS_FILE, "w"); |
| 275 | fwrite($fp, $save_words); |
| 276 | fclose($fp); |
| 277 | chmod($SQSPELL_WORDS_FILE, 0600); |
| 278 | } |
| 279 | |
| 280 | function sqspell_deleteWords(){ |
| 281 | // |
| 282 | // so I open the door to my enemies, |
| 283 | // and I ask can we wipe the slate clean, |
| 284 | // but they tell me to please go... |
| 285 | // uhm... Well, this just erases the user dictionary file. |
| 286 | // |
| 287 | global $SQSPELL_WORDS_FILE; |
| 288 | if (file_exists($SQSPELL_WORDS_FILE)) unlink($SQSPELL_WORDS_FILE); |
| 289 | } |
| 290 | |
| 291 | function sqspell_makeDummy(){ |
| 292 | // |
| 293 | // Creates an empty user dictionary for the sake of saving prefs or |
| 294 | // whatever. |
| 295 | // |
| 296 | global $SQSPELL_VERSION, $SQSPELL_APP_DEFAULT; |
| 297 | $words="# SquirrelSpell User Dictionary $SQSPELL_VERSION\n# Last Revision: " . date("Y-m-d") . "\n# LANG: $SQSPELL_APP_DEFAULT\n# End\n"; |
| 298 | return $words; |
| 299 | } |
| 300 | |
| 301 | /** |
| 302 | VERSION: |
| 303 | --------- |
| 304 | SquirrelSpell version. Don't modify, since it identifies the format |
| 305 | of the user dictionary files and messing with this can do ugly |
| 306 | stuff. :) |
| 307 | **/ |
| 308 | $SQSPELL_VERSION="v0.3.5"; |
| 309 | |
| 310 | |
| 311 | ?> |