diff --git a/.dockerignore b/.dockerignore index 328b891a..ba912f55 100644 --- a/.dockerignore +++ b/.dockerignore @@ -14,7 +14,7 @@ tmp /db/**/*.sqlite3-journal /db/production public/assets -public/gl +public/b coverage/ spec/tmp .rvmrc diff --git a/.gitignore b/.gitignore index d4eff4a2..385c1850 100644 --- a/.gitignore +++ b/.gitignore @@ -14,7 +14,7 @@ # Ignore static assets. /public/system/** /public/assets/** -/public/gl/** +/public/b/** # Ignore production paths. /db/production diff --git a/.ruby-version b/.ruby-version new file mode 100644 index 00000000..73462a5a --- /dev/null +++ b/.ruby-version @@ -0,0 +1 @@ +2.5.1 diff --git a/Dockerfile b/Dockerfile index 65f890de..6b4d34b4 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,7 @@ FROM ruby:2.5 # Install app dependencies. -RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs +RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs # Set an environment variable for the install location. ENV RAILS_ROOT /usr/src/app @@ -25,8 +25,8 @@ RUN bundle install --without development test --deployment --clean RUN bundle exec rake assets:clean RUN bundle exec rake assets:precompile -# Expose port 3000. -EXPOSE 3000 +# Expose port 80. +EXPOSE 80 # Start the application. CMD ["bin/start"] diff --git a/README.md b/README.md index ce64bb4d..fbdda367 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # Greenlight +Greenlight is currently on version 2.0. If you are still running Greenlight 1.0 we suggest [upgrading to 2.0](http://docs.bigbluebutton.org/install/greenlight-v2.html#upgrading-from-greenlight-10). + Greenlight is a simple front-end interface for your BigBlueButton server. At it's heart, Greenlight provides a minimalistic web-based application that allows users to: * Signup/Login with Twitter, Google, or through the application itself. @@ -8,9 +10,13 @@ Greenlight is a simple front-end interface for your BigBlueButton server. At it' * Invite others to your room using a simple URL. * View recordings and share them with others. -Furthermore, Greenlight is completely configurable. This means you can turn on/off features to make Greenlight fit your specific use case. For more information on Greenlight and it's features, see our [documentation](http://docs.bigbluebutton.org/install/greenlight.html). +Interested? Try Greenlight out on our [demo server](https://demo.bigbluebutton.org/gl)! -For a overview of how GreenLight works, checkout our [Introduction to Greenlight Video](https://youtu.be/yGX3JCv7OVM). +Greenlight is also completely configurable. This means you can turn on/off features to make Greenlight fit your specific use case. For more information on Greenlight and its features, see our [documentation](http://docs.bigbluebutton.org/install/greenlight-v2.html). + +For a overview of how Greenlight works, checkout our Introduction to Greenlight Video: + +[![GreenLight Overview](https://img.youtube.com/vi/Hso8yLzkqj8/0.jpg)](https://youtu.be/Hso8yLzkqj8) ## Installation on a BigBlueButton Server @@ -20,7 +26,7 @@ For information on installing Greenlight, checkout our [Installing Greenlight on ## Source Code & Contributing -GreenLight is built using Ruby on Rails. Many developers already know Rails well, and we wanted to create both a full front-end to BigBlueButton but also a reference implementation of how to fully leverage the [BigBlueButton API](http://docs.bigbluebutton.org/dev/api.html). +Greenlight is built using Ruby on Rails. Many developers already know Rails well, and we wanted to create both a full front-end to BigBlueButton but also a reference implementation of how to fully leverage the [BigBlueButton API](http://docs.bigbluebutton.org/dev/api.html). We invite you to build upon GreenLight and help make it better. See [Contributing to BigBlueButton](http://docs.bigbluebutton.org/support/faq.html#contributing-to-bigbluebutton). diff --git a/app/assets/stylesheets/main.scss b/app/assets/stylesheets/main.scss index 616e3290..27a3d0c4 100644 --- a/app/assets/stylesheets/main.scss +++ b/app/assets/stylesheets/main.scss @@ -21,3 +21,18 @@ transform: translateY(-50%); margin-top: 50%; } + +.or-line { + div { + width: 100%; + height: 16px; + border-bottom: 1px solid #d3d3d3; + text-align: center; + span { + font-size: 120%; + background-color: #ffffff; + padding: 0 10px; + color: #d3d3d3 + } + } +} diff --git a/app/assets/stylesheets/rooms.scss b/app/assets/stylesheets/rooms.scss index 42daca51..6066d2db 100644 --- a/app/assets/stylesheets/rooms.scss +++ b/app/assets/stylesheets/rooms.scss @@ -7,7 +7,7 @@ } .thumbnail { - height: 40% !important; + height: 60px !important; width: auto; } @@ -22,3 +22,7 @@ .home-indicator { font-size: 22px !important; } + +.btn-del-room { + width: 70% !important; +} diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 0f07f83b..2f720083 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -5,6 +5,13 @@ require 'bigbluebutton_api' class ApplicationController < ActionController::Base include SessionsHelper + before_action :migration_error? + + # Show an information page when migration fails and there is a version error. + def migration_error? + render :migration_error unless ENV["DB_MIGRATE_FAILED"].blank? + end + protect_from_forgery with: :exception MEETING_NAME_LIMIT = 90 @@ -56,7 +63,7 @@ class ApplicationController < ActionController::Base user_is_moderator: false, meeting_logout_url: request.base_url + logout_room_path(@room), meeting_recorded: true, - moderator_message: "#{invite_msg}\n\n #{request.base_url + relative_root + room_path(@room)}", + moderator_message: "#{invite_msg}\n\n #{request.base_url + room_path(@room)}", } end end diff --git a/app/controllers/rooms_controller.rb b/app/controllers/rooms_controller.rb index 218eea7e..57569b3a 100644 --- a/app/controllers/rooms_controller.rb +++ b/app/controllers/rooms_controller.rb @@ -65,8 +65,9 @@ class RoomsController < ApplicationController # DELETE /:room_uid def destroy + p @room # Don't delete the users home room. - @room.destroy if @room != current_user.main_room + @room.destroy if @room.owned_by?(current_user) && @room != current_user.main_room redirect_to current_user.main_room end @@ -90,14 +91,6 @@ class RoomsController < ApplicationController redirect_to @room end - # POST /:room_uid/home - def home - current_user.main_room = @room - current_user.save - - redirect_to @room - end - # POST /:room_uid/:record_id def update_recording meta = { diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb index af6f531b..41a623d8 100644 --- a/app/controllers/sessions_controller.rb +++ b/app/controllers/sessions_controller.rb @@ -19,18 +19,6 @@ class SessionsController < ApplicationController end end - # POST /launch - def launch - # This will recieve a encoded POST from a launcher that - # contains the provider, and all user information. The - # launcher is what does the authentication, so we know - # that the user is who they say they are. We just need - # to use our secret to decode it and then log them in - # to GreenLight (or sign them up). - - # User.from_launch() - end - # GET/POST /auth/:provider/callback def omniauth user = User.from_omniauth(request.env['omniauth.auth']) diff --git a/app/models/user.rb b/app/models/user.rb index 019c4d74..a087c47f 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -23,8 +23,8 @@ class User < ApplicationRecord # Generates a user from omniauth. def from_omniauth(auth) find_or_initialize_by(social_uid: auth['uid'], provider: auth['provider']).tap do |u| - u.name = send("#{auth['provider']}_name", auth) - u.username = send("#{auth['provider']}_username", auth) + u.name = send("#{auth['provider']}_name", auth) unless u.name + u.username = send("#{auth['provider']}_username", auth) unless u.username u.email = send("#{auth['provider']}_email", auth) u.image = send("#{auth['provider']}_image", auth) u.save! diff --git a/app/views/application/migration_error.html.erb b/app/views/application/migration_error.html.erb new file mode 100644 index 00000000..8d90ff3d --- /dev/null +++ b/app/views/application/migration_error.html.erb @@ -0,0 +1,16 @@ +
+
+
+ +

