The Higher Education and Research forge

Home My Page Projects Code Snippets Project Openings MonLabo
Summary Activity Tracker Tasks Docs SCM Files Dokuwiki Continious Integration Listes Sympa

SCM Repository

authorHerve Suaudeau <herve@suaudeau.fr>
Mon, 27 Jul 2020 18:49:00 +0000 (20:49 +0200)
committerHerve Suaudeau <herve@suaudeau.fr>
Mon, 27 Jul 2020 18:49:00 +0000 (20:49 +0200)
admin/MonLabo-admin.php
admin/js/MonLabo-admin.js
changelog.txt
readme.txt

index b7e88d2..039efea 100644 (file)
@@ -24,7 +24,8 @@ class MonLabo_admin {
                $this->options['MonLabo_settings_group5']=get_option( 'MonLabo_settings_group5' );
 
                add_action( 'admin_enqueue_scripts', array( &$this, 'MonLabo_enqueue_admin_scripts' ) );
-               add_action( 'wp_ajax_update_member_thumbnail', array( &$this, 'update_member_thumbnail' ) );
+               add_action( 'wp_ajax_update_member_thumbnail', 'update_member_thumbnail' );
+
        }
 
        function MonLabo_enqueue_admin_scripts( $hook_suffix ) {
@@ -39,7 +40,15 @@ class MonLabo_admin {
                                                                                                        ."jQuery( 'input[type=hidden]' ).parents( 'td' ).prev( 'th' ).css( 'padding', '0' );"   );
 
                // in JavaScript, object properties are accessed as ajax_object.ajax_url, ajax_object.we_value
-               wp_localize_script( 'MonLabo_admin-script', 'ajax_object_update_member_thumbnail', array( 'ajax_url' => admin_url( 'admin-ajax.php' ) ) );
+               wp_localize_script(
+                       'MonLabo_admin-script',
+                       'ajax_object_update_member_thumbnail',
+                       array(
+                               'ajax_url' => admin_url( 'admin-ajax.php' ) ,
+                               'nonce' => wp_create_nonce( "nonce_update_member_thumbnail" )
+                       )
+               );
+
                wp_enqueue_media(); //On insère toutes les dépendances nécessaires pour l'affichage du menu média  //Obligatoire sous cette forme pour que le menu media fonctionne en AJAX
        }
 
@@ -438,46 +447,61 @@ class MonLabo_admin {
                //  Si oui: Relancer fonction cron
        }
 
