1
# Rapache - Apache Configuration Tool
2
# Copyright (C) 2008 Stefano Forenza, Jason Taylor, Emanuele Gentili
4
# This program is free software: you can redistribute it and/or modify
5
# it under the terms of the GNU General Public License as published by
6
# the Free Software Foundation, either version 3 of the License, or
7
# (at your option) any later version.
9
# This program is distributed in the hope that it will be useful,
10
# but WITHOUT ANY WARRANTY; without even the implied warranty of
11
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
# GNU General Public License for more details.
14
# You should have received a copy of the GNU General Public License
15
# along with this program. If not, see <http://www.gnu.org/licenses/>.
18
from RapacheCore.PluginBase import PluginBaseObject
19
from RapacheCore import Shell
20
from htpasswd import Htpasswd
21
from user_credentials import UserCredentials
33
class BasicAuthenticationPlugin(PluginBaseObject):
35
def __init__(self, path):
37
# The path to the plugin
40
# module this plugin works with
41
self.module = "auth_basic"
43
# Define what additional config should be read from vhost file
44
self.vhosts_config = { "AuthType" : 0, "AuthName" : 0, "AuthUserFile" : 0, "Require" : 1 } # 0 value | 1 options
46
self.default_location = "/etc/apache2/basic-auth/passwords"
48
self.users = Htpasswd()
49
self.users_active = []
51
def treeview_users_toggled(self, cell, path):
52
# toggle check box value
53
iter = self.treeview_users_store.get_iter((int(path),))
54
self.treeview_users_store.set_value(iter, 0, not self.treeview_users_store.get_value(iter, 0))
57
def on_toolbutton_user_add_clicked(self, widget):
58
uc = UserCredentials(self.path)
62
self.users.update( result[0], result[1] )
63
self.users_active.append( result[0] )
68
def on_toolbutton_user_edit_clicked(self, widget):
70
model, iter = self.treeview_users.get_selection().get_selected()
72
username = model.get_value(iter, 2)
74
uc = UserCredentials(self.path)
79
self.users.update( result[0], result[1] )
80
self.users_active.append( result[0] )
85
def on_toolbutton_user_delete_clicked(self, widget):
87
model, iter = self.treeview_users.get_selection().get_selected()
89
username = model.get_value(iter, 2)
91
md = gtk.MessageDialog(None, flags=0, type=gtk.MESSAGE_QUESTION, buttons=gtk.BUTTONS_OK_CANCEL, message_format="Are you sure you want to delete '"+ username+"' ?")
94
if result == gtk.RESPONSE_OK:
95
self.users.delete(username)
100
def on_treeview_users_row_activated(self, a,b,c):
101
model, iter = self.treeview_users.get_selection().get_selected()
103
username = model.get_value(iter, 2)
105
uc = UserCredentials(self.path)
110
self.users.update( result[0], result[1] )
111
self.users_active.append( result[0] )
115
def on_button_location_clear_clicked(self, widget):
118
def update_users(self):
119
self.treeview_users_store = gtk.ListStore(bool, str, str)
120
self.treeview_users.set_model(self.treeview_users_store)
122
for user in self.users.entries:
123
self.treeview_users_store.append((user[0] in self.users_active , user[0], user[0]))
126
def init_vhost_properties(self):
129
f = open( os.path.join(self.path, "basic_auth.glade") ,"r")
130
self.glade_vhost_xml = f.read()
133
wtree = gtk.glade.xml_new_from_buffer(self.glade_vhost_xml, len(self.glade_vhost_xml), "hbox_auth_basic")
134
hbox_auth_basic = wtree.get_widget("hbox_auth_basic")
136
self.checkbutton_enable_auth_basic = wtree.get_widget("checkbutton_enable_auth_basic")
137
self.entry_warning_message = wtree.get_widget("entry_warning_message")
138
self.treeview_users = wtree.get_widget("treeview_users")
139
self.entry_location = wtree.get_widget("entry_location")
142
"on_toolbutton_user_add_clicked" : self.on_toolbutton_user_add_clicked,
143
"on_toolbutton_user_edit_clicked" : self.on_toolbutton_user_edit_clicked,
144
"on_toolbutton_user_delete_clicked" : self.on_toolbutton_user_delete_clicked,
145
"on_treeview_users_row_activated" : self.on_treeview_users_row_activated,
146
"on_button_location_clear_clicked" : self.on_button_location_clear_clicked
148
wtree.signal_autoconnect(signals)
151
column = gtk.TreeViewColumn((''))
152
column.set_spacing(4)
153
cell = gtk.CellRendererToggle()
154
cell.connect('toggled', self.treeview_users_toggled)
155
column.pack_start(cell, False)
156
column.set_attributes(cell, active=0)
157
self.treeview_users.append_column(column)
159
column = gtk.TreeViewColumn(('User'))
160
cell = gtk.CellRendererText()
161
column.pack_start(cell, True)
162
column.set_attributes(cell, markup=1)
163
self.treeview_users.append_column(column)
165
self.entry_location.set_text(self.default_location)
166
self.users.load(Shell.command.read_file(self.default_location))
167
self.entry_warning_message.set_text("Enter your password")
172
icon_theme = gtk.icon_theme_get_default()
173
pixbuf = icon_theme.lookup_icon("gtk-dialog-authentication", 24, 0).load_icon()
175
return hbox_auth_basic, "Basic Security", pixbuf
177
# Customise the vhost properties window
178
def load_vhost_properties(self, vhost):
179
self.users_active = []
180
self.checkbutton_enable_auth_basic.set_active(False)
182
ds = vhost.config.Directory.search( [vhost.get_document_root()] )
187
self.checkbutton_enable_auth_basic.set_active(d.AuthType.value.lower() == "basic")
189
# only load if value changes
191
if d.AuthUserFile.value != self.entry_location.get_text():
192
self.entry_location.set_text(d.AuthUserFile.value)
193
content = Shell.command.read_file(self.entry_location.get_text())
195
self.users.load( content )
198
self.entry_warning_message.set_text(d.AuthName.value)
201
self.users_active = list(d.Require.opts)[1:]
207
# Perform action on vhost properties update request
208
def update_vhost_properties(self, vhost):
210
self.users_active = []
211
iter = self.treeview_users_store.get_iter_first()
214
if self.treeview_users_store.get_value(iter, 0):
215
self.users_active.append( self.treeview_users_store.get_value(iter, 2) )
216
iter = self.treeview_users_store.iter_next(iter)
218
ds = vhost.config.Directory.search( [vhost.get_document_root()] )
221
d = vhost.config.sections.create("Directory", vhost.get_document_root())
225
if self.checkbutton_enable_auth_basic.get_active() and len(self.users_active) > 0:
226
d.AuthType.value = "Basic"
228
if self.entry_warning_message.get_text():
229
d.AuthName.value = self.entry_warning_message.get_text()
233
d.AuthUserFile.value = self.entry_location.get_text()
234
d.Require.opts = ["user"] + self.users_active
237
if d.AuthType : del d.AuthType
238
if d.AuthName : del d.AuthName
239
if d.AuthUserFile : del d.AuthUserFile
240
if d.Require : del d.Require
245
# Perform action on vhost properties save
246
def save_vhost_properties(self, vhost):
248
Shell.command.write_file( self.entry_location.get_text(), self.users.save())
253
def register( path ):
254
return BasicAuthenticationPlugin( path )