Making WordPress.org


Ignore:
Timestamp:
02/26/2018 07:06:12 AM (8 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.