Skip to content
Snippets Groups Projects
Commit 63ad23ac authored by Pavel Kácha's avatar Pavel Kácha
Browse files

Modified authentication to accept only secret, without client.

parent a84f6d4c
Branches
Tags
No related merge requests found
...@@ -254,8 +254,9 @@ class Client(object): ...@@ -254,8 +254,9 @@ class Client(object):
def sendRequest(self, func="", payload=None, **kwargs): def sendRequest(self, func="", payload=None, **kwargs):
kwargs["client"] = self.name if self.secret is None:
if self.secret is not None: kwargs["client"] = self.name
else:
kwargs["secret"] = self.secret kwargs["secret"] = self.secret
if kwargs: if kwargs:
......
...@@ -44,7 +44,7 @@ curl \ ...@@ -44,7 +44,7 @@ curl \
"$url/getEvents?client=$client" "$url/getEvents?client=$client"
echo echo
echo "Test 403 - no client" echo "Test 403 - no client, no secret"
curl \ curl \
--key $keyfile \ --key $keyfile \
--cert $certfile \ --cert $certfile \
...@@ -64,6 +64,36 @@ curl \ ...@@ -64,6 +64,36 @@ curl \
"$url/getEvents?client=asdf.blefub" "$url/getEvents?client=asdf.blefub"
echo echo
echo "Test 403 - wrong client, right secret"
curl \
--key $keyfile \
--cert $certfile \
--cacert $cafile \
--connect-timeout 3 \
--request POST \
"$url/getEvents?client=asdf.blefub&secret=$secret"
echo
echo "Test 403 - right client, wrong secret"
curl \
--key $keyfile \
--cert $certfile \
--cacert $cafile \
--connect-timeout 3 \
--request POST \
"$url/getEvents?client=$client&secret=ASDFblefub"
echo
echo "Test - no client, but secret, should be ok"
curl \
--key $keyfile \
--cert $certfile \
--cacert $cafile \
--connect-timeout 3 \
--request POST \
"$url/getEvents?secret=$secret"
echo
echo "Test Deserialization" echo "Test Deserialization"
curl \ curl \
--key $keyfile \ --key $keyfile \
......
...@@ -286,37 +286,28 @@ class X509Authenticator(NoAuthenticator): ...@@ -286,37 +286,28 @@ class X509Authenticator(NoAuthenticator):
def authenticate (self, env, args): def authenticate (self, env, args):
try:
identity = args["client"][0]
except KeyError:
logging.info("authenticate: bad or missing client argument")
return None
try: try:
cert_names = self.get_cert_dns_names(env["SSL_CLIENT_CERT"]) cert_names = self.get_cert_dns_names(env["SSL_CLIENT_CERT"])
except: except:
logging.info("authenticate: cannot get or parse certificate from env") logging.info("authenticate: cannot get or parse certificate from env")
return None return None
client = self.db.get_client_by_name(identity, cert_names) identity = args.get("client", [None])[0]
secret = args.get("secret", [None])[0]
args["secret"] = ["..."] # Prevent to spill it over logs
client = self.db.get_client_by_name(cert_names, identity, secret)
if not client: if not client:
logging.info("authenticate: client not found") logging.info("authenticate: client not found by identity: \"%s\", secret: %s, cert_names: %s" % (
identity, "..." if secret else "None", str(cert_names)))
return None return None
# Clients with 'secret' set muset get authorized by it. # Clients with 'secret' set muset get authorized by it.
# No secret turns auth off for this particular client. # No secret turns auth off for this particular client.
if client.secret is not None: if client.secret is not None and secret is None:
try: logging.info("authenticate: missing secret argument")
secret = args["secret"][0] return None
except KeyError:
logging.info("authenticate: missing secret argument")
return None
if secret != client.secret:
logging.info("authenticate: wrong credentials")
return None
# Already checked, prevent to spill it over logs
args["secret"] = ["..."]
logging.info("authenticate: %s" % str(client)) logging.info("authenticate: %s" % str(client))
...@@ -421,19 +412,26 @@ class MySQL(ObjectReq): ...@@ -421,19 +412,26 @@ class MySQL(ObjectReq):
type(self).__name__, type(self.req).__name__, self.host, self.user, self.dbname, self.port, self.catmap_filename, self.tagmap_filename) type(self).__name__, type(self.req).__name__, self.host, self.user, self.dbname, self.port, self.catmap_filename, self.tagmap_filename)
def get_client_by_name(self, identity, cert_names): def get_client_by_name(self, cert_names, identity=None, secret=None):
format_strings = ','.join(['%s'] * len(cert_names)) query = ["SELECT id, registered, requestor, hostname, service, note, identity, secret, `read`, debug, `write`, test FROM clients WHERE valid = 1"]
query = "SELECT id, registered, requestor, hostname, service, note, identity, secret, `read`, debug, `write`, test FROM clients WHERE valid = 1 AND identity = %%s AND hostname IN (%s)" % format_strings params = []
self.crs.execute(query, [identity] + cert_names) if identity:
query.append(" AND identity = %s")
params.append(identity)
if secret:
query.append(" AND secret = %s")
params.append(secret)
query.append(" AND hostname IN (%s)" % ','.join(['%s'] * len(cert_names)))
params.extend(cert_names)
self.crs.execute("".join(query), params)
rows = self.crs.fetchall() rows = self.crs.fetchall()
if len(rows)>1: if len(rows)>1:
logging.warn("get_client_by_name: query returned more than one result: %s" % str(rows)) logging.warn("get_client_by_name: query returned more than one result: %s" % ", ".join(
[str(Client(**row)) for row in rows]))
return None return None
client = Client(**rows[0]) if rows else None return Client(**rows[0]) if rows else None
return client
def get_debug(self): def get_debug(self):
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment