<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[756] sites/trunk/wordcamp.org/public_html/wp-content/mu-plugins: WordCamp mu-plugins: Open-source the first round of private mu-plugins.</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://meta.trac.wordpress.org/changeset/756">756</a></dd>
<dt>Author</dt> <dd>iandunn</dd>
<dt>Date</dt> <dd>2014-07-22 00:55:39 +0000 (Tue, 22 Jul 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>WordCamp mu-plugins: Open-source the first round of private mu-plugins.</pre>

<h3>Added Paths</h3>
<ul>
<li><a href="#sitestrunkwordcamporgpublic_htmlwpcontentmupluginsdisablewppointersphp">sites/trunk/wordcamp.org/public_html/wp-content/mu-plugins/disable-wp-pointers.php</a></li>
<li><a href="#sitestrunkwordcamporgpublic_htmlwpcontentmupluginsjetpackpublicizetweaksphp">sites/trunk/wordcamp.org/public_html/wp-content/mu-plugins/jetpack-publicize-tweaks.php</a></li>
<li><a href="#sitestrunkwordcamporgpublic_htmlwpcontentmupluginswcorgdisallowpasswordresetphp">sites/trunk/wordcamp.org/public_html/wp-content/mu-plugins/wcorg-disallow-password-reset.php</a></li>
<li><a href="#sitestrunkwordcamporgpublic_htmlwpcontentmupluginswcorggloballoginphp">sites/trunk/wordcamp.org/public_html/wp-content/mu-plugins/wcorg-global-login.php</a></li>
<li><a href="#sitestrunkwordcamporgpublic_htmlwpcontentmupluginswcorgloginmessagephp">sites/trunk/wordcamp.org/public_html/wp-content/mu-plugins/wcorg-login-message.php</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="sitestrunkwordcamporgpublic_htmlwpcontentmupluginsdisablewppointersphp"></a>
<div class="addfile"><h4>Added: sites/trunk/wordcamp.org/public_html/wp-content/mu-plugins/disable-wp-pointers.php (0 => 756)</h4>
<pre class="diff"><span>
<span class="info">--- sites/trunk/wordcamp.org/public_html/wp-content/mu-plugins/disable-wp-pointers.php                               (rev 0)
+++ sites/trunk/wordcamp.org/public_html/wp-content/mu-plugins/disable-wp-pointers.php  2014-07-22 00:55:39 UTC (rev 756)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+<?php
+/**
+ * Plugin Name: Disable Admin Pointers
+ */
+
+add_action( 'admin_init', 'wcorg_disable_admin_pointers' );
+function wcorg_disable_admin_pointers() {
+       remove_action( 'admin_enqueue_scripts', array( 'WP_Internal_Pointers', 'enqueue_scripts' ) );
+}
</ins><span class="cx">\ No newline at end of file
</span><span class="cx">Property changes on: sites/trunk/wordcamp.org/public_html/wp-content/mu-plugins/disable-wp-pointers.php
</span><span class="cx">___________________________________________________________________
</span></span></pre></div>
<a id="svnexecutable"></a>
<div class="addfile"><h4>Added: svn:executable</h4></div>
<ins>+*
</ins><span class="cx">\ No newline at end of property
</span><a id="sitestrunkwordcamporgpublic_htmlwpcontentmupluginsjetpackpublicizetweaksphp"></a>
<div class="addfile"><h4>Added: sites/trunk/wordcamp.org/public_html/wp-content/mu-plugins/jetpack-publicize-tweaks.php (0 => 756)</h4>
<pre class="diff"><span>
<span class="info">--- sites/trunk/wordcamp.org/public_html/wp-content/mu-plugins/jetpack-publicize-tweaks.php                          (rev 0)
+++ sites/trunk/wordcamp.org/public_html/wp-content/mu-plugins/jetpack-publicize-tweaks.php     2014-07-22 00:55:39 UTC (rev 756)
</span><span class="lines">@@ -0,0 +1,48 @@
</span><ins>+<?php
+/*
+ * Plugin Name: Jetpack Publicize Tweaks
+ * Description: Tweak the way that posts shared on social media services will be displayed
+ * Version:     0.1
+ * Author:      Brandon Kraft
+ */
+
+
+/*
+ * Open Graph Default Image.
+ *
+ * Provides a default image for sharing WordCamp home/pages to Facebook/Twitter/Google other than the Jetpack "blank" image.
+ */
+function wc_default_og_image() {
+       return 'https://s.w.org/about/images/logos/wordpress-logo-notext-rgb.png';
+}
+add_filter( 'jetpack_open_graph_image_default', 'wc_default_og_image' );
+
+/*
+ * Add Twitter Card type.
+ *
+ * Added the twitter:card = summary OG tag for the home page and other ! is_singular() pages, which is not added by default by Jetpack.
+ */
+function wc_add_og_twitter_summary( $og_tags ) {
+       if ( is_home() || is_front_page() ) {
+               $og_tags['twitter:card'] = 'summary';
+       }
+
+       return $og_tags;
+}
+add_filter( 'jetpack_open_graph_tags', 'wc_add_og_twitter_summary' );
+
+/*
+ * User @WordCamp as the default Twitter account.
+ *
+ * Add default Twitter account as @WordCamp for when individual WCs do not set their Settings->Sharing option for Twitter cards only.
+ * Sets the "via" tag to blank to avoid slamming @WordCamp moderators with a ton of shared posts.
+ */
+function wc_twitter_sitetag( $site_tag ) {
+       if ( 'jetpack' == $site_tag ) {
+               $site_tag = 'WordCamp';
+               add_filter( 'jetpack_sharing_twitter_via', '__return_empty_string' );
+       }
+
+       return $site_tag;
+}
+add_filter( 'jetpack_twitter_cards_site_tag', 'wc_twitter_sitetag' );
</ins></span></pre></div>
<a id="sitestrunkwordcamporgpublic_htmlwpcontentmupluginswcorgdisallowpasswordresetphp"></a>
<div class="addfile"><h4>Added: sites/trunk/wordcamp.org/public_html/wp-content/mu-plugins/wcorg-disallow-password-reset.php (0 => 756)</h4>
<pre class="diff"><span>
<span class="info">--- sites/trunk/wordcamp.org/public_html/wp-content/mu-plugins/wcorg-disallow-password-reset.php                             (rev 0)
+++ sites/trunk/wordcamp.org/public_html/wp-content/mu-plugins/wcorg-disallow-password-reset.php        2014-07-22 00:55:39 UTC (rev 756)
</span><span class="lines">@@ -0,0 +1,8 @@
</span><ins>+<?php
+/**
+ * Plugin Name: Disallow Password Change/Reset
+ * Plugin Description: Disallows password change and reset across the WordCamp.org network
+ */
+
+add_filter( 'allow_password_reset', '__return_false' );
+add_filter( 'show_password_fields', '__return_false' );
</ins><span class="cx">\ No newline at end of file
</span><span class="cx">Property changes on: sites/trunk/wordcamp.org/public_html/wp-content/mu-plugins/wcorg-disallow-password-reset.php
</span><span class="cx">___________________________________________________________________
</span></span></pre></div>
<a id="svnexecutable"></a>
<div class="addfile"><h4>Added: svn:executable</h4></div>
<ins>+*
</ins><span class="cx">\ No newline at end of property
</span><a id="sitestrunkwordcamporgpublic_htmlwpcontentmupluginswcorggloballoginphp"></a>
<div class="addfile"><h4>Added: sites/trunk/wordcamp.org/public_html/wp-content/mu-plugins/wcorg-global-login.php (0 => 756)</h4>
<pre class="diff"><span>
<span class="info">--- sites/trunk/wordcamp.org/public_html/wp-content/mu-plugins/wcorg-global-login.php                                (rev 0)
+++ sites/trunk/wordcamp.org/public_html/wp-content/mu-plugins/wcorg-global-login.php   2014-07-22 00:55:39 UTC (rev 756)
</span><span class="lines">@@ -0,0 +1,71 @@
</span><ins>+<?php
+/**
+ * Plugin Name: WordCamp.org Global Login Endpoint
+ * Plugin Description: Allows users to only log in on WordCamp.org, and not any of the other sites in the network.
+ */
+
+class WordCamp_Global_Login_Endpoint_Plugin {
+
+       function __construct() {
+               add_action( 'login_form_login', array( $this, 'login_form_login' ) );
+               add_action( 'login_url', array( $this, 'login_url' ), 99, 2 );
+               add_filter( 'allowed_redirect_hosts', array( $this, 'allowed_redirect_hosts' ) );
+       }
+
+       /**
+        * Don't render the login form, unless the current host is wordcamp.org
+        */
+       function login_form_login() {
+
+               $loggedout = !empty( $_REQUEST['loggedout'] ) ? $_REQUEST['loggedout'] : '';
+
+               $current_network = get_current_site();
+               $url = parse_url( admin_url() );
+               if ( $url['host'] != $current_network->domain ) {
+                       $login_url = wp_login_url();
+                       if ( $loggedout )
+                               $login_url = add_query_arg( 'loggedout', $loggedout, $login_url );
+
+                       wp_safe_redirect( $login_url );
+                       die();
+               }
+       }
+
+       /**
+        * Filter the wp_login_url function to always return the wordcamp.org login url.
+        */
+       function login_url( $login_url, $redirect ) {
+
+               $current_network = get_current_site();
+               $url = parse_url( $login_url );
+               if ( $url['host'] != $current_network->domain ) {
+                       $login_url = sprintf( 'https://%s/wp-login.php', $current_network->domain );
+
+                       if ( $redirect )
+                               $login_url = add_query_arg( 'redirect_to', urlencode( $redirect ), $login_url );
+
+                       $login_url = esc_url_raw( $login_url );
+               }
+
+               return $login_url;
+       }
+
+       /**
+        * When redirecting with ?redirect_to= from wordcamp.org, allow the redirects to
+        * be other sites in the network. See wp_safe_redirect().
+        */
+       function allowed_redirect_hosts( $hosts ) {
+
+               $redirect_to = !empty( $_REQUEST['redirect_to'] ) ? $_REQUEST['redirect_to'] : '';
+               $url = parse_url( $redirect_to );
+               $current_network = get_current_site();
+               $pattern = '/\.'. str_replace( '.', '\.', $current_network->domain ) .'$/i';
+
+               if ( !empty( $url['host'] ) && preg_match( $pattern, $url['host'] ) )
+                       $hosts[] = $url['host'];
+
+               return $hosts;
+       }
+}
+
+$GLOBALS['wordcamp_gle'] = new WordCamp_Global_Login_Endpoint_Plugin;
</ins><span class="cx">\ No newline at end of file
</span></span></pre></div>
<a id="sitestrunkwordcamporgpublic_htmlwpcontentmupluginswcorgloginmessagephp"></a>
<div class="addfile"><h4>Added: sites/trunk/wordcamp.org/public_html/wp-content/mu-plugins/wcorg-login-message.php (0 => 756)</h4>
<pre class="diff"><span>
<span class="info">--- sites/trunk/wordcamp.org/public_html/wp-content/mu-plugins/wcorg-login-message.php                               (rev 0)
+++ sites/trunk/wordcamp.org/public_html/wp-content/mu-plugins/wcorg-login-message.php  2014-07-22 00:55:39 UTC (rev 756)
</span><span class="lines">@@ -0,0 +1,204 @@
</span><ins>+<?php
+/**
+ * Plugin Name:        WordCamp.org Login Message
+ * Plugin Description: Displays a "Login with your WordPress.org account." in wp-login.php
+ */
+
+add_action( 'login_head',         'wcorg_login_css' );
+add_action( 'admin_print_styles', 'wcorg_login_css' );
+function wcorg_login_css() {
+       ?>
+
+       <style type="text/css">
+               #wp-auth-check-wrap #wp-auth-check {
+                       width: 500px !important;
+               }
+
+               body.login #login {
+                       width: 420px;
+               }
+
+                       div.message p {
+                               margin-bottom: 1em;
+                       }
+
+                       #not-your-personal-site {
+                               font-style: italic;
+                       }
+
+                       .login form,
+                       .interim-login.login form {
+                               width: 272px;   /* 320px minus 24px padding on each side */
+                               margin-left: auto;
+                               margin-right: auto;
+                       }
+       </style>
+
+       <?php
+}
+
+/**
+ * Set the locale on the login screen
+ *
+ * Currently all logins are funneled through the main site, so they're all in English by default. That sucks for
+ * international users, so this overrides the main site's locale and uses the one from the site that they're
+ * logging into instead.
+ *
+ * @todo This can be removed after the subdirectory migration.
+ *
+ * @param string $locale
+ * @return string
+ */
+function wcorg_login_message_locale( $locale ) {
+       if ( is_main_network() && false !== strpos( $_SERVER['SCRIPT_NAME'], '/wp-login.php' ) ) {
+               $locale = wcorg_get_login_locale( $locale );
+       }
+
+       return $locale;
+}
+add_filter( 'locale', 'wcorg_login_message_locale' );
+
+/**
+ * Override the default login message.
+ *
+ * We share user tables with WordPress.org, so users need to know to use that account.
+ *
+ * @param string        $message
+ * @param string | bool $redirect_to
+ *
+ * @return string
+ */
+function wcorg_login_message( $message, $redirect_to = false ) {
+       $locale           = wcorg_get_login_locale();
+       $registration_url = wcorg_get_wporg_forums_url( $locale, 'register' );
+
+       if ( ! $redirect_to && ! empty( $_REQUEST['redirect_to'] ) ) {
+               $redirect_to = $_REQUEST['redirect_to'];
+       }
+
+       if ( $redirect_to && wp_validate_redirect( $redirect_to ) != $redirect_to ) {
+               $redirect_to = false;
+       }
+
+       /*
+        * $redirect_to gets urlencode()'d once by wp_login_url() and then all of $login_url gets encoded directly,
+        * because $registration_url will end up with two redirect_to parameters nested inside it.
+        * e.g., https://wordpress.org/support/register.php?redirect_to=https%3A%2F%2Fwordcamp.org%2Fwp-login.php%3Fredirect_to%3Dhttp%253A%252F%252Ftesting.wordcamp.org%252Ftickets%252F
+        *
+        * The second redirect_to parameter *should* be double-encoded so that it ended up single-encoded after the
+        * redirection back to wp-login.php.
+        */
+       $login_url        = urlencode( wp_login_url( $redirect_to ) );
+       $registration_url = add_query_arg( 'redirect_to', $login_url, $registration_url );
+
+       ob_start();
+       ?>
+
+       <div class="message">
+               <p><?php echo __( 'Please use your <strong>WordPress.org</strong>* account to login.', 'wordcamporg' ); ?></p>
+
+               <p>
+                       <?php printf(
+                               __( 'If you don\'t have an account, <a href="%s">please create one</a>.', 'wordcamporg' ),
+                               esc_url( $registration_url )
+                       ); ?>
+               </p>
+
+               <p id="not-your-personal-site">
+                       <?php printf( __( '* This is your account for <a href="%s">the actual WordPress.org website</a>, not your personal WordPress site.', 'wordcamporg' ), wcorg_get_wporg_forums_url( $locale ) ); ?>
+               </p>
+       </div>
+
+       <?php
+       $message = ob_get_clean();
+       return $message;
+}
+add_filter( 'login_message', 'wcorg_login_message' );
+
+/**
+ * Get the locale used by the site that the user is logging in to.
+ *
+ * @todo After subdirectory migration, users will login at city.wordcamp.org/year/wp-login.php instead of being
+ * redirected through the main site, so change this to pull from current site's locale instead of using redirect_to
+ *
+ * @return string
+ */
+function wcorg_get_login_locale( $locale = 'en_US' ) {
+       if ( ! empty( $_REQUEST['redirect_to'] ) ) {
+               $url = parse_url( $_REQUEST['redirect_to'] );
+
+               if ( isset( $url['host'] ) ) {
+                       $blog_details = get_blog_details( array( 'domain' => $url['host'] ), false );
+
+                       if ( $wplang = get_blog_option( $blog_details->blog_id, 'WPLANG' ) ) {
+                               $locale = $wplang;
+                       }
+               }
+       }
+
+       return $locale;
+}
+
+
+/**
+ * Determine the correct WordPress.org forums URL for the given locale
+ *
+ * @todo Add more sites as they're created
+ *
+ * @param string $locale
+ * @param string $path 'root' | 'register'
+ *
+ * @return string
+ */
+function wcorg_get_wporg_forums_url( $locale, $path = 'root' ) {
+       switch ( $locale ) {
+               case 'bg_BG':
+               case 'bs_BA':
+               case 'ca':
+               case 'es_AR':
+               case 'es_CL':
+               case 'es_CO':
+               case 'es_MX':
+               case 'es_PE':
+               case 'es_PR':
+               case 'es_ES':
+               case 'es_VE':
+               case 'fi':
+               case 'he_IL':
+               case 'hr':
+               case 'id_ID':
+               case 'ja':
+               case 'mk_MK':
+               case 'pl_PL':
+               case 'pt_PT':
+               case 'ru_RU':
+               case 'sr_RS':
+               case 'th':
+               case 'ug_CN':
+                       $url = sprintf( 'http://%s.forums.wordpress.org/', substr( $locale, 0, 2 ) );
+                       break;
+
+               case 'pt_BR':
+                       $url = 'http://br.forums.wordpress.org/';
+                       break;
+
+               case 'my_MM':
+                       $url = 'http://mya.forums.wordpress.org/';
+                       break;
+
+               case 'en_US':
+               default:
+                       $url = 'https://wordpress.org/';
+                       break;
+       }
+
+       if ( 'register' == $path ) {
+               if ( 'https://wordpress.org/' == $url ) {
+                       $url .= 'support/register.php';
+               } else {
+                       $url .= 'register.php';
+               }
+       }
+
+       return $url;
+}
</ins></span></pre>
</div>
</div>

</body>
</html>