/*
 * Copyright (c) 2017, 2018 Oracle and/or its affiliates. All rights reserved.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0, which is available at
 * http://www.eclipse.org/legal/epl-2.0.
 *
 * This Source Code may also be made available under the following Secondary
 * Licenses when the conditions for such availability set forth in the
 * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
 * version 2 with the GNU Classpath Exception, which is available at
 * https://www.gnu.org/software/classpath/license.html.
 *
 * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
 */

package com.sun.devtests.security.jdbcrealm;

import java.sql.*;
import java.security.*;

import sun.misc.BASE64Encoder;

public class PopulateDB {

    // username/passwords
    private static final String[][] users= { {"xyz", "xyz"},
                                             {"abc", "abc"},
                                             {"qwert", "qwert"},
                                             {"testy", "testy"} };

    private static final String[][] users_BASE64=
                                    { {"qwertBASE64", "qwertBASE64"} };
    private static final String[][] users_HEX=
                                    { {"qwertHEX", "qwertHEX"} };

    private static final String[][] users_MD2_BASE64=
                          { {"qwertMD2BASE64", "qwertMD2BASE64"} };
    private static final String[][] users_MD5_BASE64=
                          { {"qwertMD5BASE64", "qwertMD5BASE64"} };
    private static final String[][] users_SHA_BASE64=
                          { {"qwertSHABASE64", "qwertSHABASE64"} };
    private static final String[][] users_SHA256_BASE64=
                          { {"qwertSHA256BASE64", "qwertSHA256BASE64"} };
    private static final String[][] users_SHA384_BASE64=
                          { {"qwertSHA384BASE64", "qwertSHA384BASE64"} };
    private static final String[][] users_SHA512_BASE64=
                          { {"qwertSHA512BASE64", "qwertSHA512BASE64"} };

    private static final String[][] users_MD2_HEX=
                          { {"qwertMD2HEX", "qwertMD2HEX"} };
    private static final String[][] users_MD5_HEX=
                          { {"qwertMD5HEX", "qwertMD5HEX"} };
    private static final String[][] users_SHA_HEX=
                          { {"qwertSHAHEX", "qwertSHAHEX"} };
    private static final String[][] users_SHA256_HEX=
                          { {"qwertSHA256HEX", "qwertSHA256HEX"} };
    private static final String[][] users_SHA384_HEX=
                          { {"qwertSHA384HEX", "qwertSHA384HEX"} };
    private static final String[][] users_SHA512_HEX=
                          { {"qwertSHA512HEX", "qwertSHA512HEX"} };

    // username/groupname
    private static final String[][] groups= { {"xyz", "staff"},
                                              {"xyz", "employee"},
                                              {"abc", "staff"},
                                              {"abc", "employee"},
                                              {"qwert", "staff"},
                                              {"qwertBASE64", "staff"},
                                              {"qwertHEX", "staff"},

//                                               {"qwertMD2BASE64", "staff"},
//                                               {"qwertMD5BASE64", "staff"},
//                                               {"qwertSHABASE64", "staff"},
//                                               {"qwertSHA256BASE64", "staff"},
//                                               {"qwertSHA384BASE64", "staff"},
//                                               {"qwertSHA512BASE64", "staff"},

//                                               {"qwertMD2HEX", "staff"},
//                                               {"qwertMD5HEX", "staff"},
//                                               {"qwertSHAHEX", "staff"},
//                                               {"qwertSHA256HEX", "staff"},
//                                               {"qwertSHA384HEX", "staff"},
//                                               {"qwertSHA512HEX", "staff"},

                                              {"testy", "staff"} };

    private static final String URL_OPTION       = "-url";
    private static final String VERBOSE_OPTION   = "-verbose";
    private static final String DB_DRIVER_OPTION = "-dbDriver";
    private static final String USERNAME_OPTION = "-username";
    private static final String PASSWORD_OPTION = "-password";

    private static boolean verbose = false;

    private static String INSERT_USER_STMT_CLEAR =
        "insert into USER_TABLE values (?, ?)";
    private static String INSERT_USER_STMT_BASE64 =
        "insert into USER_TABLE_BASE64 values (?, ?)";
    private static String INSERT_USER_STMT_HEX =
        "insert into USER_TABLE_HEX values (?, ?)";

    private static String INSERT_USER_STMT_MD2_BASE64 =
        "insert into USER_TABLE_MD2_BASE64 values (?, ?)";
    private static String INSERT_USER_STMT_MD5_BASE64 =
        "insert into USER_TABLE_MD5_BASE64 values (?, ?)";
    private static String INSERT_USER_STMT_SHA_BASE64 =
        "insert into USER_TABLE_SHA_BASE64 values (?, ?)";
    private static String INSERT_USER_STMT_SHA256_BASE64 =
        "insert into USER_TABLE_SHA256_BASE64 values (?, ?)";
    private static String INSERT_USER_STMT_SHA384_BASE64 =
        "insert into USER_TABLE_SHA384_BASE64 values (?, ?)";
    private static String INSERT_USER_STMT_SHA512_BASE64 =
        "insert into USER_TABLE_SHA512_BASE64 values (?, ?)";

