Implemented issue #1177 - OAuth2: Office365.

This commit is contained in:
Felix Niklas 2017-07-14 12:14:51 +02:00
commit a4ef55cec0
14 changed files with 204 additions and 84 deletions

View file

@ -40,6 +40,7 @@ gem 'omniauth-gitlab'
gem 'omniauth-google-oauth2' gem 'omniauth-google-oauth2'
gem 'omniauth-linkedin-oauth2' gem 'omniauth-linkedin-oauth2'
gem 'omniauth-twitter' gem 'omniauth-twitter'
gem 'omniauth-microsoft-office365'
gem 'twitter' gem 'twitter'
gem 'telegramAPI' gem 'telegramAPI'

View file

@ -236,6 +236,9 @@ GEM
omniauth-linkedin-oauth2 (0.1.5) omniauth-linkedin-oauth2 (0.1.5)
omniauth (~> 1.0) omniauth (~> 1.0)
omniauth-oauth2 omniauth-oauth2
omniauth-microsoft-office365 (0.0.7)
omniauth
omniauth-oauth2
omniauth-oauth (1.1.0) omniauth-oauth (1.1.0)
oauth oauth
omniauth (~> 1.0) omniauth (~> 1.0)
@ -464,6 +467,7 @@ DEPENDENCIES
omniauth-gitlab omniauth-gitlab
omniauth-google-oauth2 omniauth-google-oauth2
omniauth-linkedin-oauth2 omniauth-linkedin-oauth2
omniauth-microsoft-office365
omniauth-oauth2 omniauth-oauth2
omniauth-twitter omniauth-twitter
pg pg

View file

@ -9,43 +9,7 @@ class Index extends App.ControllerSubContent
@render() @render()
render: => render: =>
auth_provider_all = { auth_provider_all = App.Config.get('auth_provider_all')
facebook: {
url: '/auth/facebook'
name: 'Facebook'
config: 'auth_facebook'
},
twitter: {
url: '/auth/twitter'
name: 'Twitter'
config: 'auth_twitter'
},
linkedin: {
url: '/auth/linkedin'
name: 'LinkedIn'
config: 'auth_linkedin'
},
github: {
url: '/auth/github'
name: 'GitHub'
config: 'auth_github'
},
gitlab: {
url: '/auth/gitlab'
name: 'GitLab'
config: 'auth_gitlab'
},
google_oauth2: {
url: '/auth/google_oauth2'
name: 'Google'
config: 'auth_google_oauth2'
},
oauth2: {
url: '/auth/oauth2'
name: 'OAuth2'
config: 'auth_oauth2'
},
}
auth_providers = {} auth_providers = {}
for key, provider of auth_provider_all for key, provider of auth_provider_all
if @Config.get(provider.config) is true || @Config.get(provider.config) is 'true' if @Config.get(provider.config) is true || @Config.get(provider.config) is 'true'
@ -90,3 +54,45 @@ class Index extends App.ControllerSubContent
) )
App.Config.set('LinkedAccounts', { prio: 4000, name: 'Linked Accounts', parent: '#profile', target: '#profile/linked', controller: Index, permission: ['user_preferences.linked_accounts'] }, 'NavBarProfile') App.Config.set('LinkedAccounts', { prio: 4000, name: 'Linked Accounts', parent: '#profile', target: '#profile/linked', controller: Index, permission: ['user_preferences.linked_accounts'] }, 'NavBarProfile')
App.Config.set('auth_provider_all', {
facebook:
url: '/auth/facebook'
name: 'Facebook'
config: 'auth_facebook'
class: 'facebook'
twitter:
url: '/auth/twitter'
name: 'Twitter'
config: 'auth_twitter'
class: 'twitter'
linkedin:
url: '/auth/linkedin'
name: 'LinkedIn'
config: 'auth_linkedin'
class: 'linkedin'
github:
url: '/auth/github'
name: 'GitHub'
config: 'auth_github'
class: 'github'
gitlab:
url: '/auth/gitlab'
name: 'GitLab'
config: 'auth_gitlab'
class: 'gitlab'
microsoft_office365:
url: '/auth/microsoft_office365'
name: 'Office 365'
config: 'auth_microsoft_office365'
class: 'office365'
google_oauth2:
url: '/auth/google_oauth2'
name: 'Google'
config: 'auth_google_oauth2'
class: 'google'
oauth2:
url: '/auth/oauth2'
name: 'OAuth2'
config: 'auth_oauth2'
class: 'oauth2'
})

