Suivi — Dépêches Corruption de dépêches et URL avec des caractères non ascii

#2003 Posté par  (site Web personnel) . État de l’entrée : ouverte. Licence CC By‑SA.
Étiquettes : aucune
1
30
mai
2021

Nouvelle dépêche avec un lien type http://localhost/ééé
-> HTTP 500

FATAL -- : [xxx] URI::InvalidURIError (URI must be ascii only "http://localhost/\u{e9}\u{e9}\u{e9}"):

Il y a pire, si on réorganise la dépêche et que l'on insère un lien invalide -> HTTP 500 + perte du format markdown (l'entrée news_versions est conservée, les entrées paragraphs sont perdues).

  • # Validation des liens et bookmarks

    Posté par  (site Web personnel) . Évalué à 2 (+0/-0).

    Hello,

    J'ai ajouté la validation des liens HTTP dans ce Pull Request: https://github.com/linuxfrorg/linuxfr.org/pull/309

    Avant, on n'affichait aucune des erreurs de validation, j'ai ajouté les messages d'erreurs dans ces cas. J'ai dû mettre à jour un peu le rendu des liens en édition dans l'espace de rédaction:

    Liens en édition dans l'espace de rédaction

    J'ai ajouté un cadre autour du formulaire, pour bien montrer à l'utilisateur que tous ces boutons sont liés.

    Dans le lien "en édition", j'ai profité d'expliquer que le lien peut être supprimé en vidant le champ Adresse.

    Quand plusieurs erreurs existent, une liste à puce est affichée. Si le lien est en modification, les puces sont les drapeaux de langue. Je n'ai pas corrigé ça, parce qu'on a déjà un Pull Request pour enlever les drapeaux de langue dans les liens.

    • [^] # Re: Validation des liens et bookmarks

      Posté par  (site Web personnel) . Évalué à 3 (+0/-0).

      Contexte :
      - étape 1 : j'essayais de compléter les infos pour https://linuxfr.org/suivi/gerer-les-vieux-contenus-en-html-et-non-en-markdown .
      - étape 2 : ça m'a conduit à me poser des questions sur les paragraphs et/ou les news_versions qui sont NULL, ainsi que sur des paragraphs.wiki_body qui sont NULL
      - étape 3 : en essayant de comprendre ça, j'ai explosé une dépêche en tombant sur ce bug
      - étape 4 : j'ai ouvert le bug
      - étape 5 : j'ai constaté qu'on avait quelques centaines de liens problématiques… j'ai commencé à nettoyer
      - … à un moment je dépilerai…

      • [^] # Re: Validation des liens et bookmarks

        Posté par  (site Web personnel) . Évalué à 2 (+0/-0).

        Pour la réorganisation, on a, dans le modèle de news, le code:

          def reorganize(params)
            Paragraph.where(news_id: self.id).delete_all
            self.attributes = params
            create_parts
            save
            unlock
          end

        On voit bien que la première étape est de supprimer tous les paragraphes.

        La ligne create_parts va recréer tous les paragraphes de la première et de la seconde partie.

        L'appel à create_new_version est définit pour s'exécuter après le save (after_save).

        Il faut savoir que, si un lien est invalide, le modèle link lève une exception sans gestion d'erreur et donc fait arrêter nette la procédure.

        Ce que je ne sais pas, c'est si le modèle de link est appelé au moment de faire self.attributes = params ou au moment de faire save.

        En plus, je ne sais pas si Rails fait des transactions dans MySQL, donc c'est un peu compliqué à expliquer ce qui se passe juste en regardant le code. Il faudrait que je reproduise aussi pour mieux analyser.

        Mais en tout cas, s'il n'y a pas de transaction SQL, la news serait effectivement dans un mauvais état: les paragraphes ont été détruits et les nouveaux body/wiki_body n'ont pas été sauvés.

        Mon Pull Request fait en sorte que le modèle link ne lève plus une exception brute, mais remonte une erreur de validtion. Au moins, ça n'arrête plus le processus d'un coup, mais ça perturbe uniquement les modifications sur les liens.

        • [^] # Re: Validation des liens et bookmarks

          Posté par  (site Web personnel) . Évalué à 2 (+0/-0).

          Ce que je ne sais pas, c'est si le modèle de link est appelé au moment de faire self.attributes = params ou au moment de faire save.

          Je viens de reproduire, c'est sur la ligne self.attributes = params que ça se déclenche.

          Voilà le déroulement dans le log et, malheureusement, il n'y a pas de transaction sql :(

          linuxfr.org_1    | Started PUT "/redaction/news/voici-venu-le-temps-des-cathedrales-libres/reorganized" for 172.18.0.8 at 2021-05-31 20:40:47 +0000
          linuxfr.org_1    | Cannot render console from 172.18.0.1! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255
          linuxfr.org_1    | Processing by Redaction::NewsController#reorganized as HTML
          linuxfr.org_1    |   Parameters: {"utf8"=>"✓", "authenticity_token"=>"kyLbHIusFEDZj_GEvZ1sLB_TOSzrTEwdGZ8Qhsy_QZaIlVR0WSyffU4MgkyUtaC2ILXnG_5KThMFKUrWu6mgug", "news"=>{"section_id"=>"1", "title"=>"Voici venu le temps des cathédrales libres test", "wiki_body"=>"test chapeau :)\r\n\r\ntest\r\nt\r\n\r\n\r\ntest2222", "links_attributes"=>{"0"=>{"title"=>"http://localhost", "url"=>"http://localhost", "lang"=>"fr", "id"=>"9"}, "1"=>{"title"=>"http://localhost", "url"=>"http://localhost/ééééééééééééé", "lang"=>"fr", "id"=>"10"}, "2"=>{"title"=>"http://localhost", "url"=>"http://localhost/ééééééééééééé", "lang"=>"fr", "id"=>"11"}}, "wiki_second_part"=>"Un sommaire sera automatiquement créé si nécessaire. Pensez à l'orthographe et aux liens explicatifs vers Wikipedia. (Vous pouvez éditer ce paragraphe en cliquant sur le crayon !)\r\n\r\ntest\r\n\r\n\r\nCe paragraphe est chou :) test\r\n\r\n\r\n\r\nVous pouvez éditer ce paragraphe en cliquant sur le crayon ! http://localhost/ééééééé test\r\n\r\n\r\nVous pouvez éditer ce paragraphe en cliquant sur le crayon ! test"}, "commit"=>"OK", "id"=>"voici-venu-le-temps-des-cathedrales-libres"}
          linuxfr.org_1    |   Account Load (0.4ms)  SELECT  `accounts`.* FROM `accounts` WHERE `accounts`.`id` = 4 ORDER BY `accounts`.`id` ASC LIMIT 1
          linuxfr.org_1    |   News Load (0.2ms)  SELECT  `news`.* FROM `news` WHERE `news`.`cached_slug` = 'voici-venu-le-temps-des-cathedrales-libres' LIMIT 1
          linuxfr.org_1    |   Paragraph Destroy (4.3ms)  DELETE FROM `paragraphs` WHERE `paragraphs`.`news_id` = 4
          linuxfr.org_1    |   Link Load (0.6ms)  SELECT `links`.* FROM `links` WHERE `links`.`news_id` = 4 AND `links`.`id` IN (9, 10, 11)
          linuxfr.org_1    | Completed 500 Internal Server Error in 15ms (ActiveRecord: 5.5ms)
          linuxfr.org_1    | 
          linuxfr.org_1    | 
          linuxfr.org_1    |   
          linuxfr.org_1    | URI::InvalidURIError (URI must be ascii only "http://localhost/\u{e9}\u{e9}\u{e9}\u{e9}\u{e9}\u{e9}\u{e9}\u{e9}\u{e9}\u{e9}\u{e9}\u{e9}\u{e9}"):
          linuxfr.org_1    |   
          linuxfr.org_1    | /usr/lib/ruby/2.3.0/uri/rfc3986_parser.rb:21:in `split'
          linuxfr.org_1    | /usr/lib/ruby/2.3.0/uri/rfc3986_parser.rb:73:in `parse'
          linuxfr.org_1    | /usr/lib/ruby/2.3.0/uri/common.rb:227:in `parse'
          linuxfr.org_1    | app/models/link.rb:36:in `url='
          linuxfr.org_1    | activemodel (5.2.5) lib/active_model/attribute_assignment.rb:51:in `public_send'
          linuxfr.org_1    | activemodel (5.2.5) lib/active_model/attribute_assignment.rb:51:in `_assign_attribute'
          linuxfr.org_1    | activemodel (5.2.5) lib/active_model/attribute_assignment.rb:44:in `block in _assign_attributes'
          linuxfr.org_1    | activemodel (5.2.5) lib/active_model/attribute_assignment.rb:43:in `each'
          linuxfr.org_1    | activemodel (5.2.5) lib/active_model/attribute_assignment.rb:43:in `_assign_attributes'
          linuxfr.org_1    | activerecord (5.2.5) lib/active_record/attribute_assignment.rb:23:in `_assign_attributes'
          linuxfr.org_1    | activemodel (5.2.5) lib/active_model/attribute_assignment.rb:35:in `assign_attributes'
          linuxfr.org_1    | activerecord (5.2.5) lib/active_record/nested_attributes.rb:553:in `assign_to_or_mark_for_destruction'
          linuxfr.org_1    | activerecord (5.2.5) lib/active_record/nested_attributes.rb:518:in `block in assign_nested_attributes_for_collection_association'
          linuxfr.org_1    | activerecord (5.2.5) lib/active_record/nested_attributes.rb:496:in `each'
          linuxfr.org_1    | activerecord (5.2.5) lib/active_record/nested_attributes.rb:496:in `assign_nested_attributes_for_collection_association'
          linuxfr.org_1    | activerecord (5.2.5) lib/active_record/nested_attributes.rb:373:in `links_attributes='
          linuxfr.org_1    | activemodel (5.2.5) lib/active_model/attribute_assignment.rb:51:in `public_send'
          linuxfr.org_1    | activemodel (5.2.5) lib/active_model/attribute_assignment.rb:51:in `_assign_attribute'
          linuxfr.org_1    | activerecord (5.2.5) lib/active_record/attribute_assignment.rb:31:in `block in assign_nested_parameter_attributes'
          linuxfr.org_1    | activerecord (5.2.5) lib/active_record/attribute_assignment.rb:31:in `each'
          linuxfr.org_1    | activerecord (5.2.5) lib/active_record/attribute_assignment.rb:31:in `assign_nested_parameter_attributes'
          linuxfr.org_1    | activerecord (5.2.5) lib/active_record/attribute_assignment.rb:25:in `_assign_attributes'
          linuxfr.org_1    | activemodel (5.2.5) lib/active_model/attribute_assignment.rb:35:in `assign_attributes'
          linuxfr.org_1    | app/models/news.rb:264:in `reorganize'
          linuxfr.org_1    | app/controllers/redaction/news_controller.rb:68:in `reorganized'
          linuxfr.org_1    | actionpack (5.2.5) lib/action_controller/metal/basic_implicit_render.rb:6:in `send_action'
          linuxfr.org_1    | actionpack (5.2.5) lib/abstract_controller/base.rb:194:in `process_action'
          linuxfr.org_1    | actionpack (5.2.5) lib/action_controller/metal/rendering.rb:30:in `process_action'
          linuxfr.org_1    | actionpack (5.2.5) lib/abstract_controller/callbacks.rb:42:in `block in process_action'
          linuxfr.org_1    | activesupport (5.2.5) lib/active_support/callbacks.rb:132:in `run_callbacks'
          linuxfr.org_1    | actionpack (5.2.5) lib/abstract_controller/callbacks.rb:41:in `process_action'
          linuxfr.org_1    | actionpack (5.2.5) lib/action_controller/metal/rescue.rb:22:in `process_action'
          linuxfr.org_1    | actionpack (5.2.5) lib/action_controller/metal/instrumentation.rb:34:in `block in process_action'
          linuxfr.org_1    | activesupport (5.2.5) lib/active_support/notifications.rb:168:in `block in instrument'
          linuxfr.org_1    | activesupport (5.2.5) lib/active_support/notifications/instrumenter.rb:23:in `instrument'
          linuxfr.org_1    | activesupport (5.2.5) lib/active_support/notifications.rb:168:in `instrument'
          linuxfr.org_1    | actionpack (5.2.5) lib/action_controller/metal/instrumentation.rb:32:in `process_action'
          linuxfr.org_1    | actionpack (5.2.5) lib/action_controller/metal/params_wrapper.rb:256:in `process_action'
          linuxfr.org_1    | activerecord (5.2.5) lib/active_record/railties/controller_runtime.rb:24:in `process_action'
          linuxfr.org_1    | actionpack (5.2.5) lib/abstract_controller/base.rb:134:in `process'
          linuxfr.org_1    | actionview (5.2.5) lib/action_view/rendering.rb:32:in `process'
          linuxfr.org_1    | actionpack (5.2.5) lib/action_controller/metal.rb:191:in `dispatch'
          linuxfr.org_1    | actionpack (5.2.5) lib/action_controller/metal.rb:252:in `dispatch'
          linuxfr.org_1    | actionpack (5.2.5) lib/action_dispatch/routing/route_set.rb:52:in `dispatch'
          linuxfr.org_1    | actionpack (5.2.5) lib/action_dispatch/routing/route_set.rb:34:in `serve'
          linuxfr.org_1    | actionpack (5.2.5) lib/action_dispatch/journey/router.rb:52:in `block in serve'
          linuxfr.org_1    | actionpack (5.2.5) lib/action_dispatch/journey/router.rb:35:in `each'
          linuxfr.org_1    | actionpack (5.2.5) lib/action_dispatch/journey/router.rb:35:in `serve'
          linuxfr.org_1    | actionpack (5.2.5) lib/action_dispatch/routing/route_set.rb:840:in `call'
          linuxfr.org_1    | warden (1.2.8) lib/warden/manager.rb:36:in `block in call'
          linuxfr.org_1    | warden (1.2.8) lib/warden/manager.rb:34:in `catch'
          linuxfr.org_1    | warden (1.2.8) lib/warden/manager.rb:34:in `call'
          linuxfr.org_1    | rack (2.2.3) lib/rack/tempfile_reaper.rb:15:in `call'
          linuxfr.org_1    | rack (2.2.3) lib/rack/etag.rb:27:in `call'
          linuxfr.org_1    | rack (2.2.3) lib/rack/conditional_get.rb:40:in `call'
          linuxfr.org_1    | rack (2.2.3) lib/rack/head.rb:12:in `call'
          linuxfr.org_1    | actionpack (5.2.5) lib/action_dispatch/http/content_security_policy.rb:18:in `call'
          linuxfr.org_1    | rack (2.2.3) lib/rack/session/abstract/id.rb:266:in `context'
          linuxfr.org_1    | rack (2.2.3) lib/rack/session/abstract/id.rb:260:in `call'
          linuxfr.org_1    | actionpack (5.2.5) lib/action_dispatch/middleware/cookies.rb:670:in `call'
          linuxfr.org_1    | activerecord (5.2.5) lib/active_record/migration.rb:559:in `call'
          linuxfr.org_1    | actionpack (5.2.5) lib/action_dispatch/middleware/callbacks.rb:28:in `block in call'
          linuxfr.org_1    | activesupport (5.2.5) lib/active_support/callbacks.rb:98:in `run_callbacks'
          linuxfr.org_1    | actionpack (5.2.5) lib/action_dispatch/middleware/callbacks.rb:26:in `call'
          linuxfr.org_1    | actionpack (5.2.5) lib/action_dispatch/middleware/executor.rb:14:in `call'
          linuxfr.org_1    | better_errors (2.5.0) lib/better_errors/middleware.rb:59:in `call'
          linuxfr.org_1    | actionpack (5.2.5) lib/action_dispatch/middleware/debug_exceptions.rb:61:in `call'
          linuxfr.org_1    | web-console (3.6.2) lib/web_console/middleware.rb:135:in `call_app'
          linuxfr.org_1    | web-console (3.6.2) lib/web_console/middleware.rb:22:in `block in call'
          linuxfr.org_1    | web-console (3.6.2) lib/web_console/middleware.rb:20:in `catch'
          linuxfr.org_1    | web-console (3.6.2) lib/web_console/middleware.rb:20:in `call'
          linuxfr.org_1    | actionpack (5.2.5) lib/action_dispatch/middleware/show_exceptions.rb:33:in `call'
          linuxfr.org_1    | railties (5.2.5) lib/rails/rack/logger.rb:38:in `call_app'
          linuxfr.org_1    | railties (5.2.5) lib/rails/rack/logger.rb:26:in `block in call'
          linuxfr.org_1    | activesupport (5.2.5) lib/active_support/tagged_logging.rb:71:in `block in tagged'
          linuxfr.org_1    | activesupport (5.2.5) lib/active_support/tagged_logging.rb:28:in `tagged'
          linuxfr.org_1    | activesupport (5.2.5) lib/active_support/tagged_logging.rb:71:in `tagged'
          linuxfr.org_1    | railties (5.2.5) lib/rails/rack/logger.rb:26:in `call'
          linuxfr.org_1    | sprockets-rails (3.2.2) lib/sprockets/rails/quiet_assets.rb:13:in `call'
          linuxfr.org_1    | actionpack (5.2.5) lib/action_dispatch/middleware/remote_ip.rb:81:in `call'
          linuxfr.org_1    | actionpack (5.2.5) lib/action_dispatch/middleware/request_id.rb:27:in `call'
          linuxfr.org_1    | rack (2.2.3) lib/rack/method_override.rb:24:in `call'
          linuxfr.org_1    | rack (2.2.3) lib/rack/runtime.rb:22:in `call'
          linuxfr.org_1    | activesupport (5.2.5) lib/active_support/cache/strategy/local_cache_middleware.rb:29:in `call'
          linuxfr.org_1    | actionpack (5.2.5) lib/action_dispatch/middleware/executor.rb:14:in `call'
          linuxfr.org_1    | actionpack (5.2.5) lib/action_dispatch/middleware/static.rb:127:in `call'
          linuxfr.org_1    | rack (2.2.3) lib/rack/sendfile.rb:110:in `call'
          linuxfr.org_1    | railties (5.2.5) lib/rails/engine.rb:524:in `call'
          linuxfr.org_1    | thin (1.7.2) lib/thin/connection.rb:86:in `block in pre_process'
          linuxfr.org_1    | thin (1.7.2) lib/thin/connection.rb:84:in `catch'
          linuxfr.org_1    | thin (1.7.2) lib/thin/connection.rb:84:in `pre_process'
          linuxfr.org_1    | thin (1.7.2) lib/thin/connection.rb:53:in `process'
          linuxfr.org_1    | thin (1.7.2) lib/thin/connection.rb:39:in `receive_data'
          linuxfr.org_1    | eventmachine (1.2.7) lib/eventmachine.rb:195:in `run_machine'
          linuxfr.org_1    | eventmachine (1.2.7) lib/eventmachine.rb:195:in `run'
          linuxfr.org_1    | thin (1.7.2) lib/thin/backends/base.rb:73:in `start'
          linuxfr.org_1    | thin (1.7.2) lib/thin/server.rb:162:in `start'
          linuxfr.org_1    | rack (2.2.3) lib/rack/handler/thin.rb:22:in `run'
          linuxfr.org_1    | rack (2.2.3) lib/rack/server.rb:327:in `start'
          linuxfr.org_1    | railties (5.2.5) lib/rails/commands/server/server_command.rb:53:in `start'
          linuxfr.org_1    | railties (5.2.5) lib/rails/commands/server/server_command.rb:147:in `block in perform'
          linuxfr.org_1    | railties (5.2.5) lib/rails/commands/server/server_command.rb:142:in `tap'
          linuxfr.org_1    | railties (5.2.5) lib/rails/commands/server/server_command.rb:142:in `perform'
          linuxfr.org_1    | thor (1.0.1) lib/thor/command.rb:27:in `run'
          linuxfr.org_1    | thor (1.0.1) lib/thor/invocation.rb:127:in `invoke_command'
          linuxfr.org_1    | thor (1.0.1) lib/thor.rb:392:in `dispatch'
          linuxfr.org_1    | railties (5.2.5) lib/rails/command/base.rb:69:in `perform'
          linuxfr.org_1    | railties (5.2.5) lib/rails/command.rb:46:in `invoke'
          linuxfr.org_1    | railties (5.2.5) lib/rails/commands.rb:18:in `<main>'
          linuxfr.org_1    | bootsnap (1.4.6) lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:23:in `require'
          linuxfr.org_1    | bootsnap (1.4.6) lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:23:in `block in require_with_bootsnap_lfi'
          linuxfr.org_1    | bootsnap (1.4.6) lib/bootsnap/load_path_cache/loaded_features_index.rb:92:in `register'
          linuxfr.org_1    | bootsnap (1.4.6) lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:22:in `require_with_bootsnap_lfi'
          linuxfr.org_1    | bootsnap (1.4.6) lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:31:in `require'
          linuxfr.org_1    | activesupport (5.2.5) lib/active_support/dependencies.rb:291:in `block in require'
          linuxfr.org_1    | activesupport (5.2.5) lib/active_support/dependencies.rb:257:in `load_dependency'
          linuxfr.org_1    | activesupport (5.2.5) lib/active_support/dependencies.rb:291:in `require'
          linuxfr.org_1    | bin/rails:4:in `<main>'
          nginx_1          | 172.18.0.1 - - [31/May/2021:20:40:47 +0000] "POST /redaction/news/voici-venu-le-temps-des-cathedrales-libres/reorganized HTTP/1.1" 500 143305 "http://dlfp.lo/redaction/news/voici-venu-le-temps-des-cathedrales-libres/reorganize" "Mozilla/5.0 (X11; Linux x86_64; rv:88.0) Gecko/20100101 Firefox/88.0" "-"
          
          • [^] # Re: Validation des liens et bookmarks

            Posté par  (site Web personnel) . Évalué à 2 (+0/-0).

            J'ai ajouté une transaction SQL manuellement pour la réorganisation, parce que c'est une opération complexe et que ce genre de bug ne devrait pas mettre dans un tel état une dépêche.

            • [^] # Re: Validation des liens et bookmarks

              Posté par  (site Web personnel) . Évalué à 2 (+0/-0).

              Mince, visiblement, ça ne suffit pas.

              Avec le Pull Request, si je fais une réorganisation avec un lien invalide: il n'y a plus d'exception levée, mais le save ne passe pas et, du coup, il n'y a pas de nouvelle version crée.

              Par contre, le résultat est que la news est bien complètement sauvée (les paragraphes sont bien présents).

              Les logs pour info:

              linuxfr.org_1    | Started PUT "/redaction/news/voici-venu-le-temps-des-cathedrales-libres/reorganized" for 172.18.0.8 at 2021-05-31 21:12:35 +0000
              linuxfr.org_1    | Cannot render console from 172.18.0.1! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255
              linuxfr.org_1    | Processing by Redaction::NewsController#reorganized as HTML
              linuxfr.org_1    |   Parameters: {"utf8"=>"✓", "authenticity_token"=>"6rSwmgRGKjCj0-SWOLShHi7bJqCxOYIsP25mJAIcrq7xAz_y1sahDTRQl14RnG2EEb34l6Q_gCIj2Dx0dQpPgg", "news"=>{"section_id"=>"1", "title"=>"Voici venu le temps des cathédrales libres", "wiki_body"=>"test chapeau :)\r\n\r\n\r\n\r\ntest\r\nt\r\n\r\n\r\n\r\ntest2222", "links_attributes"=>{"0"=>{"title"=>"http://localhost", "url"=>"http://localhost", "lang"=>"fr", "id"=>"9"}, "1"=>{"title"=>"http://localhost", "url"=>"http://localhost/asdfjkl", "lang"=>"fr", "id"=>"10"}, "2"=>{"title"=>"http://localhost", "url"=>"http://localhost/éééééé", "lang"=>"fr", "id"=>"11"}}, "wiki_second_part"=>"Un sommaire sera automatiquement créé si nécessaire. Pensez à l'orthographe et aux liens explicatifs vers Wikipedia. (Vous pouvez éditer ce paragraphe en cliquant sur le crayon !)\r\n\r\n\r\n\r\ntest\r\n\r\n\r\n\r\nCe paragraphe est chou :) test\r\n\r\n\r\n\r\nVous pouvez éditer ce paragraphe en cliquant sur le crayon ! http://localhost/ééééééé test\r\n\r\n\r\n\r\nVous pouvez éditer ce paragraphe en cliquant sur le crayon ! test\r\n\r\naésldkjfaséldkjf"}, "commit"=>"OK", "id"=>"voici-venu-le-temps-des-cathedrales-libres"}
              linuxfr.org_1    |   Account Load (0.3ms)  SELECT  `accounts`.* FROM `accounts` WHERE `accounts`.`id` = 4 ORDER BY `accounts`.`id` ASC LIMIT 1
              nginx_1          | 172.18.0.1 - - [31/May/2021:21:12:36 +0000] "POST /redaction/news/voici-venu-le-temps-des-cathedrales-libres/reorganized HTTP/1.1" 302 149 "http://dlfp.lo/redaction/news/voici-venu-le-temps-des-cathedrales-libres/reorganize" "Mozilla/5.0 (X11; Linux x86_64; rv:88.0) Gecko/20100101 Firefox/88.0" "-"
              linuxfr.org_1    |   News Load (0.2ms)  SELECT  `news`.* FROM `news` WHERE `news`.`cached_slug` = 'voici-venu-le-temps-des-cathedrales-libres' LIMIT 1
              linuxfr.org_1    |    (0.2ms)  BEGIN
              linuxfr.org_1    |   Paragraph Destroy (0.7ms)  DELETE FROM `paragraphs` WHERE `paragraphs`.`news_id` = 4
              linuxfr.org_1    |   Link Load (0.3ms)  SELECT `links`.* FROM `links` WHERE `links`.`news_id` = 4 AND `links`.`id` IN (9, 10, 11)
              linuxfr.org_1    |   Paragraph Load (0.5ms)  SELECT  `paragraphs`.* FROM `paragraphs` WHERE `paragraphs`.`news_id` = 4 AND (`paragraphs`.`position` IS NOT NULL) ORDER BY `paragraphs`.`position` DESC LIMIT 1
              linuxfr.org_1    |   Paragraph Create (0.3ms)  INSERT INTO `paragraphs` (`news_id`, `position`, `second_part`, `body`, `wiki_body`) VALUES (4, 1, FALSE, '<p>test chapeau :)</p>\n', 'test chapeau :)\r\n\r\n')
              linuxfr.org_1    |   Paragraph Load (0.6ms)  SELECT  `paragraphs`.* FROM `paragraphs` WHERE `paragraphs`.`news_id` = 4 AND (`paragraphs`.`position` IS NOT NULL) ORDER BY `paragraphs`.`position` DESC LIMIT 1
              linuxfr.org_1    |   Paragraph Create (0.4ms)  INSERT INTO `paragraphs` (`news_id`, `position`, `second_part`, `body`, `wiki_body`) VALUES (4, 2, FALSE, '<p>test<br>\nt</p>\n', 'test\r\nt\r\n\r\n')
              linuxfr.org_1    |   Paragraph Load (0.6ms)  SELECT  `paragraphs`.* FROM `paragraphs` WHERE `paragraphs`.`news_id` = 4 AND (`paragraphs`.`position` IS NOT NULL) ORDER BY `paragraphs`.`position` DESC LIMIT 1
              linuxfr.org_1    |   Paragraph Create (0.3ms)  INSERT INTO `paragraphs` (`news_id`, `position`, `second_part`, `body`, `wiki_body`) VALUES (4, 3, FALSE, '<p>test2222</p>\n', 'test2222')
              linuxfr.org_1    |   Paragraph Load (0.7ms)  SELECT  `paragraphs`.* FROM `paragraphs` WHERE `paragraphs`.`news_id` = 4 AND (`paragraphs`.`position` IS NOT NULL) ORDER BY `paragraphs`.`position` DESC LIMIT 1
              linuxfr.org_1    |   Paragraph Create (0.7ms)  INSERT INTO `paragraphs` (`news_id`, `position`, `second_part`, `body`, `wiki_body`) VALUES (4, 4, TRUE, '<p>Un sommaire sera automatiquement créé si nécessaire. Pensez à l\'orthographe et aux liens explicatifs vers Wikipedia. (Vous pouvez éditer ce paragraphe en cliquant sur le crayon !)</p>\n', 'Un sommaire sera automatiquement créé si nécessaire. Pensez à l\'orthographe et aux liens explicatifs vers Wikipedia. (Vous pouvez éditer ce paragraphe en cliquant sur le crayon !)\r\n\r\n')
              linuxfr.org_1    |   Paragraph Load (0.6ms)  SELECT  `paragraphs`.* FROM `paragraphs` WHERE `paragraphs`.`news_id` = 4 AND (`paragraphs`.`position` IS NOT NULL) ORDER BY `paragraphs`.`position` DESC LIMIT 1
              linuxfr.org_1    |   Paragraph Create (0.3ms)  INSERT INTO `paragraphs` (`news_id`, `position`, `second_part`, `body`, `wiki_body`) VALUES (4, 5, TRUE, '<p>test</p>\n', 'test\r\n\r\n')
              linuxfr.org_1    |   Paragraph Load (1.0ms)  SELECT  `paragraphs`.* FROM `paragraphs` WHERE `paragraphs`.`news_id` = 4 AND (`paragraphs`.`position` IS NOT NULL) ORDER BY `paragraphs`.`position` DESC LIMIT 1
              linuxfr.org_1    |   Paragraph Create (0.4ms)  INSERT INTO `paragraphs` (`news_id`, `position`, `second_part`, `body`, `wiki_body`) VALUES (4, 6, TRUE, '<p>Ce paragraphe est chou :) test</p>\n', 'Ce paragraphe est chou :) test\r\n\r\n')
              linuxfr.org_1    |   Paragraph Load (0.6ms)  SELECT  `paragraphs`.* FROM `paragraphs` WHERE `paragraphs`.`news_id` = 4 AND (`paragraphs`.`position` IS NOT NULL) ORDER BY `paragraphs`.`position` DESC LIMIT 1
              linuxfr.org_1    |   Paragraph Create (0.7ms)  INSERT INTO `paragraphs` (`news_id`, `position`, `second_part`, `body`, `wiki_body`) VALUES (4, 7, TRUE, '<p>Vous pouvez éditer ce paragraphe en cliquant sur le crayon ! <a href=\"http://localhost/%C3%A9%C3%A9%C3%A9%C3%A9%C3%A9%C3%A9%C3%A9\">http://localhost/ééééééé</a> test</p>\n', 'Vous pouvez éditer ce paragraphe en cliquant sur le crayon ! http://localhost/ééééééé test\r\n\r\n')
              linuxfr.org_1    |   Paragraph Load (0.6ms)  SELECT  `paragraphs`.* FROM `paragraphs` WHERE `paragraphs`.`news_id` = 4 AND (`paragraphs`.`position` IS NOT NULL) ORDER BY `paragraphs`.`position` DESC LIMIT 1
              linuxfr.org_1    |   Paragraph Create (0.3ms)  INSERT INTO `paragraphs` (`news_id`, `position`, `second_part`, `body`, `wiki_body`) VALUES (4, 8, TRUE, '<p>Vous pouvez éditer ce paragraphe en cliquant sur le crayon ! test</p>\n', 'Vous pouvez éditer ce paragraphe en cliquant sur le crayon ! test\r\n')
              linuxfr.org_1    |   Paragraph Load (0.6ms)  SELECT  `paragraphs`.* FROM `paragraphs` WHERE `paragraphs`.`news_id` = 4 AND (`paragraphs`.`position` IS NOT NULL) ORDER BY `paragraphs`.`position` DESC LIMIT 1
              linuxfr.org_1    |   Paragraph Create (0.5ms)  INSERT INTO `paragraphs` (`news_id`, `position`, `second_part`, `body`, `wiki_body`) VALUES (4, 9, TRUE, '<p>aésldkjfaséldkjf</p>\n', 'aésldkjfaséldkjf')
              linuxfr.org_1    |   Link Load (0.4ms)  SELECT `links`.* FROM `links` WHERE `links`.`news_id` = 4
              linuxfr.org_1    |   Paragraph Load (0.5ms)  SELECT `paragraphs`.* FROM `paragraphs` WHERE `paragraphs`.`news_id` = 4 AND `paragraphs`.`second_part` = FALSE ORDER BY `paragraphs`.`position` ASC
              linuxfr.org_1    |   Paragraph Load (0.4ms)  SELECT `paragraphs`.* FROM `paragraphs` WHERE `paragraphs`.`news_id` = 4 AND `paragraphs`.`second_part` = TRUE ORDER BY `paragraphs`.`position` ASC
              linuxfr.org_1    |   Section Load (0.5ms)  SELECT  `sections`.* FROM `sections` WHERE `sections`.`id` = 1 LIMIT 1
              linuxfr.org_1    |    (1.8ms)  COMMIT
              
              

              On voit bien que je n'ai plus d'exception, car j'ai le COMMIT SQL qui est exécuté.

              Mais aucun lien n'a été mis à jour (sûrement à cause du validator d'url) et aucune version n'a été crée.

              • [^] # Re: Validation des liens et bookmarks

                Posté par  (site Web personnel) . Évalué à 3 (+1/-0).

                Voilà, j'ai ajouté des commits pour avoir un comportement acceptable:

                Si la transaction SQL a échoué ou s'il y a une erreur de validation, la méthode reorganize du modèle retourne false (sinon, elle retourne true).

                Dans le cas d'un false, le contrôleur demande de réafficher la page de réorganisation avec les erreurs de validations.

      • [^] # Re: Validation des liens et bookmarks

        Posté par  (site Web personnel) . Évalué à 3 (+0/-0).

        • étape 5 : j'ai constaté qu'on avait quelques centaines de liens problématiques… j'ai commencé à nettoyer

        a priori j'ai nettoyé cette partie là. ça devrait potentiellement se voir aussi sur la validité des pages HTML concernées.

Envoyer un commentaire

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n’en sommes pas responsables.