Making WordPress.org


Ignore:
Timestamp:
02/26/2018 07:06:12 AM (9 years ago)
Author:
dd32
Message:

2FA: Enable Email, Slack, and Backup Codes as the backup 2FA method.

See #77.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-two-factor/providers/class-wporg-two-factor-slack.php

    r6735 r6759  
    11<?php
    22
    3 require_once TWO_FACTOR_DIR . 'providers/class.two-factor-email.php';
     3require_once __DIR__ . '/class-wporg-two-factor-email.php';
    44
    5 class WPORG_Two_Factor_Slack extends Two_Factor_Email {
     5class WPORG_Two_Factor_Slack extends WPORG_Two_Factor_Email {
    66
    77        /**
     
    1111         */
    1212        const TOKEN_META_KEY = '_two_factor_slack_token';
    13 
    14         /**
    15          * Name of the input field used for code resend.
    16          *
    17          * @var string
    18          */
    19         const INPUT_NAME_RESEND_CODE = 'two-factor-slack-code-resend';
    2013
    2114        /**
     
    3427
    3528        public function get_label() {
    36                 return _x( 'Slack', 'Provider Label', 'wporg' );
     29                return 'Slack'; // Not marked for translation as this shouldn't be called/displayed.
    3730        }
    3831
    39         /**
    40          * Whether this Two Factor provider is configured and available for the user specified.
    41          *
    42          * @since 0.1-dev
    43          *
    44          * @param WP_User $user WP_User object of the logged-in user.
    45          * @return boolean
    46          */
     32        protected function get_slack_details( $user_id ) {
     33                global $wpdb;
     34
     35                static $cached_details = [];
     36                if ( isset( $cached_details[ $user_id ] ) ) {
     37                        return $cached_details[ $user_id ];
     38                }
     39
     40                // TODO abstract this? memcache it?
     41                $user_details = $wpdb->get_var( $wpdb->prepare( "SELECT profiledata FROM slack_users WHERE user_id = %d LIMIT 1", $user_id ) );
     42                $user_details = $user_details ? json_decode( $user_details ) : false;
     43
     44                $cached_details[ $user_id ] = $user_details;
     45
     46                return $user_details;
     47        }
     48
    4749        public function is_available_for_user( $user ) {
    48                 // TODO Check if the user has a 2FA slack account.
     50                $user_details = $this->get_slack_details( $user->ID );
     51
     52                // Require the Slack account to exist, and for the user to have 2FA enabled on Slack.
     53                return $user_detauls && empty( $user_details->deleted ) && ! empty( $user_details->has_2fa );
     54        }
     55
     56        public function generate_and_email_token( $user ) {
     57                return $this->generate_and_slack_token( $user );
     58        }
     59
     60        public function generate_and_slack_token( $user ) {
     61                $token = $this->generate_token( $user->ID );
     62
     63                $message = "Please enter the following verification code on WordPress.org to complete your login:\n{$token}";
     64
     65                $slack_details = $this->get_slack_details( $user->ID );
     66
     67                if ( $slack_details->id ) {
     68                        // TODO: Replace this with a named Slack Bot.
     69                        return slack_dm( $message, $slack_details->id );
     70                }
     71
    4972                return false;
    5073        }
    5174
    52         /**
    53          * Generate and email the user token.
    54          *
    55          * @since 0.1-dev
    56          *
    57          * @param WP_User $user WP_User object of the logged-in user.
    58          */
    59         public function generate_and_email_token( $user ) {
    60                 $token = $this->generate_token( $user->ID );
    61 
    62                 /* translators: %s: site name */
    63                 $subject = wp_strip_all_tags( sprintf( __( 'Your login confirmation code for %s', 'wporg' ), get_bloginfo( 'name' ) ) );
    64                 /* translators: %s: token */
    65                 $message = wp_strip_all_tags( sprintf( __( 'Enter %s to log in.', 'wporg' ), $token ) );
    66 
    67                 $who = '@dd32';
    68 
    69                 return slack_dm( $subject . "\n" . $message, $who );
    70         }
    71 
    7275}
Note: See TracChangeset for help on using the changeset viewer.