View file

@ -38,50 +38,7 @@ class Index extends App.ControllerContent
) )
render: (data = {}) -> render: (data = {}) ->
auth_provider_all = { auth_provider_all = App.Config.get('auth_provider_all')
facebook: {
url: '/auth/facebook',
name: 'Facebook',
config: 'auth_facebook',
class: 'facebook'
},
twitter: {
url: '/auth/twitter'
name: 'Twitter'
config: 'auth_twitter'
class: 'twitter'
},
linkedin: {
url: '/auth/linkedin'
name: 'LinkedIn'
config: 'auth_linkedin'
class: 'linkedin'
},
github: {
url: '/auth/github'
name: 'GitHub'
config: 'auth_github'
class: 'github'
},
gitlab: {
url: '/auth/gitlab'
name: 'GitLab'
config: 'auth_gitlab'
class: 'gitlab'
},
google_oauth2: {
url: '/auth/google_oauth2'
name: 'Google'
config: 'auth_google_oauth2'
class: 'google'
},
oauth2: {
url: '/auth/oauth2'
name: 'OAuth2'
config: 'auth_oauth2'
class: 'oauth2'
},
}
auth_providers = [] auth_providers = []
for key, provider of auth_provider_all for key, provider of auth_provider_all
if @Config.get(provider.config) is true || @Config.get(provider.config) is 'true' if @Config.get(provider.config) is true || @Config.get(provider.config) is 'true'

View file

@ -24,7 +24,7 @@
<div class="formGroup-label"> <div class="formGroup-label">
<label for="password"><%- @Ti('Password') %></label> <label for="password"><%- @Ti('Password') %></label>
</div> </div>
<input id="password" name="password" type="password" class="form-control"/> <input id="password" name="password" type="password" class="form-control" autocomplete="off"/>
</div> </div>
<div class="form-group"> <div class="form-group">

View file

@ -55,6 +55,7 @@
.icon-mute { width: 16px; height: 16px; } .icon-mute { width: 16px; height: 16px; }
.icon-note { width: 16px; height: 16px; } .icon-note { width: 16px; height: 16px; }
.icon-oauth2-button { width: 29px; height: 24px; } .icon-oauth2-button { width: 29px; height: 24px; }
.icon-office365-button { width: 29px; height: 24px; }
.icon-one-ticket { width: 48px; height: 10px; } .icon-one-ticket { width: 48px; height: 10px; }
.icon-organization { width: 16px; height: 16px; } .icon-organization { width: 16px; height: 16px; }
.icon-outbound-calls { width: 17px; height: 17px; } .icon-outbound-calls { width: 17px; height: 17px; }

View file

@ -2550,6 +2550,10 @@ ol.tabs li {
background: hsl(0,0%,15%); background: hsl(0,0%,15%);
} }
&.auth-provider--office365 {
background: hsl(15,100%,47%);
}
.provider-name { .provider-name {
flex: 1; flex: 1;
} }
@ -2558,7 +2562,6 @@ ol.tabs li {
width: 29px; width: 29px;
height: 24px; height: 24px;
margin-right: 10px; margin-right: 10px;
margin-top: 1px;
} }
} }

View file

