cinch-authentication 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.
@@ -0,0 +1,154 @@
|
|
1
|
+
require 'cinch/configuration/authentication'
|
2
|
+
|
3
|
+
module Cinch
|
4
|
+
module Extensions
|
5
|
+
module Authentication
|
6
|
+
module ClassMethods
|
7
|
+
# Public: Enables authentication for the full plugin.
|
8
|
+
def enable_authentication
|
9
|
+
hook :pre, :for => [:match], :method => :authenticated?
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.included(base)
|
14
|
+
base.extend ClassMethods
|
15
|
+
end
|
16
|
+
|
17
|
+
# Public: Checks if the user is authorized to run the command.
|
18
|
+
#
|
19
|
+
# m - The Cinch::Message.
|
20
|
+
# levels - The level(s) of authentication Symbol(s) the user must have
|
21
|
+
# (default: nil).
|
22
|
+
#
|
23
|
+
# Examples
|
24
|
+
#
|
25
|
+
# # The :channel_status strategy
|
26
|
+
# authenticated? m, :h # => true for :q, :a, :o and :h
|
27
|
+
# authenticated? m, :o # => true for :q, :a and :o
|
28
|
+
#
|
29
|
+
# # The :user_list and :user_login strategy
|
30
|
+
# authenticated? m, [:admins, :users]
|
31
|
+
# authenticated? m, :admins
|
32
|
+
#
|
33
|
+
# Returns a Boolean.
|
34
|
+
def authenticated?(m, levels = nil)
|
35
|
+
strategy = config[:authentication_strategy] ||
|
36
|
+
bot.config.authentication.strategy
|
37
|
+
levels = levels || config[:authentication_level] ||
|
38
|
+
bot.config.authentication.level
|
39
|
+
|
40
|
+
case strategy
|
41
|
+
when :channel_status then return channel_status_strategy m, levels
|
42
|
+
when :list then return list_strategy m, levels
|
43
|
+
when :login then return login_strategy m, levels
|
44
|
+
end
|
45
|
+
|
46
|
+
raise StandardError, 'You have not configured an authentication ' +
|
47
|
+
'strategy.'
|
48
|
+
end
|
49
|
+
|
50
|
+
# Internal: Checks if the user is an operator on the channel.
|
51
|
+
#
|
52
|
+
# m - The Cinch::Message.
|
53
|
+
# level - The level Symbol.
|
54
|
+
def channel_status_strategy(m, level)
|
55
|
+
if config.has_key? :authentication_channel
|
56
|
+
channel = Channel channel[:authentication_channel]
|
57
|
+
elsif bot.config.authentication.channel
|
58
|
+
channel = Channel bot.config.authentication.channel
|
59
|
+
else
|
60
|
+
channel = m.channel
|
61
|
+
end
|
62
|
+
|
63
|
+
if level.nil?
|
64
|
+
raise StandardError, "You haven't configured an authentication level."
|
65
|
+
end
|
66
|
+
|
67
|
+
bot.loggers.debug level.inspect
|
68
|
+
|
69
|
+
user_modes = channel.users[m.user]
|
70
|
+
modes = { q: 'founder', a: 'admin', o: 'operator',
|
71
|
+
h: 'half-operator', v: 'voice' }
|
72
|
+
|
73
|
+
modes.keys.take(modes.keys.find_index(level) + 1).each do |mode|
|
74
|
+
return true if user_modes.include? mode.to_s
|
75
|
+
end
|
76
|
+
|
77
|
+
m.user.notice "This command requires at least #{modes[level]} status " +
|
78
|
+
"on #{channel}."
|
79
|
+
|
80
|
+
return false
|
81
|
+
rescue => e
|
82
|
+
m.user.notice 'Something went wrong.'
|
83
|
+
raise
|
84
|
+
end
|
85
|
+
|
86
|
+
# Internal: Checks if the user sending the message is on the user list.
|
87
|
+
#
|
88
|
+
# m - The Cinch::Message.
|
89
|
+
# levels - The level Symbol(s).
|
90
|
+
#
|
91
|
+
# Returns a Boolean.
|
92
|
+
def list_strategy(m, levels)
|
93
|
+
m.user.refresh
|
94
|
+
|
95
|
+
unless m.user.authed?
|
96
|
+
m.user.notice "This command requires you to be authenticated."
|
97
|
+
return false
|
98
|
+
end
|
99
|
+
|
100
|
+
user_list = Array(levels).each_with_object [] do |level, list|
|
101
|
+
list.concat(config[level] || bot.config.authentication.send(level))
|
102
|
+
end
|
103
|
+
|
104
|
+
if user_list.nil?
|
105
|
+
bot.loggers.debug "You have not configured any user lists."
|
106
|
+
end
|
107
|
+
|
108
|
+
unless user_list.include? m.user.authname
|
109
|
+
m.user.notice "You are not authorized to run this command."
|
110
|
+
return false
|
111
|
+
end
|
112
|
+
|
113
|
+
return true
|
114
|
+
end
|
115
|
+
|
116
|
+
# Internal: Checks if the user sending the message has logged in.
|
117
|
+
#
|
118
|
+
# m- The Cinch::Message.
|
119
|
+
# levels - The level Symbol(s).
|
120
|
+
def login_strategy(m, levels)
|
121
|
+
if current_user(m).nil?
|
122
|
+
m.user.notice "You are not authorized to run this command. Please " +
|
123
|
+
"log in using !login [<username>] <password>."
|
124
|
+
return false
|
125
|
+
end
|
126
|
+
|
127
|
+
levels = Array(levels)
|
128
|
+
|
129
|
+
levels.each do |level|
|
130
|
+
level_lambda = config[level] || bot.config.authentication.send(level)
|
131
|
+
|
132
|
+
return true if level_lambda.call current_user(m)
|
133
|
+
end
|
134
|
+
|
135
|
+
# The previous check will fail if no level is given.
|
136
|
+
return true if levels.nil?
|
137
|
+
|
138
|
+
m.user.notice 'You are not authorized to run this command.'
|
139
|
+
return false
|
140
|
+
end
|
141
|
+
|
142
|
+
# Public: Returns the nickname of the currently logged in user.
|
143
|
+
#
|
144
|
+
# Returns a String.
|
145
|
+
# Returns nil when a user is not logged in.
|
146
|
+
def current_user(m)
|
147
|
+
bot.config.authentication.logged_in[m.user]
|
148
|
+
end
|
149
|
+
end
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
require 'cinch/plugins/user_login'
|
154
|
+
require 'cinch/plugins/user_list'
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'cinch/extensions/authentication'
|
2
|
+
|
3
|
+
module Cinch
|
4
|
+
module Plugins
|
5
|
+
class UserList
|
6
|
+
include Cinch::Plugin
|
7
|
+
include Cinch::Extensions::Authentication
|
8
|
+
|
9
|
+
set :plugin_name, 'userlists'
|
10
|
+
set :help, <<-USAGE.gsub(/^ {6}/, '')
|
11
|
+
Allows you to add/delete users from user lists used for authentication.
|
12
|
+
Usage:
|
13
|
+
- !add_to_<level> <nickname>: Adds a user to the <level> list.
|
14
|
+
- !delete_from_<level> <nickname>: Deletes a user from the <level> list.
|
15
|
+
- !show_<level>_list: Shows the <level> list.
|
16
|
+
USAGE
|
17
|
+
|
18
|
+
match /add_to_(\S+) (\S+)/s, :method => :add
|
19
|
+
match /delete_from_(\S+) (\S)/s, :method => :delete
|
20
|
+
match /show_(\S+)_list/s, :method => :show
|
21
|
+
|
22
|
+
enable_authentication
|
23
|
+
|
24
|
+
def add(m, level, nickname)
|
25
|
+
if bot.config.send(level) << nickname
|
26
|
+
m.user.notice "#{nickname} has been added to the #{level} list."
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def delete(m, level, nickname)
|
31
|
+
if bot.config.send(level).delete nickname
|
32
|
+
m.user.notice "#{nickname} has been deleted from the #{level} list."
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def show(m, level)
|
37
|
+
m.user.notice bot.config.send(level).join ', '
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
require 'cinch/extensions/authentication'
|
2
|
+
|
3
|
+
module Cinch
|
4
|
+
module Plugins
|
5
|
+
class UserLogin
|
6
|
+
include Cinch::Plugin
|
7
|
+
include Cinch::Extensions::Authentication
|
8
|
+
|
9
|
+
set :plugin_name, 'account'
|
10
|
+
set :help, <<-USAGE.gsub(/^ {6}/, '')
|
11
|
+
Allows you to login to run commands that require authorization.
|
12
|
+
Usage:
|
13
|
+
- !register [<nickname>] <password>: Registration (note: <nickname> defauts to your current nickname if ommited).
|
14
|
+
- !login [<nickname>] <password>: Logging in (note: <nickname> defaults to your current nickname if ommited).
|
15
|
+
- !logout: Logout. Nickname defaults to the current nickname.
|
16
|
+
USAGE
|
17
|
+
|
18
|
+
match /register (?:(\S+) )?(\S+)/s, :method => :register
|
19
|
+
match /login (?:(\S+) )?(\S+)/s, :method => :login
|
20
|
+
match /logout/s, :method => :logout
|
21
|
+
|
22
|
+
# Admin-only commands. Perhaps in a later version.
|
23
|
+
#match /add_to_(\S+) (\S+)/s => :method => :add_to
|
24
|
+
#match /remove_from_(\S+) (\S+)/s, :method => :remove_from
|
25
|
+
|
26
|
+
def register(m, nickname, password)
|
27
|
+
registration = config[:registration] ||
|
28
|
+
bot.config.authentication.registration
|
29
|
+
|
30
|
+
if registration.nil?
|
31
|
+
raise StandardError, 'You have not configured a registration lambda.'
|
32
|
+
elsif registration.call(nickname || m.user.nick, password)
|
33
|
+
m.user.notice "You have been registered as #{nickname||m.user.nick}."
|
34
|
+
login m, nickname, password
|
35
|
+
else
|
36
|
+
m.user.notice "An account with nickname #{nickname || m.user.nick} " +
|
37
|
+
'already exists.'
|
38
|
+
end
|
39
|
+
rescue => e
|
40
|
+
m.user.notice 'Something went wrong.'
|
41
|
+
raise
|
42
|
+
end
|
43
|
+
|
44
|
+
def login(m, nickname, password)
|
45
|
+
fetch_user = config[:fetch_user] || bot.config.authentication.fetch_user
|
46
|
+
|
47
|
+
if fetch_user.nil?
|
48
|
+
raise StandardError, 'You have not configured an fetch_user lambda.'
|
49
|
+
end
|
50
|
+
|
51
|
+
user = fetch_user.call(nickname || m.user.nick)
|
52
|
+
|
53
|
+
if user.nil?
|
54
|
+
m.user.notice 'You have not registered or mistyped your nickname.'
|
55
|
+
return
|
56
|
+
end
|
57
|
+
|
58
|
+
unless user.respond_to? :authenticate
|
59
|
+
raise StandardError, "Please implement #{user.class}#authenticate."
|
60
|
+
end
|
61
|
+
|
62
|
+
if user.authenticate(password)
|
63
|
+
bot.config.authentication.logged_in[m.user] = user
|
64
|
+
m.user.notice "You have been logged in as #{nickname || m.user.nick}."
|
65
|
+
else
|
66
|
+
m.user.notice 'Unknown username/password combination.'
|
67
|
+
end
|
68
|
+
rescue => e
|
69
|
+
m.user.notice 'Something went wrong.'
|
70
|
+
raise
|
71
|
+
end
|
72
|
+
|
73
|
+
def logout(m)
|
74
|
+
if bot.config.authentication.logged_in.delete m.user
|
75
|
+
m.user.notice 'You have been logged out.'
|
76
|
+
else
|
77
|
+
m.user.notice 'You are not logged in.'
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
metadata
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: cinch-authentication
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Paul Brickfeld
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-02-13 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: cinch
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 2.0.3
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 2.0.3
|
30
|
+
description: An authentication system with multiple strategies for the Cinch IRC framework.
|
31
|
+
email:
|
32
|
+
- paulbrickfeld@gmail.com
|
33
|
+
executables: []
|
34
|
+
extensions: []
|
35
|
+
extra_rdoc_files: []
|
36
|
+
files:
|
37
|
+
- lib/cinch/configuration/authentication.rb
|
38
|
+
- lib/cinch/extensions/authentication.rb
|
39
|
+
- lib/cinch/plugins/user_list.rb
|
40
|
+
- lib/cinch/plugins/user_login.rb
|
41
|
+
homepage: https://github.com/britishtea/cinch-authentication
|
42
|
+
licenses: []
|
43
|
+
post_install_message:
|
44
|
+
rdoc_options: []
|
45
|
+
require_paths:
|
46
|
+
- lib
|
47
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
48
|
+
none: false
|
49
|
+
requirements:
|
50
|
+
- - ! '>='
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: '0'
|
53
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
54
|
+
none: false
|
55
|
+
requirements:
|
56
|
+
- - ! '>='
|
57
|
+
- !ruby/object:Gem::Version
|
58
|
+
version: '0'
|
59
|
+
requirements: []
|
60
|
+
rubyforge_project: ! '[none]'
|
61
|
+
rubygems_version: 1.8.23
|
62
|
+
signing_key:
|
63
|
+
specification_version: 3
|
64
|
+
summary: Authentication for Cinch.
|
65
|
+
test_files: []
|
66
|
+
has_rdoc:
|