-       //Ajax function to display the thumbnail image of member edition page
-       function update_member_thumbnail() {
-               require_once( dirname( __FILE__ ) . '/includes/inc-lib-forms.php' );
-               $wp_post_id=getPOSTnumber( 'wp_post_id' );
 
-               // Nouveau membre
-               //----------------
-               if ( is_null( $wp_post_id ) ) {
-                       echo '<fieldset> <legend>'.__( 'Choisir une image', 'mon-laboratoire' ).' : </legend>';
-                       //Display default image
-                       echo '<a class="hover-zoom-square60"><img id="image-preview" src="'.$this->options['MonLabo_settings_group2']['MonLabo_img_par_defaut'].'" width="150" height="150" class="wp-image-6 alignright img-arrondi wp-post-image" alt="photo personne" /></a>';
-                       echo( '<input id="upload_image_button" type="button" class="button" value="'. __( 'Changer l\'image par défaut', 'mon-laboratoire' ).'"' );
-                       echo( ' onclick="imageMediaMenu(\''. __( 'Choisir une image', 'mon-laboratoire' ).'\',\''. __( 'utiliser cette image', 'mon-laboratoire' ).'\');" />' );
-
-               // Membre avec page valide
-               //-----------------------
-               } elseif ( $wp_post_id>0 ) {
-                       echo '<fieldset> <legend>'.__( 'Page WordPress choisie', 'mon-laboratoire' )." <small>(<a href='".get_edit_post_link( $wp_post_id )."'>".__( 'éditer la page', 'mon-laboratoire' ).'</a>)</small> : </legend>';
-                       echo '<a class="hover-zoom-square60">';
-                       if ( has_post_thumbnail( $wp_post_id ) ) {
-                               echo get_the_post_thumbnail( $wp_post_id, array( 150, 150 ), array( 'class' => 'alignright img-arrondi',  'id'=>"image-preview" ) );
-                       } else {
-                               //Display default image
-                               echo '<img id="image-preview" src="'.$this->options['MonLabo_settings_group2']['MonLabo_img_par_defaut'].'" width="150" height="150" class="wp-image-6 alignright img-arrondi wp-post-image" alt="silhouette par défaut" />';
-                       }
-                       echo ( '</a>' );
-                       echo( '<input id="upload_image_button" type="button" class="button" value="'. __( "Changer l'image de la page n°", 'mon-laboratoire' ).$wp_post_id.'"' );
-                       echo( ' onclick="imageMediaMenu(\''. __( 'Choisir une image', 'mon-laboratoire' ).'\',\''. __( 'utiliser cette image', 'mon-laboratoire' ).'\');" />' );
+}
 
-               // Membre avec page invalide
-               //--------------------------
+//Ajax function to display the thumbnail image of member edition page
+function update_member_thumbnail() {
+       $response = array();
+       if ( check_ajax_referer( "nonce_update_member_thumbnail" ) ) {
+               $text = generate_update_member_thumbnail();
+               $response['type'] = 'success';
+               $response['text'] = $text;
+               echo( json_encode($response) );
+       }
+       wp_die();
+}
+
+function generate_update_member_thumbnail() {
+       require_once( dirname( __FILE__ ) . '/includes/inc-lib-forms.php' );
+       $wp_post_id=getPOSTnumber( 'wp_post_id' );
+       $options2=get_option( 'MonLabo_settings_group2' );
+
+       $retval = "";
+
+       // Nouveau membre
+       //----------------
+       if ( is_null( $wp_post_id ) ) {
+               $retval .= '<fieldset> <legend>'.__( 'Choisir une image', 'mon-laboratoire' ).' : </legend>';
+               //Display default image
+               $retval .= '<a class="hover-zoom-square60"><img id="image-preview" src="'.$options2['MonLabo_img_par_defaut'].'" width="150" height="150" class="wp-image-6 alignright img-arrondi wp-post-image" alt="photo personne" /></a>';
+               $retval .= '<input id="upload_image_button" type="button" class="button" value="'. __( 'Changer l\'image par défaut', 'mon-laboratoire' ).'"' ;
+               $retval .= ' onclick="imageMediaMenu(\''. __( 'Choisir une image', 'mon-laboratoire' ).'\',\''. __( 'utiliser cette image', 'mon-laboratoire' ).'\');" />' ;
+
+       // Membre avec page valide
+       //-----------------------
+       } elseif ( $wp_post_id>0 ) {
+               $retval .= '<fieldset> <legend>'.__( 'Page WordPress choisie', 'mon-laboratoire' )." <small>(<a href='".get_edit_post_link( $wp_post_id )."'>".__( 'éditer la page', 'mon-laboratoire' ).'</a>)</small> : </legend>';
+               $retval .= '<a class="hover-zoom-square60">';
+               if ( has_post_thumbnail( $wp_post_id ) ) {
+                       $retval .= get_the_post_thumbnail( $wp_post_id, array( 150, 150 ), array( 'class' => 'alignright img-arrondi',  'id'=>"image-preview" ) );
                } else {
-                       echo '<fieldset> <legend>'.__( 'Choisissez une page WordPress pour pouvoir avoir une image.', 'mon-laboratoire' ).'</legend>';
+                       //Display default image
+                       $retval .= '<img id="image-preview" src="'.$options2['MonLabo_img_par_defaut'].'" width="150" height="150" class="wp-image-6 alignright img-arrondi wp-post-image" alt="silhouette par défaut" />';
                }
-               echo( "<input type='hidden' name='submit_image_attachment_url' id='image_attachment_url' value='__no_change__' />" );
-               echo( "<input type='hidden' name='submit_image_attachment_id' id='image_attachment_id' value='__no_change__' />" );
-               echo '</fieldset>';
-
-               wp_die();
-       }
+               $retval .=  '</a>' ;
+               $retval .= '<input id="upload_image_button" type="button" class="button" value="'. __( "Changer l'image de la page n°", 'mon-laboratoire' ).$wp_post_id.'"' ;
+               $retval .= ' onclick="imageMediaMenu(\''. __( 'Choisir une image', 'mon-laboratoire' ).'\',\''. __( 'utiliser cette image', 'mon-laboratoire' ).'\');" />' ;
+
+       // Membre avec page invalide
+       //--------------------------
+       } else {
+               $retval .= '<fieldset> <legend>'.__( 'Choisissez une page WordPress pour pouvoir avoir une image.', 'mon-laboratoire' ).'</legend>';
+       }
+       $retval .= "<input type='hidden' name='submit_image_attachment_url' id='image_attachment_url' value='__no_change__' />" ;
+       $retval .= "<input type='hidden' name='submit_image_attachment_id' id='image_attachment_id' value='__no_change__' />" ;
+       $retval .= '</fieldset>';
+       return $retval;
 }
 
 function MonLabo_admin_edit_members_and_groups_render() {
index 5a78f9f..f43953e 100644 (file)
@@ -87,18 +87,27 @@ function touchPersonFunction() {
  * @since 2.1.0 with name ajax_load_post_thumbnail_now
  * @since 2.8.0 renamed ajaxLoadPostThumbnailNow
  */
-function ajaxLoadPostThumbnailNow() {
+
+function ajaxLoadPostThumbnailNow(  ) {
        if ( jQuery( '#delayedLoadDivThumbnail' ).length ) {
-               var data = {
-                       'action': 'update_member_thumbnail',
-                       'wp_post_id': jQuery( "select[name='submit_wp_post_id']" ).val()
-               };
-
-               // We can also pass the url value separately from ajaxurl for front end AJAX implementations
-               jQuery.post( ajax_object_update_member_thumbnail.ajax_url, data, function( response ) {
-                       jQuery( '#delayedLoadDivThumbnail' ).hide();
-                       jQuery( '#delayedLoadDivThumbnail' ).html( response );
-                       jQuery( '#delayedLoadDivThumbnail' ).fadeIn( 500 );
+               jQuery.ajax({
+                       type : 'post',
+                       dataType : 'json',
+                       url : ajax_object_update_member_thumbnail.ajax_url,
+                       data : {
+                               action: 'update_member_thumbnail',
+                               _ajax_nonce: ajax_object_update_member_thumbnail.nonce,
+                               'wp_post_id': jQuery( "select[name='submit_wp_post_id']" ).val(),
+                       },
+                       success: function( response ) {
+                               console.log(response);
+                               if( 'success' == response.type ) {
+                                       jQuery( '#delayedLoadDivThumbnail' ).hide();
+                                       jQuery( '#delayedLoadDivThumbnail' ).html( response.text );
+                                       jQuery( '#delayedLoadDivThumbnail' ).fadeIn( 500 );
+                               }
+                               //else {        console.log(response);  }
+                       },
                });
        }
 }
index 13c29d7..bef1410 100644 (file)
@@ -2,7 +2,6 @@ Voici un fichier avec les TODO et les changelog complets.
 
 == TODO ==
 * EVOL: Proposer des templates de mise en forme.
-* CODE: Ajouter des nonce dans les formulaires ajax
 * EVOL : Renforcer l'obfuscation des emails https://www.olybop.fr/comment-proteger-et-afficher-son-email-et-telephone-sur-son-site-internet/
 * EVOL: (suggestion utilisateur) traiter les requêtes https://hal.archives-ouvertes.fr/IRT-SYSTEMX/search/?qa[localReference_t][]=SVA
     ==> Demande en cours à haltools pour utiliser leur interface en ce sens
@@ -51,7 +50,6 @@ Voici un fichier avec les TODO et les changelog complets.
     * installer JSHINT https://make.wordpress.org/core/handbook/best-practices/coding-standards/javascript/#jshint
     * Plugins should follow the Accessibility Handbook https://make.wordpress.org/accessibility/handbook/
         * https://make.wordpress.org/core/handbook/best-practices/coding-standards/accessibility-coding-standards/
-    * test avec PHP 5.2.3
     * DONE : Vérifier chaque data in ou out https://codex.wordpress.org/Data_Validation
         * sécuriser \$_(POST|GET|REQUEST) sanitize, validate, and escape all POST/GET/REQUEST
             * Using stripslashes or strip_tags is rarely enough. The ultimate goal is that invalid and unsafe data is never processed, saved, or displayed. Clean everything, check everything, escape everything, and never trust the users to always have input sane data.
@@ -79,6 +77,10 @@ Remember, check_admin_referer alone is not bulletproof security. Do not rely on
 
 
 == Changelog ==
+
+= 3.1 =
+* CODE : Secure ajax code with a nonce
+
 = 3.0.4 =
 (GIT tag v3.0.4)
 * BUG : Bad PHP warning of function error_MonLabo_perso_page_parent()
index 849d046..57526eb 100644 (file)
@@ -39,6 +39,8 @@ Answer: By default you have to use HAL which is opened to all french-speaking sc
 == Changelog ==
 
 You can consult complete changelogs in file changelog.txt
+= 3.1 =
+* CODE : Secure ajax code with a nonce
 
 = 3.0.4 =
 * BUG : Bad PHP warning of function error_MonLabo_perso_page_parent()