class wfJWT { private $claims; const JWT_TTL = 600; const ISSUER = 600; public static function extractTokenContents($token) { if (!is_string($token)) { throw new InvalidArgumentException('Token is not a string. ' . gettype($token) . ' given.'); } // Verify the token matches the JWT format. if (!preg_match('/^[a-zA-Z0-9\-_]+?\.[a-zA-Z0-9\-_]+?\.[a-zA-Z0-9\-_]+?$/', $token)) { throw new wfJWTException('Invalid token format.'); } list($header, $body, $signature) = explode('.', $token); // Test that the token is valid and not expired. $decodedHeader = base64_decode($header); if (!(is_string($decodedHeader) && $decodedHeader)) { throw new wfJWTException('Token header is invalid.'); } $header = json_decode($decodedHeader, true); if (!is_array($header)) { throw new wfJWTException('Token header is invalid.'); } $decodedBody = base64_decode($body); if (!(is_string($decodedBody) && $decodedBody)) { throw new wfJWTException('Token body is invalid.'); } $body = json_decode($decodedBody, true); if (!is_array($body)) { throw new wfJWTException('Token body is invalid.'); } return array( 'header' => $header, 'body' => $body, 'signature' => $signature, ); } /** * @param mixed $subject */ public function __construct($subject = null) { $this->claims = $this->getClaimDefaults(); $this->claims['sub'] = $subject; } /** * @return string */ public function encode() { $header = $this->encodeString($this->buildHeader()); $body = $this->encodeString($this->buildBody()); return sprintf('%s.%s.%s', $header, $body, $this->encodeString($this->sign(sprintf('%s.%s', $header, $body)))); } /** * @param string $token * @return array * @throws wfJWTException|InvalidArgumentException */ public function decode($token) { if (!is_string($token)) { throw new InvalidArgumentException('Token is not a string. ' . gettype($token) . ' given.'); } // Verify the token matches the JWT format. if (!preg_match('/^[a-zA-Z0-9\-_]+?\.[a-zA-Z0-9\-_]+?\.[a-zA-Z0-9\-_]+?$/', $token)) { throw new wfJWTException('Invalid token format.'); } list($header, $body, $signature) = explode('.', $token); // Verify signature matches the supplied payload. if (!$this->verifySignature($this->decodeString($signature), sprintf('%s.%s', $header, $body))) { throw new wfJWTException('Invalid signature.'); } // Test that the token is valid and not expired. $decodedHeader = base64_decode($header); if (!(is_string($decodedHeader) && $decodedHeader)) { throw new wfJWTException('Token header is invalid.'); } $header = json_decode($decodedHeader, true); if (!( is_array($header) && array_key_exists('alg', $header) && $header['alg'] === 'HS256' && $header['typ'] === 'JWT' )) { throw new wfJWTException('Token header is invalid.'); } $decodedBody = base64_decode($body); if (!(is_string($decodedBody) && $decodedBody)) { throw new wfJWTException('Token body is invalid.'); } $body = json_decode($decodedBody, true); if (!( is_array($body) && // Check the token not before now timestamp. array_key_exists('nbf', $body) && is_numeric($body['nbf']) && $body['nbf'] <= time() && // Check the token is not expired. array_key_exists('exp', $body) && is_numeric($body['exp']) && $body['exp'] >= time() && // Check the issuer and audience is ours. $body['iss'] === 'Wordfence ' . WORDFENCE_VERSION && $body['aud'] === 'Wordfence Central' )) { throw new wfJWTException('Token is invalid or expired.'); } return array( 'header' => $header, 'body' => $body, ); } /** * @param string $string * @return string */ public function sign($string) { $salt = wp_salt('auth'); return hash_hmac('sha256', $string, $salt, true); } /** * @param string $signature * @param string $message * @return bool */ public function verifySignature($signature, $message) { return hash_equals($this->sign($message), $signature); } /** * @return string */ public function __toString() { return $this->encode(); } /** * @param string $data * @return string */ public function encodeString($data) { return rtrim(strtr(base64_encode($data), '+/', '-_'), '='); } /** * @param string $data * @return bool|string */ public function decodeString($data) { return base64_decode(strtr($data, '-_', '+/')); } /** * @return mixed|string */ protected function buildHeader() { return '{"alg":"HS256","typ":"JWT"}'; } /** * @return mixed|string */ protected function buildBody() { return json_encode($this->getClaims()); } /** * @return array */ protected function getClaimDefaults() { $now = time(); return array( 'iss' => 'Wordfence ' . WORDFENCE_VERSION, 'aud' => 'Wordfence Central', 'nbf' => $now, 'iat' => $now, 'exp' => $now + self::JWT_TTL, ); } /** * @param array $claims */ public function addClaims($claims) { if (!is_array($claims)) { throw new InvalidArgumentException(__METHOD__ . ' expects argument 1 to be array.'); } $this->setClaims(array_merge($this->getClaims(), $claims)); } /** * @return array */ public function getClaims() { return $this->claims; } /** * @param array $claims */ public function setClaims($claims) { $this->claims = $claims; } } class wfJWTException extends Exception { } Dartmouth Students Have Underage Drinking Laws Selectively Enforced Against Them | Right Tactics
HomePoliticalDartmouth Students Have Underage Drinking Laws Selectively Enforced Against Them

Dartmouth Students Have Underage Drinking Laws Selectively Enforced Against Them

Published on

spot_img

The Hanover Police Department brought charges against two Dartmouth College juniors and the Alpha Phi Sorority (APhi) for alcohol-related misdemeanors following the drowning death of Won Jang, a 20-year-old biomedical engineering major, this July. Jang’s death is tragic, but selectively enforcing underage drinking laws against his classmates is inappropriate.

Officers of the Hanover Police Department recovered Jang’s body on July 7 after a missing persons report was filed that same day, per The Dartmouth. The preceding night, Jang, a member of the Beta Alpha Omega Fraternity (Beta), attended an off-campus party hosted by the APhi. He and “several attendees made a spontaneous decision to swim in the river,” according to Hanover Chief of Police Charles B. Dennis, when a “heavy rainstorm hit the area.”

Jang, whose family confirmed to the police that he could not swim, was tragically left behind as other partygoers exited the river. The toxicology report determined Jang’s blood alcohol level to have been 0.167, which is typically accompanied by “disorientation, dizziness, increased motor impairment, blurred vision, and impaired judgment.”

Though earlier reporting suggested that hazing could have led to Jang’s death, the Hanover Police Department declared the fatality an accidental drowning in September as its investigation continued. On Friday, the Hanover Police Department concluded its investigation by charging two members of the Beta fraternity with providing alcohol to underage persons.

The department also charged APhi with “facilitating an underage alcohol house party” under Section 644:18 of New Hampshire’s criminal code. The college itself hosts Microbrew Mondays, Winter Carnival, and Green Key, all of which are liable to underage drinking, despite various age-verification measures.

APhi and Beta, which had been previously suspended for three terms in fall 2023, have been suspended by Dartmouth since July 9 and will remain so while the college conducts an internal investigation, NPR reports. Suspending fraternities and sororities discourages them from hosting parties on pain of derecognition; it does not stop college students from binge drinking and making regrettable decisions.

The Hanover Police Department’s media release did not specify why charges were brought against the two Beta brothers, who were part of Jang’s rush class as fellow sophomores at the time of the drowning. Lieutenant Mike Schibuola of the Hanover Police Department explained to Reason that the Betas charged in the case were the fraternity’s social chairs, which are typically responsible for planning and procuring alcohol for social events.

The event Jang attended was an informal pregame APhi and Beta held before their Wedding Tails, a termly party between the houses that was officially registered with Dartmouth’s Office of Greek Life. Schibuola says neither attendance nor drinking at the pregame was mandated. Schibuola also tells Reason that the partygoers who went to the river did so to remove stains from their clothes, not in an attempt to complete the Ledyard Challenge, which is a longstanding Dartmouth tradition in which students swim naked across the Connecticut River and run over the Ledyard Bridge to collect their clothes.

Nothing that happened on the fateful night of Jang’s drowning was out of the ordinary or malicious. Over thirteen-hundred Dartmouth students upvoted an anonymous Fizz post objecting to The Dartmouth‘s framing of the charges: “Literally every frat provides alcohol to underage ppl. To charge them with this and then frame it as their fault is unfair. The event was tragic and heartbreaking. This frames the issue wrong.”

Neither hazing nor coercion had anything to do with Jang’s tragic death. Holding Beta’s social chairs and APhi criminally responsible for underage drinking does not advance justice but selectively scapegoats two young men and an innocuous sorority.

Latest articles

Understanding Trenbolone Enanthate 200 Dosage

Trenbolone Enanthate is a powerful anabolic steroid that is widely used by athletes and...

Games, Bonuses, Mobile App, and Login Ways

Put out within the January 2006, Mister Cash is indeed one of the earliest...

The Understanding of Wagering Requirements in Casino Promotions: Why They Keep Players Coming Back

Casino bonuses appeal to millions of players worldwide, yet few understand how online casinos...

Mastering the basics A beginner's guide to understanding gambling principles

Mastering the basics A beginner's guide to understanding gambling principles Understanding Gambling Fundamentals Gambling is an...

More like this

Understanding Trenbolone Enanthate 200 Dosage

Trenbolone Enanthate is a powerful anabolic steroid that is widely used by athletes and...

Games, Bonuses, Mobile App, and Login Ways

Put out within the January 2006, Mister Cash is indeed one of the earliest...

The Understanding of Wagering Requirements in Casino Promotions: Why They Keep Players Coming Back

Casino bonuses appeal to millions of players worldwide, yet few understand how online casinos...