128 lines
4.5 KiB
Ruby
128 lines
4.5 KiB
Ruby
class InstallationsController < ApplicationController
|
||
include RegisterHelper
|
||
before_action :require_login
|
||
|
||
# app详情
|
||
def app
|
||
@bot = Bot.find_by(uid: current_user.id)
|
||
end
|
||
|
||
def index
|
||
@install_bots = BotInstall.where(bot_id: get_bot_id).group(:installer_id)
|
||
end
|
||
|
||
def show
|
||
@install_bot = BotInstall.find_by(bot_id: get_bot_id, installer_id: params[:id]) || BotInstall.find_by(id: params[:id])
|
||
tip_exception "参数installer_id错误" if @install_bot.blank?
|
||
end
|
||
|
||
def repositories
|
||
# 与github差异,所以取安装用户和bot对应所有的仓库
|
||
# 必须使用access_tokens获取到bot的token才能查询
|
||
tip_exception "无效Token" if current_user.platform != "bot"
|
||
bot = Bot.find_by(uid: current_user.id)
|
||
@install_bots = BotInstall.where(bot_id: bot.id).where(installer_id: params[:id])
|
||
end
|
||
|
||
def update_secret
|
||
ActiveRecord::Base.transaction do
|
||
bot = Bot.find params[:id]
|
||
application = Doorkeeper::Application.find_by(uid: bot.client_id, secret: bot.client_secret)
|
||
bot.client_secret = Doorkeeper::OAuth::Helpers::UniqueToken.generate
|
||
bot.save!
|
||
application.secret = bot.client_secret
|
||
application.save!
|
||
render_ok
|
||
end
|
||
end
|
||
|
||
def update_private_key
|
||
bot = Bot.find params[:id]
|
||
bot.private_key = OpenSSL::PKey::RSA::generate(2048).to_s
|
||
bot.save!
|
||
render_ok
|
||
end
|
||
|
||
# 同步bot信息,回调地址和名称
|
||
def update_callback_url
|
||
bot = Bot.find params[:id]
|
||
application = Doorkeeper::Application.find_by(uid: bot.client_id, secret: bot.client_secret)
|
||
application.redirect_uri = bot.oauth_callback_url
|
||
application.name = bot.name
|
||
if bot.uid.present?
|
||
bot_user = User.find_by(id: bot.uid)
|
||
bot_user.update_column(:nickname, bot.name) if bot_user.present?
|
||
end
|
||
application.save
|
||
render_ok
|
||
end
|
||
|
||
def suspended
|
||
@install_bot = BotInstall.find params[:id]
|
||
@install_bot.update_attributes!(state: 0)
|
||
render_ok
|
||
end
|
||
|
||
def unsuspended
|
||
@install_bot = BotInstall.find params[:id]
|
||
@install_bot.update_attributes!(state: 1)
|
||
render_ok
|
||
end
|
||
|
||
def auth_active
|
||
begin
|
||
@bot = Bot.find params[:id]
|
||
tip_exception("该Bot已激活") if Doorkeeper::Application.find_by(uid: @bot.client_id, secret: @bot.client_secret).present?
|
||
@bot.client_id = SecureRandom.uuid.gsub("-", "") if params[:client_id].blank?
|
||
@bot.client_secret = Doorkeeper::OAuth::Helpers::UniqueToken.generate if params[:client_secret].blank?
|
||
@bot.private_key = OpenSSL::PKey::RSA::generate(2048).to_s
|
||
@bot.owner_id = current_user.id
|
||
ActiveRecord::Base.transaction do
|
||
# 注册bot对应oauth应用
|
||
Doorkeeper::Application.create!(name: @bot.name, uid: @bot.client_id, secret: @bot.client_secret, redirect_uri: @bot.oauth_callback_url)
|
||
# 注册bot对应用户
|
||
result = autologin_register(User.generate_user_login('b'), nil, "#{SecureRandom.hex(6)}", 'bot', nil, @bot.name)
|
||
tip_exception(-1, result[:message]) if result[:message].present?
|
||
@bot.uid = result[:user][:id]
|
||
@bot.save
|
||
render_ok
|
||
end
|
||
rescue Exception => e
|
||
tip_exception(-1, e.message)
|
||
end
|
||
end
|
||
|
||
def access_tokens
|
||
@install_bot = BotInstall.find_by(bot_id: get_bot_id, installer_id: params[:id]) || BotInstall.find_by(id: params[:id])
|
||
tip_exception "参数installer_id错误" if @install_bot.blank?
|
||
@bot = @install_bot.bot
|
||
@application = Doorkeeper::Application.find_by(uid: @bot.client_id, secret: @bot.client_secret)
|
||
tip_exception("该Bot未激活") if @application.blank?
|
||
# 给bot生成token,因为bot是机器人操作
|
||
@access_token = Doorkeeper::AccessToken.create!({ :application_id => @application.id,
|
||
:resource_owner_id => @bot.uid,
|
||
:scopes => "public write",
|
||
:expires_in => "2592000",
|
||
:use_refresh_token => true
|
||
})
|
||
@install_bot.update_attributes!(state: 1)
|
||
render_ok(token: @access_token.token)
|
||
end
|
||
|
||
private
|
||
|
||
def get_bot_id
|
||
header = request.authorization
|
||
pattern = /^Bearer /i
|
||
token = header.gsub(pattern, "")
|
||
decoded_token = JWT.decode token, nil, false
|
||
# 前面已验证token有效期和正确性
|
||
decoded_token[0]["iss"]
|
||
rescue JWT::DecodeError
|
||
Rails.logger.error "jwt token decode error:#{token}"
|
||
tip_exception("无效Token")
|
||
end
|
||
|
||
end
|
||
|