Najmul Islam

33 papers C 6Journal 13Unranked 14
YearRankTypeTitle / Venue / Authors
2026 J jnl
Data Inf. Manag.
Mohammed Jawwadul Islam, Mohammad Fahad Al Rafi, Pranto Podder, Aysha Siddika, Moumy Kabir, Euna Mehnaz Khan, Najmul Islam, Saddam Mukta
2026 J jnl
Inf. Softw. Technol.
Muhammad Azeem Akbar, Arif Ali Khan, Mohammad Shameem, Mohammad Nadeem, Najmul Islam
2025 J jnl
Softw. Pract. Exp.
Md. Saddam Hossain Mukta, Badrun Nessa Antu, Nasreen Azad, Iftekharul Abedeen, Najmul Islam
2025 J jnl
Inf. Technol. People
Maryam Hina, Nasreen Azad, Najmul Islam
2025 J jnl
CoRR
Hasan Mahmud, Najmul Islam, Satish Krishnan
2025 J jnl
Decis. Support Syst.
Hasan Mahmud, Najmul Islam, Satish Krishnan
2025 conf
ECIS
Md. Saddam Hossain Mukta, Najmul Islam
2025 conf
AMCIS
Maryam Hina, Najmul Islam
2025 J jnl
Internet Res.
Anushree Tandon, Samuli Laato, Najmul Islam, Amandeep Dhir
2025 conf
AMCIS
Revathi Karri, Prabhat Kumar, Najmul Islam
2025 J jnl
Electron. Mark.
A. K. M. Bahalul Haque, Najmul Islam, Patrick Mikalef
2025 J jnl
Decis. Support Syst.
Maryam Hina, Najmul Islam, Xin (Robert) Luo
2024 conf
MIE
Ilias Maglogiannis, Arsalan Khan, Parisis Gallos, Andreas Menychtas, Christos Panagopoulos, Petros Papachristou, Najmul Islam, Annika Wolff, Salviano Soares, Scott Hansen, Sebastian Scholze
2024 J jnl
IEEE Trans. Engineering Management
Sachin S. Kamble, Amine Belhadi, Shivam Gupta, Najmul Islam, Virendra Kumar Verma, Ludovico Solima
2024 J jnl
Internet Res.
Maryam Hina, Najmul Islam, Amandeep Dhir
2024 conf
ICSOB Companion
Anastasiia Gurzhii, Najmul Islam
2024 conf
ECIS
Janne Parkkila, A. K. M. Bahalul Haque, Jaakko Vuolasto, Anastasiia Gurzhii, Sami Hyrynsalmi, Najmul Islam
2024 J jnl
Softw. Pract. Exp.
Muhammad Azeem Akbar, Arif Ali Khan, Najmul Islam, Sajjad Mahmood
2024 conf
AMCIS
Md. Shamim Talukder, Najmul Islam, Md Farid H. Talukder
2024 C conf
ICIS
Md Raihan Uddin, Gauri Shankar, Md. Saddam Hossain Mukta, Prabhat Kumar, Najmul Islam
2024 J jnl
CoRR
Md Raihan Uddin, Gauri Shankar, Saddam Hossain Mukta, Prabhat Kumar, Najmul Islam
2024 C conf
ICIS
Prabhat Kumar, Najmul Islam
2024 conf
AMCIS
Hasan Mahmud, Najmul Islam
2024 conf
ICSOB
Nasreen Azad, Maryam Hina, Najmul Islam
2024 C conf
ICIS
Maryam Hina, Najmul Islam
2024 conf
ICC Workshops
Ushasri Peddibhotla, Randhir Kumar, Sobin C. C., Prabhat Kumar, Danish Javeed, Najmul Islam
2023 conf
I3E
Anastasiia Gurzhii, Najmul Islam, Micheal Tuape
2023 C conf
ICIS
Maryam Hina, Amandeep Dhir, Najmul Islam, Anushree Luukela-Tandon, Shalini Talwar
2023 C conf
ICIS
Maryam Hina, Amandeep Dhir, Najmul Islam, Anushree Luukela-Tandon, Shalini Talwar
2023 conf
I3E
Hasan Mahmud, Najmul Islam
2023 conf
I3E
Anastasiia Gurzhii, Najmul Islam, Venkata Marella
2023 conf
I3E
Maryam Hina, Najmul Islam, Amandeep Dhir
2020 C conf
FIE
Nicolas Pope, Mikko-Ville Apiola, Heidi Salmento, Najmul Islam, Marko Lahti, Erkki Sutinen
redb/s3_utils.py
← Index redb/s3_utils.py python
"""
S3 and file utility functions for REDB.

Contains MinIO/S3 client creation, S3 key generation,
file download, and archive extraction helpers.
"""
import os
import tempfile
from typing import Optional, List

