This repository has been archived on 2021-10-24. You can view files and clone it, but cannot push or open issues or pull requests.
greenlight/app/models/user.rb

171 lines
5.3 KiB
Ruby
Raw Normal View History

2018-06-26 10:29:46 -04:00
# frozen_string_literal: true
2018-05-07 16:06:01 -04:00
2018-08-01 09:45:12 -04:00
# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/.
#
# Copyright (c) 2018 BigBlueButton Inc. and by respective authors (see below).
#
# This program is free software; you can redistribute it and/or modify it under the
# terms of the GNU Lesser General Public License as published by the Free Software
# Foundation; either version 3.0 of the License, or (at your option) any later
# version.
#
# BigBlueButton 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 Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License along
# with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
2018-06-26 10:29:46 -04:00
class User < ApplicationRecord
attr_accessor :reset_token
2018-05-31 15:04:18 -04:00
after_create :initialize_main_room
2018-06-26 10:29:46 -04:00
before_save { email.try(:downcase!) }
2018-05-09 16:31:52 -04:00
before_destroy :destroy_rooms
2018-05-29 15:28:29 -04:00
has_many :rooms
2018-05-31 15:04:18 -04:00
belongs_to :main_room, class_name: 'Room', foreign_key: :room_id, required: false
2018-05-07 16:06:01 -04:00
validates :name, length: { maximum: 256 }, presence: true
2018-05-09 16:31:52 -04:00
validates :provider, presence: true
2018-06-26 10:29:46 -04:00
validates :image, format: { with: /\.(png|jpg)\Z/i }, allow_blank: true
validates :email, length: { maximum: 256 }, allow_blank: true,
uniqueness: { case_sensitive: false, scope: :provider },
2018-06-26 10:29:46 -04:00
format: { with: /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i }
2018-05-09 16:31:52 -04:00
validates :password, length: { minimum: 6 }, confirmation: true, if: :greenlight_account?, on: :create
2018-05-09 16:31:52 -04:00
# Bypass validation if omniauth
validates :accepted_terms, acceptance: true,
unless: -> { !greenlight_account? || !Rails.configuration.terms }
2018-06-08 14:44:08 -04:00
# We don't want to require password validations on all accounts.
2018-05-09 16:31:52 -04:00
has_secure_password(validations: false)
2018-05-07 16:06:01 -04:00
class << self
# Generates a user from omniauth.
def from_omniauth(auth)
2018-07-10 15:05:50 -04:00
# Provider is the customer name if in loadbalanced config mode
provider = auth['provider'] == "bn_launcher" ? auth['info']['customer'] : auth['provider']
2018-07-09 16:00:10 -04:00
find_or_initialize_by(social_uid: auth['uid'], provider: provider).tap do |u|
2018-07-20 14:20:14 -04:00
u.name = auth_name(auth) unless u.name
u.username = auth_username(auth) unless u.username
u.email = auth_email(auth)
u.image = auth_image(auth)
u.email_verified = true
2018-06-26 10:29:46 -04:00
u.save!
end
2018-05-11 15:57:31 -04:00
end
2018-05-07 16:06:01 -04:00
private
# Provider attributes.
2018-07-20 14:20:14 -04:00
def auth_name(auth)
case auth['provider']
when :microsoft_office365
auth['info']['display_name']
else
auth['info']['name']
end
2018-05-07 16:06:01 -04:00
end
2018-07-20 14:20:14 -04:00
def auth_username(auth)
case auth['provider']
when :google
auth['info']['email'].split('@').first
when :bn_launcher
auth['info']['username']
else
auth['info']['nickname']
end
2018-06-29 10:07:06 -04:00
end
2018-07-20 14:20:14 -04:00
def auth_email(auth)
2018-07-04 14:48:22 -04:00
auth['info']['email']
2018-06-29 10:07:06 -04:00
end
2018-07-20 14:20:14 -04:00
def auth_image(auth)
case auth['provider']
when :twitter
auth['info']['image'].gsub("http", "https").gsub("_normal", "")
else
auth['info']['image'] unless auth['provider'] == :microsoft_office365
2018-07-20 14:20:14 -04:00
end
2018-06-29 10:07:06 -04:00
end
2018-05-25 11:55:48 -04:00
end
# Sets the password reset attributes.
def create_reset_digest
self.reset_token = User.new_token
update_attribute(:reset_digest, User.digest(reset_token))
update_attribute(:reset_sent_at, Time.zone.now)
end
# Sends password reset email.
def send_password_reset_email(url)
UserMailer.password_reset(self, url).deliver_now
end
# Returns true if the given token matches the digest.
def authenticated?(attribute, token)
digest = send("#{attribute}_digest")
return false if digest.nil?
BCrypt::Password.new(digest).is_password?(token)
end
# Return true if password reset link expires
def password_reset_expired?
reset_sent_at < 2.hours.ago
end
2018-06-13 13:27:29 -04:00
# Retrives a list of all a users rooms that are not the main room, sorted by last session date.
def secondary_rooms
secondary = (rooms - [main_room])
2018-06-26 10:29:46 -04:00
no_session, session = secondary.partition { |r| r.last_session.nil? }
sorted = session.sort_by(&:last_session)
sorted + no_session
2018-05-07 16:06:01 -04:00
end
def name_chunk
charset = ("a".."z").to_a - %w(b i l o s) + ("2".."9").to_a - %w(5 8)
chunk = name.parameterize[0...3]
if chunk.empty?
chunk + (0...3).map { charset.to_a[rand(charset.size)] }.join
elsif chunk.length == 1
chunk + (0...2).map { charset.to_a[rand(charset.size)] }.join
elsif chunk.length == 2
chunk + (0...1).map { charset.to_a[rand(charset.size)] }.join
else
chunk
end
2018-05-28 18:10:20 -04:00
end
2018-06-08 14:44:08 -04:00
def greenlight_account?
provider == "greenlight"
end
def self.digest(string)
cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST : BCrypt::Engine.cost
BCrypt::Password.create(string, cost: cost)
end
# Returns a random token.
def self.new_token
SecureRandom.urlsafe_base64
end
2018-05-09 16:31:52 -04:00
private
# Destory a users rooms when they are removed.
def destroy_rooms
rooms.destroy_all
end
2018-06-03 14:57:30 -04:00
# Initializes a room for the user and assign a BigBlueButton user id.
2018-05-31 15:04:18 -04:00
def initialize_main_room
2018-06-15 14:41:07 -04:00
self.uid = "gl-#{(0...12).map { (65 + rand(26)).chr }.join.downcase}"
self.main_room = Room.create!(owner: self, name: I18n.t("home_room"))
2018-06-26 10:29:46 -04:00
save
2018-05-09 16:31:52 -04:00
end
2018-05-07 16:06:01 -04:00
end