text:
package org.globus.gsi.proxy;

import org.globus.common.CoGProperties;

import org.globus.gsi.util.CertificateLoadUtil;

import org.globus.gsi.trustmanager.CRLChecker;
import org.globus.gsi.trustmanager.CertificateChecker;
import org.globus.gsi.trustmanager.DateValidityChecker;
import org.globus.gsi.trustmanager.IdentityChecker;
import org.globus.gsi.trustmanager.SigningPolicyChecker;
import org.globus.gsi.trustmanager.UnsupportedCriticalExtensionChecker;
import org.globus.gsi.trustmanager.X509ProxyCertPathValidator;

import org.globus.gsi.X509Credential;

import java.util.ArrayList;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import java.util.Map;
import javax.security.auth.x500.X500Principal;
import java.security.cert.CertPathValidatorException;
import java.security.cert.CertPath;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.StringReader;
import java.security.cert.X509Certificate;
import java.security.cert.X509CRL;
import org.globus.gsi.GSIConstants;
import org.globus.gsi.TrustedCertificates;
import org.globus.gsi.SigningPolicy;
import org.globus.gsi.SigningPolicyParser;
import org.globus.gsi.CertificateRevocationLists;
import org.globus.gsi.proxy.ProxyPolicyHandler;
import org.globus.gsi.proxy.ProxyPathValidator;
import org.globus.gsi.proxy.ProxyPathValidatorException;
import org.globus.gsi.proxy.ext.ProxyCertInfo;
import org.globus.gsi.proxy.ext.ProxyPolicy;

import junit.framework.TestCase;

public class ProxyPathValidatorTest extends TestCase {

    private static Log log = LogFactory.getLog(ProxyPathValidatorTest.class);
    public static final String BASE = "validatorTest/";

    public static String[] crlNames = { "ca2crl.r0", "testca3.r0" };

    public static String[][] certs = {
        {GSIConstants.CertificateType.CA.name(), "TestCA1.pem"},
        {GSIConstants.CertificateType.EEC.name(), "eecFromTestCA1.pem"},
        {GSIConstants.CertificateType.GSI_2_PROXY.name(), "gsi2fullproxy.pem"},
        {GSIConstants.CertificateType.GSI_2_LIMITED_PROXY.name(), "gsi2limitedproxy.pem"},
            // 4, double GSIConstants.CertificateType.GSI_2_LIMITED_PROXY), gsi2limited2xproxy.pem (issued by
            // 3)
        {GSIConstants.CertificateType.GSI_2_LIMITED_PROXY.name(), "gsi2limited2xproxy.pem"},
            // 5, GSIConstants.CertificateType.GSI_3_IMPERSONATION_PROXY), gsi3impersonationproxy.pem
        {GSIConstants.CertificateType.GSI_3_IMPERSONATION_PROXY.name(), "gsi3impersonationproxy.pem"},
            // 6, GSIConstants.CertificateType.GSI_3_INDEPENDENT_PROXY), gsi3independentproxy.pem
        {GSIConstants.CertificateType.GSI_3_INDEPENDENT_PROXY.name(), "gsi3independentproxy.pem"},
            // 7, GSIConstants.CertificateType.GSI_3_LIMITED_PROXY), gsi3limitedproxy.pem
        {GSIConstants.CertificateType.GSI_3_LIMITED_PROXY.name(), "gsi3limitedproxy.pem"},
            // 8, GSIConstants.CertificateType.GSI_3_RESTRICTED_PROXY), gsi3restrictedproxy.pem
        {GSIConstants.CertificateType.GSI_3_RESTRICTED_PROXY.name(), "gsi3restrictedproxy.pem"},
            // double
            // 9, GSIConstants.CertificateType.GSI_3_IMPERSONATION_PROXY), gsi3impersonation2xproxy.pem
        {GSIConstants.CertificateType.GSI_3_IMPERSONATION_PROXY.name(), "gsi3impersonation2xproxy.pem"},
            // 10, GSIConstants.CertificateType.GSI_3_INDEPENDENT_PROXY), gsi3independent2xproxy.pem
        {GSIConstants.CertificateType.GSI_3_INDEPENDENT_PROXY.name(), "gsi3independent2xproxy.pem"},
            // pathLen = 0
            // 11, GSIConstants.CertificateType.GSI_3_IMPERSONATION_PROXY), gsi3impersonationp0proxy.pem
        {GSIConstants.CertificateType.GSI_3_IMPERSONATION_PROXY.name(), "gsi3impersonationp0proxy.pem"},
            // pathLen = 1
            // 12, GSIConstants.CertificateType.GSI_3_INDEPENDENT_PROXY), gsi2independentp1proxy.pem
        {GSIConstants.CertificateType.GSI_3_INDEPENDENT_PROXY.name(), "gsi3independentp1proxy.pem"},
            // pathLen = 2
            // 13, GSIConstants.CertificateType.CA),
        {GSIConstants.CertificateType.CA.name(), "testca.pem"},
            // 14, GSIConstants.CertificateType.EEC)
        {GSIConstants.CertificateType.EEC.name(), "testeec1.pem"},
            // 15, GSIConstants.CertificateType.EEC)
        {GSIConstants.CertificateType.EEC.name(), "testeec2.pem"},
            // pathLen = 1
            // 16, GSIConstants.CertificateType.CA)
        {GSIConstants.CertificateType.CA.name(), "testca2.pem"}, // crl for this, 16
            // 17, GSIConstants.CertificateType.GSI_3_IMPERSONATION_PROXY),
        {GSIConstants.CertificateType.GSI_3_IMPERSONATION_PROXY.name(), "testgsi3proxy.pem"},
            // for CRL test
            // 18, GSIConstants.CertificateType.CA),
        {GSIConstants.CertificateType.CA.name(), "testca3.pem"},
            // 19, GSIConstants.CertificateType.EEC),
        {GSIConstants.CertificateType.EEC.name(), "crl_usercert.pem"},
            // 20, GSIConstants.CertificateType.GSI_2_PROXY),
        {GSIConstants.CertificateType.GSI_2_PROXY.name(), "crl_proxy.pem"},
            // 21 (all good)
            // GSIConstants.CertificateType.CA)
        {GSIConstants.CertificateType.CA.name(), "ca1cert.pem"},
            // 22, GSIConstants.CertificateType.EEC
        {GSIConstants.CertificateType.EEC.name(), "user1ca1.pem"},
            // 23, GSIConstants.CertificateType.EEC)
        {GSIConstants.CertificateType.EEC.name(), "user2ca1.pem"},
            // 24, GSIConstants.CertificateType.EEC)
        {GSIConstants.CertificateType.EEC.name(), "user3ca1.pem"},
            // 25
            // GSIConstants.CertificateType.CA)
        {GSIConstants.CertificateType.CA.name(), "ca2cert.pem"}, // crl 25
            // must be revoked (in ca2crl.r0)
            // 26, GSIConstants.CertificateType.EEC)
        {GSIConstants.CertificateType.EEC.name(), "user1ca2.pem"},
            // must be revoked (in ca2crl.r0)
            // 27, GSIConstants.CertificateType.EEC),
        {GSIConstants.CertificateType.EEC.name(), "user2ca2.pem"},
            // 28, GSIConstants.CertificateType.EEC)
        {GSIConstants.CertificateType.EEC.name(), "user3ca2.pem"},
            // 29
            // gsi3 limited impersonation signs a gsi3 independent
        {GSIConstants.CertificateType.GSI_3_INDEPENDENT_PROXY.name(), "gsi3independentFromLimitedProxy.pem"},
            // 30
            // gsi3 limited impersonation signs a gsi3 impersonation
        {GSIConstants.CertificateType.GSI_3_IMPERSONATION_PROXY.name(), "gsi3limitedimpersonation2xproxy.pem"},
            // 31
            // gsi3 independent signs a gsi3 impersonation
        {GSIConstants.CertificateType.GSI_3_IMPERSONATION_PROXY.name(), "gsi3impersonationFromIndependentProxy.pem"},
            // 32
            // gsi3 pathlength 0 impersonatipon proxy signs proxy
        {GSIConstants.CertificateType.GSI_3_IMPERSONATION_PROXY.name(), "gsi3FromPathZeroProxy.pem"},
            // 33
            // gsi3 path length 1 independent proxy signs proxy
        {GSIConstants.CertificateType.GSI_3_IMPERSONATION_PROXY.name(), "gsi3FromPathOneProxy.pem"},
            // 34
            // gsi3FrompathOneProxy signs proxy
        {GSIConstants.CertificateType.GSI_3_IMPERSONATION_PROXY.name(), "gsi3FromPathOneIssuedProxy.pem"},
            // 35
            // gsi2 proxy generated from gsi3impersonationProxy
        {GSIConstants.CertificateType.GSI_2_PROXY.name(), "gsi2proxyFromgsi3.pem"},
            // 36
            // gsi3 proxy generated from gsi2fullproxy
        {GSIConstants.CertificateType.GSI_3_IMPERSONATION_PROXY.name(), "gsi3proxyFromgsi2.pem" }};

    public static String[] badCerts = {
            "-----BEGIN CERTIFICATE-----\n" + "MIICFTCCAX6gAwIBAgIDClb3MA0GCSqGSIb3DQEBBAUAMGIxCzAJBgNVBAYTAlVT\n"
                + "MQ8wDQYDVQQKEwZHbG9idXMxJDAiBgNVBAoTG0FyZ29ubmUgTmF0aW9uYWwgTGFi\n"
                + "b3JhdG9yeTEMMAoGA1UECxMDTUNTMQ4wDAYDVQQDEwVnYXdvcjAeFw0wMjEyMTgw\n"
                + "NzEzNDhaFw0wMjEyMTgxOTE4NDhaMIGCMQswCQYDVQQGEwJVUzEPMA0GA1UEChMG\n"
                + "R2xvYnVzMSQwIgYDVQQKExtBcmdvbm5lIE5hdGlvbmFsIExhYm9yYXRvcnkxDDAK\n"
                + "BgNVBAsTA01DUzEOMAwGA1UEAxMFZ2F3b3IxDjAMBgNVBAMTBXByb3h5MQ4wDAYD\n"
                + "VQQDEwVwcm94eTBaMA0GCSqGSIb3DQEBAQUAA0kAMEYCQQCplfu3OZH5AfYgoYKi\n"
                + "KFmGZnbj3+ZwJm45B6Ef7qwW7Le7FP4eirljObqijgn8ao0gGqy38LYbaTntToqX\n"
                + "iy5fAgERMA0GCSqGSIb3DQEBBAUAA4GBAKnNy0VPDzzD6++7i9a/yegPX2+OVI6C\n"
                + "7oss1/4sSw2gfn/q8qNiGdt1kr4W3JJACdjgnik8fokNS7pDMdXKi3Wx6E0HhgKz\n"
                + "eRIm5r6Vj7nshVBAv60Xmfju3yaOZsDnj8p0t8Fjc8ekeZowLEdRn7PCEQPylMOp\n" + "2puR03MaPiFj\n"
                + "-----END CERTIFICATE-----",
            "-----BEGIN CERTIFICATE-----\n" + "MIICBDCCAW2gAwIBAgIDAx4rMA0GCSqGSIb3DQEBBAUAMGIxCzAJBgNVBAYTAlVT\n"
                + "MQ8wDQYDVQQKEwZHbG9idXMxJDAiBgNVBAoTG0FyZ29ubmUgTmF0aW9uYWwgTGFi\n"
                + "b3JhdG9yeTEMMAoGA1UECxMDTUNTMQ4wDAYDVQQDEwVnYXZvcjAeFw0wMjEyMTgw\n"
                + "NzIxMThaFw0wMjEyMTgxOTI2MThaMHIxCzAJBgNVBAYTAlVTMQ8wDQYDVQQKEwZH\n"
                + "bG9idXMxJDAiBgNVBAoTG0FyZ29ubmUgTmF0aW9uYWwgTGFib3JhdG9yeTEMMAoG\n"
                + "A1UECxMDTUNTMQ4wDAYDVQQDEwVnYXdvcjEOMAwGA1UEAxMFcHJveHkwWjANBgkq\n"
                + "hkiG9w0BAQEFAANJADBGAkEAx2fp80b+Yo0zCwjYJdIjzn0N3ezzcD2h2bAr/Nop\n"
                + "w/H6JB4heiVGMeydMlSJHyI7J/s5l8k39G/KVrBGT9tRJwIBETANBgkqhkiG9w0B\n"
                + "AQQFAAOBgQCRRvTdW6Ddn1curWm515l/GoAoJ76XBFJWfusIZ9TdwE8hlkRpK9Bd\n"
                + "Rrao4Z2YO+e3UItn45Hs+8gzx+jBB1AduTUor603Z8AXaNbF/c+gz62lBWlcmZ2Y\n"
                + "LzuUWgwZLd9HdA2YBgCcT3B9VFmBxcnPjGOwWT29ZUtyy2GXFtzcDw==\n"
                + "-----END CERTIFICATE-----" };