Greenlight encountered a database migration error.
This may be because you haven't updated to Greenlight 2.0.

+

If you are not an administrator, please contact one.

+

We've released a new version of Greenlight, but your database isn't compatible.

+ + Show me how to upgrade to 2.0! + + + I'd like to stay using 1.0. + +
+
+
diff --git a/app/views/main/index.html.erb b/app/views/main/index.html.erb index 5ce4ab45..57ca2794 100644 --- a/app/views/main/index.html.erb +++ b/app/views/main/index.html.erb @@ -12,7 +12,7 @@

Welcome to Greenlight.

A simple front end for your BigBlueButton Open Source Web Conferencing Server.

- <%= link_to "https://www.youtube.com/watch?v=yGX3JCv7OVM&feature=youtu.be", class: "p-3", target: "_blank" do %> + <%= link_to "https://youtu.be/Hso8yLzkqj8", class: "p-3", target: "_blank" do %>

Watch a tutorial on using Greenlight

<% end %> diff --git a/app/views/rooms/show.html.erb b/app/views/rooms/show.html.erb index 79500e11..f48df08c 100644 --- a/app/views/rooms/show.html.erb +++ b/app/views/rooms/show.html.erb @@ -48,6 +48,7 @@ <%= render "shared/components/room_block", room: room %> <% end %> + <%= render "shared/modals/delete_room_modal", room: room %> <% end %> <% end %> diff --git a/app/views/shared/_header.html.erb b/app/views/shared/_header.html.erb index 61cef386..78e5217c 100644 --- a/app/views/shared/_header.html.erb +++ b/app/views/shared/_header.html.erb @@ -10,7 +10,7 @@ <%= image_tag("logo_with_text.png", class: "header-brand-img") %> <% end %> <% end %> - +
<% if current_user %> @@ -29,13 +29,13 @@ diff --git a/app/views/shared/components/_room_block.html.erb b/app/views/shared/components/_room_block.html.erb index 69d4b2d9..0a796d84 100644 --- a/app/views/shared/components/_room_block.html.erb +++ b/app/views/shared/components/_room_block.html.erb @@ -22,22 +22,21 @@
- diff --git a/app/views/shared/modals/_delete_room_modal.html.erb b/app/views/shared/modals/_delete_room_modal.html.erb new file mode 100644 index 00000000..5ce6854f --- /dev/null +++ b/app/views/shared/modals/_delete_room_modal.html.erb @@ -0,0 +1,25 @@ + diff --git a/app/views/shared/modals/_login_modal.html.erb b/app/views/shared/modals/_login_modal.html.erb index f6f2307c..5896d4fb 100644 --- a/app/views/shared/modals/_login_modal.html.erb +++ b/app/views/shared/modals/_login_modal.html.erb @@ -6,15 +6,19 @@

