google_directory 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/lib/google_directory.rb +6 -0
- data/lib/google_directory/connection.rb +100 -0
- data/lib/google_directory/user_commands.rb +117 -0
- data/lib/google_directory/users_commands.rb +24 -0
- data/lib/google_directory/version.rb +5 -0
- metadata +121 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: be15ff583f69da807620a4b2aef6466b6a896e5d9fc50bdd36f5855fb63b4d50
|
4
|
+
data.tar.gz: b7ecff040096c31c35a8b29ff13859e763f9cb4fcb3d025247c255f32fb6e801
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: dc47b4ce9e1d17d53ff5ec0a109feec4b0cc82951917cdfe3b1392aa16688d594152710a321d7c7225654348962995ddef87c2b368d0250412a4992ac675d17a
|
7
|
+
data.tar.gz: 0f482a2d2cfc9ae100b0e5b0617c8892a5445821ac64da29fc9334c32aedd0bb616748b63751e500ca3a1e97dddffdc6863659b0bdd3ea1ff4d081af82a86cb6
|
@@ -0,0 +1,100 @@
|
|
1
|
+
require 'google/apis/admin_directory_v1'
|
2
|
+
require 'googleauth'
|
3
|
+
require 'googleauth/stores/file_token_store'
|
4
|
+
|
5
|
+
require 'fileutils'
|
6
|
+
|
7
|
+
require "google_directory/user_commands"
|
8
|
+
|
9
|
+
module GoogleDirectory
|
10
|
+
|
11
|
+
# The GoogleDirectory, makes it easy to work with Google Directory.
|
12
|
+
# @since 0.1.0
|
13
|
+
#
|
14
|
+
# @note Its important to have your oauth setup and its client_secret.json file downloaded in the root directory
|
15
|
+
# @note You can also use environment variables to override google defaults as wanted.
|
16
|
+
class Connection
|
17
|
+
|
18
|
+
include GoogleDirectory::UserCommands
|
19
|
+
|
20
|
+
# default settings from google for all users
|
21
|
+
OOB_URI = ENV['OOB_URI'] || 'urn:ietf:wg:oauth:2.0:oob'
|
22
|
+
CREDENTIALS_PATH = ENV['CREDENTIALS_PATH'] || File.join( Dir.home, '.credentials', "admin-directory_v1-ruby-accounts.yaml")
|
23
|
+
|
24
|
+
# Get info the Google Cloud Admin
|
25
|
+
# https://console.cloud.google.com/apis/ or
|
26
|
+
# build using: https://developers.google.com/api-client-library/ruby/guide/aaa_client_secrets
|
27
|
+
CLIENT_SECRETS_PATH = ENV['CLIENT_SECRETS_PATH'] || 'client_secret.json'
|
28
|
+
|
29
|
+
# Scope options - https://www.googleapis.com/auth/admin.directory.user
|
30
|
+
SCOPE = Google::Apis::AdminDirectoryV1::AUTH_ADMIN_DIRECTORY_USER
|
31
|
+
|
32
|
+
# Initialize the API
|
33
|
+
# https://www.rubydoc.info/github/google/google-api-ruby-client/Google/Apis/AdminDirectoryV1/DirectoryService
|
34
|
+
# https://github.com/google/google-api-ruby-client/issues/360
|
35
|
+
|
36
|
+
# @note make connection to google directory services
|
37
|
+
# @param service [Class] the default is: Google::Apis::AdminDirectoryV1::DirectoryService
|
38
|
+
def initialize( service: Google::Apis::AdminDirectoryV1::DirectoryService )
|
39
|
+
app_name ||= ENV['APPLICATION_NAME'] || 'google_cloud_app_name'
|
40
|
+
@service = service.new
|
41
|
+
@service.client_options.application_name = app_name
|
42
|
+
@service.authorization = authorize
|
43
|
+
end
|
44
|
+
|
45
|
+
# @note Run a command against Google Directory
|
46
|
+
#
|
47
|
+
# @param action [Symbol] choose action to perform these include: :user_get, :user_exists? (t/f), :user_create, :user_delete, :user_update & convience commands :user_suspend, :user_reactivate, :user_change_password
|
48
|
+
# @param attributes [Hash] attributes needed to perform action
|
49
|
+
# @return [Hash] will hopefully return a hash with {success: {action: :action, attributes: {primary_email: "user@domain"}, response: "whatever google answered - usually a hash"} }
|
50
|
+
def run( action:, attributes: {} )
|
51
|
+
response = { success: nil, error: nil }
|
52
|
+
begin
|
53
|
+
response[:success] = send( action, attributes: attributes )
|
54
|
+
rescue Google::Apis::ClientError => error
|
55
|
+
response[:error] = {action: action, attributes: attributes,
|
56
|
+
error: error}
|
57
|
+
end
|
58
|
+
response
|
59
|
+
end
|
60
|
+
alias_method :execute, :run
|
61
|
+
|
62
|
+
# # answer = GoogleDirectory.(action: :user_get, attributes: {primary_email: "btihen@las.ch"})
|
63
|
+
# def self.call(service: Google::Apis::AdminDirectoryV1::DirectoryService,
|
64
|
+
# app_name: nil,
|
65
|
+
# action:, attributes: {} )
|
66
|
+
# new(service: service, app_name: app_name).
|
67
|
+
# run(action: action, attributes: attributes)
|
68
|
+
# end
|
69
|
+
|
70
|
+
private
|
71
|
+
attr_reader :service
|
72
|
+
##
|
73
|
+
# FROM:
|
74
|
+
# https://www.rubydoc.info/github/google/google-api-ruby-client/Google/Apis/AdminDirectoryV1/DirectoryService
|
75
|
+
# Ensure valid credentials, either by restoring from the saved credentials
|
76
|
+
# files or intitiating an OAuth2 authorization. If authorization is required,
|
77
|
+
# the user's default browser will be launched to approve the request.
|
78
|
+
# @return [Google::Auth::UserRefreshCredentials] OAuth2 credentials
|
79
|
+
def authorize
|
80
|
+
FileUtils.mkdir_p(File.dirname(CREDENTIALS_PATH))
|
81
|
+
|
82
|
+
client_id = Google::Auth::ClientId.from_file(CLIENT_SECRETS_PATH)
|
83
|
+
token_store = Google::Auth::Stores::FileTokenStore.new(file: CREDENTIALS_PATH)
|
84
|
+
authorizer = Google::Auth::UserAuthorizer.new( client_id, SCOPE, token_store )
|
85
|
+
user_id = 'default'
|
86
|
+
credentials = authorizer.get_credentials(user_id)
|
87
|
+
if credentials.nil?
|
88
|
+
url = authorizer.get_authorization_url(
|
89
|
+
base_url: OOB_URI)
|
90
|
+
puts "Open the following URL in the browser and enter the " +
|
91
|
+
"resulting code after authorization"
|
92
|
+
puts url
|
93
|
+
code = gets
|
94
|
+
credentials = authorizer.get_and_store_credentials_from_code(
|
95
|
+
user_id: user_id, code: code, base_url: OOB_URI)
|
96
|
+
end
|
97
|
+
credentials
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
@@ -0,0 +1,117 @@
|
|
1
|
+
# already required in Google API
|
2
|
+
# require 'SecureRandom'
|
3
|
+
|
4
|
+
module GoogleDirectory
|
5
|
+
|
6
|
+
# @note DirectoryService Ruby API Commands - https://www.rubydoc.info/github/google/google-api-ruby-client/Google/Apis/AdminDirectoryV1/DirectoryService
|
7
|
+
# @note GoogleUser Attributes - https://www.rubydoc.info/github/google/google-api-ruby-client/Google/Apis/AdminDirectoryV1/User
|
8
|
+
module UserCommands
|
9
|
+
|
10
|
+
# @note Get GoogleDirectory User Info
|
11
|
+
#
|
12
|
+
# @param attributes [Hash] this attribute MUST include: { primary_email: "username@domain.com" }
|
13
|
+
# @return [Hash] formatted as {success: {action: :user_get, attributes: {primary_email: "user@domain"}, response: GoogleUserObject } }
|
14
|
+
def user_get( attributes: )
|
15
|
+
response = service.get_user( attributes[:primary_email] )
|
16
|
+
{action: :user_get, user: attributes[:primary_email], response: response}
|
17
|
+
end
|
18
|
+
|
19
|
+
# @note Test if user exists in Google Directory
|
20
|
+
#
|
21
|
+
# @param attributes [Hash] this attribute MUST include: { primary_email: "username@domain.com" }
|
22
|
+
# @return [Hash] formatted as {success: {action: :user_exists?, attributes: {primary_email: "user@domain"}, response: Boolean } }
|
23
|
+
def user_exists?( attributes: )
|
24
|
+
begin
|
25
|
+
response = service.get_user( attributes[:primary_email] )
|
26
|
+
return {action: :user_exists?, user: attributes[:primary_email], response: true}
|
27
|
+
rescue Google::Apis::ClientError => error
|
28
|
+
if error.message.include? 'notFound'
|
29
|
+
return {action: :user_exists?, user: attributes[:primary_email], response: false}
|
30
|
+
else
|
31
|
+
raise error
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
# @note creates a new Google Directory User
|
37
|
+
#
|
38
|
+
# @param attributes [Hash] this attribute MUST include: { primary_email: "username@domain.com", name: {given_name: "First Names", family_name: "LAST NAMES" } }
|
39
|
+
# @return [Hash] formatted as {success: {action: :user_create, attributes: {primary_email: "user@domain"}, response: GoogleUserObject } }
|
40
|
+
def user_create( attributes: )
|
41
|
+
# http://blog.liveedu.tv/ruby-generate-random-string/
|
42
|
+
password = SecureRandom.base64
|
43
|
+
defaults = { suspended: true, password: password, change_password_at_next_login: true }
|
44
|
+
user_attr = defaults.merge( attributes )
|
45
|
+
# create a google user object
|
46
|
+
user_object = Google::Apis::AdminDirectoryV1::User.new user_attr
|
47
|
+
# create user in directory services
|
48
|
+
response = service.insert_user( user_object )
|
49
|
+
{action: :user_create, user: attributes[:primary_email], response: response}
|
50
|
+
end
|
51
|
+
|
52
|
+
# @note updates an exising Google Directory User
|
53
|
+
#
|
54
|
+
# @param attributes [Hash] this attribute MUST include: { primary_email: "username@domain.com", attributes_to_change: "" } }
|
55
|
+
# @return [Hash] formatted as {success: {action: :user_update, attributes: {primary_email: "user@domain"}, response: GoogleUserObject } }
|
56
|
+
def user_update( attributes: )
|
57
|
+
# create a user object for google to update
|
58
|
+
response = update_user( attributes )
|
59
|
+
{action: :user_update, user: attributes[:primary_email], response: response}
|
60
|
+
end
|
61
|
+
|
62
|
+
# @note updates an exising Google Directory User password - convience method instead of using :user_update
|
63
|
+
#
|
64
|
+
# @param attributes [Hash] this attribute MUST include: { primary_email: "username@domain.com", password: "secret" } - if no password is included a random password will be assigned
|
65
|
+
# @return [Hash] formatted as {success: {action: :user_change_password, attributes: {primary_email: "user@domain"}, response: GoogleUserObject } }
|
66
|
+
def user_change_password( attributes: )
|
67
|
+
password = SecureRandom.base64
|
68
|
+
defaults = { password: password, change_password_at_next_login: true }
|
69
|
+
user_attr = defaults.merge( attributes )
|
70
|
+
|
71
|
+
response = update_user( user_attr )
|
72
|
+
{action: :user_change_password, user: attributes[:primary_email], response: response}
|
73
|
+
end
|
74
|
+
|
75
|
+
# @note activates an exising Google Directory User password - convience method instead of using :user_update
|
76
|
+
#
|
77
|
+
# @param attributes [Hash] this attribute MUST include: { primary_email: "username@domain.com" }
|
78
|
+
# @return [Hash] formatted as {success: {action: :user_reactivate, attributes: {primary_email: "user@domain"}, response: GoogleUserObject } }
|
79
|
+
def user_reactivate( attributes: )
|
80
|
+
defaults = { :suspended => false }
|
81
|
+
user_attr = defaults.merge( attributes )
|
82
|
+
|
83
|
+
response = update_user( user_attr )
|
84
|
+
{action: :user_reactivate, user: attributes[:primary_email], response: response}
|
85
|
+
end
|
86
|
+
|
87
|
+
# @note suspends an exising Google Directory User password - convience method instead of using :user_update
|
88
|
+
#
|
89
|
+
# @param attributes [Hash] this attribute MUST include: { primary_email: "username@domain.com" }
|
90
|
+
# @return [Hash] formatted as {success: {action: :user_suspend, attributes: {primary_email: "user@domain"}, response: GoogleUserObject } }
|
91
|
+
def user_suspend( attributes: )
|
92
|
+
defaults = { :suspended => true }
|
93
|
+
user_attr = defaults.merge( attributes )
|
94
|
+
|
95
|
+
response = update_user( user_attr )
|
96
|
+
{action: :user_suspend, user: attributes[:primary_email], response: response}
|
97
|
+
end
|
98
|
+
|
99
|
+
# @note deletes an exising Google Directory User
|
100
|
+
#
|
101
|
+
# @param attributes [Hash] this attribute MUST include: { primary_email: "username@domain.com" }
|
102
|
+
# @return [Hash] formatted as {success: {action: :user_delete, attributes: {primary_email: "user@domain"}, response: "" } }
|
103
|
+
def user_delete( attributes: )
|
104
|
+
response = service.delete_user( attributes[:primary_email] )
|
105
|
+
{action: :user_delete, user: attributes[:primary_email], response: response}
|
106
|
+
end
|
107
|
+
|
108
|
+
private
|
109
|
+
def update_user( user_attr )
|
110
|
+
# create a user object that google will create
|
111
|
+
user_object = Google::Apis::AdminDirectoryV1::User.new user_attr
|
112
|
+
# send user object to google directory
|
113
|
+
service.update_user( user_attr[:primary_email], user_object )
|
114
|
+
end
|
115
|
+
|
116
|
+
end
|
117
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# already required in Google API
|
2
|
+
# require 'SecureRandom'
|
3
|
+
|
4
|
+
module GoogleDirectory
|
5
|
+
|
6
|
+
# DirectoryService Ruby API Commands
|
7
|
+
# https://www.rubydoc.info/github/google/google-api-ruby-client/Google/Apis/AdminDirectoryV1/DirectoryService
|
8
|
+
module UsersCommands
|
9
|
+
|
10
|
+
# Usage hints
|
11
|
+
# https://github.com/google/google-api-ruby-client/issues/360
|
12
|
+
|
13
|
+
# get multiple users
|
14
|
+
# if you don't want the defaults { max_results: 10, order_by: 'email' }
|
15
|
+
# you must override (a nil disables the option)
|
16
|
+
def users_list( attributes: {} )
|
17
|
+
defaults = { max_results: 10, order_by: 'email' }
|
18
|
+
filters = defaults.merge( attributes )
|
19
|
+
response = service.list_users( filters )
|
20
|
+
{action: :users_list, filters: filters, response: response}
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
metadata
ADDED
@@ -0,0 +1,121 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: google_directory
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Bill Tihen
|
8
|
+
- Lee Weisbecker
|
9
|
+
autorequire:
|
10
|
+
bindir: exe
|
11
|
+
cert_chain: []
|
12
|
+
date: 2018-05-22 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: google-api-client
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - "~>"
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: '0.21'
|
21
|
+
type: :runtime
|
22
|
+
prerelease: false
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - "~>"
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
version: '0.21'
|
28
|
+
- !ruby/object:Gem::Dependency
|
29
|
+
name: bundler
|
30
|
+
requirement: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - "~>"
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: '1.16'
|
35
|
+
type: :development
|
36
|
+
prerelease: false
|
37
|
+
version_requirements: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - "~>"
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '1.16'
|
42
|
+
- !ruby/object:Gem::Dependency
|
43
|
+
name: rake
|
44
|
+
requirement: !ruby/object:Gem::Requirement
|
45
|
+
requirements:
|
46
|
+
- - "~>"
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: '10.0'
|
49
|
+
type: :development
|
50
|
+
prerelease: false
|
51
|
+
version_requirements: !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - "~>"
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '10.0'
|
56
|
+
- !ruby/object:Gem::Dependency
|
57
|
+
name: rspec
|
58
|
+
requirement: !ruby/object:Gem::Requirement
|
59
|
+
requirements:
|
60
|
+
- - "~>"
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '3.0'
|
63
|
+
type: :development
|
64
|
+
prerelease: false
|
65
|
+
version_requirements: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - "~>"
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '3.0'
|
70
|
+
- !ruby/object:Gem::Dependency
|
71
|
+
name: pry
|
72
|
+
requirement: !ruby/object:Gem::Requirement
|
73
|
+
requirements:
|
74
|
+
- - "~>"
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '0.11'
|
77
|
+
type: :development
|
78
|
+
prerelease: false
|
79
|
+
version_requirements: !ruby/object:Gem::Requirement
|
80
|
+
requirements:
|
81
|
+
- - "~>"
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: '0.11'
|
84
|
+
description: Authenticate, list, make, check, suspend and activate google users.
|
85
|
+
email:
|
86
|
+
- btihen@gmail.com
|
87
|
+
- lweisbecker@las.ch
|
88
|
+
executables: []
|
89
|
+
extensions: []
|
90
|
+
extra_rdoc_files: []
|
91
|
+
files:
|
92
|
+
- lib/google_directory.rb
|
93
|
+
- lib/google_directory/connection.rb
|
94
|
+
- lib/google_directory/user_commands.rb
|
95
|
+
- lib/google_directory/users_commands.rb
|
96
|
+
- lib/google_directory/version.rb
|
97
|
+
homepage: https://github.com/LAS-IT/google_directory
|
98
|
+
licenses:
|
99
|
+
- MIT
|
100
|
+
metadata: {}
|
101
|
+
post_install_message:
|
102
|
+
rdoc_options: []
|
103
|
+
require_paths:
|
104
|
+
- lib
|
105
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
106
|
+
requirements:
|
107
|
+
- - ">="
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
110
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
111
|
+
requirements:
|
112
|
+
- - ">="
|
113
|
+
- !ruby/object:Gem::Version
|
114
|
+
version: '0'
|
115
|
+
requirements: []
|
116
|
+
rubyforge_project:
|
117
|
+
rubygems_version: 2.7.6
|
118
|
+
signing_key:
|
119
|
+
specification_version: 4
|
120
|
+
summary: Simple ruby wrapper to manage google accounts.
|
121
|
+
test_files: []
|