    public static String[] testCerts = {
            "-----BEGIN CERTIFICATE-----\n"
                + "MIIB7zCCAVigAwIBAgICAbowDQYJKoZIhvcNAQEEBQAwVzEbMBkGA1UEChMSZG9l\n"
                + "c2NpZW5jZWdyaWQub3JnMQ8wDQYDVQQLEwZQZW9wbGUxJzAlBgNVBAMTHlZpamF5\n"
                + "YSBMYWtzaG1pIE5hdGFyYWphbiAxNzkwODAeFw0wMzAxMTcyMjExMjJaFw0wMzAx\n"
                + "MTgxMDE2MjJaMGcxGzAZBgNVBAoTEmRvZXNjaWVuY2VncmlkLm9yZzEPMA0GA1UE\n"
                + "CxMGUGVvcGxlMScwJQYDVQQDEx5WaWpheWEgTGFrc2htaSBOYXRhcmFqYW4gMTc5\n"
                + "MDgxDjAMBgNVBAMTBXByb3h5MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBANGP+xct\n"
                + "lDYMPm11QKnACvqs95fbPRehvUi6/dizZ+VrDOU1OTUoXA0t6HRgtmJ8XthEUKxU\n"
                + "MVsxjXtoZOzfuFECAwEAATANBgkqhkiG9w0BAQQFAAOBgQBqFTcN/qqvTnyI4z26\n"
                + "lv1lMTuRIjL9l6Ug/Kwxuzjpl088INky1myFPjKsWMYzh9nXIQg9gg2dJTno5JHB\n"
                + "++u0Fw2iNrTjswu4hvqYZn+LoSGchH2XyCUssuOWCbW4IkN8/Xzfre2oC2EieECC\n"
                + "w+jjGhcqPrxvkHh8xXYroqA0Sg==\n"
                + "-----END CERTIFICATE-----",
            "-----BEGIN CERTIFICATE-----\n"
                + "MIIDLDCCAhSgAwIBAgICAbowDQYJKoZIhvcNAQEFBQAwdTETMBEGCgmSJomT8ixk\n"
                + "ARkWA25ldDESMBAGCgmSJomT8ixkARkWAmVzMSAwHgYDVQQLExdDZXJ0aWZpY2F0\n"
                + "ZSBBdXRob3JpdGllczEZMBcGA1UECxMQRE9FIFNjaWVuY2UgR3JpZDENMAsGA1UE\n"
                + "AxMEcGtpMTAeFw0wMjA5MjMyMzQ2NDRaFw0wMzA5MjMyMzQ2NDRaMFcxGzAZBgNV\n"
                + "BAoTEmRvZXNjaWVuY2VncmlkLm9yZzEPMA0GA1UECxMGUGVvcGxlMScwJQYDVQQD\n"
                + "Ex5WaWpheWEgTGFrc2htaSBOYXRhcmFqYW4gMTc5MDgwgZ8wDQYJKoZIhvcNAQEB\n"
                + "BQADgY0AMIGJAoGBAORYHsPQU3yVlTsC/29CDoEYF82PVlolQk5s+1m6A7m3VvML\n"
                + "TKh4ja6cKtq7C5rBUIWdyklkU3eXSSmiAzjJrVOmfWK3RR465A5tfvJLmXKWaq3U\n"
                + "7SvI6v3vx4Jzy4MJs46TDAr4v9JRJG2yshoxruRy2gDsn4F5NfLLevDNwzSLAgMB\n"
                + "AAGjaDBmMBEGCWCGSAGG+EIBAQQEAwIF4DAOBgNVHQ8BAf8EBAMCBPAwHwYDVR0j\n"
                + "BBgwFoAUVBeIygPBOSa4VabEmfQrAqu+AOkwIAYDVR0RBBkwF4EVdmlqYXlhbG5A\n"
                + "bWF0aC5sYmwuZ292MA0GCSqGSIb3DQEBBQUAA4IBAQC/dxf5ZuSrNrxslHUZfDle\n"
                + "V8SPnX5roBUOuO2EPpEGYHB25Ca+TEi0ra0RSRuZfGmY13/aS6CzjBF+6GED9MLo\n"
                + "6UdP1dg994wpGZ2Mj0dZoGE7we10NrSvFAS3u7uXrTTegeJoDpo1k9YVsOkK9Lu9\n"
                + "Sg+EztnMGa1BANWf779Qws5J9xUR2Nip0tBkV3IRORcBx0CoZzQnDIWyppmnkza2\n"
                + "mhgEv6CXYYB4ucCFst0P2Q3omcWrtHexoueMGOV6PtLFBst5ReOaZWU+q2D30t3b\n"
                + "GFITa0aayXTlb6gWgo3z/O/K5GZS5jF+BA3j1e8IhxqeibT1rVHF4W4ZMjGhBcwa\n"
                + "-----END CERTIFICATE-----",
            "-----BEGIN CERTIFICATE-----\n"
                + "MIIEqjCCBBOgAwIBAgIBLzANBgkqhkiG9w0BAQUFADBbMRkwFwYDVQQKExBET0Ug\n"
                + "U2NpZW5jZSBHcmlkMSAwHgYDVQQLExdDZXJ0aWZpY2F0ZSBBdXRob3JpdGllczEc\n"
                + "MBoGA1UEAxMTQ2VydGlmaWNhdGUgTWFuYWdlcjAeFw0wMTEyMjEyMzQ4MzdaFw0w\n"
                + "NDAxMTAyMzQ4MzdaMHUxEzARBgoJkiaJk/IsZAEZFgNuZXQxEjAQBgoJkiaJk/Is\n"
                + "ZAEZFgJlczEgMB4GA1UECxMXQ2VydGlmaWNhdGUgQXV0aG9yaXRpZXMxGTAXBgNV\n"
                + "BAsTEERPRSBTY2llbmNlIEdyaWQxDTALBgNVBAMTBHBraTEwggEiMA0GCSqGSIb3\n"
                + "DQEBAQUAA4IBDwAwggEKAoIBAQDhgzoAt5viFffXWG6P0KSf/dO0mrEbgpuKIHDa\n"
                + "RdHkxJGaoBgRO2D+YV4Wh+JcKlz64v2ScYHCgGbKoaE+cGM/O06xkLCV0pyT4Xvj\n"
                + "6/R80jqwzzRw8aYz9iE/wjljK1ehb+oJ6TJlnotCVBd7TlHODYfXXblt67/Uk1uu\n"
                + "4l17jCdfk4mUn/2Bdeae4EMibj7Vc1dkPkyY47ZADTeFXMNDyp4yGFeIDZQ6h+YH\n"
                + "27+t1/TDuEH1R4PpklRpSbppGprI8hv2P6uEKTySjAEkww9xVzenN6oULeafFJuS\n"
                + "t6Ui6BFxc1OuxMq/s0PDiFh8bPMhzJWBfzaNPHnYrFDWcDwHAgMBAAGjggHeMIIB\n"
                + "2jAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFFQXiMoDwTkmuFWmxJn0KwKrvgDp\n"
                + "MB8GA1UdIwQYMBaAFJvOT/K8vVhwMdXyMg5+nr3iURTnMA8GA1UdEwEB/wQFMAMB\n"
                + "Af8wgY8GA1UdHwSBhzCBhDCBgaAaoBiGFmh0dHA6Ly9lbnZpc2FnZS5lcy5uZXSB\n"
                + "AgDsol+kXTBbMRkwFwYDVQQKExBET0UgU2NpZW5jZSBHcmlkMSAwHgYDVQQLExdD\n"
                + "ZXJ0aWZpY2F0ZSBBdXRob3JpdGllczEcMBoGA1UEAxMTQ2VydGlmaWNhdGUgTWFu\n"
                + "YWdlcjCB5AYDVR0gBIHcMIHZMIHWBgoqhkiG90wDBgQBMIHHMF8GCCsGAQUFBwIC\n"
                + "MFMwJhYfRVNuZXQgKEVuZXJneSBTY2llbmNlcyBOZXR3b3JrKTADAgEBGilFU25l\n"
                + "dC1ET0UgU2NpZW5jZSBHcmlkIENlcnRpZmljYXRlIFBvbGljeTBkBggrBgEFBQcC\n"
                + "ARZYaHR0cDovL2VudmlzYWdlLmVzLm5ldC9FbnZpc2FnZSUyMERvY3MvRE9FU0cl\n"
                + "MjBDQSUyMENlcnRpZmljYXRlJTIwUG9saWN5JTIwYW5kJTIwQ1BTLnBkZjANBgkq\n"
                + "hkiG9w0BAQUFAAOBgQCaAdUregqwmCJG6j/h6uK2bTpcfa/SfpaYwsTy+zlf5r4P\n"
                + "iY/wIRN0ZjJ4RrJQ/WUH16onNwb87JnYe0V4JYhATAOnp/5y9kl+iC4XvHBioVxm\n"
                + "3sEADL40WAVREWBGZnyFqysXAEGfk+Wg7um5FzCwi6380GASKY0VujQG03f6Pg==\n"
                + "-----END CERTIFICATE-----"
            };

    // Globus CA signing policy. Using globusca.pem and usercert.pem
    public static String signingPolicy = "access_id_CA      X509         '/C=TestCA1/CN=CA'\npos_rights        globus        CA:sign\ncond_subjects     globus       '\"/*\"'";

    // Globus CA signing policy that causes usercert.pem to violate
    // the policy
    public static String signingPolicyViolation = "access_id_CA      X509         '/C=TestCA1/CN=CA'\npos_rights        globus        CA:sign\ncond_subjects     globus       '\"/12*\"'";

    // Globus CA signing policy without relevant signing policy
    public static String signingPolicySansPolicy = "# Globus CA rights\naccess_id_CA      nonX509         '/C=US/O=Globus/CN=Globus Certification Authority'\npos_rights        globus        CA:sign\ncond_subjects     globus       '\"/C=usa/O=Globus/*\"  \"/C=USA/O=Globus/*\"'\n# End of ca-signing-policy.conf";

    public static X509Certificate[] goodCertsArr;

    static {
        try {
            goodCertsArr = initCerts();
        } catch (Exception e) {
            throw new RuntimeException("Failed to load certs: " + e.getMessage());
        }
    }

    public ProxyPathValidatorTest(String name) {
        super(name);
    }

    public static X509Certificate[] initCerts() throws Exception {
        CoGProperties.getDefault().setProperty(CoGProperties.getDefault().CRL_CACHE_LIFETIME, "1");

        X509Certificate[] goodCertsArr = new X509Certificate[certs.length];
        ClassLoader loader = ProxyPathValidatorTest.class.getClassLoader();
        for (int i = 0; i < certs.length; i++) {
            String name = BASE + certs[i][1];
            InputStream in = loader.getResourceAsStream(name);
            if (in == null) {
                throw new Exception("Unable to load: " + name);
            }
            log.debug("goodCertsArr[" + i + "]" + name);
            goodCertsArr[i] = CertificateLoadUtil.loadCertificate(in);
        }
        return goodCertsArr;
    }