    private static String INSERT_USER_STMT_MD2_HEX =
        "insert into USER_TABLE_MD2_HEX values (?, ?)";
    private static String INSERT_USER_STMT_MD5_HEX =
        "insert into USER_TABLE_MD5_HEX values (?, ?)";
    private static String INSERT_USER_STMT_SHA_HEX =
        "insert into USER_TABLE_SHA_HEX values (?, ?)";
    private static String INSERT_USER_STMT_SHA256_HEX =
        "insert into USER_TABLE_SHA256_HEX values (?, ?)";
    private static String INSERT_USER_STMT_SHA384_HEX =
        "insert into USER_TABLE_SHA384_HEX values (?, ?)";
    private static String INSERT_USER_STMT_SHA512_HEX =
        "insert into USER_TABLE_SHA512_HEX values (?, ?)";

    private static String INSERT_GROUP_STMT =
        "insert into GROUP_TABLE values (?, ?)";

    private static void verbose(String msg) {
        if( verbose )
            System.out.println(msg);
    }

    private static void usage() {
        System.out.println("usage: java PopulateDB -url <url>");
    }

    public static void main(String[] args) throws Exception {

        String dbURL = null;
        String dbDriverClass = "org.apache.derby.jdbc.ClientDriver";
        String username = null;
        String password = null;

        for(int i=0; i<args.length; i++) {
            verbose("Arg[" + i + "] " +args[i]);
            if( args[i].intern() == URL_OPTION.intern() ) {
                dbURL = args[++i];
            } else if( args[i].intern() == VERBOSE_OPTION.intern() ) {
                verbose = true;
            } else if( args[i].intern() == DB_DRIVER_OPTION.intern() ) {
                dbDriverClass = args[++i];;
            } else if( args[i].intern() == USERNAME_OPTION.intern() ) {
                username = args[++i];
            } else if( args[i].intern() == PASSWORD_OPTION.intern() ) {
                password = args[++i];
            } else {
                usage();
                System.exit(1);
            }
        }

        if( dbURL == null ) {
            usage();
            System.exit(1);
        }

        verbose("db url: " + dbURL);
        verbose("db driver: " + dbDriverClass);
        verbose("db user: " + username);
        verbose("db pass: " + password);

        Class.forName(dbDriverClass);
        Connection con =  null;
        if( username == null )
            con = DriverManager.getConnection(dbURL);
        else
            con = DriverManager.getConnection(dbURL, username, password);

        // populate the clear user table
        PreparedStatement ps = con.prepareStatement(INSERT_USER_STMT_CLEAR);
        for(int i=0; i<users.length; i++) {
            ps.setString(1, users[i][0]);
            ps.setString(2, users[i][1]);
            ps.executeUpdate();
        }
        ps.close();

        ps = con.prepareStatement(INSERT_USER_STMT_BASE64);
        BASE64Encoder base64 = new BASE64Encoder();
        for(int i=0; i<users_BASE64.length; i++) {
            ps.setString(1, users_BASE64[i][0]);
            ps.setString(2, new String(base64.encode(users_BASE64[i][1].getBytes())));
            ps.executeUpdate();
        }
        ps.close();

        ps = con.prepareStatement(INSERT_USER_STMT_HEX);
        for(int i=0; i<users_HEX.length; i++) {
            ps.setString(1, users_HEX[i][0]);
            ps.setString(2, hexConvert(users_HEX[i][1].getBytes()));
            ps.executeUpdate();
        }
        ps.close();

        ps = con.prepareStatement(INSERT_USER_STMT_MD2_BASE64);
        MessageDigest md2 = MessageDigest.getInstance("MD2");
        for(int i=0; i<users_MD2_BASE64.length; i++) {
            ps.setString(1, users_MD2_BASE64[i][0]);
            ps.setString(2, base64.encode(md2.digest(users_MD2_BASE64[i][1].getBytes())));
            ps.executeUpdate();
            md2.reset();
        }
        ps.close();

        ps = con.prepareStatement(INSERT_USER_STMT_MD5_BASE64);
        MessageDigest md5 = MessageDigest.getInstance("MD5");
        for(int i=0; i<users_MD5_BASE64.length; i++) {
            ps.setString(1, users_MD5_BASE64[i][0]);
            ps.setString(2, base64.encode(md5.digest(users_MD5_BASE64[i][1].getBytes())));
            ps.executeUpdate();
            md5.reset();
        }
        ps.close();

        ps = con.prepareStatement(INSERT_USER_STMT_SHA_BASE64);
        MessageDigest sha = MessageDigest.getInstance("SHA");
        for(int i=0; i<users_SHA_BASE64.length; i++) {
            ps.setString(1, users_SHA_BASE64[i][0]);
            ps.setString(2, base64.encode(sha.digest(users_SHA_BASE64[i][1].getBytes())));
            ps.executeUpdate();
            sha.reset();
        }
        ps.close();

        ps = con.prepareStatement(INSERT_USER_STMT_SHA256_BASE64);
        MessageDigest sha256 = MessageDigest.getInstance("SHA-256");
        for(int i=0; i<users_SHA256_BASE64.length; i++) {
            ps.setString(1, users_SHA256_BASE64[i][0]);
            ps.setString(2, base64.encode(sha256.digest(users_SHA256_BASE64[i][1].getBytes())));
            ps.executeUpdate();
            sha256.reset();
        }
        ps.close();

        ps = con.prepareStatement(INSERT_USER_STMT_SHA384_BASE64);
        MessageDigest sha384 = MessageDigest.getInstance("SHA-384");
        for(int i=0; i<users_SHA384_BASE64.length; i++) {
            ps.setString(1, users_SHA384_BASE64[i][0]);
            ps.setString(2, base64.encode(sha384.digest(users_SHA384_BASE64[i][1].getBytes())));
            ps.executeUpdate();
            sha384.reset();
        }
        ps.close();

        ps = con.prepareStatement(INSERT_USER_STMT_SHA512_BASE64);
        MessageDigest sha512 = MessageDigest.getInstance("SHA-512");
        for(int i=0; i<users_SHA512_BASE64.length; i++) {
            ps.setString(1, users_SHA512_BASE64[i][0]);
            ps.setString(2, base64.encode(sha512.digest(users_SHA512_BASE64[i][1].getBytes())));
            ps.executeUpdate();
            sha512.reset();
        }
        ps.close();

        ps = con.prepareStatement(INSERT_USER_STMT_MD2_HEX);
        for(int i=0; i<users_MD2_HEX.length; i++) {
            ps.setString(1, users_MD2_HEX[i][0]);
            ps.setString(2, hexConvert(md2.digest(users_MD2_HEX[i][1].getBytes())));
            ps.executeUpdate();
            md2.reset();
        }
        ps.close();

        ps = con.prepareStatement(INSERT_USER_STMT_MD5_HEX);
        for(int i=0; i<users_MD5_HEX.length; i++) {
            ps.setString(1, users_MD5_HEX[i][0]);
            ps.setString(2, hexConvert(md5.digest(users_MD5_HEX[i][1].getBytes())));
            ps.executeUpdate();
            md5.reset();
        }
        ps.close();

        ps = con.prepareStatement(INSERT_USER_STMT_SHA_HEX);
        for(int i=0; i<users_SHA_HEX.length; i++) {
            ps.setString(1, users_SHA_HEX[i][0]);
            ps.setString(2, hexConvert(sha.digest(users_SHA_HEX[i][1].getBytes())));
            ps.executeUpdate();
            sha.reset();
        }
        ps.close();

        ps = con.prepareStatement(INSERT_USER_STMT_SHA256_HEX);
        for(int i=0; i<users_SHA256_HEX.length; i++) {
            ps.setString(1, users_SHA256_HEX[i][0]);
            ps.setString(2, hexConvert(sha256.digest(users_SHA256_HEX[i][1].getBytes())));
            ps.executeUpdate();
            sha256.reset();
        }
        ps.close();

        ps = con.prepareStatement(INSERT_USER_STMT_SHA384_HEX);
        for(int i=0; i<users_SHA384_HEX.length; i++) {
            ps.setString(1, users_SHA384_HEX[i][0]);
            ps.setString(2, hexConvert(sha384.digest(users_SHA384_HEX[i][1].getBytes())));
            ps.executeUpdate();
            sha384.reset();
        }
        ps.close();

        ps = con.prepareStatement(INSERT_USER_STMT_SHA512_HEX);
        for(int i=0; i<users_SHA512_HEX.length; i++) {
            ps.setString(1, users_SHA512_HEX[i][0]);
            ps.setString(2, hexConvert(sha512.digest(users_SHA512_HEX[i][1].getBytes())));
            ps.executeUpdate();
            sha512.reset();
        }
        ps.close();

        // populate the group table
        ps = con.prepareStatement(INSERT_GROUP_STMT);
        for(int i=0; i<groups.length; i++) {
            ps.setString(1, groups[i][0]);
            ps.setString(2, groups[i][1]);
            ps.executeUpdate();
        }
        ps.close();
    }

    private static String hexConvert(byte bytes[]) {

        StringBuffer sb = new StringBuffer(bytes.length * 2);
        for (int i = 0; i < bytes.length; i++) {
            sb.append(convertDigit((int) (bytes[i] >> 4)));
            sb.append(convertDigit((int) (bytes[i] & 0x0f)));
        }
        return (sb.toString());

    }

    private static char convertDigit(int value) {

        value &= 0x0f;
        if (value >= 10)
            return ((char) (value - 10 + 'a'));
        else
            return ((char) (value + '0'));

    }


}