@ -34,6 +34,9 @@ Rails.application.config.middleware.use OmniAuth::Builder do
}, },
} }
# microsoft_office365 database connect
provider :microsoft_office365_database, 'not_change_will_be_set_by_database', 'not_change_will_be_set_by_database'
# oauth2 database connect # oauth2 database connect
provider :oauth2_database, 'not_change_will_be_set_by_database', 'not_change_will_be_set_by_database', { provider :oauth2_database, 'not_change_will_be_set_by_database', 'not_change_will_be_set_by_database', {
client_options: { client_options: {

Binary file not shown.

View file

@ -0,0 +1,63 @@
class OmniauthOffice365Setting < ActiveRecord::Migration
def up
# return if it's a new setup
return if !Setting.find_by(name: 'system_init_done')
Setting.create_if_not_exists(
title: 'Authentication via %s',
name: 'auth_microsoft_office365',
area: 'Security::ThirdPartyAuthentication',
description: 'Enables user authentication via %s. Register your app first at [%s](%s).',
options: {
form: [
{
display: '',
null: true,
name: 'auth_microsoft_office365',
tag: 'boolean',
options: {
true => 'yes',
false => 'no',
},
},
],
},
preferences: {
controller: 'SettingsAreaSwitch',
sub: ['auth_microsoft_office365_credentials'],
title_i18n: ['Office 365'],
description_i18n: ['Office 365', 'Microsoft Application Registration Portal', 'https://apps.dev.microsoft.com'],
permission: ['admin.security'],
},
state: false,
frontend: true
)
Setting.create_if_not_exists(
title: 'Office 365 App Credentials',
name: 'auth_microsoft_office365_credentials',
area: 'Security::ThirdPartyAuthentication::Office365',
description: 'Enables user authentication via Office 365.',
options: {
form: [
{
display: 'App ID',
null: true,
name: 'app_id',
tag: 'input',
},
{
display: 'App Secret',
null: true,
name: 'app_secret',
tag: 'input',
},
],
},
state: {},
preferences: {
permission: ['admin.security'],
},
frontend: false
)
end
end

View file

@ -1084,6 +1084,63 @@ Setting.create_if_not_exists(
frontend: false frontend: false
) )
Setting.create_if_not_exists(
title: 'Authentication via %s',
name: 'auth_microsoft_office365',
area: 'Security::ThirdPartyAuthentication',
description: 'Enables user authentication via %s. Register your app first at [%s](%s).',
options: {
form: [
{
display: '',
null: true,
name: 'auth_microsoft_office365',
tag: 'boolean',
options: {
true => 'yes',
false => 'no',
},
},
],
},
preferences: {
controller: 'SettingsAreaSwitch',
sub: ['auth_microsoft_office365_credentials'],
title_i18n: ['Office 365'],
description_i18n: ['Office 365', 'Microsoft Application Registration Portal', 'https://apps.dev.microsoft.com'],
permission: ['admin.security'],
},
state: false,
frontend: true
)
Setting.create_if_not_exists(
title: 'Office 365 App Credentials',
name: 'auth_microsoft_office365_credentials',
area: 'Security::ThirdPartyAuthentication::Office365',
description: 'Enables user authentication via Office 365.',
options: {
form: [
{
display: 'App ID',
null: true,
name: 'app_id',
tag: 'input',
},
{
display: 'App Secret',
null: true,
name: 'app_secret',
tag: 'input',
},
],
},
state: {},
preferences: {
permission: ['admin.security'],
},
frontend: false
)
Setting.create_if_not_exists( Setting.create_if_not_exists(
title: 'Authentication via %s', title: 'Authentication via %s',
name: 'auth_oauth2', name: 'auth_oauth2',

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 61 KiB

After

Width:  |  Height:  |  Size: 61 KiB

View file

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="29px" height="24px" viewBox="0 0 29 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 45.2 (43514) - http://www.bohemiancoding.com/sketch -->
<title>office365-button</title>
<desc>Created with Sketch.</desc>
<defs></defs>
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="office365-button" fill-rule="nonzero" fill="#FFFFFF">
<polyline id="office365" points="23 20.4918622 22.9835112 20.4918622 22.9835112 3.5578176 16.9485936 1.80999994 6.03297769 5.8992337 6 5.91572254 6 18.1504461 9.72647915 16.6994277 9.72647915 6.74016483 16.9485936 5.00883602 16.9156159 19.6509311 6 18.1504461 16.9156159 22.1902133 22.9835112 20.5083511 22.9835112 20.4918622"></polyline>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 890 B

View file

@ -0,0 +1,13 @@
class MicrosoftOffice365Database < OmniAuth::Strategies::MicrosoftOffice365
option :name, 'microsoft_office365'
def initialize(app, *args, &block)
# database lookup
config = Setting.get('auth_microsoft_office365_credentials') || {}
args[0] = config['app_id']
args[1] = config['app_secret']
super
end
end