- results = dict()
-
- try:
- for key, value in kwargs.iteritems():
- if key == 'name':
- r = self.change_name(key, value)
- if r:
- results.update(r)
- elif key == 'owner':
- r = self.change_owner(key, value)
- if r:
- results.update(r)
-
- elif key == 'default_nameid':
- r = self.change_default_nameid(key, value)
- if r:
- results.update(r)
-
- elif key == 'allowed_nameids':
- r = self.change_allowed_nameids(key, value)
- if r:
- results.update(r)
-
- except InvalidValueFormat, e:
- message = str(e)
- message_type = ADMIN_STATUS_WARN
- return self.form_standard(message, message_type)
- except UnauthorizedUser, e:
- message = str(e)
- message_type = ADMIN_STATUS_ERROR
- return self.form_standard(message, message_type)
- except Exception, e: # pylint: disable=broad-except
- self._debug("Error: %s" % repr(e))
- message = "Internal Error"
- message_type = ADMIN_STATUS_ERROR
- return self.form_standard(message, message_type)
+ new_db_values = dict()
+
+ conf = self.sp.get_config_obj()
+
+ for name, option in conf.iteritems():
+ if name in kwargs:
+ value = kwargs[name]
+ if isinstance(option, pconfig.List):
+ value = [x.strip() for x in value.split('\n')]
+ # for normal lists we want unordered comparison
+ if set(value) == set(option.get_value()):
+ continue
+ elif isinstance(option, pconfig.Condition):
+ value = True
+ else:
+ if isinstance(option, pconfig.Condition):
+ value = False
+ elif isinstance(option, pconfig.Choice):
+ value = list()
+ for a in option.get_allowed():
+ aname = '%s_%s' % (name, a)
+ if aname in kwargs:
+ value.append(a)
+ elif isinstance(option, pconfig.MappingList):
+ current = deepcopy(option.get_value())
+ value = get_mapping_list_value(name,
+ current,
+ **kwargs)
+ # if current value is None do nothing
+ if value is None:
+ if option.get_value() is None:
+ continue
+ # else pass and let it continue as None
+ elif isinstance(option, pconfig.ComplexList):
+ current = deepcopy(option.get_value())
+ value = get_complex_list_value(name,
+ current,
+ **kwargs)
+ # if current value is None do nothing
+ if value is None:
+ if option.get_value() is None:
+ continue
+ # else pass and let it continue as None
+ else:
+ continue
+
+ if value != option.get_value():
+ cherrypy.log.error("Storing %s = %s" %
+ (name, value), severity=logging.DEBUG)
+ new_db_values[name] = value
+
+ if len(new_db_values) != 0:
+ try:
+ # Validate user can make these changes
+ for (key, value) in new_db_values.iteritems():
+ if key == 'Name':
+ if (not self.user.is_admin and
+ self.user.name != self.sp.owner):
+ raise UnauthorizedUser("Unauthorized to set owner")
+ elif key in ['User Owner', 'Default NameID',
+ 'Allowed NameIDs', 'Attribute Mapping',
+ 'Allowed Attributes', 'Description',
+ 'Service Provider link',
+ 'Visible in Portal', 'Image File']:
+ if not self.user.is_admin:
+ raise UnauthorizedUser(
+ "Unauthorized to set %s" % key
+ )
+
+ # Make changes in current config
+ for name, option in conf.iteritems():
+ if name not in new_db_values:
+ continue
+ value = new_db_values.get(name, False)
+ # A value of None means remove from the data store
+ if ((value is False or value == []) and
+ name != 'Visible in Portal'):
+ continue
+ if name == 'Name':
+ if not self.sp.is_valid_name(value):
+ raise InvalidValueFormat(
+ 'Invalid name! Use only numbers and'
+ ' letters'
+ )
+ self.sp.name = value
+ self.url = '%s/sp/%s' % (self.parent.url, value)
+ self.parent.rename_sp(option.get_value(), value)
+ elif name == 'User Owner':
+ self.sp.owner = value
+ elif name == 'Description':
+ self.sp.description = value
+ elif name == 'Visible in Portal':
+ self.sp.visible = value
+ elif name == 'Service Provider link':
+ self.sp.splink = value
+ elif name == 'Default NameID':
+ self.sp.default_nameid = value
+ elif name == 'Allowed NameIDs':
+ self.sp.allowed_nameids = value
+ elif name == 'Attribute Mapping':
+ self.sp.attribute_mappings = value
+ elif name == 'Allowed Attributes':
+ self.sp.allowed_attributes = value
+ elif name == 'Image File':
+ if hasattr(value, 'content_type'):
+ # pylint: disable=maybe-no-member
+ blob = value.fullvalue()
+ if len(blob) > 0:
+ self.sp.imagefile = base64.b64encode(blob)
+ else:
+ raise InvalidValueFormat(
+ 'Invalid Image file format'
+ )
+
+ except InvalidValueFormat, e:
+ message = str(e)
+ message_type = ADMIN_STATUS_WARN
+ return self.root_with_msg(message, message_type)
+ except UnauthorizedUser, e:
+ message = str(e)
+ message_type = ADMIN_STATUS_ERROR
+ return self.root_with_msg(message, message_type)
+ except Exception as e: # pylint: disable=broad-except
+ self.debug("Error: %s" % repr(e))
+ message = "Internal Error"
+ message_type = ADMIN_STATUS_ERROR
+ return self.root_with_msg(message, message_type)