Login

- - <% configured_providers.each do |provider| %> - <%= link_to omniauth_login_url(provider), class: "btn btn-pill btn-#{provider} btn-block" do %> -  <%= "Login with #{provider.capitalize}" %> + + <% unless configured_providers.length.zero? %> + <% configured_providers.each do |provider| %> + <%= link_to omniauth_login_url(provider), class: "btn btn-pill btn-#{provider} btn-block" do %> +  <%= "Login with #{provider.capitalize}" %> + <% end %> <% end %> + +
+
or
+
<% end %> -
- <%= form_for(:session, url: create_session_path) do |f| %>
diff --git a/app/views/shared/settings/_account.html.erb b/app/views/shared/settings/_account.html.erb index 26504eb8..cc9669a5 100644 --- a/app/views/shared/settings/_account.html.erb +++ b/app/views/shared/settings/_account.html.erb @@ -18,7 +18,7 @@

<%= f.label "Provider", class: "form-label" %> - <%= f.text_field :provider, class: "form-control", value: @user.provider.capitalize, readonly: "" %> + <%= f.text_field :provider, class: "form-control", readonly: "" %> <%= f.label "Image", class: "form-label mt-5" %>
diff --git a/app/views/users/new.html.erb b/app/views/users/new.html.erb index 56620103..06b3168d 100644 --- a/app/views/users/new.html.erb +++ b/app/views/users/new.html.erb @@ -28,7 +28,8 @@
<%= @user.errors.full_messages_for(:password_confirmation).first %>
<% end %>
diff --git a/bin/start b/bin/start index c9f53fa0..3bfb4ab2 100755 --- a/bin/start +++ b/bin/start @@ -6,6 +6,8 @@ do done bundle exec rake db:create -bundle exec rake db:migrate +if ! bundle exec rake db:migrate ; then + export DB_MIGRATE_FAILED=1 +fi exec bundle exec puma -C config/puma.rb diff --git a/config/environments/production.rb b/config/environments/production.rb index 42d2e076..42654597 100644 --- a/config/environments/production.rb +++ b/config/environments/production.rb @@ -87,6 +87,7 @@ Rails.application.configure do config.active_record.dump_schema_after_migration = false # Set the relative url root for deployment to a subdirectory. - config.relative_url_root = "/" - config.relative_url_root = ENV['RELATIVE_URL_ROOT'] if ENV['RELATIVE_URL_ROOT'].present? + if ENV['RELATIVE_URL_ROOT'] != "/" + config.relative_url_root = ENV['RELATIVE_URL_ROOT'] || "/b" + end end diff --git a/config/puma.rb b/config/puma.rb index 991c3a6f..2ef031d5 100644 --- a/config/puma.rb +++ b/config/puma.rb @@ -11,7 +11,7 @@ threads threads_count, threads_count # Specifies the `port` that Puma will listen on to receive requests, default is 3000. # -port ENV.fetch("PORT") { 3000 } +port ENV.fetch("PORT") { 80 } # Specifies the `environment` that Puma will run in. # diff --git a/config/routes.rb b/config/routes.rb index 924b1191..a43d1ff9 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -24,9 +24,6 @@ Rails.application.routes.draw do patch '/:user_uid/edit', to: 'users#update', as: :update_user end - # Handles launches from a trusted launcher. - post '/launch', to: 'sessions#launch' - # Handles Omniauth authentication. match '/auth/:provider/callback', to: 'sessions#omniauth', via: [:get, :post], as: :omniauth_session get '/auth/failure', to: 'sessions#fail' @@ -39,7 +36,6 @@ Rails.application.routes.draw do post '/', to: 'rooms#join' post '/start', to: 'rooms#start', as: :start_room get '/logout', to: 'rooms#logout', as: :logout_room - post '/home', to: 'rooms#home', as: :make_home # Mange recordings. scope '/:record_id' do diff --git a/docker-compose.yml b/docker-compose.yml index ef11cc2f..7b50ff0c 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,14 +1,14 @@ version: '3' -services: +services: app: entrypoint: [bin/start] - image: joshblind/greenlight:latest - container_name: greenlight-web + image: bigbluebutton/greenlight:v2 + container_name: greenlight-v2 env_file: env restart: unless-stopped ports: - - 6000:3000 - volumes: + - 5000:80 + volumes: - ./db/production:/usr/src/app/db/production - ./log:/usr/src/app/log diff --git a/greenlight.nginx b/greenlight.nginx index a40d30ba..b3d5f904 100644 --- a/greenlight.nginx +++ b/greenlight.nginx @@ -1,18 +1,18 @@ -# Routes requests to Greenlight based on the '/gl' prefix. -# Use this file to route '/gl' paths on your BigBlueButton server +# Routes requests to Greenlight based on the '/b' prefix. +# Use this file to route '/b' paths on your BigBlueButton server # to the Greenlight application. If you are using a different # subpath, you should change it here. -location /gl { - proxy_pass http://127.0.0.1:6000; +location /b { + proxy_pass http://127.0.0.1:5000; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_http_version 1.1; } -location /gl/cable { - proxy_pass http://127.0.0.1:6000; +location /b/cable { + proxy_pass http://127.0.0.1:5000; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; diff --git a/sample.env b/sample.env index 26973ac0..864b5d0c 100644 --- a/sample.env +++ b/sample.env @@ -3,7 +3,7 @@ # You can generate a secure one through the Greenlight docker image # with with the command. # -# docker run --rm bigbluebutton/greenlight bundle exec rake secret +# docker run --rm bigbluebutton/greenlight:v2 bundle exec rake secret # SECRET_KEY_BASE= @@ -50,6 +50,6 @@ ALLOW_GREENLIGHT_ACCOUNTS=true # if deploying on a BigBlueButton server. Keep in mind that if you change this, you'll # have to update your authentication callback URL's to reflect this change. # -# The recommended prefix is "/gl". +# The recommended prefix is "/b". # -RELATIVE_URL_ROOT=/gl +RELATIVE_URL_ROOT=/b