fortigate-api icon indicating copy to clipboard operation
fortigate-api copied to clipboard

Logic simplification and unnecessary loop elimination for csrf token

Open Christiandus opened this issue 1 year ago • 2 comments
trafficstars

Currently the get token from cookies function has the following loop:

Current code
while True:
    # fortios < v7
    cookie_name = "ccsrftoken"
    if cookies := [o for o in session.cookies if o and o.name == cookie_name]:
        break

    # fortios >= v7
    cookie_name += "_"
    if cookies := [o for o in session.cookies if o and o.name.startswith(cookie_name)]:
        break

    raise ValueError("Invalid login credentials. Cookie 'ccsrftoken' is missing.")

token = str(cookies[0].value).strip('"')
return token

In my opinion the logic could be significantly simplified and the loop removed. I've tested it on 7.2.8 and it works flawlessly :) Let me know what you think! (Of course the tests would need to be adjusted as they currently check for the underscore as well)

My suggestion
cookie_prefix = "ccsrftoken"
if cookies := [o for o in session.cookies if o and o.name.startswith(cookie_prefix)]:
    token = str(cookies[0].value).strip('"')
    return token
else:
    raise ValueError("Invalid login credentials. Cookie 'ccsrftoken' is missing.")

Christiandus avatar May 08 '24 00:05 Christiandus

Thank you for your interest in this project. Regarding your suggestion to remove the following ValueError tests: L103 L104

These tests aim to exclude cookies not related to authentication. I suppose that some cookies starting with ccsrftoken might be intended for other purposes besides authentication and I prefer to do them to eliminate unpredictable behavior. Perhaps my fears are unfounded.

vladimirs-git avatar May 08 '24 12:05 vladimirs-git

When I checked the cookies set by the FGT there were only 2 cookies. The name of the other cookies starts with APSCOOKIE. As you're only reading cookies from the FGT response (and not other websites) I don't see any problem in simplifying the logic, in the end it's up to you though.

Christiandus avatar May 08 '24 20:05 Christiandus

fixed in 2.0.2

vladimirs-git avatar May 17 '24 06:05 vladimirs-git