From: Tom Hughes Date: Sun, 9 May 2010 16:16:43 +0000 (+0100) Subject: Merge branch 'master' into terms X-Git-Tag: live~6290^2~6 X-Git-Url: https://git.openstreetmap.org/rails.git/commitdiff_plain/61e51f88cc0242dadd3939cd0bbb5197a21cfb94?hp=354a57a9fc2d356cd1f75fef4fb319cfeec07b94 Merge branch 'master' into terms --- diff --git a/app/controllers/user_controller.rb b/app/controllers/user_controller.rb index 42a50582e..1bab42266 100644 --- a/app/controllers/user_controller.rb +++ b/app/controllers/user_controller.rb @@ -18,11 +18,29 @@ class UserController < ApplicationController cache_sweeper :user_sweeper, :only => [:account, :set_status, :delete] + def terms + @title = t 'user.new.title' + @user = User.new(params[:user]) + + @legale = params[:legale] || OSM.IPToCountry(request.remote_ip) || APP_CONFIG['default_legale'] + @text = OSM.legal_text_for_country(@legale) + + if request.xhr? + render :update do |page| + page.replace_html "contributorTerms", :partial => "terms" + end + elsif @user.invalid? + render :action => 'new' + end + end + def save @title = t 'user.new.title' if Acl.find_by_address(request.remote_ip, :conditions => {:k => "no_account_creation"}) render :action => 'new' + elsif params[:decline] + redirect_to t 'user.terms.declined' else @user = User.new(params[:user]) @@ -31,6 +49,7 @@ class UserController < ApplicationController @user.description = "" if @user.description.nil? @user.creation_ip = request.remote_ip @user.languages = request.user_preferred_languages + @user.terms_agreed = Time.now.getutc if @user.save flash[:notice] = t 'user.new.flash create success message' diff --git a/app/views/user/_terms.html.erb b/app/views/user/_terms.html.erb new file mode 100644 index 000000000..849f536e3 --- /dev/null +++ b/app/views/user/_terms.html.erb @@ -0,0 +1,30 @@ +

<%= @text['intro'] %>

+
    +
  1. +

    <%= @text['section_1'] %>

    +
  2. +
  3. +

    <%= @text['section_2'] %>

    +
  4. +
  5. +

    <%= @text['section_3'] %>

    +

    <%= @text['active_defn_1'] %>

    +

    <%= @text['active_defn_2'] %>

    +
  6. +
  7. +

    <%= @text['section_4'] %>

    +
  8. +
  9. +

    <%= @text['section_5'] %>

    +
  10. +
  11. +

    <%= @text['section_6'] %>

    +
      +
    1. <%= @text['section_6_1'] %>

    2. +
    3. <%= @text['section_6_2'] %>

    4. +
    +
  12. +
  13. +

    <%= @text['section_7'] %>

    +
  14. +
diff --git a/app/views/user/new.html.erb b/app/views/user/new.html.erb index bd85664c0..66d8826c2 100644 --- a/app/views/user/new.html.erb +++ b/app/views/user/new.html.erb @@ -13,12 +13,9 @@

<%= t 'user.new.fill_form' %>

-

<%= t 'user.new.license_agreement' %> -

- <%= error_messages_for 'user' %> -<% form_tag :action => 'save' do %> +<% form_tag :action => 'terms' do %> <%= hidden_field_tag('referer', h(params[:referer])) unless params[:referer].nil? %> @@ -32,7 +29,7 @@ - +
<%= t 'user.new.email address' %><%= text_field('user', 'email',{:size => 50, :maxlength => 255, :tabindex => 1}) %>
<%= t 'user.new.confirm password' %><%= password_field('user', 'pass_crypt_confirmation',{:size => 30, :maxlength => 255, :tabindex => 5}) %>
 
<% end %> diff --git a/app/views/user/terms.html.erb b/app/views/user/terms.html.erb new file mode 100644 index 000000000..049e07ca7 --- /dev/null +++ b/app/views/user/terms.html.erb @@ -0,0 +1,46 @@ +

<%= t 'user.terms.heading' %>

+ +

<%= t 'user.terms.press accept button' %>

+ + +<% form_tag :action => 'terms' do %> +

+ <%= t 'user.terms.legale_select' %> + <% [['france', 'FR'], ['italy', 'IT'], ['rest_of_world', 'GB']].each do |name,legale| %> + <%= + radio_button_tag 'legale', legale, @legale == legale, + :onchange => remote_function( + :before => update_page do |page| + page.replace_html 'contributorTerms', image_tag('searching.gif') + end, + :url => {:legale => legale} + ) + %> + <%= label_tag "legale_#{legale}", t('user.terms.legale_names.' + name) %> + <% end %> +

+<% end %> + +
+ <%= render :partial => "terms" %> +
+ +<% form_tag({:action => "save"}, { :id => "termsForm" }) do %> +

+ + <%= check_box('user', 'consider_pd') %> + (<%= link_to(t('user.terms.consider_pd_why'), t('user.terms.consider_pd_why_url'), :target => :new)%>) +

+

+ <%= hidden_field_tag('referer', h(params[:referer])) unless params[:referer].nil? %> + <%= hidden_field('user', 'email') %> + <%= hidden_field('user', 'email_confirmation') %> + <%= hidden_field('user', 'display_name') %> + <%= hidden_field('user', 'pass_crypt') %> + <%= hidden_field('user', 'pass_crypt_confirmation') %> +

+ <%= submit_tag(t('user.terms.decline'), :name => "decline", :id => "decline") %> + <%= submit_tag(t('user.terms.agree'), :name => "agree", :id => "agree") %> +
+