    public void testValidateGsi2PathGood() throws Exception {

        X509Certificate[] chain = null;
        X509Certificate[] trustedCerts = new X509Certificate[] { goodCertsArr[0] };

        // EEC, CA
        chain = new X509Certificate[] { goodCertsArr[1], goodCertsArr[0] };
        validateChain(chain, trustedCerts, goodCertsArr[1], false);

        // proxy, EEC, CA
        chain = new X509Certificate[] { goodCertsArr[2], goodCertsArr[1], goodCertsArr[0] };
        validateChain(chain, trustedCerts, goodCertsArr[1], false);

        // limited proxy, EEC, CA
        chain = new X509Certificate[] { goodCertsArr[3], goodCertsArr[1], goodCertsArr[0] };
        validateChain(chain, trustedCerts, goodCertsArr[1], true);

        // double limited proxy, limited proxy, EEC, CA
        chain = new X509Certificate[] { goodCertsArr[4], goodCertsArr[3], goodCertsArr[1], goodCertsArr[0] };

        validateChain(chain, trustedCerts, goodCertsArr[1], true);
    }

    public void testValidateGsi3PathGood() throws Exception {

        X509Certificate[] chain = null;
        X509Certificate[] trustedCerts = new X509Certificate[] { goodCertsArr[0] };

        // GSI 3 PC impersonation, EEC, CA
        chain = new X509Certificate[] { goodCertsArr[5], goodCertsArr[1], goodCertsArr[0] };
        validateChain(chain, trustedCerts, goodCertsArr[1], false);

        // GSI 3 PC independent, EEC, CA
        chain = new X509Certificate[] { goodCertsArr[6], goodCertsArr[1], goodCertsArr[0] };
        validateChain(chain, trustedCerts, goodCertsArr[6], false);

        // GSI 3 PC imperson limited, EEC, CA
        chain = new X509Certificate[] { goodCertsArr[7], goodCertsArr[1], goodCertsArr[0] };
        validateChain(chain, trustedCerts, goodCertsArr[1], true);

        // GSI 3 PC impersonation, GSI 3 PC limited impersonation, EEC, CA
        chain = new X509Certificate[] { goodCertsArr[30], goodCertsArr[7], goodCertsArr[1], goodCertsArr[0] };
        validateChain(chain, trustedCerts, goodCertsArr[1], true);

        // GSI 3 PC impersonation, GSI 3 PC impersonation, EEC, CA
        chain = new X509Certificate[] { goodCertsArr[9], goodCertsArr[5], goodCertsArr[1], goodCertsArr[0] };
        validateChain(chain, trustedCerts, goodCertsArr[1], false);

        // GSI 3 PC indepedent, GSI 3 PC independent, EEC, CA
        chain = new X509Certificate[] { goodCertsArr[10], goodCertsArr[6], goodCertsArr[1], goodCertsArr[0] };
        validateChain(chain, trustedCerts, goodCertsArr[10], false);

        // GSI 3 PC impersonation, GSI 3 PC independent, EEC, CA
        chain = new X509Certificate[] { goodCertsArr[31], goodCertsArr[6], goodCertsArr[1], goodCertsArr[0] };
        validateChain(chain, trustedCerts, goodCertsArr[6], false);

        // GSI 3 PC indepedent, GSI 3 PC limited impersonation, EEC, CA
        chain = new X509Certificate[] { goodCertsArr[29], goodCertsArr[7], goodCertsArr[1], goodCertsArr[0] };
        validateChain(chain, trustedCerts, goodCertsArr[29], false);
    }

    public void testValidatePathWithRestrictedProxy() throws Exception {

        X509Certificate[] chain = null;
        X509Certificate[] trustedCerts = new X509Certificate[] { goodCertsArr[0] };

        // GSI 3 PC restricted, EEC, CA
        chain = new X509Certificate[] { goodCertsArr[8], goodCertsArr[1], goodCertsArr[0] };
        validateError(chain, trustedCerts, ProxyPathValidatorException.UNKNOWN_POLICY);

        // // GSI 3 PC impersonation, GSI 3 PC restricted, EEC, CA
        chain = new X509Certificate[] { goodCertsArr[9], goodCertsArr[8], goodCertsArr[1], goodCertsArr[0] };
        validateError(chain, trustedCerts, ProxyPathValidatorException.UNKNOWN_POLICY);

        TestProxyPathValidator v = new TestProxyPathValidator();
        v.setProxyPolicyHandler("1.3.6.1.4.1.3536.1.1.1.8", new ProxyPolicyHandler() {
            public void validate(ProxyCertInfo info, CertPath path, int index) throws CertPathValidatorException {
                ProxyPolicy policy = info.getProxyPolicy();
                String pol = policy.getPolicyAsString();
                assertEquals("<AllPermissions...>\r\n".trim(), pol.trim());
                // COMMENT fails without trimming
            }
        });
        chain = new X509Certificate[] { goodCertsArr[8], goodCertsArr[1], goodCertsArr[0] };
        v.validate(chain, trustedCerts);
    }

    public void testValidatePathBad() throws Exception {
        X509Certificate[] chain = null;
        X509Certificate[] trustedCerts = new X509Certificate[] { goodCertsArr[0] };

        // proxy, CA
        chain = new X509Certificate[] { goodCertsArr[5], goodCertsArr[0] };
        validateChain(chain, trustedCerts);

        // user, proxy, CA
        chain = new X509Certificate[] { goodCertsArr[1], goodCertsArr[2], goodCertsArr[0] };
        validateChain(chain, trustedCerts);

        // user, user, CA
        chain = new X509Certificate[] { goodCertsArr[1], goodCertsArr[1], goodCertsArr[0] };
        validateChain(chain, trustedCerts);

        // user, CA, user
        chain = new X509Certificate[] { goodCertsArr[1], goodCertsArr[0], goodCertsArr[1] };
        validateChain(chain, trustedCerts);
    }

    public void testValidatePathMixedProxy() throws Exception {
        X509Certificate[] chain = null;
        X509Certificate[] trustedCerts = new X509Certificate[] { goodCertsArr[0] };

        // GSI 3 PC, GSI 2 PC, EEC, CA
        chain = new X509Certificate[] { goodCertsArr[6], goodCertsArr[2], goodCertsArr[1], goodCertsArr[0] };
        validateChain(chain, trustedCerts);

        // GSI 2 PC, GSI 3 PC, EEC, CA
        chain = new X509Certificate[] { goodCertsArr[2], goodCertsArr[6], goodCertsArr[1], goodCertsArr[0] };
        validateChain(chain, trustedCerts);
    }

    public void testValidatePathProxyPathConstraint() throws Exception {
        X509Certificate[] chain = null;
        X509Certificate[] trustedCerts = new X509Certificate[] { goodCertsArr[0] };

        // GSI 3 PC pathlen=0, GSI 3 PC, EEC, CA
        chain = new X509Certificate[] { goodCertsArr[11], goodCertsArr[1], goodCertsArr[0] };
        validateChain(chain, trustedCerts, goodCertsArr[1], false);

        // GSI 3 PC, GSI 3 PC pathlen=0, EEC, CA
        chain = new X509Certificate[] { goodCertsArr[32], goodCertsArr[11], goodCertsArr[1], goodCertsArr[0] };
        validateChain(chain, trustedCerts);

        // GSI 3 PC, GSI 3 PC pathlen=1, EEC, CA
        chain = new X509Certificate[] { goodCertsArr[33], goodCertsArr[12], goodCertsArr[1], goodCertsArr[0] };
        validateChain(chain, trustedCerts, goodCertsArr[12], false);

        // GSI 3 PC, GSI 3 PC, GSI 3 PC pathlen=1, EEC, CA
        chain = new X509Certificate[] { goodCertsArr[34], goodCertsArr[33], goodCertsArr[12], goodCertsArr[1],
                goodCertsArr[0] };
        validateError(chain, trustedCerts, ProxyPathValidatorException.PATH_LENGTH_EXCEEDED);
    }

    public void testValidatePathCAPathConstraint() throws Exception {
        X509Certificate[] chain = null;
        X509Certificate[] trustedCerts = new X509Certificate[] { goodCertsArr[16] };

        // should all be OK

        // EEC, CA (pathlen=0)
        chain = new X509Certificate[] { goodCertsArr[15], goodCertsArr[16] };
        validateChain(chain, trustedCerts, goodCertsArr[15], false);

        // GSI 2 limited PC, EEC, CA (pathlen=0)
        chain = new X509Certificate[] { goodCertsArr[3], goodCertsArr[15], goodCertsArr[16] };
        //validateChain(chain, trustedCerts, goodCertsArr[15], true);
        validateError(chain, trustedCerts, ProxyPathValidatorException.PATH_LENGTH_EXCEEDED);

        // GSI 3 PC, EEC, CA (pathlen=0)
        chain = new X509Certificate[] { goodCertsArr[17], goodCertsArr[15], goodCertsArr[16] };
        validateChain(chain, trustedCerts, goodCertsArr[15], false);

        // GSI 3 PC, EEC, CA (pathlen=0), CA (pathlen=2), CA (pathlen=2)
        chain = new X509Certificate[] { goodCertsArr[17], goodCertsArr[15], goodCertsArr[16], goodCertsArr[13],
                goodCertsArr[13] };
        validateChain(chain, trustedCerts, goodCertsArr[15], false);

        // these should fail

        // EEC, CA (pathlen=0), CA (pathlen=0)
        chain = new X509Certificate[] { goodCertsArr[15], goodCertsArr[16], goodCertsArr[16] };
        validateError(chain, trustedCerts, ProxyPathValidatorException.PATH_LENGTH_EXCEEDED);

        // GSI 2 limited PC, EEC, CA (pathlen=0), CA (pathlen=2), CA (pathlen=2), CA (pathlen=2)
        chain = new X509Certificate[] { goodCertsArr[3], goodCertsArr[15], goodCertsArr[16], goodCertsArr[13],
               goodCertsArr[13], goodCertsArr[13] };
        validateError(chain, trustedCerts, ProxyPathValidatorException.PATH_LENGTH_EXCEEDED);

        // GSI 3 PC, GSI 3 PC pathlen=1, EEC, CA
        chain = new X509Certificate[] { goodCertsArr[10/*10*/], goodCertsArr[12], goodCertsArr[1], goodCertsArr[13] };
        //validateChain(chain, trustedCerts, goodCertsArr[10/*10*/], false);
        validateError(chain, trustedCerts, ProxyPathValidatorException.PATH_LENGTH_EXCEEDED);

        // GSI 3 PC, GSI 3 PC, GSI 3 PC pathlen=1, EEC, CA
        chain = new X509Certificate[] { goodCertsArr[10], goodCertsArr[10], goodCertsArr[12], goodCertsArr[1],
                goodCertsArr[13] };
        validateError(chain, trustedCerts, ProxyPathValidatorException.PATH_LENGTH_EXCEEDED);

        // GSI 3 PC, GSI 3 PC pathlen=0, EEC, CA
        chain = new X509Certificate[] { goodCertsArr[10], goodCertsArr[11], goodCertsArr[1], goodCertsArr[13] };
        validateError(chain, trustedCerts, ProxyPathValidatorException.FAILURE);
    }

    public void testKeyUsage() throws Exception {
        X509Certificate[] certsArr = new X509Certificate[testCerts.length];

        for (int i = 0; i < certsArr.length; i++) {
            certsArr[i] = CertificateLoadUtil.loadCertificate(
                new ByteArrayInputStream(testCerts[i].getBytes()));
        }
        X509Certificate[] trustedCAs = new X509Certificate[]{certsArr[2]};
        X509Certificate[] chain = null;

        // certArr[1] - has key usage but certSign is off - but it signs proxy
        // certArr[2] - has key usage and certSign is on
        chain = new X509Certificate[] { certsArr[0], certsArr[1], certsArr[2] };
        validateChain(chain, trustedCAs, certsArr[1], false);

        TestProxyPathValidator v = new TestProxyPathValidator();
        v.validate(chain, new TrustedCertificates(trustedCAs));
        assertEquals(false, v.isLimited());
        assertEquals(certsArr[1], v.getIdentityCertificate());

    }

