{ .opt="preferred-ip", .save=1 },
{ .opt="portal-userauthcookie", .show=1},
{ .opt="portal-prelogonuserauthcookie", .show=1},
- { .unknown=1 },
+ { .opt="preferred-ipv6", .save=1 },
{ .opt="usually-equals-4", .show=1 }, /* newer servers send "4" here, meaning unknown */
{ .opt="usually-equals-unknown", .show=1 }, /* newer servers send "unknown" here */
};
append_opt(request_body, "computer", vpninfo->localname);
if (vpninfo->ip_info.addr)
append_opt(request_body, "preferred-ip", vpninfo->ip_info.addr);
+ if (vpninfo->ip_info.addr6)
+ append_opt(request_body, "preferred-ipv6", vpninfo->ip_info.addr);
if (ctx->form->action)
append_opt(request_body, "inputStr", ctx->form->action);
append_form_opts(vpninfo, ctx->form, request_body);
if (!vpninfo->csd_token)
return -ENOMEM;
- /* use cookie (excluding volatile authcookie and preferred-ip) to build md5sum */
+ /* use cookie (excluding volatile authcookie and preferred-ip/ipv6) to build md5sum */
buf = buf_alloc();
- filter_opts(buf, vpninfo->cookie, "authcookie,preferred-ip", 0);
+ filter_opts(buf, vpninfo->cookie, "authcookie,preferred-ip,preferred-ipv6", 0);
if (buf_error(buf))
goto out;
const char *method = "POST";
char *xml_buf=NULL, *orig_path;
- /* cookie gives us these fields: authcookie, portal, user, domain, computer, and (maybe the unnecessary) preferred-ip */
+ /* cookie gives us these fields: authcookie, portal, user, domain, computer, and (maybe the unnecessary) preferred-ip/ipv6 */
buf_append(request_body, "client-role=global-protect-full&%s", vpninfo->cookie);
if (vpninfo->ip_info.addr)
append_opt(request_body, "client-ip", vpninfo->ip_info.addr);
source = request.args if use_query else request.form
source_name = 'args' if use_query else 'form'
for f in fields:
+ fs = f.replace('_', '-')
if on_failure:
- if session.get(f) != source.get(f) or f not in source:
+ if session.get(f) != source.get(fs):
return on_failure
else:
- assert session.get(f) == source.get(f), \
- f'at step {session.get("step")}: {source_name} {f!r} {source.get(f)!r} != session {f!r} {session.get(f)!r}'
+ assert session.get(f) == source.get(fs), \
+ f'at step {session.get("step")}: {source_name} {f!r} {source.get(fs)!r} != session {f!r} {session.get(f)!r}'
return fn(*args, **kwargs)
return wrapped
return inner
auth = 'Auth%d' % randint(1, 10)
domain = 'Domain%d' % randint(1, 10)
preferred_ip = request.form.get('preferred-ip') or '192.168.%d.%d' % (randint(2, 254), randint(2, 254))
- session.update(preferred_ip=preferred_ip, portal=portal, auth=auth, domain=domain, computer=request.form.get('computer'))
+ if request.form.get('ipv6-support') == 'yes':
+ preferred_ipv6 = request.form.get('preferred-ipv6') or 'fd00::%x' % randint(0x1000, 0xffff)
+ else:
+ preferred_ipv6 = None
+ session.update(preferred_ip=preferred_ip, portal=portal, auth=auth, domain=domain, computer=request.form.get('computer'),
+ ipv6_support=request.form.get('ipv6-support'), preferred_ipv6=preferred_ipv6)
session['authcookie'] = cookify(dict(session)).decode()
return '''<?xml version="1.0" encoding="utf-8"?> <jnlp> <application-desc>
<argument>-1</argument>
<argument>4100</argument>
<argument>{preferred_ip}</argument>
- </application-desc></jnlp>'''.format(**session)
+ <argument/>
+ <argument/>
+ <argument>{ipv6}</argument>
+ </application-desc></jnlp>'''.format(ipv6=preferred_ipv6 or '', **session)
# Respond to gateway getconfig request
@app.route('/ssl-vpn/getconfig.esp', methods=('POST',))
-@check_form_against_session('user', 'portal', 'domain', 'authcookie', on_failure="errors getting SSL/VPN config")
+@check_form_against_session('user', 'portal', 'domain', 'authcookie', 'preferred_ip', 'preferred_ipv6', 'ipv6_support', on_failure="errors getting SSL/VPN config")
def getconfig():
session.update(step='gateway-config')
- return '''<response><ip-address>{preferred_ip}</ip-address>
- <ssl-tunnel-url>/ssl-tunnel-connect.sslvpn</ssl-tunnel-url>
- </response>'''.format(**session)
+ addrs = '<ip-address>{}</ip-address>'.format(session['preferred_ip'])
+ if session['ipv6_support'] == 'yes':
+ addrs += '<ip-address-v6>{}</ip-address-v6>'.format(session['preferred_ipv6'])
+ return '''<response>{}<ssl-tunnel-url>/ssl-tunnel-connect.sslvpn</ssl-tunnel-url></response>'''.format(addrs)
# Respond to gateway getconfig request