"""

Python Desktop Server - Access Restrictions on community servers

Copyright (c) 2002, Georg Bauer <gb@murphy.bofh.ms>

Permission is hereby granted, free of charge, to any person obtaining a copy of 
this software and associated documentation files (the "Software"), to deal in 
the Software without restriction, including without limitation the rights to 
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 
the Software, and to permit persons to whom the Software is furnished to do so, 
subject to the following conditions:

The above copyright notice and this permission notice shall be included in all 
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

"""

# $Id: AccessRestrictionsTool.py,v 1.1 2003/05/15 16:52:54 gb Exp $

import time

import PyDS.Tool

class AccessRestrictionsTool(PyDS.Tool.StandardTool):

	def _getUserList(self):
		upstream = self.getToolByNamespace('upstream')
		return upstream.server.accessRestrictions.getUserList(
			upstream.get('prefs', 'usernum'),
			upstream.get('prefs', 'password')
		)
	
	def _getUserListForGroup(self, group):
		upstream = self.getToolByNamespace('upstream')
		return upstream.server.accessRestrictions.getUserListForGroup(
			upstream.get('prefs', 'usernum'),
			upstream.get('prefs', 'password'),
			group
		)
	
	def _getGroupList(self):
		upstream = self.getToolByNamespace('upstream')
		return upstream.server.accessRestrictions.getGroupList(
			upstream.get('prefs', 'usernum'),
			upstream.get('prefs', 'password')
		)
	
	def _getGroupListForLocation(self, location):
		upstream = self.getToolByNamespace('upstream')
		return upstream.server.accessRestrictions.getGroupListForLocation(
			upstream.get('prefs', 'usernum'),
			upstream.get('prefs', 'password'),
			location
		)
	
	def _getLocationList(self):
		upstream = self.getToolByNamespace('upstream')
		return upstream.server.accessRestrictions.getLocationList(
			upstream.get('prefs', 'usernum'),
			upstream.get('prefs', 'password')
		)
	
	def index_html(self, req):
		html = '<h3>%s</h3>' % _("Access Restriction Definitions")
		message = req.getFirstValue('errmsg')
		upstream = self.getToolByNamespace('upstream')
		res = upstream.getServerCapabilities()
		if res['flError']:
			message = res['message']
		elif res['community'].get('flCanHostAccessRestrictions'):
			locations = self._getLocationList()
			if locations['flError']:
				message = locations['message']
				locations = []
			else:
				locations = locations['locationlist']
			users = self._getUserList()
			if users['flError']:
				message = users['message']
				users = []
			else:
				users = users['userlist']
			groups = self._getGroupList()
			if groups['flError']:
				message = groups['message']
				groups = []
			else:
				groups = groups['grouplist']
			html += '<table width="100%"><tr>'
			html += '<th width="30%%"><h4>%s</h4></th>' % _("Locations")
			html += '<th width="30%%"><h4>%s</h4></th>' % _("Groups")
			html += '<th width="30%%"><h4>%s</h4></th>' % _("Users")
			html += '</tr><tr valign="top"><td width="30%">'
			html += '<form action="%s">' % req.getUrl('delloc_redir')
			for location in locations:
				html += '<input type=checkbox name="name" value="%s"> <a href="%s">%s</a>' % (location['name'], req.getUrl('location_html', name=location['name'], regexp=location['regexp']), location['name'])
				lglist = []
				for rec in location['grouplist']:
					lglist.append(rec['name'])
				html += ' <span class="smallfont">(' + ', '.join(lglist) + ')</span>'
				html += '<br>'
			html += '<p><input type=submit value="%s">' % _("Delete")
			html += '</form>'
			html += '</td><td width="30%">'
			html += '<form action="%s">' % req.getUrl('delgrp_redir')
			for group in groups:
				html += '<input type=checkbox name="name" value="%s"> <a href="%s">%s</a>' % (group['name'], req.getUrl('group_html', name=group['name']), group['name'])
				gulist = []
				for rec in group['userlist']:
					gulist.append(rec['name'])
				html += ' <span class="smallfont">(' + ', '.join(gulist) + ')</span>'
				html += '<br>'
			html += '<p><input type=submit value="%s">' % _("Delete")
			html += '</form>'
			html += '</td><td width="30%">'
			html += '<form action="%s">' % req.getUrl('delusr_redir')
			for user in users:
				html += '<input type=checkbox name="name" value="%s"> <a href="%s">%s</a><br>' % (user['name'], req.getUrl('user_html', name=user['name']), user['name'])
			html += '<p><input type=submit value="%s">' % _("Delete")
			html += '</form>'
			html += '</td></tr></table>'
			html += '<h4>%s</h4>' % _("Define a new location")
			html += '<form action="%s">' % req.getUrl('addloc_redir')
			html += '<table>'
			html += '<tr><th width="30%%">%s</th><td><input name="name"></td></tr>' % _("Name")
			html += '<tr><th width="30%%">%s</th><td><input name="regexp"></td></tr>' % _("Regexp")
			html += '<tr align="right"><td colspan="2"><input type=submit value="%s"></td></tr>' % _("Add")
			html += '</table>'
			html += '</form>'
			html += '<h4>%s</h4>' % _("Define a new group")
			html += '<form action="%s">' % req.getUrl('addgrp_redir')
			html += '<table>'
			html += '<tr><th width="30%%">%s</th><td><input name="name"></td></tr>' % _("Name")
			html += '<tr align="right"><td colspan="2"><input type=submit value="%s"></td></tr>' % _("Add")
			html += '</table>'
			html += '</form>'
			html += '<h4>%s</h4>' % _("Define a new user")
			html += '<form action="%s">' % req.getUrl('addusr_redir')
			html += '<table>'
			html += '<tr><th width="30%%">%s</th><td><input name="name"></td></tr>' % _("Name")
			html += '<tr><th width="30%%">%s</th><td><input name="password"></td></tr>' % _("Password")
			html += '<tr align="right"><td colspan="2"><input type=submit value="%s"></td></tr>' % _("Add")
			html += '</table>'
			html += '</form>'
		else:
			message = _("Host is not capable of access restrictions")
		return req.renderPage('BaseTemplate', body=html, errmsg=message)

	def delloc_redir(self, req):
		upstream = self.getToolByNamespace('upstream')
		for name in req.getAllValues('name'):
			res = upstream.server.accessRestrictions.delLocation(
				upstream.get('prefs', 'usernum'),
				upstream.get('prefs', 'password'),
				name
			)
			if res['flError']:
				return req.getUrl(errmsg=res['message'])
		return req.getUrl()

	def addloc_redir(self, req):
		upstream = self.getToolByNamespace('upstream')
		res = upstream.server.accessRestrictions.setLocation(
			upstream.get('prefs', 'usernum'),
			upstream.get('prefs', 'password'),
			req.getFirstValue('name'),
			req.getFirstValue('regexp')
		)
		if res['flError']:
			return req.getUrl(errmsg=res['message'])
		else:
			return req.getUrl()

	def delgrp_redir(self, req):
		upstream = self.getToolByNamespace('upstream')
		for name in req.getAllValues('name'):
			res = upstream.server.accessRestrictions.delGroup(
				upstream.get('prefs', 'usernum'),
				upstream.get('prefs', 'password'),
				name
			)
			if res['flError']:
				return req.getUrl(errmsg=res['message'])
		return req.getUrl()

	def addgrp_redir(self, req):
		upstream = self.getToolByNamespace('upstream')
		res = upstream.server.accessRestrictions.setGroup(
			upstream.get('prefs', 'usernum'),
			upstream.get('prefs', 'password'),
			req.getFirstValue('name')
		)
		if res['flError']:
			return req.getUrl(errmsg=res['message'])
		else:
			return req.getUrl()

	def delusr_redir(self, req):
		upstream = self.getToolByNamespace('upstream')
		for name in req.getAllValues('name'):
			res = upstream.server.accessRestrictions.delUser(
				upstream.get('prefs', 'usernum'),
				upstream.get('prefs', 'password'),
				name
			)
			if res['flError']:
				return req.getUrl(errmsg=res['message'])
		return req.getUrl()

	def addusr_redir(self, req):
		upstream = self.getToolByNamespace('upstream')
		res = upstream.server.accessRestrictions.setUser(
			upstream.get('prefs', 'usernum'),
			upstream.get('prefs', 'password'),
			req.getFirstValue('name'),
			req.getFirstValue('password')
		)
		if res['flError']:
			return req.getUrl(errmsg=res['message'])
		else:
			return req.getUrl()
	
	def user_html(self, req):
		user = req.getFirstValue('name')
		html = '<h3>%s %s</h3>' % (
			_("Edit user"),
			user
		)
		html += '<form action="%s">' % req.getUrl('addusr_redir')
		html += '<input type=hidden name="name" value="%s">' % user
		html += '<table>'
		html += '<tr><th>%s</th><td><input name="password"></td></tr>' % _("Password")
		html += '<tr align="right"><td colspan="2"><input type="submit" value="%s"></td></tr>' % _("Save")
		html += '</table>'
		html += '</form>'
		return req.renderPage('BaseTemplate', body=html)

	def group_html(self, req):
		group = req.getFirstValue('name')
		html = '<h3>%s %s</h3>' % (
			_("Edit group"),
			group
		)
		message = req.getFirstValue('errmsg')
		res = self._getUserList()
		if res['flError']:
			message = res['message']
		else:
			resg = self._getUserListForGroup(group)
			if resg['flError']:
				message = resg['message']
			else:
				groupusers = []
				html += '<ul>'
				for rec in resg['userlist']:
					html += '<li>%s' % rec['name']
					groupusers.append(rec['name'])
				html += '</ul>'
				users = []
				for rec in res['userlist']:
					if not(rec['name'] in groupusers):
						users.append(rec['name'])
				html += '<form action="%s">' % req.getUrl('groupdeluser_redir')
				html += '<input type=hidden name="name" value="%s">' % group
				html += '<select name="user">'
				for user in groupusers:
					html += '<option value="%s">%s' % (user, user)
				html += '</select>'
				html += '<input type=submit value="%s">' % _("Delete")
				html += '</form>'
				html += '<form action="%s">' % req.getUrl('groupadduser_redir')
				html += '<input type=hidden name="name" value="%s">' % group
				html += '<select name="user">'
				for user in users:
					html += '<option value="%s">%s' % (user, user)
				html += '</select>'
				html += '<input type=submit value="%s">' % _("Add")
				html += '</form>'
		return req.renderPage('BaseTemplate', body=html, errmsg=message)

	def groupadduser_redir(self, req):
		upstream = self.getToolByNamespace('upstream')
		res = upstream.server.accessRestrictions.addUserToGroup(
			upstream.get('prefs', 'usernum'),
			upstream.get('prefs', 'password'),
			req.getFirstValue('name'),
			req.getFirstValue('user')
		)
		if res['flError']:
			return req.getUrl(errmsg=res['message'])
		else:
			return req.getUrl()
	
	def groupdeluser_redir(self, req):
		upstream = self.getToolByNamespace('upstream')
		res = upstream.server.accessRestrictions.delUserFromGroup(
			upstream.get('prefs', 'usernum'),
			upstream.get('prefs', 'password'),
			req.getFirstValue('name'),
			req.getFirstValue('user')
		)
		if res['flError']:
			return req.getUrl(errmsg=res['message'])
		else:
			return req.getUrl()
	
	def location_html(self, req):
		location = req.getFirstValue('name')
		regexp = req.getFirstValue('regexp')
		html = '<h3>%s %s</h3>' % (
			_("Edit location"),
			location
		)
		html += '<form action="%s">' % req.getUrl('addloc_redir')
		html += '<input type=hidden name="name" value="%s">' % location
		html += '<table>'
		html += '<tr><th>%s</th><td><input name="regexp" value="%s"></td></tr>' % (_("Regexp"), regexp)
		html += '<tr align="right"><td colspan="2"><input type="submit" value="%s"></td></tr>' % _("Save")
		html += '</table>'
		html += '</form>'
		message = req.getFirstValue('errmsg')
		res = self._getGroupList()
		if res['flError']:
			message = res['message']
		else:
			resg = self._getGroupListForLocation(location)
			if resg['flError']:
				message = resg['message']
			else:
				locationgroups = []
				html += '<ul>'
				for rec in resg['grouplist']:
					html += '<li>%s' % rec['name']
					locationgroups.append(rec['name'])
				html += '</ul>'
				groups = []
				for rec in res['grouplist']:
					if not(rec['name'] in locationgroups):
						groups.append(rec['name'])
				html += '<form action="%s">' % req.getUrl('locationdelgroup_redir')
				html += '<input type=hidden name="name" value="%s">' % location
				html += '<select name="group">'
				for group in locationgroups:
					html += '<option value="%s">%s' % (group, group)
				html += '</select>'
				html += '<input type=submit value="%s">' % _("Delete")
				html += '</form>'
				html += '<form action="%s">' % req.getUrl('locationaddgroup_redir')
				html += '<input type=hidden name="name" value="%s">' % location
				html += '<select name="group">'
				for group in groups:
					html += '<option value="%s">%s' % (group, group)
				html += '</select>'
				html += '<input type=submit value="%s">' % _("Add")
				html += '</form>'
		return req.renderPage('BaseTemplate', body=html)

	def locationaddgroup_redir(self, req):
		upstream = self.getToolByNamespace('upstream')
		res = upstream.server.accessRestrictions.addGroupToLocation(
			upstream.get('prefs', 'usernum'),
			upstream.get('prefs', 'password'),
			req.getFirstValue('name'),
			req.getFirstValue('group')
		)
		if res['flError']:
			return req.getUrl(errmsg=res['message'])
		else:
			return req.getUrl()
	
	def locationdelgroup_redir(self, req):
		upstream = self.getToolByNamespace('upstream')
		res = upstream.server.accessRestrictions.delGroupFromLocation(
			upstream.get('prefs', 'usernum'),
			upstream.get('prefs', 'password'),
			req.getFirstValue('name'),
			req.getFirstValue('group')
		)
		if res['flError']:
			return req.getUrl(errmsg=res['message'])
		else:
			return req.getUrl()
	
__desc__ = _("This tool allows to set up access restrictions to your blog.")

PyDS.Tool.registerTool(AccessRestrictionsTool('access', _('Access Restrictions'), __desc__, 860))