from minio import Minio
from minio.error import S3Error


def get_minio_client():
    """Create and return a Minio client using credentials from .env file"""
    return Minio(
        endpoint=os.getenv("S3_ENDPOINT"),
        access_key=os.getenv("S3_ACCESS_KEY"),
        secret_key=os.getenv("S3_SECRET_KEY"),
        secure=os.getenv("S3_SECURE", "false").lower() == "true"
    )


def generate_s3_key_from_hash(sample_hash: str) -> str:
    """
    Generate S3 key from hash using sharding structure.
    Example: 09f7d02a3c2382199458c98a62b045145ee54ab6aba86166aecf3d10c3c1444c
    becomes: 09/f7/09f7d02a3c2382199458c98a62b045145ee54ab6aba86166aecf3d10c3c1444c.zip
    """
    if len(sample_hash) < 4:
        raise ValueError(f"Hash too short for sharding: {sample_hash}")

    # Create sharded path: first 2 chars / next 2 chars / full_hash.zip
    return f"{sample_hash[:2]}/{sample_hash[2:4]}/{sample_hash}.zip"


def download_s3_object(s3_bucket: str, s3_key: str, temp_dir: str, logger=None) -> Optional[str]:
    """
    Download an object from S3 to a local temporary directory and return the local path.
    If the .zip file is not found, automatically tries .7z as a fallback for legacy uploads.
    """
    try:
        minio_client = get_minio_client()
        local_path = os.path.join(temp_dir, os.path.basename(s3_key))

        # Download the file
        minio_client.fget_object(s3_bucket, s3_key, local_path)

        return local_path
    except S3Error as e:
        # If .zip not found and error is NoSuchKey, try .7z fallback
        if e.code == 'NoSuchKey' and s3_key.endswith('.zip'):
            s3_key_7z = s3_key[:-4] + '.7z'  # Replace .zip with .7z
            if logger:
                logger.info(f".zip not found, trying .7z fallback: {s3_key_7z}")
            try:
                local_path_7z = os.path.join(temp_dir, os.path.basename(s3_key_7z))
                minio_client.fget_object(s3_bucket, s3_key_7z, local_path_7z)
                if logger:
                    logger.info(f"Successfully downloaded .7z fallback: {s3_key_7z}")
                return local_path_7z
            except S3Error as e2:
                if logger:
                    logger.error(f"Failed to download S3 object {s3_key} (tried both .zip and .7z): {e2}")
                else:
                    print(f"[ERROR] Failed to download S3 object {s3_key} (tried both .zip and .7z): {e2}")
                return None
        else:
            if logger:
                logger.error(f"Failed to download S3 object {s3_key}: {e}")
            else:
                print(f"[ERROR] Failed to download S3 object {s3_key}: {e}")
            return None


def extract_fat_slices(macho, output_dir: str, logger) -> List[tuple]:
    """
    Extract slices from FAT Mach-O binary using machofile's dump_slices() API.

    Args:
        macho: Parsed machofile.UniversalMachO object
        output_dir: Directory to write slice files
        logger: Logger instance

    Returns:
        List of (arch_name, slice_path, slice_sha256, slice_md5, slice_sha1) tuples
    """
    result = []
    try:
        # Use machofile's dump_slices API (v2026.2.5+)
        slices = macho.dump_slices(output_dir=output_dir)
        logger.debug(f"Extracted {len(slices)} slices from FAT binary")

        for arch_name, slice_path in slices:
            # Get hash info for this slice from machofile
            general_info = macho.get_general_info(arch=arch_name)
            slice_sha256 = general_info.get('SHA256')
            slice_md5 = general_info.get('MD5')
            slice_sha1 = general_info.get('SHA1')
            result.append((arch_name, slice_path, slice_sha256, slice_md5, slice_sha1))
            logger.debug(f"Slice {arch_name}: {slice_sha256}")

    except Exception as e:
        logger.error(f"Error extracting FAT slices: {e}")

    return result