bitgateway-client 0.1.1

A small srun client for BIT
Documentation
use anyhow::Result;
use hmac::{Hmac, Mac};
use md5::Md5;
use sha1::{Digest, Sha1};

use crate::xencode::{fkbase64, xencode};

pub const SRUN_TYPE: &str = "1";
pub const SRUN_N: &str = "200";

pub fn login_info(
    username: &str,
    password: &str,
    ip: &str,
    ac_id: &str,
    token: &str,
) -> Result<String> {
    let checksum_data = serde_json::json!({
        "username": username,
        "password": password,
        "ip": ip,
        "acid": ac_id,
        "enc_ver": "srun_bx1",
    });
    let json_checksum_data = serde_json::to_string(&checksum_data)?;

    Ok(format!(
        "{}{}",
        "{SRBX1}",
        fkbase64(xencode(&json_checksum_data, token))
    ))
}

pub fn hmd5(token: &str) -> Result<String> {
    let mac = Hmac::<Md5>::new_from_slice(token.as_bytes())?;

    Ok(format!("{:x}", mac.finalize().into_bytes()))
}

pub fn checksum(
    token: &str,
    username: &str,
    hmd5: &str,
    ac_id: &str,
    ip: &str,
    info: &str,
) -> String {
    let source = format!(
        "{token}{username}{token}{hmd5}{token}{ac_id}{token}{ip}{token}{SRUN_N}{token}{SRUN_TYPE}{token}{info}"
    );
    let mut hasher = Sha1::new();
    hasher.update(source);

    format!("{:x}", hasher.finalize())
}

pub fn dm_logout_sign(timestamp: &str, username: &str, ip: &str, unbind: &str) -> String {
    let source = format!("{timestamp}{username}{ip}{unbind}{timestamp}");
    let mut hasher = Sha1::new();
    hasher.update(source);

    format!("{:x}", hasher.finalize())
}