diff --git a/confluent_server/confluent/config/configmanager.py b/confluent_server/confluent/config/configmanager.py index e505e49c..af9c8a39 100644 --- a/confluent_server/confluent/config/configmanager.py +++ b/confluent_server/confluent/config/configmanager.py @@ -136,7 +136,7 @@ def attrib_supports_expression(attrib): if not isinstance(attrib, str): attrib = attrib.decode('utf8') attrib = _attraliases.get(attrib, attrib) - if attrib.startswith('secret.') or attrib.startswith('crypted.'): + if attrib.startswith('secret.') or attrib.startswith('crypted.') or attrib.startswith('custom.nodesecret.'): return False return True @@ -1108,6 +1108,10 @@ class _ExpressionFormat(string.Formatter): field_name = val parsed = ast.parse(field_name) val = self._handle_ast_node(parsed.body[0].value) + try: + val = int(val) + except Exception: + pass return format(val, format_spec) def _handle_ast_node(self, node): @@ -1373,7 +1377,7 @@ class ConfigManager(object): attribute, match = expression.split('=') else: raise Exception('Invalid Expression') - if attribute.startswith('secret.'): + if attribute.startswith('secret.') or attribute.startswith('custom.nodesecret.'): raise Exception('Filter by secret attributes is not supported') if attribute_name_is_invalid(attribute): raise ValueError( @@ -2023,10 +2027,10 @@ class ConfigManager(object): newdict = {'value': attribmap[group][attr]} else: newdict = attribmap[group][attr] - if keydata and attr.startswith('secret.') and 'cryptvalue' in newdict: + if keydata and (attr.startswith('secret.') or attr.startswith('custom.nodesecret.')) and 'cryptvalue' in newdict: newdict['value'] = decrypt_value(newdict['cryptvalue'], keydata['cryptkey'], keydata['integritykey']) del newdict['cryptvalue'] - if 'value' in newdict and attr.startswith("secret."): + if 'value' in newdict and (attr.startswith('secret.') or attr.startswith('custom.nodesecret.')): newdict['cryptvalue'] = crypt_value(newdict['value']) del newdict['value'] if 'value' in newdict and attr.startswith("crypted."): @@ -2485,10 +2489,10 @@ class ConfigManager(object): # add check here, skip None attributes if newdict is None: continue - if keydata and attrname.startswith('secret.') and 'cryptvalue' in newdict: + if keydata and (attrname.startswith('secret.') or attrname.startswith('custom.nodesecret.')) and 'cryptvalue' in newdict: newdict['value'] = decrypt_value(newdict['cryptvalue'], keydata['cryptkey'], keydata['integritykey']) del newdict['cryptvalue'] - if 'value' in newdict and attrname.startswith("secret."): + if 'value' in newdict and (attrname.startswith('secret.') or attrname.startswith('custom.nodesecret.')): newdict['cryptvalue'] = crypt_value(newdict['value']) del newdict['value'] if 'value' in newdict and attrname.startswith("crypted."): diff --git a/confluent_server/confluent/httpapi.py b/confluent_server/confluent/httpapi.py index c47722d4..b2d45f0c 100644 --- a/confluent_server/confluent/httpapi.py +++ b/confluent_server/confluent/httpapi.py @@ -97,7 +97,7 @@ def group_creation_resources(): for attr in sorted(attribs.node): if attr == 'groups': continue - if attr.startswith("secret."): + if attr.startswith('secret.') or attr.startswith('custom.nodesecret.'): yield confluent.messages.CryptedAttributes( kv={attr: None}, desc=attribs.node[attr]['description']).html() + '
\n' @@ -116,7 +116,7 @@ def node_creation_resources(): yield confluent.messages.Attributes( kv={'name': None}, desc="Name of the node").html() + '
' for attr in sorted(attribs.node): - if attr.startswith("secret."): + if attr.startswith('secret.') or attr.startswith('custom.nodesecret.'): yield confluent.messages.CryptedAttributes( kv={attr: None}, desc=attribs.node[attr]['description']).html() + '
\n' diff --git a/confluent_server/confluent/plugins/configuration/attributes.py b/confluent_server/confluent/plugins/configuration/attributes.py index 6986227b..2a8b2bbb 100644 --- a/confluent_server/confluent/plugins/configuration/attributes.py +++ b/confluent_server/confluent/plugins/configuration/attributes.py @@ -59,7 +59,7 @@ def retrieve_nodegroup(nodegroup, element, configmanager, inputdata, clearwarnby val['desc'] = 'The noderange this group is expanded ' \ 'to when used in noderange, exclusive with static ' \ 'nodes' - if attribute.startswith('secret.') or attribute.startswith('crypted.'): + if attribute.startswith('secret.') or attribute.startswith('crypted.') or attribute.startswith('custom.nodesecret.'): yield msg.CryptedAttributes( kv={attribute: val}, desc=allattributes.node[attribute]['description']) @@ -121,7 +121,7 @@ def retrieve_nodes(nodes, element, configmanager, inputdata, clearwarnbynode): val = [] else: # no setting, provide a blank val = {'value': None} - if attribute.startswith('secret.') or attribute.startswith('crypted.'): + if attribute.startswith('secret.') or attribute.startswith('crypted.') or attribute.startswith('custom.nodesecret.'): yield msg.CryptedAttributes( node, {attribute: val}, allattributes.node.get( diff --git a/confluent_server/confluent/selfservice.py b/confluent_server/confluent/selfservice.py index d206337e..bb619f78 100644 --- a/confluent_server/confluent/selfservice.py +++ b/confluent_server/confluent/selfservice.py @@ -262,12 +262,14 @@ def handle_request(env, start_response): start_response('200 OK', (('Content-Type', retype),)) yield dumper(res) elif env['PATH_INFO'] == '/self/myattribs': - cfd = cfg.get_node_attributes(nodename, '*').get(nodename, {}) + cfd = cfg.get_node_attributes(nodename, '*', decrypt=True).get(nodename, {}) rsp = {} for k in cfd: if k.startswith('secret') or k.startswith('crypt') or 'value' not in cfd[k] or not cfd[k]['value']: continue rsp[k] = cfd[k]['value'] + if isinstance(rsp[k], bytes): + rsp[k] = rsp[k].decode() start_response('200 OK', (('Conntent-Type', retype),)) yield dumper(rsp) elif env['PATH_INFO'] == '/self/netcfg':