Patch by Go MAEDA. git-svn-id: http://svn.redmine.org/redmine/trunk@21312 e93f8b46-1217-0410-a6f0-8f06a7374b81tags/5.0.0
@@ -34,12 +34,6 @@ group :ldap do | |||
gem 'net-ldap', '~> 0.17.0' | |||
end | |||
# Optional gem for OpenID authentication | |||
group :openid do | |||
gem "ruby-openid", "~> 2.9.2", :require => "openid" | |||
gem "rack-openid" | |||
end | |||
# Optional gem for exporting the gantt to a PNG file | |||
group :minimagick do | |||
gem 'mini_magick', '~> 4.11.0' |
@@ -27,14 +27,6 @@ class AccountController < ApplicationController | |||
skip_before_action :check_if_login_required, :check_password_change | |||
skip_before_action :check_twofa_activation, :only => :logout | |||
# Overrides ApplicationController#verify_authenticity_token to disable | |||
# token verification on openid callbacks | |||
def verify_authenticity_token | |||
unless using_open_id? | |||
super | |||
end | |||
end | |||
# Login request and validation | |||
def login | |||
if request.post? | |||
@@ -161,7 +153,7 @@ class AccountController < ApplicationController | |||
redirect_to my_account_path | |||
end | |||
else | |||
unless user_params[:identity_url].present? && user_params[:password].blank? && user_params[:password_confirmation].blank? | |||
unless user_params[:password].blank? && user_params[:password_confirmation].blank? | |||
@user.password, @user.password_confirmation = user_params[:password], user_params[:password_confirmation] | |||
end | |||
@@ -301,11 +293,7 @@ class AccountController < ApplicationController | |||
end | |||
def authenticate_user | |||
if Setting.openid? && using_open_id? | |||
open_id_authenticate(params[:openid_url]) | |||
else | |||
password_authentication | |||
end | |||
password_authentication | |||
end | |||
def password_authentication | |||
@@ -339,49 +327,6 @@ class AccountController < ApplicationController | |||
update_sudo_timestamp! # activate Sudo Mode | |||
end | |||
def open_id_authenticate(openid_url) | |||
back_url = signin_url(:autologin => params[:autologin]) | |||
authenticate_with_open_id( | |||
openid_url, :required => [:nickname, :fullname, :email], | |||
:return_to => back_url, :method => :post | |||
) do |result, identity_url, registration| | |||
if result.successful? | |||
user = User.find_or_initialize_by_identity_url(identity_url) | |||
if user.new_record? | |||
# Self-registration off | |||
(redirect_to(home_url); return) unless Setting.self_registration? | |||
# Create on the fly | |||
user.login = registration['nickname'] unless registration['nickname'].nil? | |||
user.mail = registration['email'] unless registration['email'].nil? | |||
user.firstname, user.lastname = registration['fullname'].split(' ') unless registration['fullname'].nil? | |||
user.random_password | |||
user.register | |||
case Setting.self_registration | |||
when '1' | |||
register_by_email_activation(user) do | |||
onthefly_creation_failed(user) | |||
end | |||
when '3' | |||
register_automatically(user) do | |||
onthefly_creation_failed(user) | |||
end | |||
else | |||
register_manually_by_administrator(user) do | |||
onthefly_creation_failed(user) | |||
end | |||
end | |||
else | |||
# Existing record | |||
if user.active? | |||
successful_authentication(user) | |||
else | |||
handle_inactive_user(user) | |||
end | |||
end | |||
end | |||
end | |||
end | |||
def successful_authentication(user) | |||
logger.info "Successful authentication for '#{user.login}' from #{request.remote_ip} at #{Time.now.utc}" | |||
# Valid user |
@@ -268,10 +268,6 @@ class Setting < ActiveRecord::Base | |||
a | |||
end | |||
def self.openid? | |||
Object.const_defined?(:OpenID) && self[:openid].to_i > 0 | |||
end | |||
# Checks if settings have changed since the values were read | |||
# and clears the cache hash if it's the case | |||
# Called once per request |
@@ -111,7 +111,6 @@ class User < Principal | |||
validates_format_of :login, :with => /\A[a-z0-9_\-@\.]*\z/i | |||
validates_length_of :login, :maximum => LOGIN_LENGTH_LIMIT | |||
validates_length_of :firstname, :lastname, :maximum => 30 | |||
validates_length_of :identity_url, maximum: 255 | |||
validates_inclusion_of :mail_notification, :in => MAIL_NOTIFICATION_OPTIONS.collect(&:first), :allow_blank => true | |||
Setting::PASSWORD_CHAR_CLASSES.each do |k, v| | |||
validates_format_of :password, :with => v, :message => :"must_contain_#{k}", :allow_blank => true, :if => Proc.new {Setting.password_required_char_classes.include?(k)} | |||
@@ -198,28 +197,6 @@ class User < Principal | |||
email_addresses.pluck(:address) | |||
end | |||
def self.find_or_initialize_by_identity_url(url) | |||
user = where(:identity_url => url).first | |||
unless user | |||
user = User.new | |||
user.identity_url = url | |||
end | |||
user | |||
end | |||
def identity_url=(url) | |||
if url.blank? | |||
write_attribute(:identity_url, '') | |||
else | |||
begin | |||
write_attribute(:identity_url, OpenIdAuthentication.normalize_identifier(url)) | |||
rescue OpenIdAuthentication::InvalidOpenId | |||
# Invalid url, don't save | |||
end | |||
end | |||
self.read_attribute(:identity_url) | |||
end | |||
# Returns the user that matches provided login and password, or nil | |||
# AuthSource errors are caught, logged and nil is returned. | |||
def self.try_to_login(login, password, active_only=true) | |||
@@ -800,8 +777,7 @@ class User < Principal | |||
'notified_project_ids', | |||
'language', | |||
'custom_field_values', | |||
'custom_fields', | |||
'identity_url') | |||
'custom_fields') | |||
safe_attributes( | |||
'login', | |||
:if => lambda {|user, current_user| user.new_record?}) |
@@ -13,11 +13,6 @@ | |||
</label> | |||
<%= password_field_tag 'password', nil, :tabindex => '2' %> | |||
<% if Setting.openid? %> | |||
<label for="openid_url"><%=l(:field_identity_url)%></label> | |||
<%= text_field_tag "openid_url", nil, :tabindex => '3' %> | |||
<% end %> | |||
<% if Setting.autologin? %> | |||
<label for="autologin"><%= check_box_tag 'autologin', 1, false, :tabindex => 4 %> <%= l(:label_stay_logged_in) %></label> | |||
<% end %> |
@@ -1,4 +1,4 @@ | |||
<h2><%=l(:label_register)%> <%=link_to l(:label_login_with_open_id_option), signin_url if Setting.openid? %></h2> | |||
<h2><%=l(:label_register)%></h2> | |||
<%= labelled_form_for @user, :url => register_path do |f| %> | |||
<%= error_messages_for 'user' %> | |||
@@ -28,10 +28,6 @@ | |||
<p><%= f.select :language, lang_options_for_select %></p> | |||
<% end %> | |||
<% if Setting.openid? %> | |||
<p><%= f.text_field :identity_url %></p> | |||
<% end %> | |||
<% @user.custom_field_values.select {|v| (Setting.show_custom_fields_on_registration? && v.editable?) || v.required?}.each do |value| %> | |||
<p><%= custom_field_tag_with_label :user, value %></p> | |||
<% end %> |
@@ -25,9 +25,6 @@ | |||
<% unless @user.force_default_language? %> | |||
<p><%= f.select :language, lang_options_for_select %></p> | |||
<% end %> | |||
<% if Setting.openid? %> | |||
<p><%= f.text_field :identity_url %></p> | |||
<% end %> | |||
<% if Setting.twofa? -%> | |||
<p> | |||
<label><%=l :setting_twofa -%></label> |
@@ -40,9 +40,6 @@ | |||
</p> | |||
<p><%= setting_check_box :openid, :disabled => !Object.const_defined?(:OpenID) %></p> | |||
</div> | |||
<fieldset class="box"> | |||
<legend><%= l(:label_session_expiration) %></legend> | |||
@@ -13,9 +13,6 @@ | |||
<% unless @user.force_default_language? %> | |||
<p><%= f.select :language, lang_options_for_select %></p> | |||
<% end %> | |||
<% if Setting.openid? %> | |||
<p><%= f.text_field :identity_url %></p> | |||
<% end %> | |||
<% @user.custom_field_values.each do |value| %> | |||
<p><%= custom_field_tag_with_label :user, value %></p> |
@@ -207,11 +207,6 @@ default: | |||
# Maximum number of simultaneous AJAX uploads | |||
#max_concurrent_ajax_uploads: 2 | |||
# Configure OpenIdAuthentication.store | |||
# | |||
# allowed values: :memory, :file, :memcache | |||
#openid_authentication_store: :memory | |||
# URL of the avatar server | |||
# | |||
# By default, Redmine uses Gravatar as the avatar server for displaying |
@@ -17,11 +17,6 @@ if secret.present? | |||
RedmineApp::Application.config.secret_token = secret | |||
end | |||
if Object.const_defined?(:OpenIdAuthentication) | |||
openid_authentication_store = Redmine::Configuration['openid_authentication_store'] | |||
OpenIdAuthentication.store = openid_authentication_store.presence || :memory | |||
end | |||
Redmine::PluginLoader.load | |||
plugin_assets_reloader = Redmine::PluginLoader.create_assets_reloader | |||
@@ -307,7 +307,6 @@ ar: | |||
field_parent_title: صفحة الوالدين | |||
field_editable: يمكن اعادة تحريره | |||
field_watcher: مراقب | |||
field_identity_url: افتح الرابط الخاص بالهوية الشخصية | |||
field_content: المحتويات | |||
field_group_by: تصنيف النتائج بواسطة | |||
field_sharing: مشاركة | |||
@@ -367,7 +366,6 @@ ar: | |||
setting_diff_max_lines_displayed: الحد الاقصى لعدد الخطوط | |||
setting_file_max_size_displayed: الحد الأقصى لحجم النص المعروض على الملفات المرفقة | |||
setting_repository_log_display_limit: الحد الاقصى لعدد التنقيحات المعروضة على ملف السجل | |||
setting_openid: السماح بدخول اسم المستخدم المفتوح والتسجيل | |||
setting_password_min_length: الحد الادني لطول كلمة المرور | |||
setting_new_project_user_role_id: الدور المسند الى المستخدم غير المسؤول الذي يقوم بإنشاء المشروع | |||
setting_default_projects_modules: تمكين الوحدات النمطية للمشاريع الجديدة بشكل افتراضي | |||
@@ -505,7 +503,6 @@ ar: | |||
label_information: معلومة | |||
label_information_plural: معلومات | |||
label_register: تسجيل | |||
label_login_with_open_id_option: او الدخول بهوية مفتوحة | |||
label_password_lost: فقدت كلمة السر | |||
label_home: "الصفحة الرئيسية" | |||
label_my_page: الصفحة الخاصة بي |
@@ -332,7 +332,6 @@ az: | |||
field_host: Kompyuter | |||
field_hours: saat | |||
field_identifier: Unikal identifikator | |||
field_identity_url: OpenID URL | |||
field_is_closed: Tapşırıq bağlanıb | |||
field_is_default: Susmaya görə tapşırıq | |||
field_is_filter: Filtr kimi istifadə edilir | |||
@@ -549,7 +548,6 @@ az: | |||
label_loading: Yükləmə... | |||
label_logged_as: Daxil olmusunuz | |||
label_login: Daxil olmaq | |||
label_login_with_open_id_option: və ya OpenID vasitəsilə daxil olmaq | |||
label_logout: Çıxış | |||
label_max_size: Maksimal ölçü | |||
label_member_new: Yeni iştirakçı | |||
@@ -847,7 +845,6 @@ az: | |||
setting_mail_from: Çıxan e-poçt ünvanı | |||
setting_mail_handler_api_enabled: Daxil olan məlumatlar üçün veb-servisi qoşmaq | |||
setting_mail_handler_api_key: API açar | |||
setting_openid: Giriş və qeydiyyat üçün OpenID izacə vermək | |||
setting_per_page_options: Səhifə üçün qeydlərin sayı | |||
setting_plain_text_mail: Yalnız sadə mətn (HTML olmadan) | |||
setting_protocol: Protokol |
@@ -367,7 +367,6 @@ bg: | |||
field_parent_title: Родителска страница | |||
field_editable: Editable | |||
field_watcher: Наблюдател | |||
field_identity_url: OpenID URL | |||
field_content: Съдържание | |||
field_group_by: Групиране на резултатите по | |||
field_sharing: Sharing | |||
@@ -463,7 +462,6 @@ bg: | |||
setting_diff_max_lines_displayed: Максимален брой показвани diff редове | |||
setting_file_max_size_displayed: Максимален размер на текстовите файлове, показвани inline | |||
setting_repository_log_display_limit: Максимален брой на показванете ревизии в лог файла | |||
setting_openid: Рарешаване на OpenID вход и регистрация | |||
setting_password_max_age: Изискване за смяна на паролата след | |||
setting_password_min_length: Минимална дължина на парола | |||
setting_password_required_char_classes: Задължителни символни класове за пароли | |||
@@ -658,7 +656,6 @@ bg: | |||
label_information: Информация | |||
label_information_plural: Информация | |||
label_register: Регистрация | |||
label_login_with_open_id_option: или вход чрез OpenID | |||
label_password_lost: Забравена парола | |||
label_password_required: Потвърдете вашата парола, за да продължите | |||
label_home: Начало |
@@ -292,7 +292,6 @@ bs: | |||
field_parent_title: 'Stranica "roditelj"' | |||
field_editable: Može se mijenjati | |||
field_watcher: Posmatrač | |||
field_identity_url: OpenID URL | |||
field_content: Sadržaj | |||
setting_app_title: Naslov aplikacije | |||
@@ -333,7 +332,6 @@ bs: | |||
setting_diff_max_lines_displayed: Maksimalan broj linija za prikaz razlika između dva fajla | |||
setting_file_max_size_displayed: Maksimalna veličina fajla kod prikaza razlika unutar fajla (inline) | |||
setting_repository_log_display_limit: Maksimalna veličina revizija prikazanih na log fajlu | |||
setting_openid: Omogući OpenID prijavu i registraciju | |||
permission_edit_project: Ispravke projekta | |||
permission_select_project_modules: Odaberi module projekta | |||
@@ -439,7 +437,6 @@ bs: | |||
label_information: Informacija | |||
label_information_plural: Informacije | |||
label_register: Registracija | |||
label_login_with_open_id_option: ili prijava sa OpenID-om | |||
label_password_lost: Izgubljena lozinka | |||
label_home: Početna stranica | |||
label_my_page: Moja stranica |
@@ -306,7 +306,6 @@ ca: | |||
field_parent_title: "Pàgina pare" | |||
field_editable: "Es pot editar" | |||
field_watcher: "Vigilància" | |||
field_identity_url: "URL OpenID" | |||
field_content: "Contingut" | |||
field_group_by: "Agrupa els resultats per" | |||
field_sharing: "Compartir" | |||
@@ -351,7 +350,6 @@ ca: | |||
setting_diff_max_lines_displayed: "Número màxim de línies amb diferències mostrades" | |||
setting_file_max_size_displayed: "Mida màxima dels fitxers de text mostrats en línia" | |||
setting_repository_log_display_limit: "Número màxim de revisions que es mostren al registre de fitxers" | |||
setting_openid: "Permet entrar i registrar-se amb l'OpenID" | |||
setting_password_min_length: "Longitud mínima de la contrasenya" | |||
setting_new_project_user_role_id: "Aquest rol es dóna a un usuari no administrador per a crear projectes" | |||
setting_default_projects_modules: "Mòduls activats per defecte en els projectes nous" | |||
@@ -476,7 +474,6 @@ ca: | |||
label_information: "Informació" | |||
label_information_plural: "Informació" | |||
label_register: "Registrar" | |||
label_login_with_open_id_option: "o entrar amb OpenID" | |||
label_password_lost: "Has oblidat la contrasenya?" | |||
label_home: "Inici" | |||
label_my_page: "La meva pàgina" |
@@ -308,7 +308,6 @@ cs: | |||
field_parent_title: Rodičovská stránka | |||
field_editable: Editovatelný | |||
field_watcher: Sleduje | |||
field_identity_url: OpenID URL | |||
field_content: Obsah | |||
field_group_by: Seskupovat výsledky podle | |||
field_sharing: Sdílení | |||
@@ -358,7 +357,6 @@ cs: | |||
setting_diff_max_lines_displayed: Maximální počet zobrazených řádků rozdílu | |||
setting_file_max_size_displayed: Maximální velikost textových souborů zobrazených přímo na stránce | |||
setting_repository_log_display_limit: Maximální počet revizí zobrazených v logu souboru | |||
setting_openid: Umožnit přihlašování a registrace s OpenID | |||
setting_password_min_length: Minimální délka hesla | |||
setting_new_project_user_role_id: Role přiřazená uživateli bez práv administrátora, který projekt vytvořil | |||
setting_default_projects_modules: Výchozí zapnutné moduly pro nový projekt | |||
@@ -487,7 +485,6 @@ cs: | |||
label_information: Informace | |||
label_information_plural: Informace | |||
label_register: Registrovat | |||
label_login_with_open_id_option: nebo se přihlašte s OpenID | |||
label_password_lost: Zapomenuté heslo | |||
label_home: Úvodní | |||
label_my_page: Moje stránka |
@@ -802,9 +802,6 @@ da: | |||
setting_repository_log_display_limit: Højeste antal revisioner vist i fil-log | |||
setting_file_max_size_displayed: Maksimale størrelse på tekstfiler vist inline | |||
field_watcher: Overvåger | |||
setting_openid: Tillad OpenID login og registrering | |||
field_identity_url: OpenID URL | |||
label_login_with_open_id_option: eller login med OpenID | |||
setting_per_page_options: Enheder per side muligheder | |||
mail_body_reminder: "%{count} sage(er) som er tildelt dig har deadline indenfor de næste %{days} dage:" | |||
field_content: Indhold |
@@ -324,7 +324,6 @@ de: | |||
field_host: Host | |||
field_hours: Stunden | |||
field_identifier: Kennung | |||
field_identity_url: OpenID-URL | |||
field_inherit_members: Benutzer erben | |||
field_is_closed: Ticket geschlossen | |||
field_is_default: Standardeinstellung | |||
@@ -631,7 +630,6 @@ de: | |||
label_loading: Lade... | |||
label_logged_as: Angemeldet als | |||
label_login: Anmelden | |||
label_login_with_open_id_option: oder mit OpenID anmelden | |||
label_logout: Abmelden | |||
label_only: nur | |||
label_max_size: Maximale Größe | |||
@@ -1036,7 +1034,6 @@ de: | |||
setting_mail_handler_excluded_filenames: Anhänge nach Namen ausschließen | |||
setting_new_project_user_role_id: Rolle, die einem Nicht-Administrator zugeordnet wird, der ein Projekt erstellt | |||
setting_non_working_week_days: Arbeitsfreie Tage | |||
setting_openid: Erlaube OpenID-Anmeldung und -Registrierung | |||
setting_password_min_length: Mindestlänge des Passworts | |||
setting_password_max_age: Erzwinge Passwortwechsel nach | |||
setting_lost_password: Zurücksetzen des Passworts per E-Mail erlauben |
@@ -288,7 +288,6 @@ el: | |||
field_parent_title: Γονική σελίδα | |||
field_editable: Επεξεργάσιμο | |||
field_watcher: Παρατηρητής | |||
field_identity_url: OpenID URL | |||
field_content: Περιεχόμενο | |||
field_group_by: Ομαδικά αποτελέσματα από | |||
@@ -329,7 +328,6 @@ el: | |||
setting_diff_max_lines_displayed: Μεγ.αριθμός εμφάνισης γραμμών diff | |||
setting_file_max_size_displayed: Μεγ.μέγεθος των αρχείων απλού κειμένου που εμφανίζονται σε σειρά | |||
setting_repository_log_display_limit: Μέγιστος αριθμός αναθεωρήσεων που εμφανίζονται στο ιστορικό αρχείου | |||
setting_openid: Επιτρέψτε συνδέσεις OpenID και εγγραφή | |||
setting_password_min_length: Ελάχιστο μήκος κωδικού πρόσβασης | |||
setting_new_project_user_role_id: Απόδοση ρόλου σε χρήστη μη-διαχειριστή όταν δημιουργεί ένα έργο | |||
@@ -438,7 +436,6 @@ el: | |||
label_information: Πληροφορία | |||
label_information_plural: Πληροφορίες | |||
label_register: Εγγραφή | |||
label_login_with_open_id_option: ή συνδεθείτε με OpenID | |||
label_password_lost: Ανάκτηση κωδικού πρόσβασης | |||
label_home: Αρχική σελίδα | |||
label_my_page: Η σελίδα μου |
@@ -309,7 +309,6 @@ en-GB: | |||
field_parent_title: Parent page | |||
field_editable: Editable | |||
field_watcher: Watcher | |||
field_identity_url: OpenID URL | |||
field_content: Content | |||
field_group_by: Group results by | |||
field_sharing: Sharing | |||
@@ -360,7 +359,6 @@ en-GB: | |||
setting_diff_max_lines_displayed: Max number of diff lines displayed | |||
setting_file_max_size_displayed: Max size of text files displayed inline | |||
setting_repository_log_display_limit: Maximum number of revisions displayed on file log | |||
setting_openid: Allow OpenID login and registration | |||
setting_password_min_length: Minimum password length | |||
setting_new_project_user_role_id: Role given to a non-admin user who creates a project | |||
setting_default_projects_modules: Default enabled modules for new projects | |||
@@ -493,7 +491,6 @@ en-GB: | |||
label_information: Information | |||
label_information_plural: Information | |||
label_register: Register | |||
label_login_with_open_id_option: or login with OpenID | |||
label_password_lost: Lost password | |||
label_home: Home | |||
label_my_page: My page |
@@ -363,7 +363,6 @@ en: | |||
field_parent_title: Parent page | |||
field_editable: Editable | |||
field_watcher: Watcher | |||
field_identity_url: OpenID URL | |||
field_content: Content | |||
field_group_by: Group results by | |||
field_sharing: Sharing | |||
@@ -460,7 +459,6 @@ en: | |||
setting_diff_max_lines_displayed: Maximum number of diff lines displayed | |||
setting_file_max_size_displayed: Maximum size of text files displayed inline | |||
setting_repository_log_display_limit: Maximum number of revisions displayed on file log | |||
setting_openid: Allow OpenID login and registration | |||
setting_password_max_age: Require password change after | |||
setting_password_min_length: Minimum password length | |||
setting_password_required_char_classes : Required character classes for passwords | |||
@@ -654,7 +652,6 @@ en: | |||
label_information: Information | |||
label_information_plural: Information | |||
label_register: Register | |||
label_login_with_open_id_option: or login with OpenID | |||
label_password_lost: Lost password | |||
label_password_required: Confirm your password to continue | |||
label_home: Home |
@@ -828,9 +828,6 @@ es-PA: | |||
setting_repository_log_display_limit: Número máximo de revisiones mostradas en el archivo de trazas | |||
setting_file_max_size_displayed: Tamaño máximo de los archivos de texto mostrados | |||
field_watcher: Seguidor | |||
setting_openid: Permitir identificación y registro por OpenID | |||
field_identity_url: URL de OpenID | |||
label_login_with_open_id_option: o identifíquese con OpenID | |||
field_content: Contenido | |||
label_descending: Descendente | |||
label_sort: Ordenar |
@@ -826,9 +826,6 @@ es: | |||
setting_repository_log_display_limit: Número máximo de revisiones mostradas en el fichero de trazas | |||
setting_file_max_size_displayed: Tamaño máximo de los ficheros de texto mostrados | |||
field_watcher: Seguidor | |||
setting_openid: Permitir identificación y registro por OpenID | |||
field_identity_url: URL de OpenID | |||
label_login_with_open_id_option: o identifíquese con OpenID | |||
field_content: Contenido | |||
label_descending: Descendente | |||
label_sort: Ordenar |
@@ -327,7 +327,6 @@ et: | |||
field_parent_title: "Pärineb lehest" | |||
field_editable: "Muudetav" | |||
field_watcher: "Jälgija" | |||
field_identity_url: "OpenID URL" | |||
field_content: "Sisu" | |||
field_group_by: "Rühmita tulemus" | |||
field_sharing: "Teemade jagamine" | |||
@@ -390,7 +389,6 @@ et: | |||
setting_diff_max_lines_displayed: "Enim korraga näidatavaid erinevusi" | |||
setting_file_max_size_displayed: "Kuvatava tekstifaili suurim maht" | |||
setting_repository_log_display_limit: "Enim ajaloos näidatavaid sissekandeid" | |||
setting_openid: "Luba OpenID-ga registreerimine ja sisselogimine" | |||
setting_password_min_length: "Lühim lubatud parooli pikkus" | |||
setting_new_project_user_role_id: "Projekti looja roll oma projektis" | |||
setting_default_projects_modules: "Vaikimisi moodulid uutes projektides" | |||
@@ -531,7 +529,6 @@ et: | |||
label_information: "Teave" | |||
label_information_plural: "Teave" | |||
label_register: "Registreeru" | |||
label_login_with_open_id_option: "või logi sisse OpenID-ga" | |||
label_password_lost: "Kui parool on ununud..." | |||
label_home: "Kodu" | |||
label_my_page: "Minu leht" |
@@ -296,7 +296,6 @@ eu: | |||
field_parent_title: Orri gurasoa | |||
field_editable: Editagarria | |||
field_watcher: Behatzailea | |||
field_identity_url: OpenID URLa | |||
field_content: Edukia | |||
field_group_by: Emaitzak honegatik taldekatu | |||
field_sharing: Partekatzea | |||
@@ -340,7 +339,6 @@ eu: | |||
setting_diff_max_lines_displayed: Erakutsiko diren diff lerro kopuru maximoa | |||
setting_file_max_size_displayed: Barnean erakuzten diren testu fitxategien tamaina maximoa | |||
setting_repository_log_display_limit: Egunkari fitxategian erakutsiko diren berrikuspen kopuru maximoa. | |||
setting_openid: Baimendu OpenID saio hasiera eta erregistatzea | |||
setting_password_min_length: Pasahitzen luzera minimoa | |||
setting_new_project_user_role_id: Proiektu berriak sortzerakoan kudeatzaile ez diren erabiltzaileei esleitutako rola | |||
setting_default_projects_modules: Proiektu berrientzako defektuz gaitutako moduluak | |||
@@ -459,7 +457,6 @@ eu: | |||
label_information: Informazioa | |||
label_information_plural: Informazioa | |||
label_register: Erregistratu | |||
label_login_with_open_id_option: edo OpenID-rekin saioa hasi | |||
label_password_lost: Pasahitza galduta | |||
label_home: Hasiera | |||
label_my_page: Nire orria |
@@ -342,7 +342,6 @@ fa: | |||
field_parent_title: صفحه پدر | |||
field_editable: ویرایشپذیر | |||
field_watcher: ناظر | |||
field_identity_url: نشانی OpenID | |||
field_content: محتوا | |||
field_group_by: دسته بندی با | |||
field_sharing: اشتراک گذاری | |||
@@ -429,7 +428,6 @@ fa: | |||
setting_diff_max_lines_displayed: بیشترین اندازه ردیفهای تفاوت نشان داده شده | |||
setting_file_max_size_displayed: بیشترین اندازه پروندههای نمایش دادهشده به صورت همردیف | |||
setting_repository_log_display_limit: بیشترین تعداد بازبینیهای نمایش دادهشده در گزارش پرونده | |||
setting_openid: اجازه ورود و ثبت نام با OpenID | |||
setting_password_max_age: لزوم تغییر گذرواژه پس از | |||
setting_password_min_length: کمترین اندازه گذرواژه | |||
setting_lost_password: اجازه بازنشانی گذرواژه با رایانامه | |||
@@ -601,7 +599,6 @@ fa: | |||
label_information: اطلاعات | |||
label_information_plural: اطلاعات | |||
label_register: ثبت نام | |||
label_login_with_open_id_option: یا با OpenID وارد شوید | |||
label_password_lost: بازیابی گذرواژه | |||
label_password_required: برای ادامه، گذرواژه خود را تایید کنید | |||
label_home: خانه |
@@ -809,9 +809,6 @@ fi: | |||
setting_repository_log_display_limit: Maximum number of revisions displayed on file log | |||
setting_file_max_size_displayed: Max size of text files displayed inline | |||
field_watcher: Watcher | |||
setting_openid: Allow OpenID login and registration | |||
field_identity_url: OpenID URL | |||
label_login_with_open_id_option: or login with OpenID | |||
field_content: Content | |||
label_descending: Descending | |||
label_sort: Sort |
@@ -352,7 +352,6 @@ fr: | |||
field_parent_title: Page parent | |||
field_editable: Modifiable | |||
field_watcher: Observateur | |||
field_identity_url: URL OpenID | |||
field_content: Contenu | |||
field_group_by: Grouper par | |||
field_sharing: Partage | |||
@@ -438,7 +437,6 @@ fr: | |||
setting_diff_max_lines_displayed: Nombre maximum de lignes de diff affichées | |||
setting_file_max_size_displayed: Taille maximum des fichiers texte affichés en ligne | |||
setting_repository_log_display_limit: "Nombre maximum de révisions affichées sur l'historique d'un fichier" | |||
setting_openid: "Autoriser l'authentification et l'enregistrement OpenID" | |||
setting_password_max_age: Expiration des mots de passe après | |||
setting_password_min_length: Longueur minimum des mots de passe | |||
setting_new_project_user_role_id: Rôle donné à un utilisateur non-administrateur qui crée un projet | |||
@@ -615,7 +613,6 @@ fr: | |||
label_information: Information | |||
label_information_plural: Informations | |||
label_register: S'enregistrer | |||
label_login_with_open_id_option: S'authentifier avec OpenID | |||
label_password_lost: Mot de passe perdu | |||
label_password_required: Confirmez votre mot de passe pour continuer | |||
label_home: Accueil |
@@ -801,9 +801,6 @@ gl: | |||
setting_repository_log_display_limit: "Número máximo de revisións que se mostran no ficheiro do historial." | |||
setting_file_max_size_displayed: "Tamaño máximo dos ficheiros de texto que se mostran liña por liña." | |||
field_watcher: "Seguidor" | |||
setting_openid: "Permitir rexistrarse e acceder mediante OpenID." | |||
field_identity_url: "URL de OpenID" | |||
label_login_with_open_id_option: "ou acceda mediante OpenID." | |||
field_content: "Contido" | |||
label_descending: "Descendente" | |||
label_sort: "Ordenar" |
@@ -308,7 +308,6 @@ he: | |||
field_parent_title: דף אב | |||
field_editable: ניתן לעריכה | |||
field_watcher: צופה | |||
field_identity_url: כתובת OpenID | |||
field_content: תוכן | |||
field_group_by: קבץ את התוצאות לפי | |||
field_sharing: שיתוף | |||
@@ -354,7 +353,6 @@ he: | |||
setting_diff_max_lines_displayed: מספר מירבי של שורות בתצוגת שינויים | |||
setting_file_max_size_displayed: גודל מירבי של מלל המוצג בתוך השורה | |||
setting_repository_log_display_limit: מספר מירבי של מהדורות המוצגות ביומן קובץ | |||
setting_openid: אפשר התחברות ורישום באמצעות OpenID | |||
setting_password_min_length: אורך סיסמה מינימאלי | |||
setting_new_project_user_role_id: התפקיד שמוגדר למשתמש פשוט אשר יוצר פרויקט | |||
setting_default_projects_modules: מודולים מאופשרים בברירת מחדל עבור פרויקטים חדשים | |||
@@ -480,7 +478,6 @@ he: | |||
label_information: מידע | |||
label_information_plural: מידע | |||
label_register: הרשמה | |||
label_login_with_open_id_option: או התחבר באמצעות OpenID | |||
label_password_lost: אבדה הסיסמה? | |||
label_home: דף הבית | |||
label_my_page: הדף שלי |
@@ -288,7 +288,6 @@ hr: | |||
field_parent_title: Parent page | |||
field_editable: Editable | |||
field_watcher: Watcher | |||
field_identity_url: OpenID URL | |||
field_content: Content | |||
field_group_by: Group results by | |||
@@ -331,7 +330,6 @@ hr: | |||
setting_diff_max_lines_displayed: Maksimalni broj diff linija za prikazati | |||
setting_file_max_size_displayed: Max size of text files displayed inline | |||
setting_repository_log_display_limit: Maximum number of revisions displayed on file log | |||
setting_openid: Allow OpenID login and registration | |||
setting_password_min_length: Minimum password length | |||
setting_new_project_user_role_id: Role given to a non-admin user who creates a project | |||
setting_default_projects_modules: Default enabled modules for new projects | |||
@@ -450,7 +448,6 @@ hr: | |||
label_information: Informacija | |||
label_information_plural: Informacije | |||
label_register: Registracija | |||
label_login_with_open_id_option: or login with OpenID | |||
label_password_lost: Izgubljena zaporka | |||
label_home: Početna stranica | |||
label_my_page: Moja stranica |
@@ -807,9 +807,6 @@ | |||
setting_repository_log_display_limit: Maximum hány revíziót mutasson meg a log megjelenítésekor | |||
setting_file_max_size_displayed: Maximum mekkora szövegfájlokat jelenítsen meg soronkénti összehasonlításnál | |||
field_watcher: Megfigyelő | |||
setting_openid: OpenID regisztráció és bejelentkezés engedélyezése | |||
field_identity_url: OpenID URL | |||
label_login_with_open_id_option: bejelentkezés OpenID használatával | |||
field_content: Tartalom | |||
label_descending: Csökkenő | |||
label_sort: Rendezés |
@@ -289,7 +289,6 @@ id: | |||
field_parent_title: Halaman induk | |||
field_editable: Dapat disunting | |||
field_watcher: Pemantau | |||
field_identity_url: OpenID URL | |||
field_content: Isi | |||
field_group_by: Dikelompokkan berdasar | |||
field_sharing: Berbagi | |||
@@ -332,7 +331,6 @@ id: | |||
setting_diff_max_lines_displayed: Maksimum perbedaan baris tertampil | |||
setting_file_max_size_displayed: Maksimum berkas tertampil secara inline | |||
setting_repository_log_display_limit: Nilai maksimum dari revisi ditampilkan di log berkas | |||
setting_openid: Perbolehkan Login dan pendaftaran melalui OpenID | |||
setting_password_min_length: Panjang minimum untuk kata sandi | |||
setting_new_project_user_role_id: Peran diberikan pada pengguna non-admin yang membuat proyek | |||
setting_default_projects_modules: Modul yang diaktifkan pada proyek baru | |||
@@ -444,7 +442,6 @@ id: | |||
label_information: Informasi | |||
label_information_plural: Informasi | |||
label_register: mendaftar | |||
label_login_with_open_id_option: atau login menggunakan OpenID | |||
label_password_lost: Lupa password | |||
label_home: Halaman depan | |||
label_my_page: Beranda |
@@ -788,9 +788,6 @@ it: | |||
setting_repository_log_display_limit: Numero massimo di revisioni elencate nella cronologia file | |||
setting_file_max_size_displayed: Dimensione massima dei contenuti testuali visualizzati | |||
field_watcher: Osservatore | |||
setting_openid: Accetta connessione e registrazione con OpenID | |||
field_identity_url: URL OpenID | |||
label_login_with_open_id_option: oppure autenticati usando OpenID | |||
field_content: Contenuto | |||
label_descending: Discendente | |||
label_sort: Ordina |
@@ -328,7 +328,6 @@ ja: | |||
field_parent_title: 親ページ | |||
field_editable: 編集可能 | |||
field_watcher: ウォッチャー | |||
field_identity_url: OpenID URL | |||
field_content: 内容 | |||
field_group_by: グループ条件 | |||
field_sharing: 共有 | |||
@@ -387,7 +386,6 @@ ja: | |||
setting_diff_max_lines_displayed: 差分の表示行数の上限 | |||
setting_file_max_size_displayed: 画面表示するテキストファイルサイズの上限 | |||
setting_repository_log_display_limit: ファイルのリビジョン表示数の上限 | |||
setting_openid: OpenIDによるログインと登録 | |||
setting_password_min_length: パスワードの最低必要文字数 | |||
setting_new_project_user_role_id: システム管理者以外のユーザーが作成したプロジェクトに設定するロール | |||
setting_default_projects_modules: 新規プロジェクトにおいてデフォルトで有効になるモジュール | |||
@@ -518,7 +516,6 @@ ja: | |||
label_information: 情報 | |||
label_information_plural: 情報 | |||
label_register: 登録する | |||
label_login_with_open_id_option: またはOpenIDでログインする | |||
label_password_lost: パスワードの再設定 | |||
label_home: ホーム | |||
label_my_page: マイページ |
@@ -331,7 +331,6 @@ ko: | |||
field_parent_title: 상위 제목 | |||
field_editable: 편집가능 | |||
field_watcher: 일감관람자 | |||
field_identity_url: OpenID URL | |||
field_content: 내용 | |||
field_group_by: 결과를 묶어 보여줄 기준 | |||
@@ -372,7 +371,6 @@ ko: | |||
setting_diff_max_lines_displayed: 차이점(diff) 보기에 표시할 최대 줄수 | |||
setting_repository_log_display_limit: 저장소 보기에 표시할 개정이력의 최대 갯수 | |||
setting_file_max_size_displayed: 바로 보여줄 텍스트파일의 최대 크기 | |||
setting_openid: OpenID 로그인과 등록 허용 | |||
setting_password_min_length: 최소 암호 길이 | |||
setting_new_project_user_role_id: 프로젝트를 만든 사용자에게 주어질 역할 | |||
@@ -481,7 +479,6 @@ ko: | |||
label_information: 정보 | |||
label_information_plural: 정보 | |||
label_register: 등록 | |||
label_login_with_open_id_option: 또는 OpenID로 로그인 | |||
label_password_lost: 비밀번호 찾기 | |||
label_home: 초기화면 | |||
label_my_page: 내 페이지 |
@@ -336,7 +336,6 @@ lt: | |||
field_parent_title: Pagrindinis puslapis | |||
field_editable: Redaguojamas | |||
field_watcher: Stebėtojas | |||
field_identity_url: OpenID URL | |||
field_content: Turinys | |||
field_group_by: Sugrupuoti pagal | |||
field_sharing: Dalijimasis | |||
@@ -414,7 +413,6 @@ lt: | |||
setting_diff_max_lines_displayed: Maksimalus rodomas pakeitimų eilučių skaičius | |||
setting_file_max_size_displayed: Maksimalus tekstinių failų dydis rodomas vienoje eilutėje | |||
setting_repository_log_display_limit: Maksimalus revizijų skaičius rodomas failo žurnale | |||
setting_openid: Leisti OpenID prisijungimą ir registraciją | |||
setting_password_max_age: Reikalauti slaptažodžio pakeitimo po | |||
setting_password_min_length: Minimalus slaptažodžio ilgis | |||
setting_lost_password: Leisti slaptažodžio atstatymą elektroninu laišku | |||
@@ -581,7 +579,6 @@ lt: | |||
label_information: Informacija | |||
label_information_plural: Informacija | |||
label_register: Užsiregistruoti | |||
label_login_with_open_id_option: arba prisijunkite su OpenID | |||
label_password_lost: Prarastas slaptažodis | |||
label_password_required: Norėdami tęsti, patvirtinkite savo slaptažodį | |||
label_home: Pagrindinis |
@@ -288,7 +288,6 @@ lv: | |||
field_parent_title: Vecāka lapa | |||
field_editable: Rediģējams | |||
field_watcher: Vērotājs | |||
field_identity_url: OpenID URL | |||
field_content: Saturs | |||
field_group_by: Grupēt rezultātus pēc | |||
field_sharing: Koplietošana | |||
@@ -332,7 +331,6 @@ lv: | |||
setting_diff_max_lines_displayed: Maksimālais rādīto diff rindu skaits | |||
setting_file_max_size_displayed: Maksimālais izmērs iekļautajiem teksta failiem | |||
setting_repository_log_display_limit: Maksimālais žurnāla datnē rādīto revīziju skaits | |||
setting_openid: Atļaut OpenID pieslēgšanos un reģistrēšanos | |||
setting_password_min_length: Minimālais paroles garums | |||
setting_new_project_user_role_id: Loma, kura tiek piešķirta ne-administratora lietotājam, kurš izveido projektu | |||
setting_default_projects_modules: Noklusētie lietotie moduļi jaunam projektam | |||
@@ -454,7 +452,6 @@ lv: | |||
label_information: Informācija | |||
label_information_plural: Informācija | |||
label_register: Reģistrēties | |||
label_login_with_open_id_option: vai pieslēgties ar OpenID | |||
label_password_lost: Nozaudēta parole | |||
label_home: Sākums | |||
label_my_page: Mana lapa |
@@ -303,7 +303,6 @@ mk: | |||
field_parent_title: Parent page | |||
field_editable: Може да се уредува | |||
field_watcher: Watcher | |||
field_identity_url: OpenID URL | |||
field_content: Содржина | |||
field_group_by: Групирај ги резултатите според | |||
field_sharing: Споделување | |||
@@ -347,7 +346,6 @@ mk: | |||
setting_diff_max_lines_displayed: Max number of diff lines displayed | |||
setting_file_max_size_displayed: Max size of text files displayed inline | |||
setting_repository_log_display_limit: Maximum number of revisions displayed on file log | |||
setting_openid: Дозволи OpenID најава и регистрација | |||
setting_password_min_length: Мин. должина на лозинка | |||
setting_new_project_user_role_id: Улога доделена на неадминистраторски корисник кој креира проект | |||
setting_default_projects_modules: Default enabled modules for new projects | |||
@@ -472,7 +470,6 @@ mk: | |||
label_information: Информација | |||
label_information_plural: Информации | |||
label_register: Регистрирај се | |||
label_login_with_open_id_option: или најави се со OpenID | |||
label_password_lost: Изгубена лозинка | |||
label_home: Почетна | |||
label_my_page: Мојата страна |
@@ -294,7 +294,6 @@ mn: | |||
field_parent_title: Эцэг хуудас | |||
field_editable: Засварлагдана | |||
field_watcher: Харна | |||
field_identity_url: OpenID URL | |||
field_content: Агуулга | |||
field_group_by: Үр дүнгээр бүлэглэх | |||
field_sharing: Sharing | |||
@@ -338,7 +337,6 @@ mn: | |||
setting_diff_max_lines_displayed: Ялгаатай мөрүүдийн тоо (дээд тал нь) | |||
setting_file_max_size_displayed: Max size of text files displayed inline | |||
setting_repository_log_display_limit: Maximum number of revisions displayed on file log | |||
setting_openid: Allow OpenID login and registration | |||
setting_password_min_length: Minimum password length | |||
setting_new_project_user_role_id: Role given to a non-admin user who creates a project | |||
setting_default_projects_modules: Default enabled modules for new projects | |||
@@ -460,7 +458,6 @@ mn: | |||
label_information: Мэдээлэл | |||
label_information_plural: Мэдээллүүд | |||
label_register: Бүртгүүлэх | |||
label_login_with_open_id_option: or login with OpenID | |||
label_password_lost: Нууц үгээ алдсан | |||
label_home: Нүүр | |||
label_my_page: Миний хуудас |
@@ -770,9 +770,6 @@ nl: | |||
setting_repository_log_display_limit: Max aantal revisies zichbaar | |||
setting_file_max_size_displayed: Max grootte van tekstbestanden inline zichtbaar | |||
field_watcher: Volger | |||
setting_openid: Sta OpenID login en registratie toe | |||
field_identity_url: OpenID URL | |||
label_login_with_open_id_option: of login met uw OpenID | |||
field_content: Content | |||
label_descending: Aflopend | |||
label_sort: Sorteer |
@@ -775,9 +775,6 @@ | |||
setting_repository_log_display_limit: Maks antall revisjoner vist i fil-loggen | |||
setting_file_max_size_displayed: Max size of text files displayed inline | |||
field_watcher: Overvåker | |||
setting_openid: Tillat OpenID innlogging og registrering | |||
field_identity_url: OpenID URL | |||
label_login_with_open_id_option: eller logg inn med OpenID | |||
field_content: Innhold | |||
label_descending: Synkende | |||
label_sort: Sorter |
@@ -804,9 +804,6 @@ pl: | |||
setting_repository_log_display_limit: Maksymalna liczba rewizji pokazywanych w logu pliku | |||
setting_file_max_size_displayed: Maksymalny rozmiar plików tekstowych osadzanych w stronie | |||
field_watcher: Obserwator | |||
setting_openid: Logowanie i rejestracja przy użyciu OpenID | |||
field_identity_url: Identyfikator OpenID (URL) | |||
label_login_with_open_id_option: albo użyj OpenID | |||
field_content: Treść | |||
label_descending: Malejąco | |||
label_sort: Sortuj |
@@ -810,9 +810,6 @@ pt-BR: | |||
field_editable: Editável | |||
setting_repository_log_display_limit: Número máximo de revisões exibidas no arquivo de log | |||
setting_file_max_size_displayed: Tamanho máximo dos arquivos textos exibidos em linha | |||
setting_openid: Permitir Login e Registro via OpenID | |||
field_identity_url: OpenID URL | |||
label_login_with_open_id_option: ou use o OpenID | |||
field_content: Conteúdo | |||
label_descending: Descendente | |||
label_sort: Ordenar |
@@ -793,9 +793,6 @@ pt: | |||
setting_repository_log_display_limit: Número máximo de revisões exibido no relatório de ficheiro | |||
setting_file_max_size_displayed: Tamanho máximo dos ficheiros de texto exibidos inline | |||
field_watcher: Observador | |||
setting_openid: Permitir início de sessão e registo com OpenID | |||
field_identity_url: URL do OpenID | |||
label_login_with_open_id_option: ou início de sessão com OpenID | |||
field_content: Conteúdo | |||
label_descending: Descendente | |||
label_sort: Ordenar |
@@ -276,7 +276,6 @@ ro: | |||
field_parent_title: Pagina superioara | |||
field_editable: Modificabil | |||
field_watcher: Urmărește | |||
field_identity_url: URL OpenID | |||
field_content: Conținut | |||
setting_app_title: Titlu aplicație | |||
@@ -316,7 +315,6 @@ ro: | |||
setting_diff_max_lines_displayed: Număr maxim de linii de diferență afișate | |||
setting_file_max_size_displayed: Număr maxim de fișiere text afișate în pagină (inline) | |||
setting_repository_log_display_limit: Număr maxim de revizii afișate în istoricul fișierului | |||
setting_openid: Permite înregistrare și autentificare cu OpenID | |||
permission_edit_project: Editează proiectul | |||
permission_select_project_modules: Alege module pentru proiect | |||
@@ -422,7 +420,6 @@ ro: | |||
label_information: Informație | |||
label_information_plural: Informații | |||
label_register: Înregistrare | |||
label_login_with_open_id_option: sau autentificare cu OpenID | |||
label_password_lost: Parolă uitată | |||
label_home: Acasă | |||
label_my_page: Pagina mea |
@@ -342,7 +342,6 @@ ru: | |||
field_host: Компьютер | |||
field_hours: час(а,ов) | |||
field_identifier: Уникальный идентификатор | |||
field_identity_url: OpenID URL | |||
field_is_closed: Задача закрыта | |||
field_is_default: Значение по умолчанию | |||
field_is_filter: Используется в качестве фильтра | |||
@@ -559,7 +558,6 @@ ru: | |||
label_loading: Загрузка... | |||
label_logged_as: Вошли как | |||
label_login: Войти | |||
label_login_with_open_id_option: или войти с помощью OpenID | |||
label_logout: Выйти | |||
label_max_size: Максимальный размер | |||
label_member_new: Новый участник | |||
@@ -857,7 +855,6 @@ ru: | |||
setting_mail_from: Исходящий email адрес | |||
setting_mail_handler_api_enabled: Включить веб-сервис для входящих сообщений | |||
setting_mail_handler_api_key: API ключ | |||
setting_openid: Разрешить OpenID для входа и регистрации | |||
setting_per_page_options: Количество записей на страницу | |||
setting_plain_text_mail: Только простой текст (без HTML) | |||
setting_protocol: Протокол |
@@ -784,9 +784,6 @@ sk: | |||
setting_repository_log_display_limit: Maximálny počet revízií zobrazených v log súbore | |||
setting_file_max_size_displayed: Maximálna veľkosť textových súborov zobrazených priamo na stránke | |||
field_watcher: Pozorovatelia | |||
setting_openid: Povoliť prihlasovanie a registráciu pomocou OpenID | |||
field_identity_url: OpenID URL | |||
label_login_with_open_id_option: alebo sa prihlásiť pomocou OpenID | |||
field_content: Obsah | |||
label_descending: Zostupne | |||
label_sort: Zoradenie |
@@ -785,9 +785,6 @@ sl: | |||
setting_repository_log_display_limit: Največje število prikazanih revizij v log datoteki | |||
setting_file_max_size_displayed: Največja velikost besedilnih datotek v vključenem prikazu | |||
field_watcher: Opazovalec | |||
setting_openid: Dovoli OpenID prijavo in registracijo | |||
field_identity_url: OpenID URL | |||
label_login_with_open_id_option: ali se prijavi z OpenID | |||
field_content: Vsebina | |||
label_descending: Padajoče | |||
label_sort: Razvrsti |
@@ -310,7 +310,6 @@ sq: | |||
field_parent_title: Parent page | |||
field_editable: Editable | |||
field_watcher: Watcher | |||
field_identity_url: OpenID URL | |||
field_content: Content | |||
field_group_by: Group results by | |||
field_sharing: Sharing | |||
@@ -371,7 +370,6 @@ sq: | |||
setting_diff_max_lines_displayed: Maximum number of diff lines displayed | |||
setting_file_max_size_displayed: Maximum size of text files displayed inline | |||
setting_repository_log_display_limit: Maximum number of revisions displayed on file log | |||
setting_openid: Allow OpenID login and registration | |||
setting_password_min_length: Minimum password length | |||
setting_new_project_user_role_id: Role given to a non-admin user who creates a project | |||
setting_default_projects_modules: Default enabled modules for new projects | |||
@@ -512,7 +510,6 @@ sq: | |||
label_information: Informacion | |||
label_information_plural: Informacione | |||
label_register: Regjistrohu | |||
label_login_with_open_id_option: ose lidhu me OpenID | |||
label_password_lost: Fjalekalim i humbur | |||
label_home: Home | |||
label_my_page: Faqja ime |
@@ -304,7 +304,6 @@ sr-YU: | |||
field_parent_title: Matična stranica | |||
field_editable: Izmenljivo | |||
field_watcher: Posmatrač | |||
field_identity_url: OpenID URL | |||
field_content: Sadržaj | |||
field_group_by: Grupisanje rezultata po | |||
field_sharing: Deljenje | |||
@@ -349,7 +348,6 @@ sr-YU: | |||
setting_diff_max_lines_displayed: Maks. broj prikazanih različitih linija | |||
setting_file_max_size_displayed: Maks. veličina tekst. datoteka prikazanih umetnuto | |||
setting_repository_log_display_limit: Maks. broj revizija prikazanih u datoteci za evidenciju | |||
setting_openid: Dozvoli OpenID prijavu i registraciju | |||
setting_password_min_length: Minimalna dužina lozinke | |||
setting_new_project_user_role_id: Kreatoru projekta (koji nije administrator) dodeljuje je uloga | |||
setting_default_projects_modules: Podrazumevano omogućeni moduli za nove projekte | |||
@@ -472,7 +470,6 @@ sr-YU: | |||
label_information: Informacija | |||
label_information_plural: Informacije | |||
label_register: Registracija | |||
label_login_with_open_id_option: ili prijava sa OpenID | |||
label_password_lost: Izgubljena lozinka | |||
label_home: Početak | |||
label_my_page: Moja stranica |
@@ -302,7 +302,6 @@ sr: | |||
field_parent_title: Матична страница | |||
field_editable: Изменљиво | |||
field_watcher: Посматрач | |||
field_identity_url: OpenID URL | |||
field_content: Садржај | |||
field_group_by: Груписање резултата по | |||
field_sharing: Дељење | |||
@@ -347,7 +346,6 @@ sr: | |||
setting_diff_max_lines_displayed: Макс. број приказаних различитих линија | |||
setting_file_max_size_displayed: Макс. величина текст. датотека приказаних уметнуто | |||
setting_repository_log_display_limit: Макс. број ревизија приказаних у датотеци за евиденцију | |||
setting_openid: Дозволи OpenID пријаву и регистрацију | |||
setting_password_min_length: Минимална дужина лозинке | |||
setting_new_project_user_role_id: Креатору пројекта (који није администратор) додељује је улога | |||
setting_default_projects_modules: Подразумевано омогућени модули за нове пројекте | |||
@@ -470,7 +468,6 @@ sr: | |||
label_information: Информација | |||
label_information_plural: Информације | |||
label_register: Регистрација | |||
label_login_with_open_id_option: или пријава са OpenID | |||
label_password_lost: Изгубљена лозинка | |||
label_home: Почетак | |||
label_my_page: Моја страница |
@@ -355,7 +355,6 @@ sv: | |||
field_parent_title: Föräldersida | |||
field_editable: Redigerbar | |||
field_watcher: Bevakare | |||
field_identity_url: OpenID URL | |||
field_content: Innehåll | |||
field_group_by: Gruppera resultat efter | |||
field_sharing: Delning | |||
@@ -425,7 +424,6 @@ sv: | |||
setting_diff_max_lines_displayed: Maximalt antal synliga rader i diff | |||
setting_file_max_size_displayed: Maxstorlek på textfiler som visas inline | |||
setting_repository_log_display_limit: Maximalt antal revisioner i filloggen | |||
setting_openid: Tillåt inloggning och registrering med OpenID | |||
setting_password_min_length: Minsta tillåtna lösenordslängd | |||
setting_new_project_user_role_id: Tilldelad roll för en icke-administratör som skapar ett projekt | |||
setting_default_projects_modules: Aktiverade moduler för nya projekt | |||
@@ -579,7 +577,6 @@ sv: | |||
label_information: Information | |||
label_information_plural: Information | |||
label_register: Registrera | |||
label_login_with_open_id_option: eller logga in med OpenID | |||
label_password_lost: Glömt lösenord | |||
label_home: Hem | |||
label_my_page: Min sida |
@@ -784,9 +784,6 @@ th: | |||
setting_repository_log_display_limit: Maximum number of revisions displayed on file log | |||
setting_file_max_size_displayed: Max size of text files displayed inline | |||
field_watcher: Watcher | |||
setting_openid: Allow OpenID login and registration | |||
field_identity_url: OpenID URL | |||
label_login_with_open_id_option: or login with OpenID | |||
field_content: Content | |||
label_descending: Descending | |||
label_sort: Sort |
@@ -800,9 +800,6 @@ tr: | |||
setting_repository_log_display_limit: Dosya kaydında gösterilecek maksimum değişim sayısı | |||
setting_file_max_size_displayed: Dahili olarak gösterilecek metin dosyaları için maksimum satır sayısı | |||
field_watcher: Takipçi | |||
setting_openid: Kayıt ve giriş için OpenID'ye izin ver | |||
field_identity_url: OpenID URL | |||
label_login_with_open_id_option: veya OpenID kullanın | |||
field_content: İçerik | |||
label_descending: Azalan | |||
label_sort: Sırala |
@@ -799,9 +799,6 @@ uk: | |||
setting_repository_log_display_limit: Максимальна кількість редакцій, відображених в журналі змін | |||
setting_file_max_size_displayed: Максимальний розмір текстового файлу для відображення | |||
field_watcher: Спостерігач | |||
setting_openid: Дозволити OpenID для входу та реєстрації | |||
field_identity_url: OpenID URL | |||
label_login_with_open_id_option: або війти з допомогою OpenID | |||
field_content: Вміст | |||
label_descending: За спаданням | |||
label_sort: Сортувати |
@@ -839,9 +839,6 @@ vi: | |||
setting_repository_log_display_limit: Số lượng tối đa các bản điều chỉnh hiển thị trong file log | |||
setting_file_max_size_displayed: Kích thước tối đa của tệp tin văn bản | |||
field_watcher: Người quan sát | |||
setting_openid: Cho phép đăng nhập và đăng ký dùng OpenID | |||
field_identity_url: OpenID URL | |||
label_login_with_open_id_option: hoặc đăng nhập với OpenID | |||
field_content: Nội dung | |||
label_descending: Giảm dần | |||
label_sort: Sắp xếp |
@@ -423,7 +423,6 @@ | |||
field_parent_title: 父頁面 | |||
field_editable: 可編輯 | |||
field_watcher: 監看員 | |||
field_identity_url: OpenID 網址 | |||
field_content: 內容 | |||
field_group_by: 結果分組方式 | |||
field_sharing: 共用 | |||
@@ -510,7 +509,6 @@ | |||
setting_diff_max_lines_displayed: 差異顯示行數之最大值 | |||
setting_file_max_size_displayed: 檔案內容顯示大小之最大值 | |||
setting_repository_log_display_limit: 修訂版顯示數目之最大值 | |||
setting_openid: 允許使用 OpenID 登入與註冊 | |||
setting_password_max_age: 必須在多少天後變更密碼 | |||
setting_password_min_length: 密碼最小長度 | |||
setting_lost_password: 允許使用電子郵件重新設定密碼 | |||
@@ -686,7 +684,6 @@ | |||
label_information: 資訊 | |||
label_information_plural: 資訊 | |||
label_register: 註冊 | |||
label_login_with_open_id_option: 或使用 OpenID 登入 | |||
label_password_lost: 遺失密碼 | |||
label_password_required: 確認您的密碼後繼續 | |||
label_home: 網站首頁 |
@@ -308,7 +308,6 @@ zh: | |||
field_parent_title: 上级页面 | |||
field_editable: 可编辑 | |||
field_watcher: 关注者 | |||
field_identity_url: OpenID URL | |||
field_content: 内容 | |||
field_group_by: 根据此条件分组 | |||
field_sharing: 共享 | |||
@@ -358,7 +357,6 @@ zh: | |||
setting_diff_max_lines_displayed: 查看差别页面上显示的最大行数 | |||
setting_file_max_size_displayed: 允许直接显示的最大文本文件 | |||
setting_repository_log_display_limit: 在文件变更记录页面上显示的最大修订版本数量 | |||
setting_openid: 允许使用OpenID登录和注册 | |||
setting_password_min_length: 最短密码长度 | |||
setting_new_project_user_role_id: 非管理员用户新建项目时将被赋予的(在该项目中的)角色 | |||
setting_default_projects_modules: 新建项目默认启用的模块 | |||
@@ -487,7 +485,6 @@ zh: | |||
label_information: 信息 | |||
label_information_plural: 信息 | |||
label_register: 注册 | |||
label_login_with_open_id_option: 或使用OpenID登录 | |||
label_password_lost: 忘记密码 | |||
label_home: 主页 | |||
label_my_page: 我的工作台 |
@@ -303,9 +303,6 @@ emails_footer: | |||
To change your notification preferences, please click here: http://hostname/my/account | |||
gravatar_enabled: | |||
default: 0 | |||
openid: | |||
default: 0 | |||
security_notifications: 1 | |||
gravatar_default: | |||
default: 'identicon' | |||
start_of_week: |
@@ -0,0 +1,5 @@ | |||
class RemoveIdentityUrlFromUsers < ActiveRecord::Migration[6.1] | |||
def change | |||
remove_column :users, :identity_url, :string | |||
end | |||
end |
@@ -0,0 +1,18 @@ | |||
class DropOpenIdAuthenticationTables < ActiveRecord::Migration[6.1] | |||
def change | |||
drop_table :open_id_authentication_associations do |t| | |||
t.integer "issued" | |||
t.integer "lifetime" | |||
t.string "handle" | |||
t.string "assoc_type" | |||
t.binary "server_url" | |||
t.binary "secret" | |||
end | |||
drop_table :open_id_authentication_nonces do |t| | |||
t.integer "timestamp", null: false | |||
t.string "server_url" | |||
t.string "salt", null: false | |||
end | |||
end | |||
end |
@@ -0,0 +1,5 @@ | |||
class RemoveOpenIdSetting < ActiveRecord::Migration[6.1] | |||
def change | |||
Setting.where(:name => 'openid').delete_all | |||
end | |||
end |
@@ -1,37 +0,0 @@ | |||
* Dump heavy lifting off to rack-openid gem. OpenIdAuthentication is just a simple controller concern. | |||
* Fake HTTP method from OpenID server since they only support a GET. Eliminates the need to set an extra route to match the server's reply. [Josh Peek] | |||
* OpenID 2.0 recommends that forms should use the field name "openid_identifier" rather than "openid_url" [Josh Peek] | |||
* Return open_id_response.display_identifier to the application instead of .endpoints.claimed_id. [nbibler] | |||
* Add Timeout protection [Rick] | |||
* An invalid identity url passed through authenticate_with_open_id will no longer raise an InvalidOpenId exception. Instead it will return Result[:missing] to the completion block. | |||
* Allow a return_to option to be used instead of the requested url [Josh Peek] | |||
* Updated plugin to use Ruby OpenID 2.x.x [Josh Peek] | |||
* Tied plugin to ruby-openid 1.1.4 gem until we can make it compatible with 2.x [DHH] | |||
* Use URI instead of regexps to normalize the URL and gain free, better matching #8136 [dkubb] | |||
* Allow -'s in #normalize_url [Rick] | |||
* remove instance of mattr_accessor, it was breaking tests since they don't load ActiveSupport. Fix Timeout test [Rick] | |||
* Throw a InvalidOpenId exception instead of just a RuntimeError when the URL can't be normalized [DHH] | |||
* Just use the path for the return URL, so extra query parameters don't interfere [DHH] | |||
* Added a new default database-backed store after experiencing trouble with the filestore on NFS. The file store is still available as an option [DHH] | |||
* Added normalize_url and applied it to all operations going through the plugin [DHH] | |||
* Removed open_id? as the idea of using the same input box for both OpenID and username has died -- use using_open_id? instead (which checks for the presence of params[:openid_url] by default) [DHH] | |||
* Added OpenIdAuthentication::Result to make it easier to deal with default situations where you don't care to do something particular for each error state [DHH] | |||
* Stop relying on root_url being defined, we can just grab the current url instead [DHH] |
@@ -1,223 +0,0 @@ | |||
OpenIdAuthentication | |||
==================== | |||
Provides a thin wrapper around the excellent ruby-openid gem from JanRan. Be sure to install that first: | |||
gem install ruby-openid | |||
To understand what OpenID is about and how it works, it helps to read the documentation for lib/openid/consumer.rb | |||
from that gem. | |||
The specification used is http://openid.net/specs/openid-authentication-2_0.html. | |||
Prerequisites | |||
============= | |||
OpenID authentication uses the session, so be sure that you haven't turned that off. | |||
Alternatively, you can use the file-based store, which just relies on on tmp/openids being present in RAILS_ROOT. But be aware that this store only works if you have a single application server. And it's not safe to use across NFS. It's recommended that you use the database store if at all possible. To use the file-based store, you'll also have to add this line to your config/environment.rb: | |||
OpenIdAuthentication.store = :file | |||
This particular plugin also relies on the fact that the authentication action allows for both POST and GET operations. | |||
If you're using RESTful authentication, you'll need to explicitly allow for this in your routes.rb. | |||
The plugin also expects to find a root_url method that points to the home page of your site. You can accomplish this by using a root route in config/routes.rb: | |||
map.root :controller => 'articles' | |||
This plugin relies on Rails Edge revision 6317 or newer. | |||
Example | |||
======= | |||
This example is just to meant to demonstrate how you could use OpenID authentication. You might well want to add | |||
salted hash logins instead of plain text passwords and other requirements on top of this. Treat it as a starting point, | |||
not a destination. | |||
Note that the User model referenced in the simple example below has an 'identity_url' attribute. You will want to add the same or similar field to whatever | |||
model you are using for authentication. | |||
Also of note is the following code block used in the example below: | |||
authenticate_with_open_id do |result, identity_url| | |||
... | |||
end | |||
In the above code block, 'identity_url' will need to match user.identity_url exactly. 'identity_url' will be a string in the form of 'http://example.com' - | |||
If you are storing just 'example.com' with your user, the lookup will fail. | |||
There is a handy method in this plugin called 'normalize_url' that will help with validating OpenID URLs. | |||
OpenIdAuthentication.normalize_url(user.identity_url) | |||
The above will return a standardized version of the OpenID URL - the above called with 'example.com' will return 'http://example.com/' | |||
It will also raise an InvalidOpenId exception if the URL is determined to not be valid. | |||
Use the above code in your User model and validate OpenID URLs before saving them. | |||
config/routes.rb | |||
map.root :controller => 'articles' | |||
map.resource :session | |||
app/views/sessions/new.erb | |||
<% form_tag(session_url) do %> | |||
<p> | |||
<label for="name">Username:</label> | |||
<%= text_field_tag "name" %> | |||
</p> | |||
<p> | |||
<label for="password">Password:</label> | |||
<%= password_field_tag %> | |||
</p> | |||
<p> | |||
...or use: | |||
</p> | |||
<p> | |||
<label for="openid_identifier">OpenID:</label> | |||
<%= text_field_tag "openid_identifier" %> | |||
</p> | |||
<p> | |||
<%= submit_tag 'Sign in', :disable_with => "Signing in…" %> | |||
</p> | |||
<% end %> | |||
app/controllers/sessions_controller.rb | |||
class SessionsController < ApplicationController | |||
def create | |||
if using_open_id? | |||
open_id_authentication | |||
else | |||
password_authentication(params[:name], params[:password]) | |||
end | |||
end | |||
protected | |||
def password_authentication(name, password) | |||
if @current_user = @account.users.authenticate(params[:name], params[:password]) | |||
successful_login | |||
else | |||
failed_login "Sorry, that username/password doesn't work" | |||
end | |||
end | |||
def open_id_authentication | |||
authenticate_with_open_id do |result, identity_url| | |||
if result.successful? | |||
if @current_user = @account.users.find_by_identity_url(identity_url) | |||
successful_login | |||
else | |||
failed_login "Sorry, no user by that identity URL exists (#{identity_url})" | |||
end | |||
else | |||
failed_login result.message | |||
end | |||
end | |||
end | |||
private | |||
def successful_login | |||
session[:user_id] = @current_user.id | |||
redirect_to(root_url) | |||
end | |||
def failed_login(message) | |||
flash[:error] = message | |||
redirect_to(new_session_url) | |||
end | |||
end | |||
If you're fine with the result messages above and don't need individual logic on a per-failure basis, | |||
you can collapse the case into a mere boolean: | |||
def open_id_authentication | |||
authenticate_with_open_id do |result, identity_url| | |||
if result.successful? && @current_user = @account.users.find_by_identity_url(identity_url) | |||
successful_login | |||
else | |||
failed_login(result.message || "Sorry, no user by that identity URL exists (#{identity_url})") | |||
end | |||
end | |||
end | |||
Simple Registration OpenID Extension | |||
==================================== | |||
Some OpenID Providers support this lightweight profile exchange protocol. See more: http://www.openidenabled.com/openid/simple-registration-extension | |||
You can support it in your app by changing #open_id_authentication | |||
def open_id_authentication(identity_url) | |||
# Pass optional :required and :optional keys to specify what sreg fields you want. | |||
# Be sure to yield registration, a third argument in the #authenticate_with_open_id block. | |||
authenticate_with_open_id(identity_url, | |||
:required => [ :nickname, :email ], | |||
:optional => :fullname) do |result, identity_url, registration| | |||
case result.status | |||
when :missing | |||
failed_login "Sorry, the OpenID server couldn't be found" | |||
when :invalid | |||
failed_login "Sorry, but this does not appear to be a valid OpenID" | |||
when :canceled | |||
failed_login "OpenID verification was canceled" | |||
when :failed | |||
failed_login "Sorry, the OpenID verification failed" | |||
when :successful | |||
if @current_user = @account.users.find_by_identity_url(identity_url) | |||
assign_registration_attributes!(registration) | |||
if current_user.save | |||
successful_login | |||
else | |||
failed_login "Your OpenID profile registration failed: " + | |||
@current_user.errors.full_messages.to_sentence | |||
end | |||
else | |||
failed_login "Sorry, no user by that identity URL exists" | |||
end | |||
end | |||
end | |||
end | |||
# registration is a hash containing the valid sreg keys given above | |||
# use this to map them to fields of your user model | |||
def assign_registration_attributes!(registration) | |||
model_to_registration_mapping.each do |model_attribute, registration_attribute| | |||
unless registration[registration_attribute].blank? | |||
@current_user.send("#{model_attribute}=", registration[registration_attribute]) | |||
end | |||
end | |||
end | |||
def model_to_registration_mapping | |||
{ :login => 'nickname', :email => 'email', :display_name => 'fullname' } | |||
end | |||
Attribute Exchange OpenID Extension | |||
=================================== | |||
Some OpenID providers also support the OpenID AX (attribute exchange) protocol for exchanging identity information between endpoints. See more: http://openid.net/specs/openid-attribute-exchange-1_0.html | |||
Accessing AX data is very similar to the Simple Registration process, described above -- just add the URI identifier for the AX field to your :optional or :required parameters. For example: | |||
authenticate_with_open_id(identity_url, | |||
:required => [ :email, 'http://schema.openid.net/birthDate' ]) do |result, identity_url, registration| | |||
This would provide the sreg data for :email, and the AX data for 'http://schema.openid.net/birthDate' | |||
Copyright (c) 2007 David Heinemeier Hansson, released under the MIT license |
@@ -1,22 +0,0 @@ | |||
require 'rake' | |||
require 'rake/testtask' | |||
require 'rake/rdoctask' | |||
desc 'Default: run unit tests.' | |||
task :default => :test | |||
desc 'Test the open_id_authentication plugin.' | |||
Rake::TestTask.new(:test) do |t| | |||
t.libs << 'lib' | |||
t.pattern = 'test/**/*_test.rb' | |||
t.verbose = true | |||
end | |||
desc 'Generate documentation for the open_id_authentication plugin.' | |||
Rake::RDocTask.new(:rdoc) do |rdoc| | |||
rdoc.rdoc_dir = 'rdoc' | |||
rdoc.title = 'OpenIdAuthentication' | |||
rdoc.options << '--line-numbers' << '--inline-source' | |||
rdoc.rdoc_files.include('README') | |||
rdoc.rdoc_files.include('lib/**/*.rb') | |||
end |
@@ -1,11 +0,0 @@ | |||
class OpenIdAuthenticationTablesGenerator < Rails::Generator::NamedBase | |||
def initialize(runtime_args, runtime_options = {}) | |||
super | |||
end | |||
def manifest | |||
record do |m| | |||
m.migration_template 'migration.rb', 'db/migrate' | |||
end | |||
end | |||
end |
@@ -1,20 +0,0 @@ | |||
class <%= class_name %> < ActiveRecord::Migration | |||
def self.up | |||
create_table :open_id_authentication_associations, :force => true do |t| | |||
t.integer :issued, :lifetime | |||
t.string :handle, :assoc_type | |||
t.binary :server_url, :secret | |||
end | |||
create_table :open_id_authentication_nonces, :force => true do |t| | |||
t.integer :timestamp, :null => false | |||
t.string :server_url, :null => true | |||
t.string :salt, :null => false | |||
end | |||
end | |||
def self.down | |||
drop_table :open_id_authentication_associations | |||
drop_table :open_id_authentication_nonces | |||
end | |||
end |
@@ -1,26 +0,0 @@ | |||
class <%= class_name %> < ActiveRecord::Migration | |||
def self.up | |||
drop_table :open_id_authentication_settings | |||
drop_table :open_id_authentication_nonces | |||
create_table :open_id_authentication_nonces, :force => true do |t| | |||
t.integer :timestamp, :null => false | |||
t.string :server_url, :null => true | |||
t.string :salt, :null => false | |||
end | |||
end | |||
def self.down | |||
drop_table :open_id_authentication_nonces | |||
create_table :open_id_authentication_nonces, :force => true do |t| | |||
t.integer :created | |||
t.string :nonce | |||
end | |||
create_table :open_id_authentication_settings, :force => true do |t| | |||
t.string :setting | |||
t.binary :value | |||
end | |||
end | |||
end |
@@ -1,11 +0,0 @@ | |||
class UpgradeOpenIdAuthenticationTablesGenerator < Rails::Generator::NamedBase | |||
def initialize(runtime_args, runtime_options = {}) | |||
super | |||
end | |||
def manifest | |||
record do |m| | |||
m.migration_template 'migration.rb', 'db/migrate' | |||
end | |||
end | |||
end |
@@ -1,10 +0,0 @@ | |||
# frozen_string_literal: false | |||
require File.dirname(__FILE__) + '/lib/open_id_authentication' | |||
config.middleware.use OpenIdAuthentication | |||
config.after_initialize do | |||
OpenID::Util.logger = Rails.logger | |||
ActionController::Base.send :include, OpenIdAuthentication | |||
end |
@@ -1,159 +0,0 @@ | |||
require 'uri' | |||
require 'openid' | |||
require 'rack/openid' | |||
module OpenIdAuthentication | |||
def self.new(app) | |||
store = OpenIdAuthentication.store | |||
if store.nil? | |||
Rails.logger.warn "OpenIdAuthentication.store is nil. Using in-memory store." | |||
end | |||
::Rack::OpenID.new(app, OpenIdAuthentication.store) | |||
end | |||
def self.store | |||
@@store | |||
end | |||
def self.store=(*store_option) | |||
store, *parameters = *([ store_option ].flatten) | |||
@@store = case store | |||
when :memory | |||
require 'openid/store/memory' | |||
OpenID::Store::Memory.new | |||
when :file | |||
require 'openid/store/filesystem' | |||
OpenID::Store::Filesystem.new(Rails.root.join('tmp/openids')) | |||
when :memcache | |||
require 'memcache' | |||
require 'openid/store/memcache' | |||
OpenID::Store::Memcache.new(MemCache.new(parameters)) | |||
else | |||
store | |||
end | |||
end | |||
self.store = nil | |||
class InvalidOpenId < StandardError | |||
end | |||
class Result | |||
ERROR_MESSAGES = { | |||
:missing => "Sorry, the OpenID server couldn't be found", | |||
:invalid => "Sorry, but this does not appear to be a valid OpenID", | |||
:canceled => "OpenID verification was canceled", | |||
:failed => "OpenID verification failed", | |||
:setup_needed => "OpenID verification needs setup" | |||
} | |||
def self.[](code) | |||
new(code) | |||
end | |||
def initialize(code) | |||
@code = code | |||
end | |||
def status | |||
@code | |||
end | |||
ERROR_MESSAGES.each_key { |state| define_method("#{state}?") { @code == state } } | |||
def successful? | |||
@code == :successful | |||
end | |||
def unsuccessful? | |||
ERROR_MESSAGES.keys.include?(@code) | |||
end | |||
def message | |||
ERROR_MESSAGES[@code] | |||
end | |||
end | |||
# normalizes an OpenID according to http://openid.net/specs/openid-authentication-2_0.html#normalization | |||
def self.normalize_identifier(identifier) | |||
# clean up whitespace | |||
identifier = identifier.to_s.strip | |||
# if an XRI has a prefix, strip it. | |||
identifier.gsub!(/xri:\/\//i, '') | |||
# dodge XRIs -- TODO: validate, don't just skip. | |||
unless ['=', '@', '+', '$', '!', '('].include?(identifier.at(0)) | |||
# does it begin with http? if not, add it. | |||
identifier = +"http://#{identifier}" unless /^http/i.match?(identifier) | |||
# strip any fragments | |||
identifier.gsub!(/\#(.*)$/, '') | |||
begin | |||
uri = URI.parse(identifier) | |||
uri.scheme = uri.scheme.downcase if uri.scheme # URI should do this | |||
identifier = uri.normalize.to_s | |||
rescue URI::InvalidURIError | |||
raise InvalidOpenId.new("#{identifier} is not an OpenID identifier") | |||
end | |||
end | |||
return identifier | |||
end | |||
protected | |||
# The parameter name of "openid_identifier" is used rather than | |||
# the Rails convention "open_id_identifier" because that's what | |||
# the specification dictates in order to get browser auto-complete | |||
# working across sites | |||
def using_open_id?(identifier = nil) | |||
identifier ||= open_id_identifier | |||
!identifier.blank? || request.env[Rack::OpenID::RESPONSE] | |||
end | |||
def authenticate_with_open_id(identifier = nil, options = {}, &block) | |||
identifier ||= open_id_identifier | |||
if request.env[Rack::OpenID::RESPONSE] | |||
complete_open_id_authentication(&block) | |||
else | |||
begin_open_id_authentication(identifier, options, &block) | |||
end | |||
end | |||
private | |||
def open_id_identifier | |||
params[:openid_identifier] || params[:openid_url] | |||
end | |||
def begin_open_id_authentication(identifier, options = {}) | |||
options[:identifier] = identifier | |||
value = Rack::OpenID.build_header(options) | |||
response.headers[Rack::OpenID::AUTHENTICATE_HEADER] = value | |||
head :unauthorized | |||
end | |||
def complete_open_id_authentication | |||
response = request.env[Rack::OpenID::RESPONSE] | |||
identifier = response.display_identifier | |||
case response.status | |||
when OpenID::Consumer::SUCCESS | |||
yield Result[:successful], identifier, | |||
OpenID::SReg::Response.from_success_response(response) | |||
when :missing | |||
yield Result[:missing], identifier, nil | |||
when :invalid | |||
yield Result[:invalid], identifier, nil | |||
when OpenID::Consumer::CANCEL | |||
yield Result[:canceled], identifier, nil | |||
when OpenID::Consumer::FAILURE | |||
yield Result[:failed], identifier, nil | |||
when OpenID::Consumer::SETUP_NEEDED | |||
yield Result[:setup_needed], response.setup_url, nil | |||
end | |||
end | |||
end |
@@ -1,11 +0,0 @@ | |||
# frozen_string_literal: true | |||
module OpenIdAuthentication | |||
class Association < ActiveRecord::Base | |||
self.table_name = :open_id_authentication_associations | |||
def from_record | |||
OpenID::Association.new(handle, secret, issued, lifetime, assoc_type) | |||
end | |||
end | |||
end |
@@ -1,57 +0,0 @@ | |||
# frozen_string_literal: false | |||
require 'openid/store/interface' | |||
module OpenIdAuthentication | |||
class DbStore < OpenID::Store::Interface | |||
def self.cleanup_nonces | |||
now = Time.now.to_i | |||
Nonce.delete_all(["timestamp > ? OR timestamp < ?", now + OpenID::Nonce.skew, now - OpenID::Nonce.skew]) | |||
end | |||
def self.cleanup_associations | |||
now = Time.now.to_i | |||
Association.delete_all(['issued + lifetime > ?',now]) | |||
end | |||
def store_association(server_url, assoc) | |||
remove_association(server_url, assoc.handle) | |||
Association.create(:server_url => server_url, | |||
:handle => assoc.handle, | |||
:secret => assoc.secret, | |||
:issued => assoc.issued, | |||
:lifetime => assoc.lifetime, | |||
:assoc_type => assoc.assoc_type) | |||
end | |||
def get_association(server_url, handle = nil) | |||
assocs = if handle.blank? | |||
Association.find_all_by_server_url(server_url) | |||
else | |||
Association.find_all_by_server_url_and_handle(server_url, handle) | |||
end | |||
assocs.reverse_each do |assoc| | |||
a = assoc.from_record | |||
if a.expires_in == 0 | |||
assoc.destroy | |||
else | |||
return a | |||
end | |||
end if assocs.any? | |||
return nil | |||
end | |||
def remove_association(server_url, handle) | |||
Association.delete_all(['server_url = ? AND handle = ?', server_url, handle]) > 0 | |||
end | |||
def use_nonce(server_url, timestamp, salt) | |||
return false if Nonce.find_by_server_url_and_timestamp_and_salt(server_url, timestamp, salt) | |||
return false if (timestamp - Time.now.to_i).abs > OpenID::Nonce.skew | |||
Nonce.create(:server_url => server_url, :timestamp => timestamp, :salt => salt) | |||
return true | |||
end | |||
end | |||
end |
@@ -1,75 +0,0 @@ | |||
# frozen_string_literal: false | |||
require 'digest/sha1' | |||
require 'openid/store/interface' | |||
module OpenIdAuthentication | |||
class MemCacheStore < OpenID::Store::Interface | |||
def initialize(*addresses) | |||
@connection = ActiveSupport::Cache::MemCacheStore.new(addresses) | |||
end | |||
def store_association(server_url, assoc) | |||
server_key = association_server_key(server_url) | |||
assoc_key = association_key(server_url, assoc.handle) | |||
assocs = @connection.read(server_key) || {} | |||
assocs[assoc.issued] = assoc_key | |||
@connection.write(server_key, assocs) | |||
@connection.write(assoc_key, assoc, :expires_in => assoc.lifetime) | |||
end | |||
def get_association(server_url, handle = nil) | |||
if handle | |||
@connection.read(association_key(server_url, handle)) | |||
else | |||
server_key = association_server_key(server_url) | |||
assocs = @connection.read(server_key) | |||
return if assocs.nil? | |||
last_key = assocs[assocs.keys.sort.last] | |||
@connection.read(last_key) | |||
end | |||
end | |||
def remove_association(server_url, handle) | |||
server_key = association_server_key(server_url) | |||
assoc_key = association_key(server_url, handle) | |||
assocs = @connection.read(server_key) | |||
return false unless assocs && assocs.has_value?(assoc_key) | |||
assocs = assocs.delete_if { |key, value| value == assoc_key } | |||
@connection.write(server_key, assocs) | |||
@connection.delete(assoc_key) | |||
return true | |||
end | |||
def use_nonce(server_url, timestamp, salt) | |||
return false if @connection.read(nonce_key(server_url, salt)) | |||
return false if (timestamp - Time.now.to_i).abs > OpenID::Nonce.skew | |||
@connection.write(nonce_key(server_url, salt), timestamp, :expires_in => OpenID::Nonce.skew) | |||
return true | |||
end | |||
private | |||
def association_key(server_url, handle = nil) | |||
"openid_association_#{digest(server_url)}_#{digest(handle)}" | |||
end | |||
def association_server_key(server_url) | |||
"openid_association_server_#{digest(server_url)}" | |||
end | |||
def nonce_key(server_url, salt) | |||
"openid_nonce_#{digest(server_url)}_#{digest(salt)}" | |||
end | |||
def digest(text) | |||
Digest::SHA1.hexdigest(text) | |||
end | |||
end | |||
end |
@@ -1,7 +0,0 @@ | |||
# frozen_string_literal: true | |||
module OpenIdAuthentication | |||
class Nonce < ActiveRecord::Base | |||
self.table_name = :open_id_authentication_nonces | |||
end | |||
end |
@@ -1,25 +0,0 @@ | |||
# frozen_string_literal: false | |||
module OpenIdAuthentication | |||
module Request | |||
def self.included(base) | |||
base.alias_method_chain :request_method, :openid | |||
end | |||
def request_method_with_openid | |||
if !parameters[:_method].blank? && parameters[:open_id_complete] == '1' | |||
parameters[:_method].to_sym | |||
else | |||
request_method_without_openid | |||
end | |||
end | |||
end | |||
end | |||
# In Rails 2.3, the request object has been renamed | |||
# from AbstractRequest to Request | |||
if defined? ActionController::Request | |||
ActionController::Request.send :include, OpenIdAuthentication::Request | |||
else | |||
ActionController::AbstractRequest.send :include, OpenIdAuthentication::Request | |||
end |
@@ -1,22 +0,0 @@ | |||
# frozen_string_literal: true | |||
# http://trac.openidenabled.com/trac/ticket/156 | |||
module OpenID | |||
@@timeout_threshold = 20 | |||
def self.timeout_threshold | |||
@@timeout_threshold | |||
end | |||
def self.timeout_threshold=(value) | |||
@@timeout_threshold = value | |||
end | |||
class StandardFetcher | |||
def make_http(uri) | |||
http = @proxy.new(uri.host, uri.port) | |||
http.read_timeout = http.open_timeout = OpenID.timeout_threshold | |||
http | |||
end | |||
end | |||
end |
@@ -1,30 +0,0 @@ | |||
namespace :open_id_authentication do | |||
namespace :db do | |||
desc "Creates authentication tables for use with OpenIdAuthentication" | |||
task :create => :environment do | |||
generate_migration(["open_id_authentication_tables", "add_open_id_authentication_tables"]) | |||
end | |||
desc "Upgrade authentication tables from ruby-openid 1.x.x to 2.x.x" | |||
task :upgrade => :environment do | |||
generate_migration(["upgrade_open_id_authentication_tables", "upgrade_open_id_authentication_tables"]) | |||
end | |||
def generate_migration(args) | |||
require 'rails_generator' | |||
require 'rails_generator/scripts/generate' | |||
if ActiveRecord::Base.connection.supports_migrations? | |||
Rails::Generator::Scripts::Generate.new.run(args) | |||
else | |||
raise "Task unavailable to this database (no migration support)" | |||
end | |||
end | |||
desc "Clear the authentication tables" | |||
task :clear => :environment do | |||
OpenIdAuthentication::DbStore.cleanup_nonces | |||
OpenIdAuthentication::DbStore.cleanup_associations | |||
end | |||
end | |||
end |
@@ -1,151 +0,0 @@ | |||
require File.dirname(__FILE__) + '/test_helper' | |||
require File.dirname(__FILE__) + '/../lib/open_id_authentication/mem_cache_store' | |||
# Mock MemCacheStore with MemoryStore for testing | |||
class OpenIdAuthentication::MemCacheStore < OpenID::Store::Interface | |||
def initialize(*addresses) | |||
@connection = ActiveSupport::Cache::MemoryStore.new | |||
end | |||
end | |||
class MemCacheStoreTest < Test::Unit::TestCase | |||
ALLOWED_HANDLE = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~' | |||
def setup | |||
@store = OpenIdAuthentication::MemCacheStore.new | |||
end | |||
def test_store | |||
server_url = "http://www.myopenid.com/openid" | |||
assoc = gen_assoc(0) | |||
# Make sure that a missing association returns no result | |||
assert_retrieve(server_url) | |||
# Check that after storage, getting returns the same result | |||
@store.store_association(server_url, assoc) | |||
assert_retrieve(server_url, nil, assoc) | |||
# more than once | |||
assert_retrieve(server_url, nil, assoc) | |||
# Storing more than once has no ill effect | |||
@store.store_association(server_url, assoc) | |||
assert_retrieve(server_url, nil, assoc) | |||
# Removing an association that does not exist returns not present | |||
assert_remove(server_url, assoc.handle + 'x', false) | |||
# Removing an association that does not exist returns not present | |||
assert_remove(server_url + 'x', assoc.handle, false) | |||
# Removing an association that is present returns present | |||
assert_remove(server_url, assoc.handle, true) | |||
# but not present on subsequent calls | |||
assert_remove(server_url, assoc.handle, false) | |||
# Put assoc back in the store | |||
@store.store_association(server_url, assoc) | |||
# More recent and expires after assoc | |||
assoc2 = gen_assoc(1) | |||
@store.store_association(server_url, assoc2) | |||
# After storing an association with a different handle, but the | |||
# same server_url, the handle with the later expiration is returned. | |||
assert_retrieve(server_url, nil, assoc2) | |||
# We can still retrieve the older association | |||
assert_retrieve(server_url, assoc.handle, assoc) | |||
# Plus we can retrieve the association with the later expiration | |||
# explicitly | |||
assert_retrieve(server_url, assoc2.handle, assoc2) | |||
# More recent, and expires earlier than assoc2 or assoc. Make sure | |||
# that we're picking the one with the latest issued date and not | |||
# taking into account the expiration. | |||
assoc3 = gen_assoc(2, 100) | |||
@store.store_association(server_url, assoc3) | |||
assert_retrieve(server_url, nil, assoc3) | |||
assert_retrieve(server_url, assoc.handle, assoc) | |||
assert_retrieve(server_url, assoc2.handle, assoc2) | |||
assert_retrieve(server_url, assoc3.handle, assoc3) | |||
assert_remove(server_url, assoc2.handle, true) | |||
assert_retrieve(server_url, nil, assoc3) | |||
assert_retrieve(server_url, assoc.handle, assoc) | |||
assert_retrieve(server_url, assoc2.handle, nil) | |||
assert_retrieve(server_url, assoc3.handle, assoc3) | |||
assert_remove(server_url, assoc2.handle, false) | |||
assert_remove(server_url, assoc3.handle, true) | |||
assert_retrieve(server_url, nil, assoc) | |||
assert_retrieve(server_url, assoc.handle, assoc) | |||
assert_retrieve(server_url, assoc2.handle, nil) | |||
assert_retrieve(server_url, assoc3.handle, nil) | |||
assert_remove(server_url, assoc2.handle, false) | |||
assert_remove(server_url, assoc.handle, true) | |||
assert_remove(server_url, assoc3.handle, false) | |||
assert_retrieve(server_url, nil, nil) | |||
assert_retrieve(server_url, assoc.handle, nil) | |||
assert_retrieve(server_url, assoc2.handle, nil) | |||
assert_retrieve(server_url, assoc3.handle, nil) | |||
assert_remove(server_url, assoc2.handle, false) | |||
assert_remove(server_url, assoc.handle, false) | |||
assert_remove(server_url, assoc3.handle, false) | |||
end | |||
def test_nonce | |||
server_url = "http://www.myopenid.com/openid" | |||
[server_url, ''].each do |url| | |||
nonce1 = OpenID::Nonce::mk_nonce | |||
assert_nonce(nonce1, true, url, "#{url}: nonce allowed by default") | |||
assert_nonce(nonce1, false, url, "#{url}: nonce not allowed twice") | |||
assert_nonce(nonce1, false, url, "#{url}: nonce not allowed third time") | |||
# old nonces shouldn't pass | |||
old_nonce = OpenID::Nonce::mk_nonce(3600) | |||
assert_nonce(old_nonce, false, url, "Old nonce #{old_nonce.inspect} passed") | |||
end | |||
end | |||
private | |||
def gen_assoc(issued, lifetime = 600) | |||
secret = OpenID::CryptUtil.random_string(20, nil) | |||
handle = OpenID::CryptUtil.random_string(128, ALLOWED_HANDLE) | |||
OpenID::Association.new(handle, secret, Time.now + issued, lifetime, 'HMAC-SHA1') | |||
end | |||
def assert_retrieve(url, handle = nil, expected = nil) | |||
assoc = @store.get_association(url, handle) | |||
if expected.nil? | |||
assert_nil(assoc) | |||
else | |||
assert_equal(expected, assoc) | |||
assert_equal(expected.handle, assoc.handle) | |||
assert_equal(expected.secret, assoc.secret) | |||
end | |||
end | |||
def assert_remove(url, handle, expected) | |||
present = @store.remove_association(url, handle) | |||
assert_equal(expected, present) | |||
end | |||
def assert_nonce(nonce, expected, server_url, msg = "") | |||
stamp, salt = OpenID::Nonce::split_nonce(nonce) | |||
actual = @store.use_nonce(server_url, stamp, salt) | |||
assert_equal(expected, actual, msg) | |||
end | |||
end |
@@ -1,32 +0,0 @@ | |||
require File.dirname(__FILE__) + '/test_helper' | |||
class NormalizeTest < Test::Unit::TestCase | |||
include OpenIdAuthentication | |||
NORMALIZATIONS = { | |||
"openid.aol.com/nextangler" => "http://openid.aol.com/nextangler", | |||
"http://openid.aol.com/nextangler" => "http://openid.aol.com/nextangler", | |||
"https://openid.aol.com/nextangler" => "https://openid.aol.com/nextangler", | |||
"HTTP://OPENID.AOL.COM/NEXTANGLER" => "http://openid.aol.com/NEXTANGLER", | |||
"HTTPS://OPENID.AOL.COM/NEXTANGLER" => "https://openid.aol.com/NEXTANGLER", | |||
"loudthinking.com" => "http://loudthinking.com/", | |||
"http://loudthinking.com" => "http://loudthinking.com/", | |||
"http://loudthinking.com:80" => "http://loudthinking.com/", | |||
"https://loudthinking.com:443" => "https://loudthinking.com/", | |||
"http://loudthinking.com:8080" => "http://loudthinking.com:8080/", | |||
"techno-weenie.net" => "http://techno-weenie.net/", | |||
"http://techno-weenie.net" => "http://techno-weenie.net/", | |||
"http://techno-weenie.net " => "http://techno-weenie.net/", | |||
"=name" => "=name" | |||
} | |||
def test_normalizations | |||
NORMALIZATIONS.each do |from, to| | |||
assert_equal to, normalize_identifier(from) | |||
end | |||
end | |||
def test_broken_open_id | |||
assert_raises(InvalidOpenId) { normalize_identifier(nil) } | |||
end | |||
end |
@@ -1,46 +0,0 @@ | |||
require File.dirname(__FILE__) + '/test_helper' | |||
class OpenIdAuthenticationTest < Test::Unit::TestCase | |||
def setup | |||
@controller = Class.new do | |||
include OpenIdAuthentication | |||
def params() {} end | |||
end.new | |||
end | |||
def test_authentication_should_fail_when_the_identity_server_is_missing | |||
open_id_consumer = mock() | |||
open_id_consumer.expects(:begin).raises(OpenID::OpenIDError) | |||
@controller.expects(:open_id_consumer).returns(open_id_consumer) | |||
@controller.expects(:logger).returns(mock(:error => true)) | |||
@controller.send(:authenticate_with_open_id, "http://someone.example.com") do |result, identity_url| | |||
assert result.missing? | |||
assert_equal "Sorry, the OpenID server couldn't be found", result.message | |||
end | |||
end | |||
def test_authentication_should_be_invalid_when_the_identity_url_is_invalid | |||
@controller.send(:authenticate_with_open_id, "!") do |result, identity_url| | |||
assert result.invalid?, "Result expected to be invalid but was not" | |||
assert_equal "Sorry, but this does not appear to be a valid OpenID", result.message | |||
end | |||
end | |||
def test_authentication_should_fail_when_the_identity_server_times_out | |||
open_id_consumer = mock() | |||
open_id_consumer.expects(:begin).raises(Timeout::Error, "Identity Server took too long.") | |||
@controller.expects(:open_id_consumer).returns(open_id_consumer) | |||
@controller.expects(:logger).returns(mock(:error => true)) | |||
@controller.send(:authenticate_with_open_id, "http://someone.example.com") do |result, identity_url| | |||
assert result.missing? | |||
assert_equal "Sorry, the OpenID server couldn't be found", result.message | |||
end | |||
end | |||
def test_authentication_should_begin_when_the_identity_server_is_present | |||
@controller.expects(:begin_open_id_authentication) | |||
@controller.send(:authenticate_with_open_id, "http://someone.example.com") | |||
end | |||
end |
@@ -1,14 +0,0 @@ | |||
require File.dirname(__FILE__) + '/test_helper' | |||
class StatusTest < Test::Unit::TestCase | |||
include OpenIdAuthentication | |||
def test_state_conditional | |||
assert Result[:missing].missing? | |||
assert Result[:missing].unsuccessful? | |||
assert !Result[:missing].successful? | |||
assert Result[:successful].successful? | |||
assert !Result[:successful].unsuccessful? | |||
end | |||
end |
@@ -1,17 +0,0 @@ | |||
require 'test/unit' | |||
require 'rubygems' | |||
gem 'activesupport' | |||
require 'active_support' | |||
gem 'actionpack' | |||
require 'action_controller' | |||
gem 'mocha' | |||
require 'mocha/setup' | |||
gem 'ruby-openid' | |||
require 'openid' | |||
RAILS_ROOT = File.dirname(__FILE__) unless defined? RAILS_ROOT | |||
require File.dirname(__FILE__) + "/../lib/open_id_authentication" |
@@ -129,7 +129,6 @@ pre, code {font-family: Consolas, Menlo, "Liberation Mono", Courier, monospace;} | |||
#login-form input[type=text], #login-form input[type=password], #login-form input[type=submit] {display: block; width: 100%;} | |||
#login-form input[type=text], #login-form input[type=password] {margin-bottom: 15px;} | |||
#login-form a.lost_password {float:right; font-weight:normal;} | |||
#login-form input#openid_url {background:#fff url(../images/openid-bg.gif) no-repeat 4px 50%; padding-left:24px !important;} | |||
#login-form h3 {text-align: center;} | |||
div.modal { border-radius:5px; background:#fff; z-index:50; padding:4px;} | |||
@@ -734,7 +733,7 @@ ul.properties li span {font-style:italic;} | |||
.total-hours span.hours-int { font-size: 120%; } | |||
.autoscroll {overflow-x: auto; padding:1px; margin-bottom: 1.2em; position: relative;} | |||
#user_login, #user_firstname, #user_lastname, #user_mail, #my_account_form select, #user_form select, #user_identity_url { width: 90%; } | |||
#user_login, #user_firstname, #user_lastname, #user_mail, #my_account_form select, #user_form select { width: 90%; } | |||
#workflow_copy_form select { width: 200px; } | |||
table.transitions td.enabled {background: #bfb;} |
@@ -29,8 +29,6 @@ h1, h2, h3, h4 {padding:2px 00px 1px 10px;} | |||
#login-form table {margin-left:auto; margin-right:auto;} | |||
div.modal p.buttons {text-align:left;} | |||
input#openid_url {padding-left:0px; padding-right:18px;} | |||
/***** Links *****/ | |||
#sidebar a.selected {padding:1px 2px 2px 3px; margin-left:0px; margin-right:-2px;} |
@@ -1,219 +0,0 @@ | |||
# frozen_string_literal: true | |||
# Redmine - project management software | |||
# Copyright (C) 2006-2021 Jean-Philippe Lang | |||
# | |||
# This program is free software; you can redistribute it and/or | |||
# modify it under the terms of the GNU General Public License | |||
# as published by the Free Software Foundation; either version 2 | |||
# of the License, or (at your option) any later version. | |||
# | |||
# This program is distributed in the hope that it will be useful, | |||
# but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
# GNU General Public License for more details. | |||
# | |||
# You should have received a copy of the GNU General Public License | |||
# along with this program; if not, write to the Free Software | |||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | |||
require File.expand_path('../../test_helper', __FILE__) | |||
class AccountControllerOpenidTest < Redmine::ControllerTest | |||
tests AccountController | |||
fixtures :users, :roles | |||
def setup | |||
User.current = nil | |||
Setting.openid = '1' | |||
end | |||
def teardown | |||
Setting.openid = '0' | |||
end | |||
if Object.const_defined?(:OpenID) | |||
def test_login_with_openid_for_existing_user | |||
existing_user = User.new(:firstname => 'Cool', | |||
:lastname => 'User', | |||
:mail => 'user@somedomain.com', | |||
:identity_url => 'http://openid.example.com/good_user') | |||
existing_user.login = 'cool_user' | |||
assert existing_user.save! | |||
with_settings( | |||
:openid => '1', | |||
:self_registration => '3' | |||
) do | |||
post(:login, :params => {:openid_url => existing_user.identity_url}) | |||
end | |||
assert_redirected_to '/my/page' | |||
end | |||
def test_login_with_invalid_openid_provider | |||
Setting.self_registration = '0' | |||
post( | |||
:login, | |||
:params => { | |||
:openid_url => 'http;//openid.example.com/good_user' | |||
} | |||
) | |||
assert_redirected_to home_url | |||
end | |||
def test_login_with_openid_for_existing_non_active_user | |||
existing_user = User.new(:firstname => 'Cool', | |||
:lastname => 'User', | |||
:mail => 'user@somedomain.com', | |||
:identity_url => 'http://openid.example.com/good_user', | |||
:status => User::STATUS_REGISTERED) | |||
existing_user.login = 'cool_user' | |||
assert existing_user.save! | |||
with_settings( | |||
:openid => '1', | |||
:self_registration => '2' | |||
) do | |||
post(:login, :params => {:openid_url => existing_user.identity_url}) | |||
end | |||
assert_redirected_to '/login' | |||
end | |||
def test_login_with_openid_with_new_user_created | |||
Setting.self_registration = '3' | |||
post( | |||
:login, | |||
:params => { | |||
:openid_url => 'http://openid.example.com/good_user' | |||
} | |||
) | |||
assert_redirected_to '/my/account' | |||
user = User.find_by_login('cool_user') | |||
assert user | |||
assert_equal 'Cool', user.firstname | |||
assert_equal 'User', user.lastname | |||
end | |||
def test_login_with_openid_with_new_user_and_self_registration_off | |||
Setting.self_registration = '0' | |||
post( | |||
:login, | |||
:params => { | |||
:openid_url => 'http://openid.example.com/good_user' | |||
} | |||
) | |||
assert_redirected_to home_url | |||
user = User.find_by_login('cool_user') | |||
assert_nil user | |||
end | |||
def test_login_with_openid_with_new_user_created_with_email_activation_should_have_a_token | |||
Setting.self_registration = '1' | |||
post( | |||
:login, | |||
:params => { | |||
:openid_url => 'http://openid.example.com/good_user' | |||
} | |||
) | |||
assert_redirected_to '/login' | |||
user = User.find_by_login('cool_user') | |||
assert user | |||
token = Token.find_by_user_id_and_action(user.id, 'register') | |||
assert token | |||
end | |||
def test_login_with_openid_with_new_user_created_with_manual_activation | |||
Setting.self_registration = '2' | |||
post( | |||
:login, | |||
:params => { | |||
:openid_url => 'http://openid.example.com/good_user' | |||
} | |||
) | |||
assert_redirected_to '/login' | |||
user = User.find_by_login('cool_user') | |||
assert user | |||
assert_equal User::STATUS_REGISTERED, user.status | |||
end | |||
def test_login_with_openid_with_new_user_with_conflict_should_register | |||
Setting.self_registration = '3' | |||
existing_user = User.new(:firstname => 'Cool', :lastname => 'User', :mail => 'user@somedomain.com') | |||
existing_user.login = 'cool_user' | |||
assert existing_user.save! | |||
post( | |||
:login, | |||
:params => { | |||
:openid_url => 'http://openid.example.com/good_user' | |||
} | |||
) | |||
assert_response :success | |||
assert_select 'input[name=?][value=?]', 'user[identity_url]', 'http://openid.example.com/good_user' | |||
end | |||
def test_login_with_openid_with_new_user_with_missing_information_should_register | |||
Setting.self_registration = '3' | |||
post( | |||
:login, | |||
:params => { | |||
:openid_url => 'http://openid.example.com/good_blank_user' | |||
} | |||
) | |||
assert_response :success | |||
assert_select 'input[name=?]', 'user[login]' | |||
assert_select 'input[name=?]', 'user[password]' | |||
assert_select 'input[name=?]', 'user[password_confirmation]' | |||
assert_select 'input[name=?][value=?]', 'user[identity_url]', 'http://openid.example.com/good_blank_user' | |||
end | |||
def test_post_login_should_not_verify_token_when_using_open_id | |||
ActionController::Base.allow_forgery_protection = true | |||
AccountController.any_instance.stubs(:using_open_id?).returns(true) | |||
AccountController.any_instance.stubs(:authenticate_with_open_id).returns(true) | |||
post :login | |||
assert_response 200 | |||
ensure | |||
ActionController::Base.allow_forgery_protection = false | |||
end | |||
def test_register_after_login_failure_should_not_require_user_to_enter_a_password | |||
Setting.self_registration = '3' | |||
assert_difference 'User.count' do | |||
post( | |||
:register, | |||
:params => { | |||
:user => { | |||
:login => 'good_blank_user', | |||
:password => '', | |||
:password_confirmation => '', | |||
:firstname => 'Cool', | |||
:lastname => 'User', | |||
:mail => 'user@somedomain.com', | |||
:identity_url => 'http://openid.example.com/good_blank_user' | |||
} | |||
} | |||
) | |||
assert_response 302 | |||
end | |||
user = User.order('id DESC').first | |||
assert_equal 'http://openid.example.com/good_blank_user', user.identity_url | |||
assert user.hashed_password.blank?, "Hashed password was #{user.hashed_password}" | |||
end | |||
def test_setting_openid_should_return_true_when_set_to_true | |||
assert_equal true, Setting.openid? | |||
end | |||
else | |||
puts "Skipping openid tests." | |||
def test_dummy | |||
end | |||
end | |||
end |
@@ -1,49 +0,0 @@ | |||
# frozen_string_literal: true | |||
# Mocks out OpenID | |||
# | |||
# http://www.northpub.com/articles/2007/04/02/testing-openid-support | |||
module OpenIdAuthentication | |||
EXTENSION_FIELDS = {'email' => 'user@somedomain.com', | |||
'nickname' => 'cool_user', | |||
'country' => 'US', | |||
'postcode' => '12345', | |||
'fullname' => 'Cool User', | |||
'dob' => '1970-04-01', | |||
'language' => 'en', | |||
'timezone' => 'America/New_York'} | |||
protected | |||
def authenticate_with_open_id(identity_url = params[:openid_url], options = {}) | |||
if User.find_by_identity_url(identity_url) || identity_url.include?('good') | |||
extension_response_fields = {} | |||
# Don't process registration fields unless it is requested. | |||
unless identity_url.include?('blank') || (options[:required].nil? && options[:optional].nil?) | |||
unless options[:required].nil? | |||
options[:required].each do |field| | |||
extension_response_fields[field.to_s] = EXTENSION_FIELDS[field.to_s] | |||
end | |||
end | |||
unless options[:optional].nil? | |||
options[:optional].each do |field| | |||
extension_response_fields[field.to_s] = EXTENSION_FIELDS[field.to_s] | |||
end | |||
end | |||
end | |||
yield Result[:successful], identity_url, extension_response_fields | |||
else | |||
logger.info "OpenID authentication failed: #{identity_url}" | |||
yield Result[:failed], identity_url, nil | |||
end | |||
end | |||
private | |||
def add_simple_registration_fields(open_id_response, fields) | |||
open_id_response.add_extension_arg('sreg', 'required', [fields[:required]].flatten * ',') if fields[:required] | |||
open_id_response.add_extension_arg('sreg', 'optional', [fields[:optional]].flatten * ',') if fields[:optional] | |||
end | |||
end |
@@ -29,7 +29,6 @@ $redmine_test_ldap_server = ENV['REDMINE_TEST_LDAP_SERVER'] || '127.0.0.1' | |||
ENV["RAILS_ENV"] = "test" | |||
require File.expand_path(File.dirname(__FILE__) + "/../config/environment") | |||
require 'rails/test_help' | |||
require Rails.root.join('test', 'mocks', 'open_id_authentication_mock.rb').to_s | |||
require File.expand_path(File.dirname(__FILE__) + '/object_helpers') | |||
include ObjectHelpers |
@@ -1348,37 +1348,4 @@ class UserTest < ActiveSupport::TestCase | |||
cv2a.reload | |||
assert_equal @dlopper.id.to_s, cv2a.value | |||
end | |||
if Object.const_defined?(:OpenID) | |||
def test_setting_identity_url | |||
normalized_open_id_url = 'http://example.com/' | |||
u = User.new(:identity_url => 'http://example.com/') | |||
assert_equal normalized_open_id_url, u.identity_url | |||
end | |||
def test_setting_identity_url_without_trailing_slash | |||
normalized_open_id_url = 'http://example.com/' | |||
u = User.new(:identity_url => 'http://example.com') | |||
assert_equal normalized_open_id_url, u.identity_url | |||
end | |||
def test_setting_identity_url_without_protocol | |||
normalized_open_id_url = 'http://example.com/' | |||
u = User.new(:identity_url => 'example.com') | |||
assert_equal normalized_open_id_url, u.identity_url | |||
end | |||
def test_setting_blank_identity_url | |||
u = User.new(:identity_url => 'example.com') | |||
u.identity_url = '' | |||
assert u.identity_url.blank? | |||
end | |||
def test_setting_invalid_identity_url | |||
u = User.new(:identity_url => 'this is not an openid url') | |||
assert u.identity_url.blank? | |||
end | |||
else | |||
puts "Skipping openid tests." | |||
end | |||
end |