Version Description
Download this release
Release Info
Developer | Cimmo |
Plugin | ![]() |
Version | 2.3.11 |
Comparing to | |
See all releases |
Code changes from version 2.3.10 to 2.3.11
- README_OFFICIAL.txt +7 -0
- cimy_uef_admin.php +0 -2
- cimy_uef_db.php +0 -2
- cimy_uef_email_handler.php +0 -1
- cimy_uef_functions.php +6 -11
- cimy_uef_init.php +0 -2
- cimy_uef_missing_functions.php +0 -2
- cimy_uef_mu_activation.php +0 -2
- cimy_uef_options.php +0 -2
- cimy_uef_profile.php +0 -2
- cimy_uef_register.php +3 -4
- cimy_user_extra_fields.php +2 -4
- readme.txt +2 -2
- securimage/LICENSE.txt +24 -457
- securimage/README.txt +29 -9
- securimage/audio/0.mp3 +0 -0
- securimage/audio/1.mp3 +0 -0
- securimage/audio/2.mp3 +0 -0
- securimage/audio/3.mp3 +0 -0
- securimage/audio/4.mp3 +0 -0
- securimage/audio/5.mp3 +0 -0
- securimage/audio/6.mp3 +0 -0
- securimage/audio/7.mp3 +0 -0
- securimage/audio/8.mp3 +0 -0
- securimage/audio/9.mp3 +0 -0
- securimage/audio/A.mp3 +0 -0
- securimage/audio/B.mp3 +0 -0
- securimage/audio/C.mp3 +0 -0
- securimage/audio/D.mp3 +0 -0
- securimage/audio/E.mp3 +0 -0
- securimage/audio/F.mp3 +0 -0
- securimage/audio/G.mp3 +0 -0
- securimage/audio/H.mp3 +0 -0
- securimage/audio/I.mp3 +0 -0
- securimage/audio/J.mp3 +0 -0
- securimage/audio/K.mp3 +0 -0
- securimage/audio/L.mp3 +0 -0
- securimage/audio/M.mp3 +0 -0
- securimage/audio/N.mp3 +0 -0
- securimage/audio/O.mp3 +0 -0
- securimage/audio/P.mp3 +0 -0
- securimage/audio/Q.mp3 +0 -0
- securimage/audio/R.mp3 +0 -0
- securimage/audio/S.mp3 +0 -0
- securimage/audio/T.mp3 +0 -0
- securimage/audio/U.mp3 +0 -0
- securimage/audio/V.mp3 +0 -0
- securimage/audio/W.mp3 +0 -0
- securimage/audio/X.mp3 +0 -0
- securimage/audio/Y.mp3 +0 -0
- securimage/audio/Z.mp3 +0 -0
- securimage/audio/error.wav +0 -0
- securimage/captcha.html +13 -0
- securimage/database/securimage.sqlite +0 -0
- securimage/example_form.ajax.php +213 -0
- securimage/example_form.php +176 -56
- securimage/gdfonts/automatic.gdf +0 -0
- securimage/images/refresh.png +0 -0
- securimage/securimage.php +1345 -1492
- securimage/securimage_play.php +11 -7
- securimage/securimage_play.swf +0 -0
- securimage/securimage_show.php +51 -29
- securimage/securimage_show_captcha.php +3 -3
- securimage/securimage_show_example.php +65 -0
- securimage/securimage_show_example2.php +63 -0
- securimage/words/words.txt +1547 -1711
README_OFFICIAL.txt
CHANGED
@@ -619,6 +619,13 @@ A lot of times I cannot reproduce the problem and I need more details, so if you
|
|
619 |
|
620 |
|
621 |
CHANGELOG:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
622 |
v2.3.10 - 24/09/2012
|
623 |
- Fixed email is not sent to the user once confirmed its email address (non-MS only) (introduced in v2.3.9) (thanks to nerik73 and all people that reported this)
|
624 |
- Fixed 'A password will be e-mailed to you.' will be hidden when password field is not hidden (non-MS only) (thanks to lcool for the idea)
|
619 |
|
620 |
|
621 |
CHANGELOG:
|
622 |
+
v2.3.11 - 29/10/2012
|
623 |
+
- Fixed reCAPTCHA was not working on secure webservers (thanks to invisnet for the patch)
|
624 |
+
- Fixed extra lines outputted by php files (thanks to Ov3rfly)
|
625 |
+
- Fixed one PHP warning on options save (thanks to thomask)
|
626 |
+
- Fixed background logo was stretched under Safari (thanks to DarioDN)
|
627 |
+
- Updated Securimage Captcha to v3.0.1
|
628 |
+
|
629 |
v2.3.10 - 24/09/2012
|
630 |
- Fixed email is not sent to the user once confirmed its email address (non-MS only) (introduced in v2.3.9) (thanks to nerik73 and all people that reported this)
|
631 |
- Fixed 'A password will be e-mailed to you.' will be hidden when password field is not hidden (non-MS only) (thanks to lcool for the idea)
|
cimy_uef_admin.php
CHANGED
@@ -1839,5 +1839,3 @@ function cimy_save_field($action, $table, $data) {
|
|
1839 |
|
1840 |
$wpdb->query($sql);
|
1841 |
}
|
1842 |
-
|
1843 |
-
?>
|
1839 |
|
1840 |
$wpdb->query($sql);
|
1841 |
}
|
|
|
|
cimy_uef_db.php
CHANGED
@@ -566,5 +566,3 @@ function cimy_uef_get_meta_from_url($domain, $path) {
|
|
566 |
|
567 |
return $wpdb->get_row($wpdb->prepare("SELECT user_login, user_email, meta FROM ".$wpdb->prefix."signups WHERE domain = %s AND path = %s AND active = %d", $domain, $path, 0), ARRAY_A );
|
568 |
}
|
569 |
-
|
570 |
-
?>
|
566 |
|
567 |
return $wpdb->get_row($wpdb->prepare("SELECT user_login, user_email, meta FROM ".$wpdb->prefix."signups WHERE domain = %s AND path = %s AND active = %d", $domain, $path, 0), ARRAY_A );
|
568 |
}
|
|
|
|
cimy_uef_email_handler.php
CHANGED
@@ -320,4 +320,3 @@ function cimy_check_user_on_signups($errors, $user_name, $user_email) {
|
|
320 |
|
321 |
return $errors;
|
322 |
}
|
323 |
-
?>
|
320 |
|
321 |
return $errors;
|
322 |
}
|
|
cimy_uef_functions.php
CHANGED
@@ -763,15 +763,7 @@ function cimy_manage_upload($input_name, $user_login, $rules, $old_file=false, $
|
|
763 |
$user_path = $blog_path;
|
764 |
$file_path = $blog_path.$type_path;
|
765 |
}
|
766 |
-
if (!empty($new_filename))
|
767 |
-
$file_name = $new_filename;
|
768 |
-
else
|
769 |
-
$file_name = $_FILES[$input_name]['name'];
|
770 |
|
771 |
-
// protect from site traversing
|
772 |
-
$file_name = str_replace('../', '', $file_name);
|
773 |
-
$file_name = str_replace('/', '', $file_name);
|
774 |
-
|
775 |
// delete old file if requested
|
776 |
if ($delete_file) {
|
777 |
if (is_file($file_path.$old_file))
|
@@ -787,7 +779,7 @@ function cimy_manage_upload($input_name, $user_login, $rules, $old_file=false, $
|
|
787 |
// or there is no file to upload
|
788 |
// or dest dir is not writable
|
789 |
// then everything else is useless
|
790 |
-
if ((($user_login == "") && ($type != "registration-logo")) || (
|
791 |
return "";
|
792 |
|
793 |
// create user subdir
|
@@ -814,6 +806,11 @@ function cimy_manage_upload($input_name, $user_login, $rules, $old_file=false, $
|
|
814 |
}
|
815 |
}
|
816 |
|
|
|
|
|
|
|
|
|
|
|
817 |
// filesize in Byte transformed in KiloByte
|
818 |
$file_size = $_FILES[$input_name]['size'] / 1024;
|
819 |
$file_type = $_FILES[$input_name]['type'];
|
@@ -915,5 +912,3 @@ function cimy_uef_get_allowed_image_extensions() {
|
|
915 |
$image_ext = array_merge($image_ext, explode('|', $key));
|
916 |
return $image_ext;
|
917 |
}
|
918 |
-
|
919 |
-
?>
|
763 |
$user_path = $blog_path;
|
764 |
$file_path = $blog_path.$type_path;
|
765 |
}
|
|
|
|
|
|
|
|
|
766 |
|
|
|
|
|
|
|
|
|
767 |
// delete old file if requested
|
768 |
if ($delete_file) {
|
769 |
if (is_file($file_path.$old_file))
|
779 |
// or there is no file to upload
|
780 |
// or dest dir is not writable
|
781 |
// then everything else is useless
|
782 |
+
if ((($user_login == "") && ($type != "registration-logo")) || (empty($_FILES[$input_name]['name'])) || (!is_writable($cuef_upload_path)))
|
783 |
return "";
|
784 |
|
785 |
// create user subdir
|
806 |
}
|
807 |
}
|
808 |
|
809 |
+
if (!empty($new_filename))
|
810 |
+
$file_name = $new_filename;
|
811 |
+
else
|
812 |
+
$file_name = $_FILES[$input_name]['name'];
|
813 |
+
|
814 |
// filesize in Byte transformed in KiloByte
|
815 |
$file_size = $_FILES[$input_name]['size'] / 1024;
|
816 |
$file_type = $_FILES[$input_name]['type'];
|
912 |
$image_ext = array_merge($image_ext, explode('|', $key));
|
913 |
return $image_ext;
|
914 |
}
|
|
|
|
cimy_uef_init.php
CHANGED
@@ -130,5 +130,3 @@ function cimy_uef_init_javascripts($rule_name) {
|
|
130 |
wp_print_scripts();
|
131 |
}
|
132 |
}
|
133 |
-
|
134 |
-
?>
|
130 |
wp_print_scripts();
|
131 |
}
|
132 |
}
|
|
|
|
cimy_uef_missing_functions.php
CHANGED
@@ -27,5 +27,3 @@ function wp_load_image( $file ) {
|
|
27 |
|
28 |
return $image;
|
29 |
}
|
30 |
-
|
31 |
-
?>
|
27 |
|
28 |
return $image;
|
29 |
}
|
|
|
|
cimy_uef_mu_activation.php
CHANGED
@@ -48,5 +48,3 @@ function cimy_uef_mu_blog_exists($blog_id, $c_site_id=-1) {
|
|
48 |
|
49 |
return false;
|
50 |
}
|
51 |
-
|
52 |
-
?>
|
48 |
|
49 |
return false;
|
50 |
}
|
|
|
|
cimy_uef_options.php
CHANGED
@@ -725,5 +725,3 @@ function cimy_show_options($results, $embedded) {
|
|
725 |
|
726 |
return $ret;
|
727 |
}
|
728 |
-
|
729 |
-
?>
|
725 |
|
726 |
return $ret;
|
727 |
}
|
|
|
|
cimy_uef_profile.php
CHANGED
@@ -738,5 +738,3 @@ function cimy_update_ExtraFields() {
|
|
738 |
wp_mail($admin_email, $mail_subject, $mail_changes);
|
739 |
}
|
740 |
}
|
741 |
-
|
742 |
-
?>
|
738 |
wp_mail($admin_email, $mail_subject, $mail_changes);
|
739 |
}
|
740 |
}
|
|
|
|
cimy_uef_register.php
CHANGED
@@ -1151,7 +1151,7 @@ function cimy_registration_form($errors=null, $show_type=0) {
|
|
1151 |
?>
|
1152 |
<div style="width: <?php echo $width; ?>px; float: left; height: 80px; vertical-align: text-top;">
|
1153 |
<img id="captcha" align="left" style="padding-right: 5px; border: 0" src="<?php echo $cuef_securimage_webpath; ?>/securimage_show_captcha.php" alt="CAPTCHA Image" />
|
1154 |
-
<object type="application/x-shockwave-flash" data="<?php echo $cuef_securimage_webpath; ?>/securimage_play.swf?
|
1155 |
<br /><br /><br />
|
1156 |
<a align="right" tabindex="<?php echo $tabindex; $tabindex++; ?>" style="border-style: none" href="#" onclick="document.getElementById('captcha').src = '<?php echo $cuef_securimage_webpath; ?>/securimage_show_captcha.php?' + Math.random(); return false"><img src="<?php echo $cuef_securimage_webpath; ?>/images/refresh.gif" alt="<?php _e("Change image", $cimy_uef_domain); ?>" border="0" onclick="this.blur()" align="bottom" /></a>
|
1157 |
</div>
|
@@ -1184,7 +1184,7 @@ function cimy_registration_form($errors=null, $show_type=0) {
|
|
1184 |
</script>
|
1185 |
<?php
|
1186 |
}
|
1187 |
-
echo recaptcha_get_html($options['recaptcha_public_key']);
|
1188 |
}
|
1189 |
|
1190 |
cimy_switch_current_blog(true);
|
@@ -1294,6 +1294,7 @@ function cimy_change_login_registration_logo() {
|
|
1294 |
#login h1:first-child a:first-child {
|
1295 |
background: url(<?php echo esc_url($cuef_upload_webpath.basename($options["registration-logo"])); ?>) no-repeat top center;
|
1296 |
background-position: center top;
|
|
|
1297 |
width: <?php echo max(328, $logo_width); ?>px;
|
1298 |
height: <?php echo $logo_height; ?>px;
|
1299 |
text-indent: -9999px;
|
@@ -1305,5 +1306,3 @@ function cimy_change_login_registration_logo() {
|
|
1305 |
<?php
|
1306 |
}
|
1307 |
}
|
1308 |
-
|
1309 |
-
?>
|
1151 |
?>
|
1152 |
<div style="width: <?php echo $width; ?>px; float: left; height: 80px; vertical-align: text-top;">
|
1153 |
<img id="captcha" align="left" style="padding-right: 5px; border: 0" src="<?php echo $cuef_securimage_webpath; ?>/securimage_show_captcha.php" alt="CAPTCHA Image" />
|
1154 |
+
<object type="application/x-shockwave-flash" data="<?php echo $cuef_securimage_webpath; ?>/securimage_play.swf?audio_file=<?php echo $cuef_securimage_webpath; ?>/securimage_play.php&bgColor1=#fff&bgColor2=#fff&iconColor=#777&borderWidth=1&borderColor=#000" height="19" width="19"><param name="movie" value="<?php echo $cuef_securimage_webpath; ?>/securimage_play.swf?audio_file=<?php echo $cuef_securimage_webpath; ?>/securimage_play.php&bgColor1=#fff&bgColor2=#fff&iconColor=#777&borderWidth=1&borderColor=#000" /></object>
|
1155 |
<br /><br /><br />
|
1156 |
<a align="right" tabindex="<?php echo $tabindex; $tabindex++; ?>" style="border-style: none" href="#" onclick="document.getElementById('captcha').src = '<?php echo $cuef_securimage_webpath; ?>/securimage_show_captcha.php?' + Math.random(); return false"><img src="<?php echo $cuef_securimage_webpath; ?>/images/refresh.gif" alt="<?php _e("Change image", $cimy_uef_domain); ?>" border="0" onclick="this.blur()" align="bottom" /></a>
|
1157 |
</div>
|
1184 |
</script>
|
1185 |
<?php
|
1186 |
}
|
1187 |
+
echo recaptcha_get_html($options['recaptcha_public_key'], null, is_ssl());
|
1188 |
}
|
1189 |
|
1190 |
cimy_switch_current_blog(true);
|
1294 |
#login h1:first-child a:first-child {
|
1295 |
background: url(<?php echo esc_url($cuef_upload_webpath.basename($options["registration-logo"])); ?>) no-repeat top center;
|
1296 |
background-position: center top;
|
1297 |
+
background-size: auto auto;
|
1298 |
width: <?php echo max(328, $logo_width); ?>px;
|
1299 |
height: <?php echo $logo_height; ?>px;
|
1300 |
text-indent: -9999px;
|
1306 |
<?php
|
1307 |
}
|
1308 |
}
|
|
|
|
cimy_user_extra_fields.php
CHANGED
@@ -3,7 +3,7 @@
|
|
3 |
Plugin Name: Cimy User Extra Fields
|
4 |
Plugin URI: http://www.marcocimmino.net/cimy-wordpress-plugins/cimy-user-extra-fields/
|
5 |
Description: Add some useful fields to registration and user's info
|
6 |
-
Version: 2.3.
|
7 |
Author: Marco Cimmino
|
8 |
Author URI: mailto:cimmino.marco@gmail.com
|
9 |
License: GPL2
|
@@ -162,7 +162,7 @@ require_once($cuef_plugin_dir.'/cimy_uef_admin.php');
|
|
162 |
add_action('admin_init', 'cimy_uef_admin_init');
|
163 |
|
164 |
$cimy_uef_name = "Cimy User Extra Fields";
|
165 |
-
$cimy_uef_version = "2.3.
|
166 |
$cimy_uef_url = "http://www.marcocimmino.net/cimy-wordpress-plugins/cimy-user-extra-fields/";
|
167 |
$cimy_project_url = "http://www.marcocimmino.net/cimy-wordpress-plugins/support-the-cimy-project-paypal/";
|
168 |
|
@@ -582,5 +582,3 @@ add_filter('get_avatar', 'cimy_uef_avatar_filter', 1, 5);
|
|
582 |
|
583 |
// add code to handle new value from ajax code in A&U Extended
|
584 |
add_action('wp_ajax_save-extra-field-new-value', 'cimy_uef_admin_ajax_save_ef_new_value');
|
585 |
-
|
586 |
-
?>
|
3 |
Plugin Name: Cimy User Extra Fields
|
4 |
Plugin URI: http://www.marcocimmino.net/cimy-wordpress-plugins/cimy-user-extra-fields/
|
5 |
Description: Add some useful fields to registration and user's info
|
6 |
+
Version: 2.3.11
|
7 |
Author: Marco Cimmino
|
8 |
Author URI: mailto:cimmino.marco@gmail.com
|
9 |
License: GPL2
|
162 |
add_action('admin_init', 'cimy_uef_admin_init');
|
163 |
|
164 |
$cimy_uef_name = "Cimy User Extra Fields";
|
165 |
+
$cimy_uef_version = "2.3.11";
|
166 |
$cimy_uef_url = "http://www.marcocimmino.net/cimy-wordpress-plugins/cimy-user-extra-fields/";
|
167 |
$cimy_project_url = "http://www.marcocimmino.net/cimy-wordpress-plugins/support-the-cimy-project-paypal/";
|
168 |
|
582 |
|
583 |
// add code to handle new value from ajax code in A&U Extended
|
584 |
add_action('wp_ajax_save-extra-field-new-value', 'cimy_uef_admin_ajax_save_ef_new_value');
|
|
|
|
readme.txt
CHANGED
@@ -4,8 +4,8 @@ Donate link: http://www.marcocimmino.net/cimy-wordpress-plugins/support-the-cimy
|
|
4 |
Website link: http://www.marcocimmino.net/cimy-wordpress-plugins/cimy-user-extra-fields/
|
5 |
Tags: cimy, admin, registration, profile, extra fields, avatar, gravatar, recaptcha, captcha
|
6 |
Requires at least: 3.1
|
7 |
-
Tested up to: 3.
|
8 |
-
Stable tag: 2.3.
|
9 |
|
10 |
Add some useful fields to registration and user's info
|
11 |
|
4 |
Website link: http://www.marcocimmino.net/cimy-wordpress-plugins/cimy-user-extra-fields/
|
5 |
Tags: cimy, admin, registration, profile, extra fields, avatar, gravatar, recaptcha, captcha
|
6 |
Requires at least: 3.1
|
7 |
+
Tested up to: 3.5
|
8 |
+
Stable tag: 2.3.11
|
9 |
|
10 |
Add some useful fields to registration and user's info
|
11 |
|
securimage/LICENSE.txt
CHANGED
@@ -1,458 +1,25 @@
|
|
1 |
-
|
2 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3 |
|
4 |
-
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
|
5 |
-
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
6 |
-
Everyone is permitted to copy and distribute verbatim copies
|
7 |
-
of this license document, but changing it is not allowed.
|
8 |
-
|
9 |
-
[This is the first released version of the Lesser GPL. It also counts
|
10 |
-
as the successor of the GNU Library Public License, version 2, hence
|
11 |
-
the version number 2.1.]
|
12 |
-
|
13 |
-
Preamble
|
14 |
-
|
15 |
-
The licenses for most software are designed to take away your
|
16 |
-
freedom to share and change it. By contrast, the GNU General Public
|
17 |
-
Licenses are intended to guarantee your freedom to share and change
|
18 |
-
free software--to make sure the software is free for all its users.
|
19 |
-
|
20 |
-
This license, the Lesser General Public License, applies to some
|
21 |
-
specially designated software packages--typically libraries--of the
|
22 |
-
Free Software Foundation and other authors who decide to use it. You
|
23 |
-
can use it too, but we suggest you first think carefully about whether
|
24 |
-
this license or the ordinary General Public License is the better
|
25 |
-
strategy to use in any particular case, based on the explanations below.
|
26 |
-
|
27 |
-
When we speak of free software, we are referring to freedom of use,
|
28 |
-
not price. Our General Public Licenses are designed to make sure that
|
29 |
-
you have the freedom to distribute copies of free software (and charge
|
30 |
-
for this service if you wish); that you receive source code or can get
|
31 |
-
it if you want it; that you can change the software and use pieces of
|
32 |
-
it in new free programs; and that you are informed that you can do
|
33 |
-
these things.
|
34 |
-
|
35 |
-
To protect your rights, we need to make restrictions that forbid
|
36 |
-
distributors to deny you these rights or to ask you to surrender these
|
37 |
-
rights. These restrictions translate to certain responsibilities for
|
38 |
-
you if you distribute copies of the library or if you modify it.
|
39 |
-
|
40 |
-
For example, if you distribute copies of the library, whether gratis
|
41 |
-
or for a fee, you must give the recipients all the rights that we gave
|
42 |
-
you. You must make sure that they, too, receive or can get the source
|
43 |
-
code. If you link other code with the library, you must provide
|
44 |
-
complete object files to the recipients, so that they can relink them
|
45 |
-
with the library after making changes to the library and recompiling
|
46 |
-
it. And you must show them these terms so they know their rights.
|
47 |
-
|
48 |
-
We protect your rights with a two-step method: (1) we copyright the
|
49 |
-
library, and (2) we offer you this license, which gives you legal
|
50 |
-
permission to copy, distribute and/or modify the library.
|
51 |
-
|
52 |
-
To protect each distributor, we want to make it very clear that
|
53 |
-
there is no warranty for the free library. Also, if the library is
|
54 |
-
modified by someone else and passed on, the recipients should know
|
55 |
-
that what they have is not the original version, so that the original
|
56 |
-
author's reputation will not be affected by problems that might be
|
57 |
-
introduced by others.
|
58 |
-
|
59 |
-
Finally, software patents pose a constant threat to the existence of
|
60 |
-
any free program. We wish to make sure that a company cannot
|
61 |
-
effectively restrict the users of a free program by obtaining a
|
62 |
-
restrictive license from a patent holder. Therefore, we insist that
|
63 |
-
any patent license obtained for a version of the library must be
|
64 |
-
consistent with the full freedom of use specified in this license.
|
65 |
-
|
66 |
-
Most GNU software, including some libraries, is covered by the
|
67 |
-
ordinary GNU General Public License. This license, the GNU Lesser
|
68 |
-
General Public License, applies to certain designated libraries, and
|
69 |
-
is quite different from the ordinary General Public License. We use
|
70 |
-
this license for certain libraries in order to permit linking those
|
71 |
-
libraries into non-free programs.
|
72 |
-
|
73 |
-
When a program is linked with a library, whether statically or using
|
74 |
-
a shared library, the combination of the two is legally speaking a
|
75 |
-
combined work, a derivative of the original library. The ordinary
|
76 |
-
General Public License therefore permits such linking only if the
|
77 |
-
entire combination fits its criteria of freedom. The Lesser General
|
78 |
-
Public License permits more lax criteria for linking other code with
|
79 |
-
the library.
|
80 |
-
|
81 |
-
We call this license the "Lesser" General Public License because it
|
82 |
-
does Less to protect the user's freedom than the ordinary General
|
83 |
-
Public License. It also provides other free software developers Less
|
84 |
-
of an advantage over competing non-free programs. These disadvantages
|
85 |
-
are the reason we use the ordinary General Public License for many
|
86 |
-
libraries. However, the Lesser license provides advantages in certain
|
87 |
-
special circumstances.
|
88 |
-
|
89 |
-
For example, on rare occasions, there may be a special need to
|
90 |
-
encourage the widest possible use of a certain library, so that it becomes
|
91 |
-
a de-facto standard. To achieve this, non-free programs must be
|
92 |
-
allowed to use the library. A more frequent case is that a free
|
93 |
-
library does the same job as widely used non-free libraries. In this
|
94 |
-
case, there is little to gain by limiting the free library to free
|
95 |
-
software only, so we use the Lesser General Public License.
|
96 |
-
|
97 |
-
In other cases, permission to use a particular library in non-free
|
98 |
-
programs enables a greater number of people to use a large body of
|
99 |
-
free software. For example, permission to use the GNU C Library in
|
100 |
-
non-free programs enables many more people to use the whole GNU
|
101 |
-
operating system, as well as its variant, the GNU/Linux operating
|
102 |
-
system.
|
103 |
-
|
104 |
-
Although the Lesser General Public License is Less protective of the
|
105 |
-
users' freedom, it does ensure that the user of a program that is
|
106 |
-
linked with the Library has the freedom and the wherewithal to run
|
107 |
-
that program using a modified version of the Library.
|
108 |
-
|
109 |
-
The precise terms and conditions for copying, distribution and
|
110 |
-
modification follow. Pay close attention to the difference between a
|
111 |
-
"work based on the library" and a "work that uses the library". The
|
112 |
-
former contains code derived from the library, whereas the latter must
|
113 |
-
be combined with the library in order to run.
|
114 |
-
|
115 |
-
GNU LESSER GENERAL PUBLIC LICENSE
|
116 |
-
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
117 |
-
|
118 |
-
0. This License Agreement applies to any software library or other
|
119 |
-
program which contains a notice placed by the copyright holder or
|
120 |
-
other authorized party saying it may be distributed under the terms of
|
121 |
-
this Lesser General Public License (also called "this License").
|
122 |
-
Each licensee is addressed as "you".
|
123 |
-
|
124 |
-
A "library" means a collection of software functions and/or data
|
125 |
-
prepared so as to be conveniently linked with application programs
|
126 |
-
(which use some of those functions and data) to form executables.
|
127 |
-
|
128 |
-
The "Library", below, refers to any such software library or work
|
129 |
-
which has been distributed under these terms. A "work based on the
|
130 |
-
Library" means either the Library or any derivative work under
|
131 |
-
copyright law: that is to say, a work containing the Library or a
|
132 |
-
portion of it, either verbatim or with modifications and/or translated
|
133 |
-
straightforwardly into another language. (Hereinafter, translation is
|
134 |
-
included without limitation in the term "modification".)
|
135 |
-
|
136 |
-
"Source code" for a work means the preferred form of the work for
|
137 |
-
making modifications to it. For a library, complete source code means
|
138 |
-
all the source code for all modules it contains, plus any associated
|
139 |
-
interface definition files, plus the scripts used to control compilation
|
140 |
-
and installation of the library.
|
141 |
-
|
142 |
-
Activities other than copying, distribution and modification are not
|
143 |
-
covered by this License; they are outside its scope. The act of
|
144 |
-
running a program using the Library is not restricted, and output from
|
145 |
-
such a program is covered only if its contents constitute a work based
|
146 |
-
on the Library (independent of the use of the Library in a tool for
|
147 |
-
writing it). Whether that is true depends on what the Library does
|
148 |
-
and what the program that uses the Library does.
|
149 |
-
|
150 |
-
1. You may copy and distribute verbatim copies of the Library's
|
151 |
-
complete source code as you receive it, in any medium, provided that
|
152 |
-
you conspicuously and appropriately publish on each copy an
|
153 |
-
appropriate copyright notice and disclaimer of warranty; keep intact
|
154 |
-
all the notices that refer to this License and to the absence of any
|
155 |
-
warranty; and distribute a copy of this License along with the
|
156 |
-
Library.
|
157 |
-
|
158 |
-
You may charge a fee for the physical act of transferring a copy,
|
159 |
-
and you may at your option offer warranty protection in exchange for a
|
160 |
-
fee.
|
161 |
-
|
162 |
-
2. You may modify your copy or copies of the Library or any portion
|
163 |
-
of it, thus forming a work based on the Library, and copy and
|
164 |
-
distribute such modifications or work under the terms of Section 1
|
165 |
-
above, provided that you also meet all of these conditions:
|
166 |
-
|
167 |
-
a) The modified work must itself be a software library.
|
168 |
-
|
169 |
-
b) You must cause the files modified to carry prominent notices
|
170 |
-
stating that you changed the files and the date of any change.
|
171 |
-
|
172 |
-
c) You must cause the whole of the work to be licensed at no
|
173 |
-
charge to all third parties under the terms of this License.
|
174 |
-
|
175 |
-
d) If a facility in the modified Library refers to a function or a
|
176 |
-
table of data to be supplied by an application program that uses
|
177 |
-
the facility, other than as an argument passed when the facility
|
178 |
-
is invoked, then you must make a good faith effort to ensure that,
|
179 |
-
in the event an application does not supply such function or
|
180 |
-
table, the facility still operates, and performs whatever part of
|
181 |
-
its purpose remains meaningful.
|
182 |
-
|
183 |
-
(For example, a function in a library to compute square roots has
|
184 |
-
a purpose that is entirely well-defined independent of the
|
185 |
-
application. Therefore, Subsection 2d requires that any
|
186 |
-
application-supplied function or table used by this function must
|
187 |
-
be optional: if the application does not supply it, the square
|
188 |
-
root function must still compute square roots.)
|
189 |
-
|
190 |
-
These requirements apply to the modified work as a whole. If
|
191 |
-
identifiable sections of that work are not derived from the Library,
|
192 |
-
and can be reasonably considered independent and separate works in
|
193 |
-
themselves, then this License, and its terms, do not apply to those
|
194 |
-
sections when you distribute them as separate works. But when you
|
195 |
-
distribute the same sections as part of a whole which is a work based
|
196 |
-
on the Library, the distribution of the whole must be on the terms of
|
197 |
-
this License, whose permissions for other licensees extend to the
|
198 |
-
entire whole, and thus to each and every part regardless of who wrote
|
199 |
-
it.
|
200 |
-
|
201 |
-
Thus, it is not the intent of this section to claim rights or contest
|
202 |
-
your rights to work written entirely by you; rather, the intent is to
|
203 |
-
exercise the right to control the distribution of derivative or
|
204 |
-
collective works based on the Library.
|
205 |
-
|
206 |
-
In addition, mere aggregation of another work not based on the Library
|
207 |
-
with the Library (or with a work based on the Library) on a volume of
|
208 |
-
a storage or distribution medium does not bring the other work under
|
209 |
-
the scope of this License.
|
210 |
-
|
211 |
-
3. You may opt to apply the terms of the ordinary GNU General Public
|
212 |
-
License instead of this License to a given copy of the Library. To do
|
213 |
-
this, you must alter all the notices that refer to this License, so
|
214 |
-
that they refer to the ordinary GNU General Public License, version 2,
|
215 |
-
instead of to this License. (If a newer version than version 2 of the
|
216 |
-
ordinary GNU General Public License has appeared, then you can specify
|
217 |
-
that version instead if you wish.) Do not make any other change in
|
218 |
-
these notices.
|
219 |
-
|
220 |
-
Once this change is made in a given copy, it is irreversible for
|
221 |
-
that copy, so the ordinary GNU General Public License applies to all
|
222 |
-
subsequent copies and derivative works made from that copy.
|
223 |
-
|
224 |
-
This option is useful when you wish to copy part of the code of
|
225 |
-
the Library into a program that is not a library.
|
226 |
-
|
227 |
-
4. You may copy and distribute the Library (or a portion or
|
228 |
-
derivative of it, under Section 2) in object code or executable form
|
229 |
-
under the terms of Sections 1 and 2 above provided that you accompany
|
230 |
-
it with the complete corresponding machine-readable source code, which
|
231 |
-
must be distributed under the terms of Sections 1 and 2 above on a
|
232 |
-
medium customarily used for software interchange.
|
233 |
-
|
234 |
-
If distribution of object code is made by offering access to copy
|
235 |
-
from a designated place, then offering equivalent access to copy the
|
236 |
-
source code from the same place satisfies the requirement to
|
237 |
-
distribute the source code, even though third parties are not
|
238 |
-
compelled to copy the source along with the object code.
|
239 |
-
|
240 |
-
5. A program that contains no derivative of any portion of the
|
241 |
-
Library, but is designed to work with the Library by being compiled or
|
242 |
-
linked with it, is called a "work that uses the Library". Such a
|
243 |
-
work, in isolation, is not a derivative work of the Library, and
|
244 |
-
therefore falls outside the scope of this License.
|
245 |
-
|
246 |
-
However, linking a "work that uses the Library" with the Library
|
247 |
-
creates an executable that is a derivative of the Library (because it
|
248 |
-
contains portions of the Library), rather than a "work that uses the
|
249 |
-
library". The executable is therefore covered by this License.
|
250 |
-
Section 6 states terms for distribution of such executables.
|
251 |
-
|
252 |
-
When a "work that uses the Library" uses material from a header file
|
253 |
-
that is part of the Library, the object code for the work may be a
|
254 |
-
derivative work of the Library even though the source code is not.
|
255 |
-
Whether this is true is especially significant if the work can be
|
256 |
-
linked without the Library, or if the work is itself a library. The
|
257 |
-
threshold for this to be true is not precisely defined by law.
|
258 |
-
|
259 |
-
If such an object file uses only numerical parameters, data
|
260 |
-
structure layouts and accessors, and small macros and small inline
|
261 |
-
functions (ten lines or less in length), then the use of the object
|
262 |
-
file is unrestricted, regardless of whether it is legally a derivative
|
263 |
-
work. (Executables containing this object code plus portions of the
|
264 |
-
Library will still fall under Section 6.)
|
265 |
-
|
266 |
-
Otherwise, if the work is a derivative of the Library, you may
|
267 |
-
distribute the object code for the work under the terms of Section 6.
|
268 |
-
Any executables containing that work also fall under Section 6,
|
269 |
-
whether or not they are linked directly with the Library itself.
|
270 |
-
|
271 |
-
6. As an exception to the Sections above, you may also combine or
|
272 |
-
link a "work that uses the Library" with the Library to produce a
|
273 |
-
work containing portions of the Library, and distribute that work
|
274 |
-
under terms of your choice, provided that the terms permit
|
275 |
-
modification of the work for the customer's own use and reverse
|
276 |
-
engineering for debugging such modifications.
|
277 |
-
|
278 |
-
You must give prominent notice with each copy of the work that the
|
279 |
-
Library is used in it and that the Library and its use are covered by
|
280 |
-
this License. You must supply a copy of this License. If the work
|
281 |
-
during execution displays copyright notices, you must include the
|
282 |
-
copyright notice for the Library among them, as well as a reference
|
283 |
-
directing the user to the copy of this License. Also, you must do one
|
284 |
-
of these things:
|
285 |
-
|
286 |
-
a) Accompany the work with the complete corresponding
|
287 |
-
machine-readable source code for the Library including whatever
|
288 |
-
changes were used in the work (which must be distributed under
|
289 |
-
Sections 1 and 2 above); and, if the work is an executable linked
|
290 |
-
with the Library, with the complete machine-readable "work that
|
291 |
-
uses the Library", as object code and/or source code, so that the
|
292 |
-
user can modify the Library and then relink to produce a modified
|
293 |
-
executable containing the modified Library. (It is understood
|
294 |
-
that the user who changes the contents of definitions files in the
|
295 |
-
Library will not necessarily be able to recompile the application
|
296 |
-
to use the modified definitions.)
|
297 |
-
|
298 |
-
b) Use a suitable shared library mechanism for linking with the
|
299 |
-
Library. A suitable mechanism is one that (1) uses at run time a
|
300 |
-
copy of the library already present on the user's computer system,
|
301 |
-
rather than copying library functions into the executable, and (2)
|
302 |
-
will operate properly with a modified version of the library, if
|
303 |
-
the user installs one, as long as the modified version is
|
304 |
-
interface-compatible with the version that the work was made with.
|
305 |
-
|
306 |
-
c) Accompany the work with a written offer, valid for at
|
307 |
-
least three years, to give the same user the materials
|
308 |
-
specified in Subsection 6a, above, for a charge no more
|
309 |
-
than the cost of performing this distribution.
|
310 |
-
|
311 |
-
d) If distribution of the work is made by offering access to copy
|
312 |
-
from a designated place, offer equivalent access to copy the above
|
313 |
-
specified materials from the same place.
|
314 |
-
|
315 |
-
e) Verify that the user has already received a copy of these
|
316 |
-
materials or that you have already sent this user a copy.
|
317 |
-
|
318 |
-
For an executable, the required form of the "work that uses the
|
319 |
-
Library" must include any data and utility programs needed for
|
320 |
-
reproducing the executable from it. However, as a special exception,
|
321 |
-
the materials to be distributed need not include anything that is
|
322 |
-
normally distributed (in either source or binary form) with the major
|
323 |
-
components (compiler, kernel, and so on) of the operating system on
|
324 |
-
which the executable runs, unless that component itself accompanies
|
325 |
-
the executable.
|
326 |
-
|
327 |
-
It may happen that this requirement contradicts the license
|
328 |
-
restrictions of other proprietary libraries that do not normally
|
329 |
-
accompany the operating system. Such a contradiction means you cannot
|
330 |
-
use both them and the Library together in an executable that you
|
331 |
-
distribute.
|
332 |
-
|
333 |
-
7. You may place library facilities that are a work based on the
|
334 |
-
Library side-by-side in a single library together with other library
|
335 |
-
facilities not covered by this License, and distribute such a combined
|
336 |
-
library, provided that the separate distribution of the work based on
|
337 |
-
the Library and of the other library facilities is otherwise
|
338 |
-
permitted, and provided that you do these two things:
|
339 |
-
|
340 |
-
a) Accompany the combined library with a copy of the same work
|
341 |
-
based on the Library, uncombined with any other library
|
342 |
-
facilities. This must be distributed under the terms of the
|
343 |
-
Sections above.
|
344 |
-
|
345 |
-
b) Give prominent notice with the combined library of the fact
|
346 |
-
that part of it is a work based on the Library, and explaining
|
347 |
-
where to find the accompanying uncombined form of the same work.
|
348 |
-
|
349 |
-
8. You may not copy, modify, sublicense, link with, or distribute
|
350 |
-
the Library except as expressly provided under this License. Any
|
351 |
-
attempt otherwise to copy, modify, sublicense, link with, or
|
352 |
-
distribute the Library is void, and will automatically terminate your
|
353 |
-
rights under this License. However, parties who have received copies,
|
354 |
-
or rights, from you under this License will not have their licenses
|
355 |
-
terminated so long as such parties remain in full compliance.
|
356 |
-
|
357 |
-
9. You are not required to accept this License, since you have not
|
358 |
-
signed it. However, nothing else grants you permission to modify or
|
359 |
-
distribute the Library or its derivative works. These actions are
|
360 |
-
prohibited by law if you do not accept this License. Therefore, by
|
361 |
-
modifying or distributing the Library (or any work based on the
|
362 |
-
Library), you indicate your acceptance of this License to do so, and
|
363 |
-
all its terms and conditions for copying, distributing or modifying
|
364 |
-
the Library or works based on it.
|
365 |
-
|
366 |
-
10. Each time you redistribute the Library (or any work based on the
|
367 |
-
Library), the recipient automatically receives a license from the
|
368 |
-
original licensor to copy, distribute, link with or modify the Library
|
369 |
-
subject to these terms and conditions. You may not impose any further
|
370 |
-
restrictions on the recipients' exercise of the rights granted herein.
|
371 |
-
You are not responsible for enforcing compliance by third parties with
|
372 |
-
this License.
|
373 |
-
|
374 |
-
11. If, as a consequence of a court judgment or allegation of patent
|
375 |
-
infringement or for any other reason (not limited to patent issues),
|
376 |
-
conditions are imposed on you (whether by court order, agreement or
|
377 |
-
otherwise) that contradict the conditions of this License, they do not
|
378 |
-
excuse you from the conditions of this License. If you cannot
|
379 |
-
distribute so as to satisfy simultaneously your obligations under this
|
380 |
-
License and any other pertinent obligations, then as a consequence you
|
381 |
-
may not distribute the Library at all. For example, if a patent
|
382 |
-
license would not permit royalty-free redistribution of the Library by
|
383 |
-
all those who receive copies directly or indirectly through you, then
|
384 |
-
the only way you could satisfy both it and this License would be to
|
385 |
-
refrain entirely from distribution of the Library.
|
386 |
-
|
387 |
-
If any portion of this section is held invalid or unenforceable under any
|
388 |
-
particular circumstance, the balance of the section is intended to apply,
|
389 |
-
and the section as a whole is intended to apply in other circumstances.
|
390 |
-
|
391 |
-
It is not the purpose of this section to induce you to infringe any
|
392 |
-
patents or other property right claims or to contest validity of any
|
393 |
-
such claims; this section has the sole purpose of protecting the
|
394 |
-
integrity of the free software distribution system which is
|
395 |
-
implemented by public license practices. Many people have made
|
396 |
-
generous contributions to the wide range of software distributed
|
397 |
-
through that system in reliance on consistent application of that
|
398 |
-
system; it is up to the author/donor to decide if he or she is willing
|
399 |
-
to distribute software through any other system and a licensee cannot
|
400 |
-
impose that choice.
|
401 |
-
|
402 |
-
This section is intended to make thoroughly clear what is believed to
|
403 |
-
be a consequence of the rest of this License.
|
404 |
-
|
405 |
-
12. If the distribution and/or use of the Library is restricted in
|
406 |
-
certain countries either by patents or by copyrighted interfaces, the
|
407 |
-
original copyright holder who places the Library under this License may add
|
408 |
-
an explicit geographical distribution limitation excluding those countries,
|
409 |
-
so that distribution is permitted only in or among countries not thus
|
410 |
-
excluded. In such case, this License incorporates the limitation as if
|
411 |
-
written in the body of this License.
|
412 |
-
|
413 |
-
13. The Free Software Foundation may publish revised and/or new
|
414 |
-
versions of the Lesser General Public License from time to time.
|
415 |
-
Such new versions will be similar in spirit to the present version,
|
416 |
-
but may differ in detail to address new problems or concerns.
|
417 |
-
|
418 |
-
Each version is given a distinguishing version number. If the Library
|
419 |
-
specifies a version number of this License which applies to it and
|
420 |
-
"any later version", you have the option of following the terms and
|
421 |
-
conditions either of that version or of any later version published by
|
422 |
-
the Free Software Foundation. If the Library does not specify a
|
423 |
-
license version number, you may choose any version ever published by
|
424 |
-
the Free Software Foundation.
|
425 |
-
|
426 |
-
14. If you wish to incorporate parts of the Library into other free
|
427 |
-
programs whose distribution conditions are incompatible with these,
|
428 |
-
write to the author to ask for permission. For software which is
|
429 |
-
copyrighted by the Free Software Foundation, write to the Free
|
430 |
-
Software Foundation; we sometimes make exceptions for this. Our
|
431 |
-
decision will be guided by the two goals of preserving the free status
|
432 |
-
of all derivatives of our free software and of promoting the sharing
|
433 |
-
and reuse of software generally.
|
434 |
-
|
435 |
-
NO WARRANTY
|
436 |
-
|
437 |
-
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
|
438 |
-
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
|
439 |
-
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
|
440 |
-
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
|
441 |
-
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
|
442 |
-
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
443 |
-
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
|
444 |
-
LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
|
445 |
-
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
446 |
-
|
447 |
-
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
|
448 |
-
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
|
449 |
-
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
|
450 |
-
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
|
451 |
-
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
|
452 |
-
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
|
453 |
-
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
|
454 |
-
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
|
455 |
-
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
|
456 |
-
DAMAGES.
|
457 |
-
|
458 |
-
END OF TERMS AND CONDITIONS
|
1 |
+
COPYRIGHT:
|
2 |
+
Copyright (c) 2011 Drew Phillips
|
3 |
+
All rights reserved.
|
4 |
+
|
5 |
+
Redistribution and use in source and binary forms, with or without modification,
|
6 |
+
are permitted provided that the following conditions are met:
|
7 |
+
|
8 |
+
- Redistributions of source code must retain the above copyright notice,
|
9 |
+
this list of conditions and the following disclaimer.
|
10 |
+
- Redistributions in binary form must reproduce the above copyright notice,
|
11 |
+
this list of conditions and the following disclaimer in the documentation
|
12 |
+
and/or other materials provided with the distribution.
|
13 |
+
|
14 |
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
15 |
+
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
16 |
+
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
17 |
+
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
18 |
+
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
19 |
+
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
20 |
+
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
21 |
+
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
22 |
+
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
23 |
+
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
24 |
+
POSSIBILITY OF SUCH DAMAGE.
|
25 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
securimage/README.txt
CHANGED
@@ -1,8 +1,8 @@
|
|
1 |
NAME:
|
2 |
|
3 |
-
Securimage - A PHP class for creating and
|
4 |
|
5 |
-
VERSION:
|
6 |
|
7 |
AUTHOR:
|
8 |
|
@@ -19,9 +19,9 @@ DOCUMENTATION:
|
|
19 |
be found at http://www.phpcaptcha.org/Securimage_Docs/
|
20 |
|
21 |
REQUIREMENTS:
|
22 |
-
PHP
|
23 |
GD 2.0
|
24 |
-
FreeType (
|
25 |
|
26 |
SYNOPSIS:
|
27 |
|
@@ -48,16 +48,36 @@ DESCRIPTION:
|
|
48 |
The classes uses an existing PHP session or creates its own if none is found to store the
|
49 |
CAPTCHA code. Variables within the class are used to control the style and display of the image.
|
50 |
The class supports TTF fonts and effects for strengthening the security of the image.
|
51 |
-
|
52 |
-
transparent text and angled letters cannot be used.
|
53 |
|
54 |
|
55 |
COPYRIGHT:
|
56 |
-
Copyright (c)
|
57 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
58 |
|
59 |
-----------------------------------------------------------------------------
|
60 |
-
Flash code created for Securimage by
|
61 |
Many thanks for releasing this to the project!
|
62 |
|
63 |
------------------------------------------------------------------------------
|
1 |
NAME:
|
2 |
|
3 |
+
Securimage - A PHP class for creating captcha images and audio with many options.
|
4 |
|
5 |
+
VERSION: 3.0
|
6 |
|
7 |
AUTHOR:
|
8 |
|
19 |
be found at http://www.phpcaptcha.org/Securimage_Docs/
|
20 |
|
21 |
REQUIREMENTS:
|
22 |
+
PHP 5.2 or greater
|
23 |
GD 2.0
|
24 |
+
FreeType (Required, for TTF fonts)
|
25 |
|
26 |
SYNOPSIS:
|
27 |
|
48 |
The classes uses an existing PHP session or creates its own if none is found to store the
|
49 |
CAPTCHA code. Variables within the class are used to control the style and display of the image.
|
50 |
The class supports TTF fonts and effects for strengthening the security of the image.
|
51 |
+
An audible code can also be streamed to the browser for visually impared users.
|
|
|
52 |
|
53 |
|
54 |
COPYRIGHT:
|
55 |
+
Copyright (c) 2011 Drew Phillips
|
56 |
+
All rights reserved.
|
57 |
+
|
58 |
+
Redistribution and use in source and binary forms, with or without modification,
|
59 |
+
are permitted provided that the following conditions are met:
|
60 |
+
|
61 |
+
- Redistributions of source code must retain the above copyright notice,
|
62 |
+
this list of conditions and the following disclaimer.
|
63 |
+
- Redistributions in binary form must reproduce the above copyright notice,
|
64 |
+
this list of conditions and the following disclaimer in the documentation
|
65 |
+
and/or other materials provided with the distribution.
|
66 |
+
|
67 |
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
68 |
+
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
69 |
+
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
70 |
+
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
71 |
+
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
72 |
+
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
73 |
+
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
74 |
+
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
75 |
+
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
76 |
+
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
77 |
+
POSSIBILITY OF SUCH DAMAGE.
|
78 |
|
79 |
-----------------------------------------------------------------------------
|
80 |
+
Flash code created for Securimage by Mario Romero (animario@hotmail.com)
|
81 |
Many thanks for releasing this to the project!
|
82 |
|
83 |
------------------------------------------------------------------------------
|
securimage/audio/0.mp3
DELETED
Binary file
|
securimage/audio/1.mp3
DELETED
Binary file
|
securimage/audio/2.mp3
DELETED
Binary file
|
securimage/audio/3.mp3
DELETED
Binary file
|
securimage/audio/4.mp3
DELETED
Binary file
|
securimage/audio/5.mp3
DELETED
Binary file
|
securimage/audio/6.mp3
DELETED
Binary file
|
securimage/audio/7.mp3
DELETED
Binary file
|
securimage/audio/8.mp3
DELETED
Binary file
|
securimage/audio/9.mp3
DELETED
Binary file
|
securimage/audio/A.mp3
DELETED
Binary file
|
securimage/audio/B.mp3
DELETED
Binary file
|
securimage/audio/C.mp3
DELETED
Binary file
|
securimage/audio/D.mp3
DELETED
Binary file
|
securimage/audio/E.mp3
DELETED
Binary file
|
securimage/audio/F.mp3
DELETED
Binary file
|
securimage/audio/G.mp3
DELETED
Binary file
|
securimage/audio/H.mp3
DELETED
Binary file
|
securimage/audio/I.mp3
DELETED
Binary file
|
securimage/audio/J.mp3
DELETED
Binary file
|
securimage/audio/K.mp3
DELETED
Binary file
|
securimage/audio/L.mp3
DELETED
Binary file
|
securimage/audio/M.mp3
DELETED
Binary file
|
securimage/audio/N.mp3
DELETED
Binary file
|
securimage/audio/O.mp3
DELETED
Binary file
|
securimage/audio/P.mp3
DELETED
Binary file
|
securimage/audio/Q.mp3
DELETED
Binary file
|
securimage/audio/R.mp3
DELETED
Binary file
|
securimage/audio/S.mp3
DELETED
Binary file
|
securimage/audio/T.mp3
DELETED
Binary file
|
securimage/audio/U.mp3
DELETED
Binary file
|
securimage/audio/V.mp3
DELETED
Binary file
|
securimage/audio/W.mp3
DELETED
Binary file
|
securimage/audio/X.mp3
DELETED
Binary file
|
securimage/audio/Y.mp3
DELETED
Binary file
|
securimage/audio/Z.mp3
DELETED
Binary file
|
securimage/audio/error.wav
ADDED
Binary file
|
securimage/captcha.html
ADDED
@@ -0,0 +1,13 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<!-- The following is example HTML that can be used on your form -->
|
2 |
+
|
3 |
+
<p>
|
4 |
+
<img id="siimage" style="border: 1px solid #000; margin-right: 15px" src="./securimage_show.php?sid=<?php echo md5(uniqid()) ?>" alt="CAPTCHA Image" align="left">
|
5 |
+
<object type="application/x-shockwave-flash" data="./securimage_play.swf?audio_file=./securimage_play.php&bgColor1=#fff&bgColor2=#fff&iconColor=#777&borderWidth=1&borderColor=#000" height="32" width="32">
|
6 |
+
<param name="movie" value="./securimage_play.swf?audio_file=./securimage_play.php&bgColor1=#fff&bgColor2=#fff&iconColor=#777&borderWidth=1&borderColor=#000">
|
7 |
+
</object>
|
8 |
+
|
9 |
+
<a tabindex="-1" style="border-style: none;" href="#" title="Refresh Image" onclick="document.getElementById('siimage').src = './securimage_show.php?sid=' + Math.random(); this.blur(); return false"><img src="./images/refresh.png" alt="Reload Image" onclick="this.blur()" align="bottom" border="0"></a><br />
|
10 |
+
<strong>Enter Code*:</strong><br />
|
11 |
+
<input type="text" name="ct_captcha" size="12" maxlength="8" />
|
12 |
+
</p>
|
13 |
+
|
securimage/database/securimage.sqlite
CHANGED
Binary file
|
securimage/example_form.ajax.php
ADDED
@@ -0,0 +1,213 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
session_start(); // this MUST be called prior to any output including whitespaces and line breaks!
|
3 |
+
|
4 |
+
$GLOBALS['ct_recipient'] = 'YOU@EXAMPLE.COM'; // Change to your email address!
|
5 |
+
$GLOBALS['ct_msg_subject'] = 'Securimage Test Contact Form';
|
6 |
+
|
7 |
+
$GLOBALS['DEBUG_MODE'] = 1;
|
8 |
+
// CHANGE TO 0 TO TURN OFF DEBUG MODE
|
9 |
+
// IN DEBUG MODE, ONLY THE CAPTCHA CODE IS VALIDATED, AND NO EMAIL IS SENT
|
10 |
+
|
11 |
+
|
12 |
+
// Process the form, if it was submitted
|
13 |
+
process_si_contact_form();
|
14 |
+
|
15 |
+
?>
|
16 |
+
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
17 |
+
<html>
|
18 |
+
<head>
|
19 |
+
<title>Securimage Example Form</title>
|
20 |
+
<style type="text/css">
|
21 |
+
<!--
|
22 |
+
#success_message { border: 1px solid #000; width: 550px; text-align: left; padding: 10px 7px; background: #33ff33; color: #000; font-weight; bold; font-size: 1.2em; border-radius: 4px; -moz-border-radius: 4px; -webkit-border-radius: 4px; }
|
23 |
+
fieldset { width: 90%; }
|
24 |
+
legend { font-size: 24px; }
|
25 |
+
.note { font-size: 18px; }
|
26 |
+
-->
|
27 |
+
</style>
|
28 |
+
|
29 |
+
<script src="https://ajax.googleapis.com/ajax/libs/prototype/1.7.0.0/prototype.js"></script>
|
30 |
+
|
31 |
+
<script type="text/javascript">
|
32 |
+
function reloadCaptcha()
|
33 |
+
{
|
34 |
+
document.getElementById('siimage').src = './securimage_show.php?sid=' + Math.random();
|
35 |
+
}
|
36 |
+
|
37 |
+
function processForm()
|
38 |
+
{
|
39 |
+
new Ajax.Request('<?php echo $_SERVER['PHP_SELF'] ?>', {
|
40 |
+
method: 'post',
|
41 |
+
parameters: $('contact_form').serialize(),
|
42 |
+
onSuccess: function(transport) {
|
43 |
+
try {
|
44 |
+
var r = transport.responseText.evalJSON();
|
45 |
+
|
46 |
+
if (r.error == 0) {
|
47 |
+
$('success_message').show();
|
48 |
+
$('contact_form').reset();
|
49 |
+
reloadCaptcha();
|
50 |
+
setTimeout("$('success_message').hide()", 30000);
|
51 |
+
} else {
|
52 |
+
alert("There was an error with your submission.\n\n" + r.message);
|
53 |
+
}
|
54 |
+
} catch(ex) {
|
55 |
+
alert("There was an error parsing the json");
|
56 |
+
}
|
57 |
+
},
|
58 |
+
onFailure: function(err) {
|
59 |
+
alert("Ajax request failed");
|
60 |
+
}
|
61 |
+
});
|
62 |
+
|
63 |
+
return false;
|
64 |
+
}
|
65 |
+
</script>
|
66 |
+
</head>
|
67 |
+
<body>
|
68 |
+
|
69 |
+
<fieldset>
|
70 |
+
<legend>Example Form</legend>
|
71 |
+
|
72 |
+
<p class="note">
|
73 |
+
This is an example PHP form that processes user information, checks for errors, and validates the captcha code.<br />
|
74 |
+
This example form also demonstrates how to submit a form to itself to display error messages.
|
75 |
+
</p>
|
76 |
+
|
77 |
+
<div id="success_message" style="display: none">Your message has been sent!<br />We will contact you as soon as possible.</div>
|
78 |
+
|
79 |
+
<form method="post" action="" id="contact_form" onsubmit="return processForm()">
|
80 |
+
<input type="hidden" name="do" value="contact" />
|
81 |
+
|
82 |
+
<p>
|
83 |
+
<strong>Name*:</strong><br />
|
84 |
+
<input type="text" name="ct_name" size="35" value="" />
|
85 |
+
</p>
|
86 |
+
|
87 |
+
<p>
|
88 |
+
<strong>Email*:</strong><br />
|
89 |
+
<input type="text" name="ct_email" size="35" value="" />
|
90 |
+
</p>
|
91 |
+
|
92 |
+
<p>
|
93 |
+
<strong>URL:</strong><br />
|
94 |
+
<input type="text" name="ct_URL" size="35" value="" />
|
95 |
+
</p>
|
96 |
+
|
97 |
+
<p>
|
98 |
+
<strong>Message*:</strong><br />
|
99 |
+
<textarea name="ct_message" style="width: 450px; height: 200px"></textarea>
|
100 |
+
</p>
|
101 |
+
|
102 |
+
<p>
|
103 |
+
<img id="siimage" style="border: 1px solid #000; margin-right: 15px" src="./securimage_show.php?sid=<?php echo md5(uniqid()) ?>" alt="CAPTCHA Image" align="left">
|
104 |
+
<object type="application/x-shockwave-flash" data="./securimage_play.swf?audio_file=./securimage_play.php&bgColor1=#fff&bgColor2=#fff&iconColor=#777&borderWidth=1&borderColor=#000" height="32" width="32">
|
105 |
+
<param name="movie" value="./securimage_play.swf?audio_file=./securimage_play.php&bgColor1=#fff&bgColor2=#fff&iconColor=#777&borderWidth=1&borderColor=#000">
|
106 |
+
</object>
|
107 |
+
|
108 |
+
<a tabindex="-1" style="border-style: none;" href="#" title="Refresh Image" onclick="reloadCaptcha(); this.blur(); return false"><img src="./images/refresh.png" alt="Reload Image" onclick="this.blur()" align="bottom" border="0"></a><br />
|
109 |
+
<strong>Enter Code*:</strong><br />
|
110 |
+
<input type="text" name="ct_captcha" size="12" maxlength="8" />
|
111 |
+
</p>
|
112 |
+
|
113 |
+
<p>
|
114 |
+
<br />
|
115 |
+
<input type="submit" value="Submit Message">
|
116 |
+
</p>
|
117 |
+
|
118 |
+
</form>
|
119 |
+
</fieldset>
|
120 |
+
|
121 |
+
</body>
|
122 |
+
</html>
|
123 |
+
|
124 |
+
<?php
|
125 |
+
|
126 |
+
// The form processor PHP code
|
127 |
+
function process_si_contact_form()
|
128 |
+
{
|
129 |
+
if ($_SERVER['REQUEST_METHOD'] == 'POST' && @$_POST['do'] == 'contact') {
|
130 |
+
// if the form has been submitted
|
131 |
+
|
132 |
+
foreach($_POST as $key => $value) {
|
133 |
+
if (!is_array($key)) {
|
134 |
+
// sanitize the input data
|
135 |
+
if ($key != 'ct_message') $value = strip_tags($value);
|
136 |
+
$_POST[$key] = htmlspecialchars(stripslashes(trim($value)));
|
137 |
+
}
|
138 |
+
}
|
139 |
+
|
140 |
+
$name = @$_POST['ct_name']; // name from the form
|
141 |
+
$email = @$_POST['ct_email']; // email from the form
|
142 |
+
$URL = @$_POST['ct_URL']; // url from the form
|
143 |
+
$message = @$_POST['ct_message']; // the message from the form
|
144 |
+
$captcha = @$_POST['ct_captcha']; // the user's entry for the captcha code
|
145 |
+
$name = substr($name, 0, 64); // limit name to 64 characters
|
146 |
+
|
147 |
+
$errors = array(); // initialize empty error array
|
148 |
+
|
149 |
+
if (isset($GLOBALS['DEBUG_MODE']) && $GLOBALS['DEBUG_MODE'] == false) {
|
150 |
+
// only check for errors if the form is not in debug mode
|
151 |
+
|
152 |
+
if (strlen($name) < 3) {
|
153 |
+
// name too short, add error
|
154 |
+
$errors['name_error'] = 'Your name is required';
|
155 |
+
}
|
156 |
+
|
157 |
+
if (strlen($email) == 0) {
|
158 |
+
// no email address given
|
159 |
+
$errors['email_error'] = 'Email address is required';
|
160 |
+
} else if ( !preg_match('/^(?:[\w\d]+\.?)+@(?:(?:[\w\d]\-?)+\.)+\w{2,4}$/i', $email)) {
|
161 |
+
// invalid email format
|
162 |
+
$errors['email_error'] = 'Email address entered is invalid';
|
163 |
+
}
|
164 |
+
|
165 |
+
if (strlen($message) < 20) {
|
166 |
+
// message length too short
|
167 |
+
$errors['message_error'] = 'Please enter a message';
|
168 |
+
}
|
169 |
+
}
|
170 |
+
|
171 |
+
// Only try to validate the captcha if the form has no errors
|
172 |
+
// This is especially important for ajax calls
|
173 |
+
if (sizeof($errors) == 0) {
|
174 |
+
require_once dirname(__FILE__) . '/securimage.php';
|
175 |
+
$securimage = new Securimage();
|
176 |
+
|
177 |
+
if ($securimage->check($captcha) == false) {
|
178 |
+
$errors['captcha_error'] = 'Incorrect security code entered';
|
179 |
+
}
|
180 |
+
}
|
181 |
+
|
182 |
+
if (sizeof($errors) == 0) {
|
183 |
+
// no errors, send the form
|
184 |
+
$time = date('r');
|
185 |
+
$message = "A message was submitted from the contact form. The following information was provided.<br /><br />"
|
186 |
+
. "Name: $name<br />"
|
187 |
+
. "Email: $email<br />"
|
188 |
+
. "URL: $URL<br />"
|
189 |
+
. "Message:<br />"
|
190 |
+
. "<pre>$message</pre>"
|
191 |
+
. "<br /><br />IP Address: {$_SERVER['REMOTE_ADDR']}<br />"
|
192 |
+
. "Time: $time<br />"
|
193 |
+
. "Browser: {$_SERVER['HTTP_USER_AGENT']}<br />";
|
194 |
+
|
195 |
+
if (isset($GLOBALS['DEBUG_MODE']) && $GLOBALS['DEBUG_MODE'] == false) {
|
196 |
+
// send the message with mail()
|
197 |
+
mail($GLOBALS['ct_recipient'], $GLOBALS['ct_msg_subject'], $message, "From: {$GLOBALS['ct_recipient']}\r\nReply-To: {$email}\r\nContent-type: text/html; charset=ISO-8859-1\r\nMIME-Version: 1.0");
|
198 |
+
}
|
199 |
+
|
200 |
+
$return = array('error' => 0, 'message' => 'OK');
|
201 |
+
die(json_encode($return));
|
202 |
+
} else {
|
203 |
+
$errmsg = '';
|
204 |
+
foreach($errors as $key => $error) {
|
205 |
+
// set up error messages to display with each field
|
206 |
+
$errmsg .= " - {$error}\n";
|
207 |
+
}
|
208 |
+
|
209 |
+
$return = array('error' => 1, 'message' => $errmsg);
|
210 |
+
die(json_encode($return));
|
211 |
+
}
|
212 |
+
} // POST
|
213 |
+
} // function process_si_contact_form()
|
securimage/example_form.php
CHANGED
@@ -1,71 +1,191 @@
|
|
1 |
<?php
|
|
|
2 |
|
3 |
-
|
4 |
-
|
5 |
-
|
6 |
-
* URL: www.phpcaptcha.org
|
7 |
-
*/
|
8 |
-
|
9 |
-
|
10 |
-
session_start(); // Start the session where the code will be stored.
|
11 |
|
12 |
?>
|
|
|
13 |
<html>
|
14 |
<head>
|
15 |
-
<title>Securimage
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
16 |
</head>
|
17 |
-
|
18 |
<body>
|
19 |
|
20 |
-
|
21 |
-
|
22 |
-
|
23 |
-
|
24 |
-
|
25 |
-
|
26 |
-
|
27 |
-
|
28 |
-
<div style="width: 430px; float: left; height: 90px">
|
29 |
-
<img id="siimage" align="left" style="padding-right: 5px; border: 0" src="securimage_show.php?sid=<?php echo md5(time()) ?>" />
|
30 |
-
|
31 |
-
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" width="19" height="19" id="SecurImage_as3" align="middle">
|
32 |
-
<param name="allowScriptAccess" value="sameDomain" />
|
33 |
-
<param name="allowFullScreen" value="false" />
|
34 |
-
<param name="movie" value="securimage_play.swf?audio=securimage_play.php&bgColor1=#777&bgColor2=#fff&iconColor=#000&roundedCorner=5" />
|
35 |
-
<param name="quality" value="high" />
|
36 |
-
|
37 |
-
<param name="bgcolor" value="#ffffff" />
|
38 |
-
<embed src="securimage_play.swf?audio=securimage_play.php&bgColor1=#777&bgColor2=#fff&iconColor=#000&roundedCorner=5" quality="high" bgcolor="#ffffff" width="19" height="19" name="SecurImage_as3" align="middle" allowScriptAccess="sameDomain" allowFullScreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />
|
39 |
-
</object>
|
40 |
-
|
41 |
-
<br />
|
42 |
-
|
43 |
-
<!-- pass a session id to the query string of the script to prevent ie caching -->
|
44 |
-
<a tabindex="-1" style="border-style: none" href="#" title="Refresh Image" onclick="document.getElementById('siimage').src = 'securimage_show.php?sid=' + Math.random(); return false"><img src="images/refresh.gif" alt="Reload Image" border="0" onclick="this.blur()" align="bottom" /></a>
|
45 |
-
</div>
|
46 |
-
<div style="clear: both"></div>
|
47 |
-
Code:<br />
|
48 |
-
|
49 |
-
<!-- NOTE: the "name" attribute is "code" so that $img->check($_POST['code']) will check the submitted form field -->
|
50 |
-
<input type="text" name="code" size="12" /><br /><br />
|
51 |
-
|
52 |
-
<input type="submit" value="Submit Form" />
|
53 |
-
</form>
|
54 |
|
55 |
<?php
|
56 |
-
} else { //form is posted
|
57 |
-
include("securimage.php");
|
58 |
-
$img = new Securimage();
|
59 |
-
$valid = $img->check($_POST['code']);
|
60 |
-
|
61 |
-
if($valid == true) {
|
62 |
-
echo "<center>Thanks, you entered the correct code.<br />Click <a href=\"{$_SERVER['PHP_SELF']}\">here</a> to go back.</center>";
|
63 |
-
} else {
|
64 |
-
echo "<center>Sorry, the code you entered was invalid. <a href=\"javascript:history.go(-1)\">Go back</a> to try again.</center>";
|
65 |
-
}
|
66 |
-
}
|
67 |
|
68 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
69 |
|
70 |
</body>
|
71 |
</html>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
<?php
|
2 |
+
session_start(); // this MUST be called prior to any output including whitespaces and line breaks!
|
3 |
|
4 |
+
$GLOBALS['DEBUG_MODE'] = 1;
|
5 |
+
// CHANGE TO 0 TO TURN OFF DEBUG MODE
|
6 |
+
// IN DEBUG MODE, ONLY THE CAPTCHA CODE IS VALIDATED, AND NO EMAIL IS SENT
|
|
|
|
|
|
|
|
|
|
|
7 |
|
8 |
?>
|
9 |
+
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
10 |
<html>
|
11 |
<head>
|
12 |
+
<title>Securimage Example Form</title>
|
13 |
+
<style type="text/css">
|
14 |
+
<!--
|
15 |
+
.error { color: #f00; font-weight: bold; font-size: 1.2em; }
|
16 |
+
.success { color: #00f; font-weight; bold; font-size: 1.2em; }
|
17 |
+
fieldset { width: 90%; }
|
18 |
+
legend { font-size: 24px; }
|
19 |
+
.note { font-size: 18px;
|
20 |
+
-->
|
21 |
+
</style>
|
22 |
</head>
|
|
|
23 |
<body>
|
24 |
|
25 |
+
<fieldset>
|
26 |
+
<legend>Example Form</legend>
|
27 |
+
|
28 |
+
<p class="note">
|
29 |
+
This is an example PHP form that processes user information, checks for errors, and validates the captcha code.<br />
|
30 |
+
This example form also demonstrates how to submit a form to itself to display error messages.
|
31 |
+
</p>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
32 |
|
33 |
<?php
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
34 |
|
35 |
+
$GLOBALS['ct_recipient'] = 'YOU@EXAMPLE.COm'; // Change to your email address!
|
36 |
+
$GLOBALS['ct_msg_subject'] = 'Securimage Test Contact Form';
|
37 |
+
|
38 |
+
process_si_contact_form(); // Process the form, if it was submitted
|
39 |
+
|
40 |
+
if (isset($_SESSION['ctform']['error']) && $_SESSION['ctform']['error'] == true): /* The last form submission had 1 or more errors */ ?>
|
41 |
+
<span class="error">There was a problem with your submission. Errors are displayed below in red.</span><br /><br />
|
42 |
+
<?php elseif (isset($_SESSION['ctform']['success']) && $_SESSION['ctform']['success'] == true): /* form was processed successfully */ ?>
|
43 |
+
<span class="success">The captcha was correct and the message has been sent!</span><br /><br />
|
44 |
+
<?php endif; ?>
|
45 |
+
|
46 |
+
<form method="post" action="<?php echo $_SERVER['REQUEST_URI'] . $_SERVER['QUERY_STRING'] ?>" id="contact_form">
|
47 |
+
<input type="hidden" name="do" value="contact" />
|
48 |
+
|
49 |
+
<p>
|
50 |
+
<strong>Name*:</strong> <?php echo @$_SESSION['ctform']['name_error'] ?><br />
|
51 |
+
<input type="text" name="ct_name" size="35" value="<?php echo htmlspecialchars(@$_SESSION['ctform']['ct_name']) ?>" />
|
52 |
+
</p>
|
53 |
+
|
54 |
+
<p>
|
55 |
+
<strong>Email*:</strong> <?php echo @$_SESSION['ctform']['email_error'] ?><br />
|
56 |
+
<input type="text" name="ct_email" size="35" value="<?php echo htmlspecialchars(@$_SESSION['ctform']['ct_email']) ?>" />
|
57 |
+
</p>
|
58 |
+
|
59 |
+
<p>
|
60 |
+
<strong>URL:</strong> <?php echo @$_SESSION['ctform']['URL_error'] ?><br />
|
61 |
+
<input type="text" name="ct_URL" size="35" value="<?php echo htmlspecialchars(@$_SESSION['ctform']['ct_URL']) ?>" />
|
62 |
+
</p>
|
63 |
+
|
64 |
+
<p>
|
65 |
+
<strong>Message*:</strong> <?php echo @$_SESSION['ctform']['message_error'] ?><br />
|
66 |
+
<textarea name="ct_message" style="width: 450px; height: 200px"><?php echo htmlspecialchars(@$_SESSION['ctform']['ct_message']) ?></textarea>
|
67 |
+
</p>
|
68 |
+
|
69 |
+
<p>
|
70 |
+
<img id="siimage" style="border: 1px solid #000; margin-right: 15px" src="./securimage_show.php?sid=<?php echo md5(uniqid()) ?>" alt="CAPTCHA Image" align="left">
|
71 |
+
<object type="application/x-shockwave-flash" data="./securimage_play.swf?audio_file=./securimage_play.php&bgColor1=#fff&bgColor2=#fff&iconColor=#777&borderWidth=1&borderColor=#000" height="32" width="32">
|
72 |
+
<param name="movie" value="./securimage_play.swf?audio_file=./securimage_play.php&bgColor1=#fff&bgColor2=#fff&iconColor=#777&borderWidth=1&borderColor=#000">
|
73 |
+
</object>
|
74 |
+
|
75 |
+
<a tabindex="-1" style="border-style: none;" href="#" title="Refresh Image" onclick="document.getElementById('siimage').src = './securimage_show.php?sid=' + Math.random(); this.blur(); return false"><img src="./images/refresh.png" alt="Reload Image" onclick="this.blur()" align="bottom" border="0"></a><br />
|
76 |
+
<strong>Enter Code*:</strong><br />
|
77 |
+
<?php echo @$_SESSION['ctform']['captcha_error'] ?>
|
78 |
+
<input type="text" name="ct_captcha" size="12" maxlength="8" />
|
79 |
+
</p>
|
80 |
+
|
81 |
+
<p>
|
82 |
+
<br />
|
83 |
+
<input type="submit" value="Submit Message">
|
84 |
+
</p>
|
85 |
+
|
86 |
+
</form>
|
87 |
+
</fieldset>
|
88 |
|
89 |
</body>
|
90 |
</html>
|
91 |
+
|
92 |
+
<?php
|
93 |
+
|
94 |
+
// The form processor PHP code
|
95 |
+
function process_si_contact_form()
|
96 |
+
{
|
97 |
+
$_SESSION['ctform'] = array(); // re-initialize the form session data
|
98 |
+
|
99 |
+
if ($_SERVER['REQUEST_METHOD'] == 'POST' && @$_POST['do'] == 'contact') {
|
100 |
+
// if the form has been submitted
|
101 |
+
|
102 |
+
foreach($_POST as $key => $value) {
|
103 |
+
if (!is_array($key)) {
|
104 |
+
// sanitize the input data
|
105 |
+
if ($key != 'ct_message') $value = strip_tags($value);
|
106 |
+
$_POST[$key] = htmlspecialchars(stripslashes(trim($value)));
|
107 |
+
}
|
108 |
+
}
|
109 |
+
|
110 |
+
$name = @$_POST['ct_name']; // name from the form
|
111 |
+
$email = @$_POST['ct_email']; // email from the form
|
112 |
+
$URL = @$_POST['ct_URL']; // url from the form
|
113 |
+
$message = @$_POST['ct_message']; // the message from the form
|
114 |
+
$captcha = @$_POST['ct_captcha']; // the user's entry for the captcha code
|
115 |
+
$name = substr($name, 0, 64); // limit name to 64 characters
|
116 |
+
|
117 |
+
$errors = array(); // initialize empty error array
|
118 |
+
|
119 |
+
if (isset($GLOBALS['DEBUG_MODE']) && $GLOBALS['DEBUG_MODE'] == false) {
|
120 |
+
// only check for errors if the form is not in debug mode
|
121 |
+
|
122 |
+
if (strlen($name) < 3) {
|
123 |
+
// name too short, add error
|
124 |
+
$errors['name_error'] = 'Your name is required';
|
125 |
+
}
|
126 |
+
|
127 |
+
if (strlen($email) == 0) {
|
128 |
+
// no email address given
|
129 |
+
$errors['email_error'] = 'Email address is required';
|
130 |
+
} else if ( !preg_match('/^(?:[\w\d]+\.?)+@(?:(?:[\w\d]\-?)+\.)+\w{2,4}$/i', $email)) {
|
131 |
+
// invalid email format
|
132 |
+
$errors['email_error'] = 'Email address entered is invalid';
|
133 |
+
}
|
134 |
+
|
135 |
+
if (strlen($message) < 20) {
|
136 |
+
// message length too short
|
137 |
+
$errors['message_error'] = 'Please enter a message';
|
138 |
+
}
|
139 |
+
}
|
140 |
+
|
141 |
+
// Only try to validate the captcha if the form has no errors
|
142 |
+
// This is especially important for ajax calls
|
143 |
+
if (sizeof($errors) == 0) {
|
144 |
+
require_once dirname(__FILE__) . '/securimage.php';
|
145 |
+
$securimage = new Securimage();
|
146 |
+
|
147 |
+
if ($securimage->check($captcha) == false) {
|
148 |
+
$errors['captcha_error'] = 'Incorrect security code entered<br />';
|
149 |
+
}
|
150 |
+
}
|
151 |
+
|
152 |
+
if (sizeof($errors) == 0) {
|
153 |
+
// no errors, send the form
|
154 |
+
$time = date('r');
|
155 |
+
$message = "A message was submitted from the contact form. The following information was provided.<br /><br />"
|
156 |
+
. "Name: $name<br />"
|
157 |
+
. "Email: $email<br />"
|
158 |
+
. "URL: $URL<br />"
|
159 |
+
. "Message:<br />"
|
160 |
+
. "<pre>$message</pre>"
|
161 |
+
. "<br /><br />IP Address: {$_SERVER['REMOTE_ADDR']}<br />"
|
162 |
+
. "Time: $time<br />"
|
163 |
+
. "Browser: {$_SERVER['HTTP_USER_AGENT']}<br />";
|
164 |
+
|
165 |
+
$message = wordwrap($message, 70);
|
166 |
+
|
167 |
+
if (isset($GLOBALS['DEBUG_MODE']) && $GLOBALS['DEBUG_MODE'] == false) {
|
168 |
+
// send the message with mail()
|
169 |
+
mail($GLOBALS['ct_recipient'], $GLOBALS['ct_msg_subject'], $message, "From: {$GLOBALS['ct_recipient']}\r\nReply-To: {$email}\r\nContent-type: text/html; charset=ISO-8859-1\r\nMIME-Version: 1.0");
|
170 |
+
}
|
171 |
+
|
172 |
+
$_SESSION['ctform']['error'] = false; // no error with form
|
173 |
+
$_SESSION['ctform']['success'] = true; // message sent
|
174 |
+
} else {
|
175 |
+
// save the entries, this is to re-populate the form
|
176 |
+
$_SESSION['ctform']['ct_name'] = $name; // save name from the form submission
|
177 |
+
$_SESSION['ctform']['ct_email'] = $email; // save email
|
178 |
+
$_SESSION['ctform']['ct_URL'] = $URL; // save URL
|
179 |
+
$_SESSION['ctform']['ct_message'] = $message; // save message
|
180 |
+
|
181 |
+
foreach($errors as $key => $error) {
|
182 |
+
// set up error messages to display with each field
|
183 |
+
$_SESSION['ctform'][$key] = "<span style=\"font-weight: bold; color: #f00\">$error</span>";
|
184 |
+
}
|
185 |
+
|
186 |
+
$_SESSION['ctform']['error'] = true; // set error floag
|
187 |
+
}
|
188 |
+
} // POST
|
189 |
+
}
|
190 |
+
|
191 |
+
$_SESSION['ctform']['success'] = false; // clear success value after running
|
securimage/gdfonts/automatic.gdf
DELETED
Binary file
|
securimage/images/refresh.png
ADDED
Binary file
|
securimage/securimage.php
CHANGED
@@ -1,22 +1,34 @@
|
|
1 |
<?php
|
2 |
|
|
|
|
|
3 |
/**
|
4 |
* Project: Securimage: A PHP class for creating and managing form CAPTCHA images<br />
|
5 |
* File: securimage.php<br />
|
6 |
*
|
7 |
-
*
|
8 |
-
*
|
9 |
-
*
|
10 |
-
*
|
11 |
-
*
|
12 |
-
*
|
13 |
-
*
|
14 |
-
*
|
15 |
-
*
|
16 |
-
*
|
17 |
-
*
|
18 |
-
*
|
19 |
-
*
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
20 |
*
|
21 |
* Any modifications to the library should be indicated clearly in the source code
|
22 |
* to inform users that the changes are not a part of the original software.<br /><br />
|
@@ -27,9 +39,9 @@
|
|
27 |
* @link http://www.phpcaptcha.org Securimage PHP CAPTCHA
|
28 |
* @link http://www.phpcaptcha.org/latest.zip Download Latest Version
|
29 |
* @link http://www.phpcaptcha.org/Securimage_Docs/ Online Documentation
|
30 |
-
* @copyright
|
31 |
* @author Drew Phillips <drew@drew-phillips.com>
|
32 |
-
* @version
|
33 |
* @package Securimage
|
34 |
*
|
35 |
*/
|
@@ -37,6 +49,23 @@
|
|
37 |
/**
|
38 |
ChangeLog
|
39 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
40 |
2.0.1
|
41 |
- Add support for browsers with cookies disabled (requires php5, sqlite) maps users to md5 hashed ip addresses and md5 hashed codes for security
|
42 |
- Add fallback to gd fonts if ttf support is not enabled or font file not found (Mike Challis http://www.642weather.com/weather/scripts.php)
|
@@ -80,1505 +109,1329 @@
|
|
80 |
|
81 |
*/
|
82 |
|
83 |
-
/**
|
84 |
-
* Output images in JPEG format
|
85 |
-
*/
|
86 |
-
if (!defined('SI_IMAGE_JPEG'))
|
87 |
-
define('SI_IMAGE_JPEG', 1);
|
88 |
-
/**
|
89 |
-
* Output images in PNG format
|
90 |
-
*/
|
91 |
-
if (!defined('SI_IMAGE_PNG'))
|
92 |
-
define('SI_IMAGE_PNG', 2);
|
93 |
-
/**
|
94 |
-
* Output images in GIF format (not recommended)
|
95 |
-
* Must have GD >= 2.0.28!
|
96 |
-
*/
|
97 |
-
if (!defined('SI_IMAGE_GIF'))
|
98 |
-
define('SI_IMAGE_GIF', 3);
|
99 |
|
100 |
/**
|
101 |
* Securimage CAPTCHA Class.
|
102 |
*
|
|
|
103 |
* @package Securimage
|
104 |
* @subpackage classes
|
|
|
105 |
*
|
106 |
*/
|
107 |
-
class Securimage
|
108 |
-
|
109 |
-
|
110 |
-
|
111 |
-
|
112 |
-
|
113 |
-
|
114 |
-
|
115 |
-
|
116 |
-
|
117 |
-
|
118 |
-
|