    public void testNoBasicConstraintsExtension() throws Exception {
        X509Certificate[] chain = null;
        X509Certificate[] trustedCAs = new X509Certificate[] { goodCertsArr[16] };
        X509Certificate[] trustedCerts = new X509Certificate[] { goodCertsArr[16] };
        // EEC, EEC, CA - that should fail
        //chain = new X509Certificate[] { goodCertsArr[1], goodCertsArr[1], goodCertsArr[0] };
        chain = new X509Certificate[] { goodCertsArr[15], goodCertsArr[15], goodCertsArr[16] };
        //validateChain(chain, trustedCerts, goodCertsArr[15], false);

        validateChain(chain, trustedCAs);

        TestProxyPathValidator v = new TestProxyPathValidator();
        TrustedCertificates trustedCert = new TrustedCertificates(new X509Certificate[] { goodCertsArr[16] },
            new SigningPolicy[] { new SigningPolicy(new X500Principal("CN=foo"), new String[] { "CN=foo" }) });

        //X509Certificate[] trustedCerts = new X509Certificate[] { goodCertsArr[1] };
        chain = new X509Certificate[] { goodCertsArr[16], goodCertsArr[16], goodCertsArr[0] };
        // this makes the PathValidator think the chain is:
        // CA, CA, CA - which is ok. irrelevant to signing policy.
        try {

            v.validate(chain, trustedCert);

        } catch (ProxyPathValidatorException e) {
            e.printStackTrace();
            fail("Unexpected exception: " + e.getMessage());
        }
    }

    //JGLOBUS-103
    public void testCrlsChecks() throws Exception {

        TestProxyPathValidator tvalidator = new TestProxyPathValidator();

        // chain of good certs
        X509Certificate[] chain = new X509Certificate[]{goodCertsArr[22], goodCertsArr[21]};
        X509Certificate[] tCerts = new X509Certificate[]{goodCertsArr[1],
            goodCertsArr[16], goodCertsArr[25], goodCertsArr[21]};
        ClassLoader loader = ProxyPathValidatorTest.class.getClassLoader();
        String location1 = loader.getResource(BASE).getPath();
        CertificateRevocationLists certRevLists = CertificateRevocationLists.getCertificateRevocationLists(location1);
        assertNotNull(certRevLists);
        assertEquals(2,certRevLists.getCrls().length);

        TrustedCertificates trustedCerts = new TrustedCertificates(tCerts);
        X509CRL[] crls = certRevLists.getCrls();
        assertNotNull(crls);
        assertEquals(2, crls.length);
        try {
            tvalidator.validate(chain, trustedCerts.getCertificates(), certRevLists, trustedCerts.getSigningPolicies());
        } catch (ProxyPathValidatorException e) {
            e.printStackTrace();
            fail("Unexpected exception: " + e.getMessage());
        }

        tvalidator.reset();

        // remove signing policy checks and validity checks

        // ca1 ca1user1 good chain
        chain = new X509Certificate[] { goodCertsArr[22], goodCertsArr[21] };
        certRevLists = CertificateRevocationLists.getCertificateRevocationLists(location1);
        assertNotNull(certRevLists.getCrls());
        assertEquals(2,certRevLists.getCrls().length);

        try {
            tvalidator.validate(chain, new X509Certificate[] { goodCertsArr[21] }, certRevLists, trustedCerts
                .getSigningPolicies());
        } catch (ProxyPathValidatorException e) {
            e.printStackTrace();
            fail("Unexpected exception: " + e.getMessage());
        }

        tvalidator.reset();

        // ca1 ca1user2 good chain
        chain = new X509Certificate[] { goodCertsArr[23], goodCertsArr[21] };
        try {
            tvalidator.validate(chain, new X509Certificate[] { goodCertsArr[21] }, certRevLists, trustedCerts
                .getSigningPolicies());
        } catch (ProxyPathValidatorException e) {
            e.printStackTrace();
            fail("Unexpected exception: " + e.getMessage());
        }

        tvalidator.reset();

        // ca2 user1 bad chain
        chain = new X509Certificate[] { goodCertsArr[26], goodCertsArr[25] };
        try {
            tvalidator.validate(chain, new X509Certificate[] { goodCertsArr[25] }, certRevLists, trustedCerts
                .getSigningPolicies());
            fail("Validation did not throw exception");
        } catch (ProxyPathValidatorException crlExp) {
            // COMMENT no check on exception error code
            //assertEquals(ProxyPathValidatorException.REVOKED, crlExp.getErrorCode());
        }

        tvalidator.reset();

        // ca2 user2 bad chain
        chain = new X509Certificate[] { goodCertsArr[27], goodCertsArr[25] };
        try {
            tvalidator.validate(chain, new X509Certificate[] { goodCertsArr[25] }, certRevLists, trustedCerts
                .getSigningPolicies());
            fail("Validation did not throw exception");
        } catch (ProxyPathValidatorException crlExp) {
            // COMMENT no check on exceptino error code
            //assertEquals(ProxyPathValidatorException.REVOKED, crlExp.getErrorCode());
        }

        tvalidator.reset();

        // ca2 user3 good chain
        chain = new X509Certificate[] { goodCertsArr[28], goodCertsArr[25] };
        try {
            tvalidator.validate(chain, new X509Certificate[] { goodCertsArr[25] }, certRevLists, trustedCerts.getSigningPolicies());
        } catch (ProxyPathValidatorException e) {
            e.printStackTrace();
            fail("Unexpected exception: " + e.getMessage());
        }
    }

    public void testSigningPolicy() throws Exception {

        X509Certificate[] chain = null;

        Map<X500Principal, SigningPolicy> map = new SigningPolicyParser().parse(new StringReader(signingPolicy));
        SigningPolicy policy = map.values().iterator().next();
        assertNotNull(policy);

        TestProxyPathValidator tvalidator = new TestProxyPathValidator(true);
        chain = new X509Certificate[] { goodCertsArr[1], goodCertsArr[0] };
        TrustedCertificates tc = new TrustedCertificates(new X509Certificate[] { goodCertsArr[0] },
            new SigningPolicy[] { policy });
        tvalidator.validate(chain, tc);

        map = new SigningPolicyParser().parse(new StringReader(signingPolicyViolation));
        policy = map.values().iterator().next();
        assertNotNull(policy);
        tc = new TrustedCertificates(new X509Certificate[] { goodCertsArr[0] }, new SigningPolicy[] { policy });

        try {
            tvalidator.validate(chain, tc);
            fail("Exception expected");
        } catch (ProxyPathValidatorException exp) {
            // COMMENT ignore error code
            //assertEquals(ProxyPathValidatorException.SIGNING_POLICY_VIOLATION, exp.getErrorCode());
        }

        try {
            map = new SigningPolicyParser().parse(new StringReader(signingPolicySansPolicy));
            fail("Exception expected");
        } catch (IllegalArgumentException exp) {
        }
    }

    private void validateChain(X509Certificate[] chain, X509Certificate[] trustedCerts) throws Exception {
        validateError(chain, trustedCerts, ProxyPathValidatorException.FAILURE);
    }

    private void validateChain(X509Certificate[] chain, X509Certificate[] trustedCerts,
        X509Certificate expectedIdentity, boolean expectedLimited) throws Exception {
        TestProxyPathValidator v = new TestProxyPathValidator();
        v.validate(chain, new TrustedCertificates(trustedCerts));
        assertEquals(expectedLimited, v.isLimited());
        assertEquals(expectedIdentity, v.getIdentityCertificate());
    }

    private void validateError(X509Certificate[] chain, X509Certificate[] trustedCerts, int expectedErrorCode) throws Exception {
        TestProxyPathValidator v = new TestProxyPathValidator();
        try {
            v.validate(chain);
            fail("Did not throw exception as expected");
        } catch (ProxyPathValidatorException e) {
            // COMMENT ignore error codes, because new code works with strings
            //assertEquals(expectedErrorCode, e.getErrorCode());
        }
    }

    // for testing only to disable validity checking
    class TestProxyPathValidator extends ProxyPathValidator {

        boolean policyChk = false;
        MockProxyCertPathValidator validator;

        TestProxyPathValidator() {
            super();
            policyChk = false;
            validator = new MockProxyCertPathValidator(false, false, false);
        }

        TestProxyPathValidator(boolean checkSigningPolicy) {
            policyChk = checkSigningPolicy;
            validator = new MockProxyCertPathValidator(false, false, true);
        }

        public void validate(X509Certificate[] certPath) throws ProxyPathValidatorException {
            super.setValidator(validator);
            super.validate(certPath);
        }

        public void validate(X509Certificate[] certPath, TrustedCertificates trustedCerts)
            throws ProxyPathValidatorException {
            super.setValidator(validator);
            super.validate(certPath, trustedCerts);
        }

        public void validate(X509Certificate[] certPath, TrustedCertificates trustedCerts,
            CertificateRevocationLists crlsList, Boolean enforceSigningPolicy) throws ProxyPathValidatorException {
            super.setValidator(validator);
            super.validate(certPath, trustedCerts, crlsList, enforceSigningPolicy);
        }
    }

    // for testing only to disable validity checking

    public class MockProxyCertPathValidator extends X509ProxyCertPathValidator {

        boolean checkCertificateDateValidity;
        boolean checkCRLDateValidity;
        boolean checkSigningPolicy;
        private CertificateChecker dateChecker = new DateValidityChecker();

        public MockProxyCertPathValidator(boolean checkCertificateDateValidity_,
                                          boolean checkCRLDateValidity_,
                                          boolean checkSigningPolicy_) {

            this.checkCertificateDateValidity = checkCertificateDateValidity_;
            this.checkCRLDateValidity = checkCRLDateValidity_;
            this.checkSigningPolicy = checkSigningPolicy_;
        }

        @Override
        protected List<CertificateChecker> getCertificateCheckers() {
            List<CertificateChecker> checkers = new ArrayList<CertificateChecker>();
            if (checkCertificateDateValidity) {
                checkers.add(dateChecker);
            }
            checkers.add(new UnsupportedCriticalExtensionChecker());
            checkers.add(new IdentityChecker(this));
            checkers.add(new CRLChecker(this.certStore, this.keyStore, this.checkCertificateDateValidity));
            if (this.checkSigningPolicy) {
                checkers.add(new SigningPolicyChecker(this.policyStore));
            }
            return checkers;
        }
    }

}


It's weird to consider that we've been controlling Agent 47 as he takes on contracts and completes stealth hits for more than a decade now. The Hitman brand took its roots back in 200o on the PC. Hitman: Absolution will be the fifth game in the franchise, and the first we've seen of the series since way back in 2006. This is also the first Hitman title planned to see release on the PlayStation 3.
"Hunted by the police, completely unarmed, Agent 47 seeks refuge in an abandoned Chicago library…"
Hitman: Absolution is being published by Square Enix and developed by IO Interactive; the developers have helmed the entire series, while Square Enix is publishing instead of their acquired Eidos Interactive. The project features the Glacier 2 engine, a proprietary work from IO.
By the way, friends, you have just finished watching a minute-long teaser trailer for an upcoming, full-length gameplay trailer. Why? Because this is the gaming industry. Still, we figured Hitman fans, of which there are many, would appreciate catching as much word and coverage for the upcoming gameplay drop as possible before it hits.
The full trailer is set to release later in the day tomorrow, October 11th, and it will feature the unedited gameplay from this entire Chicago library sequence. Hitman: Absolution is currently planned for the Xbox 360, PlayStation 3 and PC platforms and is set for a release during 2012. We'll have more on the game as it arrives.
Until then, we have to ask you folks this: Are you excited for the return of Agent 47 and the Hitman franchise? Or, has it been way too long for you to care anymore?


Looking for the cruise of a lifetime? With Norwegian Cruise Line's incredible Premium All Inclusive, this is exactly what you'll get!
Experience a brand new sense of freedom at sea with Norwegian Cruise Line's Premium All Inclusive. Holiday budgeting has never been easier because there is so much more included in your cruise fare , like soft and branded alcoholic drinks in all bars, lounges and restaurants, service charges, speciality coffees in restaurants and mineral water in your stateroom.