+<% end %> diff --git a/config/application.yml b/config/application.yml index a1fbd887a..d40570965 100644 --- a/config/application.yml +++ b/config/application.yml @@ -24,6 +24,8 @@ standard_settings: &standard_settings #quova_password: "" # Spam threshold spam_threshold: 50 + # Default legale (jurisdiction location) for contributor terms + default_legale: GB development: <<: *standard_settings diff --git a/config/environment.rb b/config/environment.rb index d8f9b2fc8..93b6e86d2 100644 --- a/config/environment.rb +++ b/config/environment.rb @@ -8,7 +8,7 @@ ENV['RAILS_ENV'] ||= 'production' RAILS_GEM_VERSION = '2.3.5' unless defined? RAILS_GEM_VERSION # Set the server URL -SERVER_URL = ENV['OSM_SERVER_URL'] || 'www.openstreetmap.org' +SERVER_URL = ENV['OSM_SERVER_URL'] || 'contributor_terms.dev.openstreetmap.org' # Set the generator GENERATOR = ENV['OSM_SERVER_GENERATOR'] || 'OpenStreetMap server' diff --git a/config/legales/FR.yml b/config/legales/FR.yml new file mode 100644 index 000000000..25e44a35c --- /dev/null +++ b/config/legales/FR.yml @@ -0,0 +1,12 @@ +intro: "Nous vous remercions de votre intérêt pour la base de données géographiques du projet OpenStreetMap (« le Projet ») et pour votre volonté d’y intégrer des données et/ou tout autre contenu (collectivement « les Contenus »). Cet accord de contribution (« l’Accord ») est conclu entre vous (ci-après « Vous ») et la Fondation OpenStreetMap (« OSMF ») et a pour objectif de définir l’étendue des droits de propriété intellectuelle relatifs aux Contenus que vous déciderez de soumettre au Projet. Lisez attentivement les articles suivants et si vous en acceptez les termes, cliquez sur le bouton « J’accepte » en bas de la page afin de continuer." +section_1: "Dans le cas où des Contenus comprennent des éléments soumis à un droit d’auteur, Vous acceptez de n’ajouter que des Contenus dont Vous possédez la propriété intellectuelle. Vous garantissez le fait que Vous êtes légalement habilité à octroyer une licence telle que définie à l’Article 2 des Présentes et que cette licence ne contrevient à aucune loi, à aucune disposition contractuelle ni, à votre connaissance, à aucun droit d’un tiers. Si Vous n’êtes pas détenteur des droits de propriété intellectuelle, Vous devez garantir le fait que vous avez obtenu l’accord exprès et préalable d’utiliser les droits de propriété intellectuelle afférents au Contenu et de concéder une licence d’utilisation de ce Contenu." +section_2: "Droits concédés. Vous concédez à OSMF, dans les conditions définies à l’article 3, de manière irrévocable et perpétuelle, une licence internationale, non soumise aux droits patrimoniaux d’auteur et non exclusive, portant sur tout acte relatif au Contenu, quel que soit le support. La concession porte notamment sur une éventuelle utilisation commerciale du Contenu ainsi que sur le droit de sous-licencier l’ensemble des contributions à des tiers ou sous-traitants. Vous acceptez de ne pas user de votre droit moral à l’encontre de OSMF ou de ses sous-traitants si la loi ou les conventions vous donne un tel droit relativement aux Contenus." +section_3: "OSMF consent à utiliser ou sous-licencier votre Contenu comme partie de la base de données et seulement par le biais d’une des licences suivantes : ODbL 1.0 pour la base de données et DbCL 1.0 pour les contenus individuels de la base de données ; CC-BY-SA 2.0 ; ou toute autre licence libre et ouverte choisie à la majorité par vote des membres OSMF puis adoptée par une majorité de 2/3 des contributeurs actifs." +active_defn_1: "Un contributeur actif est défini comme suit:" +active_defn_2: "Une personne physique (utilisant un ou plusieurs comptes, agissant pour son compte ou au nom d’un tiers pouvant être une société) qui, ayant une adresse email valide dans son profil enregistré a, dans 3 des 12 derniers mois, modifié le Projet, ce qui démontre ainsi son intérêt réel et renouvelé dans le projet et qui, lorsqu’elle est sollicitée répond dans un délai maximal de 3 semaines." +section_4: "OSMF accepte de Vous citer ou de citer le titulaire des droits d’auteur, selon Votre souhait ou celui du titulaire des droits. Le procédé d'attribution sera fourni ultérieurement. Actuellement, il s'agit de la page web." +section_5: "Nonobstant les cas prévus dans les Présentes, Vous conservez les droits et intérêts à agir relatifs à vos Contenus." +section_6: "Limitation de responsabilité" +section_6_1: "A l’exception des garanties prévues à l’Article 1 des Présentes et dans les limites permises par la loi, Vous fournissez les Contenus en l’état sans aucune garantie d’aucune sorte, expresse ou tacite, notamment sans garantie de valeur commerciale, d’adéquation à un usage ou à besoin quelconque." +section_6_2: "En cas de responsabilité ne pouvant être limitée ou exclue par la loi, aucun préjudice particulier, indirect ou punitif, lorsque ces termes s’appliquent, ne pourra Vous être imputé ou être imputé à OSMF dans le cadre de cet Accord. Cette limitation de responsabilité s’applique même si chaque Partie était avisée de la possibilité de réalisation d’un tel dommage." +section_7: "Divers. Cet Accord est régi par le Droit Anglais, nonobstant les règles en vigueur relatives aux conflits de Lois. Vous convenez que la Convention des Nations Unies sur les Ventes Internationales de Marchandises de 1980 est intégralement inapplicable à cet Accord. Cet Accord entre Vous et OSMF remplace et annule tout accord antérieur, qu’il soit oral ou écrit, concernant l’objet de cet Accord." diff --git a/config/legales/GB.yml b/config/legales/GB.yml new file mode 100644 index 000000000..670332fb0 --- /dev/null +++ b/config/legales/GB.yml @@ -0,0 +1,12 @@ +intro: "Thank you for your interest in contributing data and/or any other content (collectively, 'Contents') to the geo-database of the OpenStreetMap project (the 'Project'). This contributor agreement (the 'Agreement') is made between you ('You') and The OpenStreetMap Foundation ('OSMF') and clarifies the intellectual property rights in any Contents that You choose to submit to the Project. Please read the following terms and conditions carefully and click either the 'Accept' or 'Decline' button at the bottom to continue." +section_1: "You agree to only add Contents for which You are the copyright holder (to the extent the Contents include any copyrightable elements). You represent and warrant that You are legally entitled to grant the licence in Section 2 below and that such licence does not violate any law, breach any contract, or, to the best of Your knowledge, infringe any third party’s rights. If You are not the copyright holder of the Contents, You represent and warrant that You have explicit permission from the rights holder to submit the Contents and grant the licence below." +section_2: "Rights granted. Subject to Section 3 below, You hereby grant to OSMF a worldwide, royalty-free, non-exclusive, perpetual, irrevocable licence to do any act that is restricted by copyright over anything within the Contents, whether in the original medium or any other. These rights explicitly include commercial use, and do not exclude any field of endeavour. These rights include, without limitation, the right to sublicense the work through multiple tiers of sublicensees. To the extent allowable under applicable local laws and copyright conventions, You also waive and/or agree not to assert against OSMF or its licensees any moral rights that You may have in the Contents." +section_3: "OSMF agrees to use or sub-license Your Contents as part of a database and only under the terms of one of the following licences: ODbL 1.0 for the database and DbCL 1.0 for the individual contents of the database; CC-BY-SA 2.0; or another free and open licence. Which other free and open licence is chosen by a vote of the OSMF membership and approved by at least a 2/3 majority vote of active contributors." +active_defn_1: "An 'active contributor' is defined as:" +active_defn_2: "a natural person (whether using a single or multiple accounts) who has edited the Project in any 3 calendar months from the last 12 months (i.e. there is a demonstrated interest over time); and has maintained a valid email address in their registration profile and responds within 3 weeks." +section_4: "At Your or the copyright holder’s option, OSMF agrees to attribute You or the copyright holder. A mechanism will be provided, currently a web page." +section_5: "Except as set forth herein, You reserve all right, title, and interest in and to Your Contents." +section_6: "Limitation of Liability" +section_6_1: "To the extent permitted by applicable law, except as provided above in Section 1, You provide the Contents 'as is' without warranty of any kind, either express or implied, including without limitation any warranties or conditions of merchantability, fitness for a particular purpose, or otherwise." +section_6_2: "Subject to any liability that may not be excluded or limited by law, neither You nor OSMF shall be liable for any special, indirect, incidental, consequential, punitive, or exemplary damages under this Agreement, however caused and under any theory of liability. This exclusion applies even if either party has been advised of the possibility of such damages." +section_7: "Miscellaneous. This Agreement shall be governed by English law without regard to principles of conflict of law. You agree that the United Nations Convention on Contracts for the International Sale of Goods (1980) is hereby excluded in its entirety from application to this Agreement. In the event of invalidity of any provision of this Agreement, the parties agree that such invalidity shall not affect the validity of the remaining portions of this Agreement. This is the entire agreement between You and OSMF which supersedes any prior agreement, whether written or oral, relating to the subject matter of this agreement." diff --git a/config/legales/IT.yml b/config/legales/IT.yml new file mode 100644 index 000000000..e9f6076b2 --- /dev/null +++ b/config/legales/IT.yml @@ -0,0 +1,13 @@ +intro: "Ti ringraziamo per la tua disponibilità a fornire dati e/o qualunque altro contenuto (di seguito indicati collettivamente “Contenuti”) al database geografico del progetto OpenStreetMap (di seguito “Progetto”).. Il presente accordo per la contribuzione di dati (di seguito “Accordo”) si conclude fra Te e la OpenStreetMap Foundation (“OSMF”) e disciplina i diritti sui Contenuti che Tu decidi di apportare al progetto. Leggi per favore le seguenti condizioni generali e premi il tasto “Accetto” o “Rifiuto” posto in fondo al testo per proseguire." +section_1: "Sei impegnato ad apportare esclusivamente contenuti rispetto ai quali Tu sia titolare dei relativi diritti di autore (nella misura in cui i Contenuti riguardino dati o elementi suscettibili di protezione secondo il diritto di autore). Tu dichiari e garantisci di poter validamente concedere la licenza di cui al successivo Articolo 2 e dichiari e garantisci altresì che tale licenza non viola nessuna legge e/o nessun contratto e, per quanto sia di Tua conoscenza, non viola alcun diritto di terzi. Nel caso Tu non sia titolare dei diritti di autore rispetto ai Contenuti, Tu dichiari e garantisci di avere ricevuto del titolare di tali diritti l’espressa autorizzazione di apportare i Contenuti e concederne la licenza di cui al successivo punto 2." +section_2: "Diritti concessi. Con il presente Accordo Tu, nei limiti di cui al successivo punto 3, concedi a OSMF in via NON esclusiva una licenza gratuita, valida su tutto il territorio mondiale e di carattere perpetuo e irrevocabile a compiere qualunque atto riservato ai titolari dei diritti di autore sopra i Contenuti e/o qualunque loro singola parte, da effettuarsi su qualunque supporto e mezzo di comunicazione ivi compresi quelli ulteriori e diversi rispetto all’originale." +section_3: "OSMF userà o concederà in sub-licenza i tuoi Contenuti come parte di un database e solamente nel rispetto di una di queste licenze: ODbl 1.0 per quanto riguarda il database e DdCL 1.0 per i contenuti individuali del database; CC-BY-SA 2.0; o una altra licenza gratuita e di carattere aperto. I membri di OMSF potranno scegliere altre licenze gratuite e di carattere aperto, le quali saranno si intenderanno approvate con il voto della maggioranza dei 2/3 dei voti dei contributori attivi." +active_defn_1: "Per “contributore attivo” deve intendersi:" +active_defn_2: "una persona fisica (indipendentemente dal fatto che usi uno o più account) con i seguenti requisiti cumulativi: 1) che negli ultimi dodici mesi ha fornito in almeno tre diverse circostanze verificatesi in tre diversi mesi propri Contenuti pubblicati nel Progetto (dimostrando così un interesse continuato nel tempo); 2) che ha sempre mantenuto un valido indirizzo email nel suo profilo di registrazione rispondendo a eventuali messaggi entro tre settimane dal loro invio." +section_4: "OSMF riconoscerà la esistenza dei diritti di autore sui Contenuti apportati, e a tal fine indicherà Te o il loro eventuale titolare originario, a scelta di quest’ultimo o Tua. In questo senso verrà attuato un apposito meccanismo di attribuzione, che al momento risulta dalla pagina web." +section_5: "Salvo quanto stabilito nel presente Accordo, Tu conservi ogni eventuale altro diritto o prerogativa relativa ai Contenuti da Te apportati." +section_6: "Limitazione di responsabilità" +section_6_1: "Nei limiti consentiti dalla legge applicabile, e senza pregiudizio a quanto previsto dal precedente articolo 1; Tu fornisci i Contenuti senza garanzie esplicite o implicite di nessun tipo per quanto riguarda – a titolo esemplificativo – la loro qualità, assenza di vizi o difetti, adeguatezza e conformità al loro scopo o altro." +section_6_2: "Fatte salve le responsabilità che la legge non permette di escludere o derogare, né Tu né OSMF potranno intendersi responsabili di eventuali danni, siano essi diretti o indiretti, a titolo contrattuale o extracontrattuale, morali o materiali, e a qualunque genere essi appartengano. La presente esclusione di responsabilità sarà valida anche nel caso in cui una delle parti sia stata avvertita della possibilità che tali danni si verifichino." +section_7: "Varie. Il presente Accordo è disciplinato dalla legge vigente in Inghilterra – Regno Unito, senza possibilità di applicazione delle relative norme di diritto internazionale privato. Si conviene espressamente che al presente Accordo non potrà essere applicata la Convenzione delle Nazioni Unit." + diff --git a/config/locales/de.yml b/config/locales/de.yml index 5d61a478d..417d53eec 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -1456,7 +1456,7 @@ de: no_auto_account_create: Im Moment ist das automatische Erstellen eines Benutzerkontos leider nicht möglich. not displayed publicly: Nicht öffentlich sichtbar (Datenschutzrichtlinie) password: "Passwort:" - signup: Registrieren + signup: Fortsetzen title: Benutzerkonto erstellen no_such_user: body: Es gibt leider keinen Benutzer mit dem Namen {{user}}. Bitte überprüfe deine Schreibweise oder der Link war beschädigt. diff --git a/config/locales/en.yml b/config/locales/en.yml index fbf8e7a04..5abae7222 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1517,7 +1517,7 @@ en: no_auto_account_create: "Unfortunately we are not currently able to create an account for you automatically." contact_webmaster: 'Please contact the webmaster to arrange for an account to be created - we will try and deal with the request as quickly as possible.' fill_form: "Fill in the form and we will send you a quick email to activate your account." - license_agreement: 'By creating an account, you agree that all data you submit to the Openstreetmap project is to be (non-exclusively) licensed under this Creative Commons license (by-sa).' + license_agreement: 'When you confirm your account you will need to agree to the contributor terms.' email address: "Email Address:" confirm email address: "Confirm Email Address:" not displayed publicly: 'Not displayed publicly (see privacy policy)' @@ -1525,8 +1525,23 @@ en: display name description: "Your publicly displayed username. You can change this later in the preferences." password: "Password:" confirm password: "Confirm Password:" - signup: Signup + continue: Continue flash create success message: "User was successfully created. Check your email for a confirmation note, and you will be mapping in no time :-)

