From a332b32d272906b4ef3867cd75b8552a35252743 Mon Sep 17 00:00:00 2001 From: Bilel Kihal <61744974+Bilelkihal@users.noreply.github.com> Date: Fri, 21 Jun 2024 13:27:30 +0200 Subject: [PATCH] Fix: Redirect to the login page when accessing private ontology while being not authenticated (#673) --- app/assets/stylesheets/login.scss | 2 +- app/assets/stylesheets/ontologies.scss | 2 +- app/controllers/ontologies_controller.rb | 12 +- app/helpers/ontologies_helper.rb | 4 + .../controllers/content_finder_controller.js | 105 ------------------ .../controllers/label_ajax_controller.js | 2 +- .../mappings_visualization_controller.js | 2 +- app/views/instances/_details.html.haml | 2 +- app/views/login/index.html.haml | 9 +- config/environment.rb | 3 +- config/locales/en.yml | 2 +- config/locales/fr.yml | 2 +- 12 files changed, 26 insertions(+), 121 deletions(-) delete mode 100644 app/javascript/controllers/content_finder_controller.js diff --git a/app/assets/stylesheets/login.scss b/app/assets/stylesheets/login.scss index f832c6ed0..f77d8a6b7 100644 --- a/app/assets/stylesheets/login.scss +++ b/app/assets/stylesheets/login.scss @@ -1,5 +1,5 @@ .login-form{ - margin-top: 30px; + margin-top: 10px; padding: 37px 41px; box-shadow: rgba(0, 0, 0, 0.08) 0px 20px 50px; border-radius: 14px; diff --git a/app/assets/stylesheets/ontologies.scss b/app/assets/stylesheets/ontologies.scss index 223aeda8f..ccaf70d31 100644 --- a/app/assets/stylesheets/ontologies.scss +++ b/app/assets/stylesheets/ontologies.scss @@ -195,7 +195,7 @@ $widget-table-border-color: #EFEFEF; #bd_content .sidebar { overflow-x: auto; white-space: nowrap; - min-width: 35%; + min-width: 29%; } #search_box:focus { diff --git a/app/controllers/ontologies_controller.rb b/app/controllers/ontologies_controller.rb index 606fb3c64..621f1247f 100644 --- a/app/controllers/ontologies_controller.rb +++ b/app/controllers/ontologies_controller.rb @@ -238,10 +238,16 @@ def show return end - - # Note: find_by_acronym includes ontology views @ontology = LinkedData::Client::Models::Ontology.find_by_acronym(params[:ontology]).first - ontology_not_found(params[:ontology]) if @ontology.nil? || @ontology.errors + + if @ontology.nil? || @ontology.errors + if ontology_access_denied? + redirect_to "/login?redirect=/ontologies/#{params[:ontology]}", alert: t('login.private_ontology') + return + else + ontology_not_found(params[:ontology]) + end + end # Handle the case where an ontology is converted to summary only. # See: https://github.com/ncbo/bioportal_web_ui/issues/133. diff --git a/app/helpers/ontologies_helper.rb b/app/helpers/ontologies_helper.rb index 46c5d3a4f..b4ba500f0 100644 --- a/app/helpers/ontologies_helper.rb +++ b/app/helpers/ontologies_helper.rb @@ -5,6 +5,10 @@ module OntologiesHelper API_KEY = $API_KEY LANGUAGE_FILTERABLE_SECTIONS = %w[classes schemes collections instances properties].freeze + def ontology_access_denied? + @ontology&.errors&.include?('Access denied for this resource') + end + def concept_search_input(placeholder) content_tag(:div, class: 'search-inputs p-1') do text_input(placeholder: placeholder, label: '', name: "search", value: '', data: { action: "input->browse-filters#dispatchInputEvent" }) diff --git a/app/javascript/controllers/content_finder_controller.js b/app/javascript/controllers/content_finder_controller.js deleted file mode 100644 index 177b7d070..000000000 --- a/app/javascript/controllers/content_finder_controller.js +++ /dev/null @@ -1,105 +0,0 @@ -import { Controller } from '@hotwired/stimulus' -import * as jsonld from 'jsonld' -import hljs from 'highlight.js/lib/core' -import xml from 'highlight.js/lib/languages/xml' -import json from 'highlight.js/lib/languages/json' - -export default class extends Controller { - static targets = ["content"] - static values = { - format: String - } - connect() { - switch (this.formatValue) { - case 'json': - hljs.registerLanguage('json', json) - this.showJSON() - break - case 'xml': - hljs.registerLanguage('xml', xml) - this.showXML() - break - case 'ntriples': - hljs.registerLanguage('ntriples', function (hljs) { - var URL_PATTERN = /<[^>]+>/; // Regex pattern for matching URLs in angle brackets - return { - case_insensitive: true, - contains: [ - { - className: 'subject', - begin: /^<[^>]+>/, - }, - { - className: 'predicate', - begin: /<[^>]+>/, - }, - { - className: 'object', - begin: /\s([^\s]+)\s\./, - }, - hljs.COMMENT('^#', '$') - ] - }; - }); - this.showNTriples() - break - case 'turtle': - hljs.registerLanguage('turtle', function (hljs) { - var URL_PATTERN = /(?:<[^>]*>)|(?:https?:\/\/[^\s]+)/; - - return { - case_insensitive: true, - contains: [ - { - className: 'custom-prefixes', - begin: '@prefix', - relevance: 10 - }, - { - className: 'meta', - begin: /@base/, - end: /[\r\n]|$/, - relevance: 10 - }, - { - className: 'variable', - begin: /\?[\w\d]+/ - }, - { - className: 'custom-symbol', - begin: /@?[A-Za-z_][A-Za-z0-9_]*(?= *:)/, - relevance: 10 - }, - { - className: 'custom-concepts', - begin: /:\s*(\w+)/, - relevance: 10 - }, - { - className: 'string', - begin: URL_PATTERN - } - ] - }; - }); - this.showTURTLE() - break - } - } - - showJSON() { - this.contentTarget.innerHTML = hljs.highlight(JSON.stringify(JSON.parse(this.contentTarget.textContent), null, " "), { language: 'json' }).value - } - - showXML() { - this.contentTarget.innerHTML = hljs.highlight(this.contentTarget.textContent, { language: 'xml' }).value - } - - showNTriples() { - this.contentTarget.innerHTML = hljs.highlight(this.contentTarget.textContent, { language: 'ntriples' }).value - } - - showTURTLE() { - this.contentTarget.innerHTML = hljs.highlight(this.contentTarget.textContent, { language: 'turtle' }).value - } -} diff --git a/app/javascript/controllers/label_ajax_controller.js b/app/javascript/controllers/label_ajax_controller.js index 539a26aeb..d3cbcfff4 100644 --- a/app/javascript/controllers/label_ajax_controller.js +++ b/app/javascript/controllers/label_ajax_controller.js @@ -33,7 +33,7 @@ export default class extends Controller { success: this.#ajaxSuccess.bind(this), error: this.#ajaxError.bind(this) }); - },0) + },1) } abort() { diff --git a/app/javascript/controllers/mappings_visualization_controller.js b/app/javascript/controllers/mappings_visualization_controller.js index e75813d36..58d74cc60 100644 --- a/app/javascript/controllers/mappings_visualization_controller.js +++ b/app/javascript/controllers/mappings_visualization_controller.js @@ -26,7 +26,7 @@ export default class extends Controller { ontology_name: key.split('/').pop(), ontology_mappings: value, })) - + this.bubblesTarget.innerHTML = '' useMappingsDrawBubbles(data, width, height, margin, this.bubblesTarget, normalization_ratio, logScaleFactor) this.#centerScroll(this.frameTarget) diff --git a/app/views/instances/_details.html.haml b/app/views/instances/_details.html.haml index f1ddcb015..146dcd946 100644 --- a/app/views/instances/_details.html.haml +++ b/app/views/instances/_details.html.haml @@ -6,7 +6,7 @@ = render ConceptDetailsComponent.new(id:'instance-details', acronym: ontology_acronym, concept_id: @instance["@id"]) do |c| - c.header(stripped: true) do |t| - - t.add_row({th: t("instances.id")}, {td: link_to_with_actions(@instance["@id"]) }) + - t.add_row({th: t("instances.id")}, {td: link_to_with_actions(@instance["@id"], acronym: @ontology.acronym) }) - label = @instance['label'] || @instance['prefLabel'] - unless label.blank? diff --git a/app/views/login/index.html.haml b/app/views/login/index.html.haml index 2ab02ae26..0d39f910b 100644 --- a/app/views/login/index.html.haml +++ b/app/views/login/index.html.haml @@ -1,10 +1,9 @@ - @title = t('login.title') -- unless @errors.nil? - %div{:style => "color:red;"} - = t('login.invalid_login') - %ul +.d-flex.justify-content-center.mt-4 + - unless @errors.nil? + = render Display::AlertComponent.new(type: "danger", closable: false) do - for error in @errors - %li= error + %div=error .d-flex.justify-content-center .login-form = form_for(:user, :url => {:controller => 'login',:action=>'create'}) do |f| diff --git a/config/environment.rb b/config/environment.rb index 99be33ce5..0c158d03b 100755 --- a/config/environment.rb +++ b/config/environment.rb @@ -1,5 +1,6 @@ # Load the Rails application. -require_relative "application" +require_relative 'application' + # Remove this after migrating to Rails 7.1 (https://github.com/rails/rails/issues/32947#issuecomment-1356391185) class Rails::Application diff --git a/config/locales/en.yml b/config/locales/en.yml index f00316dbc..79b40f9b0 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -543,7 +543,7 @@ en: enter_email: Enter your username enter_password: Enter your password forgot_password: Forgot password? - invalid_login: Errors on the form + private_ontology: This ontology is private. Please login. no_account: Do not have an account? password: Password register: Register diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 2f4812d8d..8999255c4 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -550,7 +550,7 @@ fr: enter_email: Entrez votre nom d'utilisateur enter_password: Entrez votre mot de passe forgot_password: Mot de passe oublié ? - invalid_login: Erreurs sur le formulaire + private_ontology: Cette ontologie est privée. Veuillez vous connecter. no_account: Vous n'avez pas de compte ? password: Mot de passe register: S'inscrire