• Patrolled Highly Monitored Site - 24 Hour Access.
The possibilities are endless. Whenever you just need a short-term space to store your goods while moving , or you need a long-term space to protect your overflow possessions, we can help.
When you rent storage units from us, you're investing in the business we've built up from the ground. We take pride in being one of the few Prince Albert storage facilities to remain family owned through several generations. You'll see this dedication to our storage company and our customers as soon as you step foot on our property. Our friendly employees will make you feel right at home and answer any questions you might have.
To run a storage company successfully, you have to know the needs of your customers. How can you do that if you live halfway across the country? Luckily, we don't have to worry about that. Because we're locally owned and operated, we're always here to help if any problems or issues arise. Our years of experience managing our storage facility have taught us trying to manage things from afar is a bad idea. Instead, we prefer to provide hands-on customer service to make your storage process as easy as possible.
There's no reason you have to stick to traditional business hours to access your stuff. Our storage lockers are accessible 24 hours a day, thanks to our convenient kiosk payment and rental stations. Simply input your information, and you'll be granted access to the locker of your choice. With Secure Choice Storage, Inc. you'll have complete freedom and autonomy when storing your items.
We know how protective you are of your possessions. That's why we've taken every security precaution possible to make sure your items are safe and sound. Our storage units are 100 percent secured. The entire complex is surrounded by a fence and lit with bright lighting to prevent trespassers from sneaking into the facility. We also employ patrols to walk the grounds and monitor video camera footage. In fact, we even offer the ability for you to personally monitor your goods with a live camera feed.
• Rent the smallest amount of space you need and pack the space until full.
• A box for everything and everything in a box, is the best protection of your goods. Use uniform sizes of boxes and stack them shoulder high to maximize your total storage space.
• Prepare your unit by placing plastic on the floor under your goods. Be sure the plastic laps up over the walls a few inches on every side. Wooden pallets also provide for more secure storage to raise storage items.
• Leave a small air space between the goods stored and the storage unit walls.
• Store lightweight small items around the back of the storage unit. Move large, heavy items into storage last.
• Do not place heavy or sharp objects on top of upholstered furniture.
• Protect your mattresses, sofas, and chairs with plastic covers.
• Cover the entire load with a light plastic cover.
• Use a good quality lock on your storage unit door. We recommend Disklocks for security available at our office.
• Insure your goods while in storage. Ask the manager about self storage insurance at reasonable rates.
• Keep a list of all items in storage as well as pictures, and descriptions.
Begin packing a couple of days before you move. Careful packing pays by preventing breakage and loss of small and fragile items. And moving time is a great time to weed out old, unwanted or unneeded possessions. They only take up storage space. Another thing, you'll want plenty of sturdy corrugated cartons, packing paper, sealing tape, and a magic marker-type pen. Then if you follow these simple packing tips, they will save you trouble, help avoid damage to your goods and make maximum use of the space in your storage unit.
• Appliances: Tape all appliance doors shut when moving. Wedge doors open in storage. Secure all moveable parts with paper or wedge. Wrap a paper pad around each item for protection. Freezer, refrigerator, washer and dryer make excellent packing cartons for bedding, towels and clothing. Always clean your stove before moving and give utility companies a few days' notice to disconnect appliances.
• Beds: Lash bed rails together with rope or plastic tape. As you take beds apart, mark all pieces so you know which goes with which headboard, etc. Place covers on mattresses to keep them clean during moving and storage.
• Books: Books get heavy in bunches. Pack them in small cartons, holding weight to under 30 pounds for easy lifting. Line all book cartons with plastic and fill empty spaces with packing paper. (Garbage bags work well as a liner).
• Bureaus: Make your bureau drawers earn their passage as extra packing boxes. Fill them with a few small and fragile items. Sweaters, blankets, and towels make excellent padding.
• Cartons: Go easy on your back. Hold weight of all packing cartons under 30 pounds. With a marking pen, list contents of each carton on the side. For load sizing, multiply length x width x height of each carton if that information is not already on the carton.
• Chairs: Protect all chair legs by wrapping them in packing paper. Leave slipcovers on upholstered chairs and cover them with plastic chair covers.
• Clothing: Clothing that ordinarily hangs in a closet should be packed in a wardrobe carton.
• Dishes: Take your time when packing dishes. Wrap each one with packing tissue and cushion them in the carton with crumpled packing paper. Keep dish pack cartons under 30 pounds for easy handling and safe riding.
• Glasses: Pack glasses carefully. Wrap with tissue and pad with crumpled packing paper just like dishes.
• Lamps: Pack lamp shades in individual boxes with plenty of paper for padding. Lamp bases ride securely in bureau drawers, freezers and washing machines. For safety, pad them well with towels and blankets.
• WARNING: Do Not Store Combustibles or Perishables! such as old paint, cleaning fluids, gasoline, etc. Make certain all fuel is drained or burned out of gasoline powered equipment. Throw away anything that could possibly cause fire. Do not store food in open containers or any item which could attract rodents or pests. Why risk your possessions just to keep a few cents' worth of leftovers?
Reservations for storage space and RV parking can be made online if you cannot make it down to our main office located at Southside Storage. Visit	the	link	below to fill out a reservation or appointment request.
If you are interested in booking an appointment or making a reservation, click here, and fill out the form.


Minecraft for Mac is a game about placing blocks to build anything you can imagine. At night monsters come out, make sure to build a shelter before that happens. It also has music by C418! Minecraft is a creative sandbox game, in which you can create huge structures and caves to play in. It's a deceptively simple game of building and survival.Once you know how, mining and building is pretty quick, and you can create some really cool structures.
Qweas is providing links to Minecraft for Mac 1.3.1 as a courtesy, and makes no representations regarding Minecraft for Mac or any other applications or any information related thereto.
Any questions, complaints or claims regarding this application Minecraft for Mac 1.3.1 must be directed to the appropriate software vendor.
You may click the publisher link of Minecraft for Mac on the top of this page to get more details about the vendor.


cuddle Archives - All Chucked Up!
Max, our little teacup Pomeranian, always loves waking me up for a little "cuddle time" in the morning.
He won't stop bugging me until I've really opened my eyes and looked at him. He loves playing with my hair and ears.
When he's sure that he's gotten my attention, he starts to cuddle up beside me with his head resting on my tummy. Then he waits for the mandatory rub on his head which he seems to really want.
Cute, right? That pretty much how we spend our mornings. Max is suuuuuper sweet. No matter how sleepy I am, he never fails to make me smile.


text:
Q: How do I update my dictionary depending on whether or not the key already exists? I would like to update my dictionary. If the key already exists in a dictionary then I would like to add new values to that key (from another dictionary). If the key does not exist in the dictionary, then I would like to add a new key (from another dictionary).
In other words, I just want updated keys with new added (not overridden) values (if the keys exist in both dictionaries) and new keys (if the key exists in the new dictionary)
This is an example of the dictionaries I currently have:
     global_dict = {'abc': 123, 'def': 456}
     new_dict={'def':789, 'ghi': hello}

What I want is for the global dict to finally look like this:
     global_dict={'abc':123, 'def'=[456, 789], 'ghi'=hello}

This is the code I currently have:
    for key,val in new_dict.items():
       if key in global_dict:
          global_dict[key]=[global_dict[key],val]
       else:
          global_dict.update(new_dictionary)

This currently does not work, I'm not sure what is wrong with my solution. Any tips?

A: You update global_dict with the entire new_dict when key isn't already in global_dict, so you end up overwriting the sub-list you created for keys that do match. You should update just the value for the key that isn't already in global_dict.
Change:
global_dict.update(new_dictionary)

to:
global_dict[key] = val

redpajama_set_name: RedPajamaStackExchange


Magnetite has developed a reputation as a leader in both acoustic and thermal window insulation throughout our years of soundproofing experience. With extensive knowledge in glazing requirements, we have been customising solutions since 1998 for reducing noise and energy use in your home and office.
Our commitment to excellence includes Green Star Association to enhance communication and help deliver the best solutions for your glazing improvement projects. Our team of trained and licensed installers ensures high quality and efficient installations.
We have helped more than 10,000 Australia homeowners improve comfort in their home through window and door insulation. Magnetite has also been involved with soundproofing and thermal insulation in commercial projects for hospital, hotels, schools, office building, restaurant, heritage listed properties and government building.
We have case studies highlighting solutions implemented using Magnetite's range of products to address noise, heat, or cold. Learn how Magnetite's solutions have improved comfort and energy efficiency for homes and offices.
Our large number of satisfied customers speaks wonders about our ability to provide the best acoustic and thermal insulation. Read what our customers say about us.
Magnetite insulation solutions have been specified and used in many renowned commercial projects across Australia. Our clients have demonstrated confidence in our company and solutions. Check out some of our esteemed clients.