Please note that you will not be able to login until you've received and confirmed your email address.

If you use an antispam system which sends confirmation requests then please make sure you whitelist webmaster@openstreetmap.org as we are unable to reply to any confirmation requests." + terms: + heading: "Contributor terms" + press accept button: "Please read the agreement below and press the agree button to create your account." + consider_pd: "I consider my contributions to be in the Public Domain" + consider_pd_why: "what's this?" + consider_pd_why_url: http://wiki.openstreetmap.org/wiki/Why_would_I_want_my_contributions_to_be_public_domain + agree: Agree + declined: "http://wiki.openstreetmap.org/wiki/Contributor_Terms_Declined" + decline: "Decline" + legale_select: "Please select your country of residence:" + legale_button: "Go" + legale_names: + france: "France" + italy: "Italy" + rest_of_world: "Rest of the world" no_such_user: title: "No such user" heading: "The user {{user}} does not exist" diff --git a/config/routes.rb b/config/routes.rb index 7e27ee19e..1c67eaa6e 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -98,6 +98,7 @@ ActionController::Routing::Routes.draw do |map| map.connect '/offline', :controller => 'site', :action => 'offline' map.connect '/key', :controller => 'site', :action => 'key' map.connect '/user/new', :controller => 'user', :action => 'new' + map.connect '/user/terms', :controller => 'user', :action => 'terms' map.connect '/user/save', :controller => 'user', :action => 'save' map.connect '/user/confirm', :controller => 'user', :action => 'confirm' map.connect '/user/confirm-email', :controller => 'user', :action => 'confirm_email' diff --git a/db/migrate/050_add_contributor_terms_to_user.rb b/db/migrate/050_add_contributor_terms_to_user.rb new file mode 100644 index 000000000..f2eae9047 --- /dev/null +++ b/db/migrate/050_add_contributor_terms_to_user.rb @@ -0,0 +1,11 @@ +class AddContributorTermsToUser < ActiveRecord::Migration + def self.up + add_column :users, :terms_agreed, :datetime + add_column :users, :consider_pd, :boolean, :null => false, :default => false + end + + def self.down + remove_column :users, :consider_pd + remove_column :users, :terms_agreed + end +end diff --git a/lib/osm.rb b/lib/osm.rb index 46b904477..c92655aee 100644 --- a/lib/osm.rb +++ b/lib/osm.rb @@ -447,7 +447,7 @@ module OSM end end - def self.IPLocation(ip_address) + def self.IPToCountry(ip_address) Timeout::timeout(4) do ipinfo = Quova::IpInfo.new(ip_address) @@ -459,14 +459,24 @@ module OSM country = "GB" if country == "UK" end end + + return country.upcase + end - country = Country.find_by_code(country.upcase) + return nil + rescue Exception + return nil + end + + def self.IPLocation(ip_address) + code = OSM.IPToCountry(ip_address) + + unless code.nil? + country = Country.find_by_code(code) return { :minlon => country.min_lon, :minlat => country.min_lat, :maxlon => country.max_lon, :maxlat => country.max_lat } end - return nil - rescue Exception return nil end @@ -519,4 +529,10 @@ module OSM return [link_proportion - 0.2, 0.0].max * 200 + link_count * 20 end + + def self.legal_text_for_country(country_code) + file_name = File.join(RAILS_ROOT, "config", "legales", country_code.to_s + ".yml") + file_name = File.join(RAILS_ROOT, "config", "legales", APP_CONFIG['default_legale'] + ".yml") unless File.exist? file_name + YAML::load_file(file_name) + end end diff --git a/public/stylesheets/common.css b/public/stylesheets/common.css index 73f0fb788..2590c2d5f 100644 --- a/public/stylesheets/common.css +++ b/public/stylesheets/common.css @@ -583,6 +583,47 @@ hr { margin-top: 10px; } +/* Rules for the account confirmation page */ + +div#contributorTerms { + border: 1px solid black; + padding: 4px; + overflow: auto; + width: 80%; + height: 60%; +} + +div#contributorTerms p#first { + margin-top: 0px; +} + +div#contributorTerms p#last { + margin-bottom: 0px; +} + +div#contributorTerms ol { + margin-bottom: 0px; +} + +div#contributorTerms img { + display: block; + margin-left: auto; + margin-right: auto; + margin-top: 10%; +} + +form#termsForm { + width: 80%; +} + +form#termsForm div#buttons { + float: right; +} + +form#termsForm input#agree { + margin-left: 50px; +} + /* Rules for the account settings page */ #accountForm td {