summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/axios_client.js6
-rw-r--r--src/constants.js1
-rw-r--r--src/session.js92
3 files changed, 62 insertions, 37 deletions
diff --git a/src/axios_client.js b/src/axios_client.js
new file mode 100644
index 0000000..fd7325c
--- /dev/null
+++ b/src/axios_client.js
@@ -0,0 +1,6 @@
+import { wrapper } from "axios-cookiejar-support";
+import { CookieJar } from "tough-cookie";
+import axios from "axios";
+
+const jar = new CookieJar();
+export const client = wrapper(axios.create({ jar, withCredentials: true }));
diff --git a/src/constants.js b/src/constants.js
index 5087f3f..a0b09e5 100644
--- a/src/constants.js
+++ b/src/constants.js
@@ -1,5 +1,6 @@
export const AGGIETIME_URI = "https://aggietimeultra.usu.edu";
export const LOGIN_PATH = "api/v1/auth/login";
+export const USER_PATH = "api/v1/auth/get_user_info";
export const EXECUTION_SELECTOR = "input[type=hidden][name=execution]";
export const DUO_IFRAME_SELECTOR = "#duo_iframe";
export const DUO_FACTOR = "Duo Push";
diff --git a/src/session.js b/src/session.js
index ae6d593..0206731 100644
--- a/src/session.js
+++ b/src/session.js
@@ -1,14 +1,17 @@
import {
AGGIETIME_URI,
LOGIN_PATH,
+ USER_PATH,
DUO_IFRAME_SELECTOR,
DUO_FACTOR,
DUO_INPUT_FIELD_SELECTORS,
EXECUTION_SELECTOR,
} from "./constants.js";
+import { client } from "./axios_client.js";
+
import { parse } from "node-html-parser";
-import axios from "axios";
+//import axios from "axios";
const make_auth_params = (username, password, execution) =>
new URLSearchParams({
@@ -31,10 +34,10 @@ const push_duo_get_cookie = async (
"data-sig-request",
"src",
].map((attr) => duo_iframe_obj.getAttribute(attr));
- const transaction_id = duo_sig.split(":")[0];
+ const transaction_id = duo_sig.split(":").at(0);
+ const app = duo_sig.split(":APP").at(-1);
- const duo = axios.create({
- withCredentials: true,
+ const duo = client.create({
baseURL: `https://${duo_host}`,
});
@@ -62,63 +65,78 @@ const push_duo_get_cookie = async (
response: { txid },
} = await duo.post("/frame/prompt", push_params).then(({ data }) => data);
- return await wait_approve_duo(duo, sid, txid);
+ const { cookie, parent } = await wait_approve_duo_cookie_resp(duo, sid, txid);
+ return { duo_signed_resp: cookie + ":APP" + app, parent };
};
-const wait_approve_duo = async (duo, sid, txid) => {
- // First status to confirm device was pushed to
- // Second to long-poll for approval :3
+const wait_approve_duo_cookie_resp = async (duo, sid, txid) => {
const status_params = new URLSearchParams({
sid,
txid,
});
- const data = await duo
- .post("/frame/status", status_params)
- .then(async ({ data }) => {
- if (data.stat === "OK" && data.response.status_code === "pushed")
- return await duo
- .post("/frame/status", status_params)
- .then(({ data }) => data);
- return data;
- });
-
+ // First status to confirm device was pushed to
+ // Second to long-poll for approval :3
const {
response: { result_url },
- } = data;
+ } = await duo.post("/frame/status", status_params).then(async ({ data }) => {
+ if (data.stat === "OK" && data.response.status_code === "pushed")
+ return await duo
+ .post("/frame/status", status_params)
+ .then(({ data }) => data);
+ return data;
+ });
- console.log(data);
+ const {
+ response: { cookie, parent },
+ } = await duo
+ .post(result_url, new URLSearchParams({ sid }))
+ .then(({ data }) => data);
- return await duo.post(result_url, new URLSearchParams({ sid }));
+ return { cookie, parent };
};
+const get_execution = (cas_root) => {};
+
export const login = async (username, password) => {
- const login_page_promise = axios.get(`${AGGIETIME_URI}/${LOGIN_PATH}`);
+ const login_page_promise = client.get(`${AGGIETIME_URI}/${LOGIN_PATH}`);
const {
request: {
res: { responseUrl: response_url },
},
} = await login_page_promise;
- const cas_root = await login_page_promise.then(({ data }) => parse(data));
- const execution = cas_root
+ let cas_root = await login_page_promise.then(({ data }) => parse(data));
+ const login_execution = cas_root
.querySelector(EXECUTION_SELECTOR)
.getAttribute("value");
- const duo_iframe_obj = await axios
- .post(response_url, make_auth_params(username, password, execution))
- .then(({ data }) => parse(data).querySelector(DUO_IFRAME_SELECTOR));
+ cas_root = await client
+ .post(response_url, make_auth_params(username, password, login_execution))
+ .then(({ data }) => parse(data));
+ const authed_execution = cas_root
+ .querySelector(EXECUTION_SELECTOR)
+ .getAttribute("value");
- const cookie = await push_duo_get_cookie(
- duo_iframe_obj,
- response_url,
- username,
- password,
- execution
- );
+ const duo_iframe_obj = cas_root.querySelector(DUO_IFRAME_SELECTOR);
+
+ const { duo_signed_resp, parent: signed_response_url } =
+ await push_duo_get_cookie(
+ duo_iframe_obj,
+ response_url,
+ username,
+ password,
+ login_execution
+ );
- console.log(cookie);
- console.log(cookie.data);
+ const jwt_cookie_set = await client.post(
+ signed_response_url,
+ new URLSearchParams({
+ execution: authed_execution,
+ signedDuoResponse: duo_signed_resp,
+ _eventId: "submit",
+ })
+ );
- return cookie;
+ return jwt_cookie_set;
};