text:
Washington Square News
Diversity at NYU
Beyond NYU
Identity & Equity
Off-Third
Writer's Column
NYU Tisch film student caught writing racial slurs in class
Top lawyer named next chair of NYU board of trustees
AI makes MRIs 4 times faster, NYU and Meta researchers find
What to do this week: Free ice skating, NYU Club Fest, student film festival
Demonstrators march across Manhattan to protest Tyre Nichols killing
As Roe v. Wade turns 50, protesters march against the loss of abortion rights
Advocates seek mayor's support to save Morton Williams supermarket
Instruction resumes at New School after union strikes deal
Unlicensed weed stores pose as legitimate dispensaries, enticing NYU buyers
After one month of checking visitor vax cards, NYU gives up
Immunocompromised students concerned following mask mandate removal
End of NYU mask mandate planned for Sept. 28
Outside guests now allowed in dorms and other NYU buildings
Updated COVID booster soon available at NYU, but not yet required
Students demand more from Hamilton on Iran demonstrations
Asian/Pacific/American Studies major lacks adequate representation, students and faculty say
NYU disputes failing grade on antisemitism report
Stern professor resigns from professional org. after refusing to write diversity statement
Women with disabilities more likely to report food insecurity, NYU study finds
Village advocates side with city, challenge NYU rezoning lawsuit
Beyond NYU: Addressing historical injustices in dermatology
Beyond NYU: Empowering creators to safely share their work
Beyond NYU: Decoding inner-city stereotypes
Beyond NYU: Quitting vaping with judgment-free Jones
Beyond NYU: Betting on building healthy habits
Enter the world of Mugler with 'Thierry Mugler: Couturissime'
NYU, what's in your tote?
Urbanspace puts your favorite dining hall to shame
Small-business renewal program rekindles Chinatown spirit
Cure your winter blues with these festive holiday spots
Louis Vuitton exhibit captures 200 years of legacy
Bella Hadid, Matilda Djerf, Devon Lee Carlson and basic fashion cults
Why is everyone dressing like a soccer fan?
Animal print abound in Flying Solo show at Paris Fashion Week
EENK brings the Wild West to Paris Fashion Week
Nehera prioritizes chic utilitarian comfort at Paris Fashion Week
Glam Slam serves style at New York Fashion Week
First-ever South Asian New York Fashion Week reclaims origins
Suzanne Rae F/W 2019
Fashion for Peace F/W 2019
NPC F/W 2019
Zang Toi F/W 2019
Peacebird F/W 2019
Private Policy Family Dinner: NYFW F/W 2020
Noon by Noor: F/W 2020
Just in XX F/W 2020
Vivenne Hu: F/W 2020
Flying Solo Couture: F/W 2020
Timo Weiland F/W 2020
Oxford Fashion Studio II S/S 2020
Oxford Fashion Studio III S/S 2020
Fashion Palette Australian Designers S/S 2020
Swiss Touch Presents: Mode Suisse S/S 2020
Why WSN Will Not Cover New York Fashion Week In-Person This Year
Flying Solo: NYFW Spring/Summer 2022
Chuks Collins goes through a style metamorphosis
Deity New York's Spring/Summer 2022 collection screams femme fatale
Global Fashion Collective II S/S 2022
Imperial Legacy brings I ❤ NY gift shop to NYFW
Foresight into fashion's future: emerging designers' visions for menswear
You can sit with us: CISE brings empowering pieces to the NYFW showroom
Dancers stole the show at the 2022 Uplive x Hekka NYFW runway show
Claudia Li brings another quirky, playful collection to Fashion Week
Diamond in the rough: THEO continues mining for brand identity
Do-nut say no to these doughnuts
Carbone alone: The subtle beauty of solo dining
The art of milk tea literacy
Rolf's NYC: Christmas sleigh or neigh?
Grab a muddler and mix up a Wise Man
Spoil yourself and impress your friends with a refreshing spritz
Remaking the protein bar: the ugly, processed truth of a beloved snack
Neither shaken nor stirred: A foolproof guide to mastering the gin and tonic
NYU students' go-to pumpkin recipes
New York City's only refugee shelter is out of space
What Mauna Loa's eruption means as a Native Hawaiian
He aha ka manaʻo nui o Pele ma Mauna Loa ma ke ʻano he Kanaka Maoli
How to be gay during the day: Building lesbian community in the city
Ranked: Our own Ranked articles
Ranked: Quintessential NYU experiences
Ranked: NYU students who will break your heart by senior year
Ranked: Bad movies
Ranked: NYU meme pages
Fitz of Fitz and the Tantrums on his musical philosophy and upcoming tour
Review: 'The Menu' feasts upon the wealthy, our finest fear
Review: 'Living' is a remarkably pointless rendition of an all-time classic
'Pollock & Pollock': American labor history through abstract expressionism
'Guillermo del Toro: Crafting Pinocchio,' a look at the stop-motion behind Netflix's new adaptation
Review: 'I'm Glad My Mom Died' offers a new take on memoirs
Review: Suad Amiry's 'Mother of Strangers' powerfully portrays Palestinian life
Reading Guide: Fall in love with Deborah Levy
Review: 'Klara and the Sun' examines humanity through the eyes of a machine
Q&A: Kazuo Ishiguro on Joni Mitchell, 'War and Peace' and the future of storytelling
Review: 'Memories of My Father': An unmemorable story about the forgotten
R&B-pop artist SOLA discusses debut EP 'Everything In Between'
Spotify Wrapped: The limitations of listening
Listen To This: 100 gecs teams up with Skrillex on 'Torture Me'
Review: Weyes Blood's new album proves she's an expert on life's shades of gray
The unexpected connection between Adam Himebauch, Adam Lucas and Hanksy
Q&A: Marjan Neshat on 'Sandra' and her Iranian identity
Q&A: Foodmasku on channeling emotions into food mask art
Review: Oscar yi Hou's 'East of sun, west of moon' celebrates artistic autonomy
Review: 'FUKT' reminds us that it's never too late to redefine ourselves
Review: 'Return to Monkey Island' is a nostalgic pirate adventure game
'Call of Duty' brings subtle yet impactful changes with new season
'Halo Infinite' multiplayer: the revival of a franchise
Review: 'Call of Duty: Vanguard' beta revives the first-person shooter
'Call of Duty: Vanguard' demands historical distortion
Black students leave NYU Berlin early after reports of racism overlooked
Passports and polyglots: Two NYU Abu Dhabi students on cheap, ethical travel
How to master studying abroad
WikiLeaks editors talk future of journalism, democracy at NYU Buenos Aires
Staff Rants: Our time abroad
Opinion: I lost 112 meal swipes last semester. They should roll over.
Off-Third: The best thing about going home is the airport
Off-Third: That new NYU building should really be named after Sarah Paulson instead
Opinion: A 3-step guide to complaining correctly
Opinion: Stop buying weed from Washington Square Park
Editorial: New York needs you to vote tomorrow
Editorial: NYU's adjunct union tentative contract shouldn't have taken this long
Editorial: The New York Times article on Maitland Jones was incomplete.
Editorial: NYU lifted its mask mandate, but now isn't the time to be idle
Editorial: Do no harm, Grossman. Reject Sabatini.
Opinion: New York housing programs shouldn't exclude immigrants
Opinion: New York, don't get rid of the MetroCard
Guest Essay: Mayor Adams' new policy for the unhoused is dangerous for New York
Opinion: Strike down pepper spray restrictions
Opinion: NYU should promote more conversation clubs
Opinion: Students can save Twitter
Opinion: It's high time we embrace pop music again
Opinion: Let's be real about BeReal
Opinion: You need to fill out your course evaluations
Opinion: Traditional final exams are impractical
Opinion: You should love 8 a.m. classes
Opinion: The University of Kentucky incident indicates a much bigger racism problem.
Off-Third: Is your Elf on the Shelf spying on you?
Off-Third: Sternies are better than us, actually
Off-Third: What to do when you're stuck in the US for Thanksgiving
Letter to the Editor: Silver School dean on the case for a tuition-free social work education
Letter to the Editor: Wasserman Center director on the Handshake job search platform
Letter to the Editor: CWS director on suicide response and mental health resources
Letter to the Editor: NYU remains committed to NYU Tel Aviv
Letter to the Editor: An open letter to President Hamilton
Opinion: NYU should extend dining hall hours
The cheap labor of academia
Inside NYU's troubled Campus Safety department
Judith Heumann on NYU commencement and disability activism
Skirting the Screener: How students fake NYU's COVID pass
Bobst Library's enduring history of suicide
What's going on with NYU men's basketball?
No pride in New York after Rangers failed Pride Night
Women's basketball wins ranked matchup against Tufts University
Men's basketball sets another program record in win over Hunter College
Cinque Stephens records career high in men's basketball's 8th straight win
The Art of Storytelling | Under the Arch Magazine
Money Matters | Under the Arch Magazine
Family Ties | Under the Arch Magazine
Welcome Home, Class of 2026
NYU, Population: You
What's inside NYU's $1.2 billion Paulson Center
Brooklyn Baby
Inside WSN: How we make an online publication
Rocket science isn't rocket science
Under the Arch
All content by WSN Editorial Board
Midterm elections are important, and New York residents have an opportunity to cast their ballots tomorrow. They shouldn't waste it.
Tomorrow is Election Day. If you're not a New York resident, you've probably already registered to vote in your home state and sent in your absentee ballot. But...
NYU and its adjunct union have finally reached a tentative agreement, but it took a threat to strike to get there.
The union representing NYU's adjunct faculty, ACT-UAW Local 7902, finally reached a tentative contract with the university early Tuesday morning after six months...
An article published in the New York Times on Monday discussed the firing of Maitland Jones Jr., a renowned chemistry professor. The article, however, gravely misrepresented NYU students.
On Monday, The New York Times published a news article about the firing of a renowned professor from NYU's organic chemistry program this summer. Maitland Jones...
COVID-19 still poses a substantial risk. Keeping up with masking and testing is critical for ensuring the safety of others.
Hiring biologist David Sabatini would display a gross disregard for sexual assault survivors on the part of NYU's Grossman School of Medicine.
Content warning: This article mentions sexual harrassment and abuse. A history of sexual harassment. Pushed out of three institutions following allegations of sexual misconduct....
Editorial: Don't throw more money at the failing NYPD
The NYPD's response to the Brooklyn subway shooting showed once again that they don't keep us safe. It's time to pursue other options.
Tuesday's tragic shooting in a Brooklyn subway car stoked anxiety and fear in many New Yorkers who rely on the subway system to travel across the city. After a gunman detonated...
Editorial: The NY Post is lying to you about homelessness around NYU
The right-wing media wants you to hate unhoused people. Don't let them egg you on.
Infamous right-wing media outlets baselessly demonized unhoused people following a March 28 egging incident on NYU's campus. The culprit was never identified, but these rags...
Editorial: Make daylight saving time permanent
The Sunshine Protection Act would bring a much-needed end to the biannual clock switching, placing us permanently on daylight saving time.
Two weeks ago, the U.S. Senate unanimously approved a bill to make daylight saving time permanent. Called the Sunshine Protection Act, the bill would put an end to the changing...
Editorial: 6 Asian students were attacked on campus. Why did NYU take weeks to respond?
NYU's response to attacks on Asian students on its campus has been extremely dismissive. The university must urgently address the safety concerns of Asian students.
In February, seven students were assaulted on NYU's campus. At least four of them were likely assaulted by the same man. Of the four students he attacked initially, three were...
Editorial: Eric Adams needs to house the homeless, not attack them
Mayor Adams wants to make our trains safer by removing unhoused individuals. His plan, unfortunately, relies heavily on policing and other forms of carceral violence.
Michelle Go was tragically pushed to her death at a subway station by an unhoused individual on Jan. 15. Her death incited much needed conversations about the rise in crime in...
Editorial: Hamilton, implement the SGA's transportation resolution
By instituting discounted subway fares for the NYU community, the university could do its part to support students in need and provide stimulus to local businesses.
Students travel from all over the world to attend NYU, but the university makes no attempt to alleviate the costs of travel within the city. Commuter students are only miles away...
Editorial: NYU, buy better masks in bulk
In light of the university's reopening, NYU needs to upgrade the masks that it hands out from surgical to KN95, KF94 and N95s.
The world is finally returning to what we've coined "the new normal," reflective of pre-omicron numbers and guidelines — still masked, but more free. In light of the rapidly...
Editorial: Chief Justice Roberts needs to retire
In light of Justice Stephen Breyer announcing his retirement, it's time for another member of the Supreme Court to follow suit. Chief Justice John Roberts should announce his retirement to allow his seat to be filled before the midterm elections.
This year, the Supreme Court will lose a liberal champion. Nominated by former President Bill Clinton in 1994, the retiring Justice Stephen Breyer has been a stalwart defender...
Editorial: NYU should mandate a remote learning option
NYU's "flexible" plan for in-person learning is flexible in name only. The university should require professors to offer options for remote learning.
Earlier this month, omicron positivity rates in New York City hit 500% of last winter's peak despite wider vaccine availability, higher vaccination rates and mask compliance....
Editorial: NYU should meet 100% demonstrated need for all current students
WSN previously reported that NYU would be meeting the demonstrated financial need of every student in the class of 2025. The new policy should be extended to all current NYU students, not just the students of the future.
NYU recently implemented a new financial aid policy for the class of 2025 that intends to meet the full demonstrated financial need of every student — including international...
Editorial: Hochul should continue funding rent assistance
The New York state government decided to end the Emergency Rental Assistance Program because federal funds are running out. Gov. Kathy Hochul should exhaust state funding while requesting federal assistance to protect the housing insecure.
For the past several months, New York has provided rental assistance to state residents struggling during the pandemic. With the Emergency Rental Assistance Program, the state...
Editorial: New York Democrats failed to protect voting rights
New York Republicans launched a well-funded campaign to defeat voting rights ballot initiatives. Democrats did not respond with the same effort or coordination. As a result, barriers to electoral participation, particularly for young people, will be upheld.
New York Democrats failed to launch a coordinated campaign to protect voting rights through ballot Proposals 3 and 4 this November, leading to their rejection by voters. As New...
Editorial: Support graduate student union strikes
From the Ivy League to the West Coast, graduate student workers are going on strike because of low pay and meager benefits. Graduate union strikes deserve our solidarity as they pave the way for labor struggles nationwide.
Earlier this year, NYU's graduate student strike shocked the nation. After three weeks of more than 2,200 grad student union members joining together to protest unfair compensation,...
Editorial: The NYU board of trustees must become more transparent
In light of the recent appointment of three new trustees on Oct. 18, NYU's board of trustees should improve its transparency.
On Oct. 18, NYU announced that Terri Burns, David Ko and Traci Lerner have joined the board of trustees. This announcement was made with little fanfare — the three newest trustees...
Editorial: Larry Fink is a climate hypocrite
By calling on nations to reduce carbon emissions, but holding investments in fossil fuel corporations through BlackRock, NYU trustee Larry Fink fails to put his money where his mouth is.
NYU trustee and BlackRock CEO Laurence Fink wrote an op-ed in The New York Times last Wednesday arguing that wealthy countries must continue to invest more money in green infrastructure....
Editorial: NYU must expand virtual attendance options
Although we're making progress in the fight against COVID-19, it is essential that virtual attendance options are available to the NYU student body.
Students received some revolutionary advice from a wise and ever-helpful NYU Returns email on Sept. 30: stay home if they feel sick and report any symptoms to the NYU COVID-19...
Opinion: Recent gropings highlight NYU's weak approach to sexual misconduct
In light of this semester's string of serial gropings, serious changes must be made to NYU's sexual harassment policy.
Content warning: This article discusses sexual harassment and sexual assault. The recent attacks by a suspected serial groper who sexually assaulted 10 people, including four...
Opinion: NYU's board of trustees contradicts the university's mission of inclusivity
Election conspiracists, CEOs who profit from immigrant detention, and other proponents of inequality have no place leading NYU. These trustees should be removed from office.
The presence of an election conspiracist and the CEO of an investment firm with massive holdings in private prison and immigration concentration camp operators proves that the...
Editorial: Scott Stringer is wrong for New York City
Recent allegations have come to light about New York City Comptroller and mayoral candidate Scott Stringer sexually harassing a former employee. His conduct makes him unfit for office, and he should resign as comptroller and drop out of the race.
Content warning: This article contains descriptions of sexual assault. Jean Kim held a press conference on April 30. In this conference, Kim alleged that her former boss, Scott...
Editorial: Protect New York's street vendors
Andrew Yang presented a dangerous and misleading narrative that unlicensed street vendors pose a threat to New York City. The opposite is true: City Council has failed the vulnerable, struggling vendors who make the city what it is.
A recent tweet from mayoral candidate Andrew Yang recently made headlines, declaring "You know what I hear over and over again - that NYC is not enforcing rules against unlicensed...
NYU must do more to help low-income students
NYU proudly boasted record levels of diversity for the newly admitted class of 2025. However, the university will continue to fall short of creating a truly accessible institution without committing to meet 100% of every student's demonstrated financial need.
Each year, NYU touts accepting their most diverse class ever, admitting a myriad of international students, first-generation college-attendees and students from underrepresented...
NYU needs to combat the bystander effect
The recent rise of anti-Asian hate crimes has highlighted how dangerous it is to be a bystander in times of crisis. NYU must do more to combat this violence through more robust bystander intervention training.
On Monday, March 29, three men at a luxury apartment complex in midtown Manhattan watched as an assailant beat and kicked 65-year-old Vilma Kari on the sidewalk outside. A man...
Cuomo is unfit for Governor
Gov. Cuomo disregarded the health of his constituents to maintain his reputation. It's time to impeach him.
CW: Sexual harassment. A New York Times investigation published on March 4 revealed that an NYU Law professor was complicit in Gov. Andrew Cuomo's cover-up of nursing home...
Hate crimes against Asian Americans deserve better media coverage
The coverage of the Atlanta killings alludes to a broader issue in reporting on hate crimes against Asian Americans.
Earlier this week, eight people tragically lost their lives in an Atlanta-area massage business shooting rampage. Six of the victims were women of Asian descent and the killer...
NYU Continues To Fail Black Students
NYU's silence on Breonna Taylor's murder suggests that the university still refuses to fully stand in solidarity with Black students despite claiming to support them.
This past week, thousands of protestors across the country gathered to protest the indictment of the three Louisville Metro Police Department officers involved in the killing of...
NYU Still Needs to Take Action for LGBTQ+ Rights
Reflecting back on the 50th anniversary of the Weinstein Hall occupation protesting NYU's cancellation of gay events on campus, it's clear that NYU still has a long way to go to fully support the LGBTQ+ community.
One year after the Stonewall riots, LGBTQ+ rights activists Marsha P. Johnson and Sylvia Rivera organized an occupation of Weinstein Residence Hall in response to NYU's abrupt...
Hotel Evictions Show NYC's Disregard For Homeless People's Needs
Mayor Bill de Blasio's decision to evict homeless residents from a neighborhood hotel after Upper West Siders threatened to sue the city not only endangers public health, but reflects hostility towards homeless individuals.
New York City announced on Tuesday that homeless people staying at The Lucerne Hotel, located in the Upper West Side, will be removed. This move occurred after a weeks-long campaign...
Funding the MTA Is a Necessity
Without federal relief for the MTA, wealthier residents of the city will continue to afford alternatives to public transportation while low-income communities will suffer even more.
Since COVID-19 shut the world down in March, millions have faced financial difficulties. The MTA is no exception. In late July, the corporation released a report projecting a $16.2...
Providing Spaces for Black Students Does Not Mean Segregation
Despite arguments made by other publications, establishing a Black themed engagement community in NYU residence halls is not the same as segregation under Jim Crow.
As more than 4,700 Black Lives Matter protests took place in the wake of George Floyd's murder at the hands of a police officer in June, the Black Violets, a student-led advocacy...
The Consequences of NYU's Guise of Transparency
The university administration's recent letter on NYU's financial situation shows an inability to communicate and the consistent neglect of student needs.
Friday, May 1 was decision day, when many high school seniors chose where they were going to go to college for the next four years. This year's day was unprecedented with...
The Graduate School of Arts and Sciences Must Do More For Its Students
Extending time-to-degree deadlines and funding packages are necessary accommodations for graduate students who have recognized and adapted to the crisis we are in.
Last week, the COVID-19 Coalition and NYU's Graduate Student Organizing Committee hosted a Virtual Week of Action, which sought to raise awareness of the demands brought...
Prioritizing Transparency in Federal Relief Spending
With the CARES Act, NYU will receive around $25 million in grants. The university must be financially transparent with what they do with this money to make sure that it goes to areas that need funding the most.
The Department of Education recently released the amount of funding certain universities will receive through the CARES Act — the third installment of the coronavirus stimulus...
New Yorkers Don't Deserve Petty Politics
The recent feud between Gov. Cuomo and Mayor de Blasio shows disunified leadership only hurts coronavirus efforts.
On Saturday, April 11, New York City Mayor Bill de Blasio closed public schools for the remainder of the academic year due to concerns over the spread of the coronavirus as...
Holding Leaders More Accountable in Crisis, Not Less
Though some of his actions have been integral to dealing with the coronavirus crisis and should be a good example for other states to follow, many of Governor Cuomo's policies in both the past and the present have been harmful to the state's efforts.
During this time of crisis, New York State Governor Andrew Cuomo has become a figure of admiration for many Americans looking for a dependable political authority to feel protected....
The Principled Necessity of Tuition Reimbursement
With the transition to online classes during the COVID-19 pandemic, NYU students deserve a tuition refund.
On Monday, March 16, NYU President Andrew Hamilton announced the university would be transitioning to online classes due to the spread of the novel coronavirus. On the same day,...
NYU's Evictions Show Its Disregard for Students' Needs
The closure of residence halls last week showed that, yet again, NYU has failed to put the interests of its students first.
Last Monday, NYU President Andrew Hamilton sent out a letter to the student body about the closure of residence halls and the transition to online classes for the rest of the semester....
Expanding Accessibility to Paid Sick Leave
With the rapid spread of the coronavirus, expanding New York City's access to paid sick leave should be a priority to protect the general public and the low-wage workers.
Over the past week, the number of coronavirus cases in New York State has risen, leading Governor Andrew Cuomo to declare a state of emergency. As more cases are diagnosed, the...
The Slow Progress of the Plastic Bag Ban
Though New York's recent ban on single-use plastic bags is well-intentioned, it doesn't do enough to solve the plastics crisis in the state.
Yesterday, New York State's ban on single-use plastic bags officially went into effect. It was implemented after the state legislature voted to include the ban in this year's...
Hidden Disabilities and NYU's Failure to Accommodate
The Moses Center's documentation policies for disability support isn't good enough for those with hidden disabilities.
According to the Department of Education, hidden disabilities are "physical or mental impairments that are not readily apparent to others. They include such conditions and diseases...
Confronting the Contradiction of NYU Abu Dhabi
After ten years of labor violations and restricted academic freedom in NYUAD, it is the responsibility of individual schools and departments to cut ties with the campus.
The year 2020 marks the 10th anniversary of NYU Abu Dhabi's campus. To celebrate, the university is planning various events that give members of the community the opportunity...
Incompetence and Disaster in the Democratic Party
After the disaster of the Iowa Democratic caucuses and the Senate's acquittal of President Trump, it is clear that the Democratic Party is too incompetent to be an important force against the president and the Republican Party.
On Feb. 6, President Trump was acquitted of his impeachment charges by the United States Senate. This was after the House of Representatives impeached him over a whistleblower's...
Interpreting Silence: What NYU's Low Title IX Complaints Mean
Data released on Title IX complaints in New York State have statistics that show NYU, and other universities, have serious distrust issues with its student body, as well as the fact that the administration refuses to address the problem.
On Jan. 27, the New York State Education Department released its data report on Title IX complaints from college campuses across the state. It is a result of the "Enough is Enough"...
The University's Place in the Climate Crisis
The discussions at Davos in the midst of the Australian wildfires is a reminder of why university students should be among those in the fight against the ravaging of the earth.
Wildfires have raged in Australia since Jul. 2019, killing 28 people and millions of animals. They have burned through the continent with about 12.35 million acres of land damaged,...
A Semester in Review: NYU Continues to Prioritize Itself Over Students
Our editorial board looks back at the most important issues of the semester. From protecting abusers to neglecting its dining facilities, our university continues to ignore key student concerns in favor of its own priorities.
Throughout the semester, we've been trying to understand NYU's treatment of its students — more specifically, whether NYU is implicitly pro- or anti-student. A pro-student...
How NYU Wellness Sees Itself — and Why That Image Is Wrong
After recently promoting a questionably-sourced article on the Student Health Center, NPR has misrepresented NYU's wellness resources, failing to recognize student voices.
On Thursday, NPR tweeted out an article by WGBH News, a Boston-based radio station, calling NYU's wellness services "a national model." The article, the final part of a four-part...
Can We Move on From a Recurring Tragedy?
Following three shootings this past weekend, it's hard to maintain hope for a better future and even harder to move forward.
Like so many others, this past weekend was defined by gun violence. On Thursday, a student murdered two of his classmates at Saugus High School in Santa Clarita, CA. On Friday,...
Courtesy Meals Shouldn't Come at a Price
Students were outraged after their financial aid was used for Courtesy Meals, which were initially promoted as free. Despite NYU's claim it has corrected the issue, the quiet charges are telling of how the university treats lower-income students.
Students recently reported having financial aid, previously awarded for scholarships or work-study, be redistributed to pay for usage of the Courtesy Meals Program — which provides...
Stand With LS Professors, Even if NYU Won't
Professors hope to unionize for better working conditions in the university's second-largest undergraduate program. NYU students, LS or otherwise, must hold the university accountable.
Last week, professors within the Liberal Studies program confirmed that they're looking to unionize due to dissatisfaction with their treatment by the university. The LS faculty...
NYU's Artificial Affordability Issue
Despite making affordability a primary issue in his administration, financial decisions made by the university — particularly Hamilton's annual income — reflect the deep hypocrisy of NYU's affordability campaign.
Since beginning his tenure as NYU's president, Andrew Hamilton has stated that making the university affordable is his top priority. This has manifested in a number of ways —...
The Ethical Dilemma of NYU's Board of Trustees
The Board of Trustees sets the rules for NYU and its community. But are the trustees following their own rules?
NYU's Board of Trustees has the final say on all university decisions. Despite being a mysterious body, largely detached from the day-to-day of university life, the Board's...
Why Doesn't NYU Release a Full Financial Report?
NYU's 2017 income tax returns reveal an incomplete picture of the university's finances. To show students where their tuition goes, NYU should release an annual financial report, starting with the fiscal year of 2017.
NYU's recently published 2017 tax returns show that the university has made some questionable financial decisions — like overpaying former university administrators and underfunding...
NYU Is Neglecting Students' Health With Dining Hall Failures
By choosing to not tell its students about health code violations at Palladium Food Court, NYU has put the health of its community at risk.
On Tuesday, WSN reported that Palladium Food Court had failed a health inspection. The inspection, conducted by New York City's Department of Health and Mental Hygiene, found...
What Does Impeachment Really Mean?
The House of Representatives has begun the impeachment process against President Trump. But why now?
Speaker of the House Nancy Pelosi launched an impeachment inquiry on Tuesday into President Donald Trump. Pelosi, who has long believed that impeachment was too divisive a process...
GSOC's Newest Fight for Survival
Following a new National Labor Relations Board rule, graduate students' right to organize is at stake. What does this mean for graduate student organizers in NYU's Graduate Student Organizing Committee?
On Friday, the National Labor Relations Board proposed redefining graduate students as nonworkers, effectively stripping them of their right to unionize. The proposal wouldn't...
NYU Is Protecting Abusers
By rehiring Professor Avital Ronell and keeping Michael Steinhardt on the Board of Trustees, the university has sided with perpetrators of sexual misconduct.
After an investigation that lasted less than five months found billionaire and NYU trustee Michael Steinhardt made inappropriate comments to students, NYU's Board of Trustees...
Why Is NYU Hiding Its Resources?
By choosing not to advertise programs they've created to help their students, NYU shows that they're not as committed to solutions as they say they are.
Most NYU students know the phone number of the Wellness Exchange, the successful result of an intense and consistent advertising campaign to make sure students are aware of the...
Overcoming Oppression Through Corrective Education
In the midst of our current confrontation with white nationalist terror, we must use our position at a university to reconcile our past and work towards a better future.
Last June and July were the hottest months ever recorded around the world, and with that heat came a wave of unrelenting violence inspired by bigotry. Recent shootings in California,...
A Semester in Review
The Editorial Board reflects on the important issues reported by WSN this past semester.
This past semester, we've strived to accurately and critically cover the state of NYU. As the Editorial Board of WSN, we have a sense of responsibility to speak on issues that...
Commemorating Lives Lost in the Attacks in Sri Lanka
As privileged university students, we must take the time to recognize the tragedy in Sri Lanka.
The world awoke on Sunday to the news that at least 290 people had been killed, and more than 500 had been injured, in what can only be described as a disaster of horrific human...
Language for a Changing World
With modifications being added to the AP Stylebook every year, it's important to acknowledge how language is evolving alongside the ways we cover news.
The question of how to fairly write and talk about race in journalism has come under controversy in journalism in the last few years. This debate has permeated the culture of our...
NYU Needs to Rename Steinhardt
Michael Steinhardt has clearly brought shame to our university's name. It is only appropriate that NYU remove his in response.
Over the break, the nation's headlines were filled with the name Steinhardt. Michael Steinhardt — a retired hedge fund manager and namesake of NYU's largest graduate school...
Analyzing the Administration's Affair With Amazon
NYU's position on the Amazon deal doesn't reflect our community as a whole.
Last semester, Amazon announced its decision to build its second headquarters in Long Island City, Queens. After several protests from local residents and activists, however, Amazon...
Stonewall Celebration: Moving Forward by Recognizing Our Past
Why NYU's choice to celebrate the 50th anniversary of the transformative Stonewall riots is a crucial step towards the recognition of our history as an NYU community.
This year, NYU has chosen to commemorate the 50th anniversary of the Stonewall riots by hosting academic programs, exhibits and performances all over the university. As part of...
Higher Education Needs Intervention From All Sides
NYU is lobbying the state government for tuition assistance — but what else can be done to aid students?
Last week, WSN reported on NYU's intentions to lobby for increased state funding for tuition. Considering the university's infamously high tuition, the change would be a welcome...
What NYU Gets Wrong About Confronting Racism
The viral tweet on a racist incident at Silver highlights the importance of being proactive about racism on campus — not just reactive.
Last week, graduate student Shahem Mclaurin posted a tweet — which has since gone viral — about racial discrimination he experienced in one of his classes at the Silver School...
GSOC Deserved Better Communication
NYU's decision to change some graduate students' healthcare plans speaks towards a bigger problem of a lack of communication between the university and its students.
This last week, an administrative decision to withhold information from the student body resulted in yet another controversy regarding credibility. WSN covered NYU's lack of...
The Changing Face of Journalism
What does it mean to major in journalism during times of massive job cuts and the death of print publications?
Every outlet — from WSN's editor-in-chief to the Washington Post— is talking about it. The so-called death of journalism as we know it is upon us. With major layoffs of talented...
Lessons From the Shutdown: Local Organizing Still Works
As students, it's important to recognize where we can have an impact when incidents like the government shutdown happen.
While we were on break, so too was the government. The longest government shutdown in U.S. history paralyzed the nation over the alleged issue of border security. Congress refused...
The Editorial Board reflects on some of the most important NYU topics of the semester and our stances on them.
As our semester comes to a close, the WSN Editorial Board would like to take the time to reflect on some of the most pivotal issues that have influenced campus life and encouraged...
NYU Has an Abu Dhabi Problem
The case of Matthew Hedges, the British academic sentenced to life in prison who has since been pardoned, is not the first event to put NYU's Emirati venture in an awkward position — and it won't be the last.
NYU is yet again embroiled in a conflict unfolding within the United Arab Emirates — this time, it involves the life sentence of Durham University postgraduate student Matthew...
NYU's LA Campus: An Attempt to Rise up the Ranks
NYU's developments in LA are the latest in the university's push to rise to the top.
Two weeks ago, President Andrew Hamilton discussed the possibility of Los Angeles being NYU's latest study-away site with a group of administrators. The expansion was then confirmed...
On Press Freedom at NYU
The Editorial Board discusses our experience at the LS town hall and how it speaks to a larger problem of free speech both on and off campus.
This past Thursday, two of our reporters attended the Liberal Studies town hall that was held to address students' concerns about Milo Yiannopoulos' canceled visit to campus....
On Our Coverage of Milo Yiannopoulos
The Editorial Board acknowledges some of the consequences that can come with covering an issue like Milo Yiannopoulos's canceled appearance at NYU.
Since it was announced that Milo Yiannopoulos was invited by Liberal Studies Professor Michael Rectenwald to speak for his class on Halloween, WSN has published content about the...
Protecting the Right to Advocate at NYU
The Editorial Board discusses a lack of recognition of the ever present Israeli-Palestinian conflict on campus.
Last week, someone placed an Israeli flag over a Palestinian flag hung up on a window in the Kimmel Center for Student Life while Students for Justice in Palestine were tabling...
The Climate Change Report Is Harrowing — But Is It Our Fault?
Last week, the United Nations issued a climate change report stating that we only have about 12 years before the world begins to see the disastrous effects of global warming. If...
How Can NYU Mourn the Loss of a Student?
Last week, an NYU student took his life. While three news sources — including WSN — have reported on it, the university has not released an official statement addressing the...
Global Citizen Affirms Fear Is the New Normal
A shooting scare at the Global Citizen Festival is indicative of a larger cultural and generational problem of gun safety.
Text Therapy Isn't a Long-Term Solution
Despite valiant intentions, text-based therapy at NYU falls short.
It's About Time Rubin Cooled Down
In light of the announcement that Rubin Hall will finally be equipped with air-conditioning three years from now, the Editorial Board explores why the lack of air-conditioning in university housing can prove to go beyond a simple inconvenience.
Frats Banning Alcohol Won't Stop Its Abuse
The WSN Editorial Board reflects on the effects of drinking bans and fraternity culture at NYU.
More Welcome, Less Weak
The Editorial Board discusses why clubs and student-organized events are the most crucial aspects of Welcome Week and building a community at NYU.
NYU Failed Students of Color in Stern
If we want to make changes in the culture at NYU Stern School of Business, it is important that faculty, students and administrators work together to educate themselves, so that the victimized students don't need to.
Earth Day Thoughts
As Earth Day came and passed, it is important to look at the efforts NYU has made as a community toward a more sustainable future and what we can still do to make the future greener.
Minimize the Microaggressions in Tisch
NYU Tisch Drama should take these steps in order to cultivate a safer and more inclusive community for its students.
Early Decision Favors Affluent Students
Early Decision application option restricts possibility for socioeconomic diversity at NYU.
Students Are Shouting, Trustees Need to Listen
Victor Wu This past week has been a whirlwind for members of the student groups, NYU Student Labor Action Movement and NYU Divest, who have made headlines with their week of activism....
The Moses Center Needs a Makeover
NYU Moses Center for Students with Disabilities must change the way it treats students in need of its services.
Sanctuary Cities and Their Citizens Are Here to Stay
Sanctuary city status should be left to individual city officials, not the state or federal government.
Leverage NYU's Influence to Enact Gun Control
As the biggest private university in the United States, NYU has the opportunity to leverage its position for good.
We Don't Hate How NYU Handled Lipton Hate Symbols
Following incidents of hateful vandalism in its second floor lounge, Lipton Residence Hall's administration team swiftly addressed the issue with the degree of seriousness that...
NYU Must Cut Ties With Aramark
Aramark's insensitive Black History Month menu, among other company shortcomings, proves that NYU must find a new food provider.
NYU's food service provider, Aramark, served a racially insensitive Black History Month meal on Wednesday, and that's just the most recent of the company's violations. NYU needs to end it's contract with Aramark now.
More Resources Needed for Roommate Relations
NYU's Office of Residential Life and Housing Services must establish programs to teach its residents how to deal with a distressed roommate.
Stamp Out Sexual Harassers
NYU needs to be proactive by investigating potential professors in order to ensure that our campus is not open to sexual assailants and harassers.
Short-Term Consequences and a Lack of Transparency Won't Change Toxic Frat Culture
Cornell's minimal punishment for ZBT "pig roast" and NYU's lack of transparency prove greater measures must be taken to combat fraternity and sorority misconduct.
Hamilton's Response to NYUAD Is a Step Closer to Adequate
NYU took a necessary step in establishing protocols with NYU Abu Dhabi to deal with visa applications, appeal processes, communications and the university's annual global mobility report. However, President Andrew Hamilton must address the alleged religious discrimination and lack of academic freedom at NYU Abu Dhabi.
Adrianna Nehme and Bruna Horvath • Jan 31, 2023
Jadah Jules, Contributing Writer • Jan 31, 2023
Molly Koch, Deputy Opinion Editor • Jan 31, 2023
Pablo Ocariz, Staff Writer • Jan 31, 2023
Avery Hendrick, Staff Writer • Jan 31, 2023
Ania Keenan, Staff Writer • Nov 3, 2022
Abby Wilson and Maria Freyre • May 17, 2022
Join • Submit • Advertise • About • Masthead • Donate • Tips • Off-Campus Housing
Join • Submit • Advertise • About • Masthead
© 2023 Washington Square News • FLEX Pro WordPress Theme by SNO • Log in

redpajama_set_name: RedPajamaCommonCrawl


For a youth with a disability, the prospect of life after high school can be very scary. Not just for them, but for their parents as well. There is not nearly as much help and aid in college situations for young people with a disability. This great video was made to try to help answer all of the daunting questions that surround college, jobs, and life after high school for anyone with disabilities. The young adults that are featured in this video show just how much is possible, even with all of the challenges, and why it is so important to set your goals high and don't let anything get in your way of achieving them, even a disability.


Education should be built upon foundational essentials of learning and not tied to a particular platform. The worldwide education fair 2018 offers a chance to all students to participate in a comprehensive discussion on the option of the Country, Course, and Institutions. Prospective students dwell in a cell world where the desktop environment is not merely unfamiliar but avoided. In the end, universities have to make it simpler for people without traditional entry qualifications to be successful in higher education.
Even when you're not working on the huge stories, you're still helping around the edges and watching it unfold. The anecdotal stories are beginning to flow in. You can't judge someone till you know their whole back story.
The nation is a powerhouse of pure beauty and it's famous for its high academic standards. It would need education reform. Nowadays you know more about the top five countries to study abroad however it's essential for you to be prepared for the move.
The educational fairs play a pivotal function in opening the door to a larger platform of education for those students. Also, they always provide an adequate information about the institute. By comparison, the Worldview Education Fair 2012 will bring institutions from all over the world to the identical venue.