~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to plugin/mysql_protocol/mysql_protocol.cc

MErgeĀ Eric.

Show diffs side-by-side

added added

removed removed

Lines of Context:
28
28
 
29
29
#include "errmsg.h"
30
30
#include "mysql_protocol.h"
 
31
#include "mysql_password.h"
31
32
#include "options.h"
32
33
 
33
34
using namespace std;
48
49
static uint32_t retry_count;
49
50
static uint32_t buffer_length;
50
51
static char* bind_address;
 
52
static uint32_t random_seed1;
 
53
static uint32_t random_seed2;
 
54
static const uint32_t random_max= 0x3FFFFFFF;
 
55
static const double random_max_double= (double)0x3FFFFFFF;
51
56
 
52
57
const char* ListenMySQLProtocol::getHost(void) const
53
58
{
614
619
{
615
620
  uint32_t pkt_len= 0;
616
621
  char *end;
 
622
  char scramble[SCRAMBLE_LENGTH];
 
623
 
 
624
  makeScramble(scramble);
617
625
 
618
626
  // TCP/IP connection
619
627
  {
655
663
    end+= 4;
656
664
 
657
665
    /* We don't use scramble anymore. */
658
 
    memset(end, 'X', SCRAMBLE_LENGTH_323);
 
666
    memcpy(end, scramble, SCRAMBLE_LENGTH_323);
659
667
    end+= SCRAMBLE_LENGTH_323;
660
668
    *end++= 0; /* an empty byte for some reason */
661
669
 
667
675
    end+= 18;
668
676
 
669
677
    /* Write scramble tail. */
670
 
    memset(end, 'X', SCRAMBLE_LENGTH - SCRAMBLE_LENGTH_323);
 
678
    memcpy(end, scramble + SCRAMBLE_LENGTH_323, SCRAMBLE_LENGTH - SCRAMBLE_LENGTH_323);
671
679
    end+= (SCRAMBLE_LENGTH - SCRAMBLE_LENGTH_323);
672
680
    *end++= 0; /* an empty byte for some reason */
673
681
 
729
737
      passwd < (char *) net.read_pos + pkt_len)
730
738
  {
731
739
    passwd_len= (unsigned char)(*passwd++);
 
740
    if (passwd_len > 0)
 
741
    {
 
742
      session->getSecurityContext().setPasswordType(SecurityContext::MYSQL_HASH);
 
743
      session->getSecurityContext().setPasswordContext(scramble, SCRAMBLE_LENGTH);
 
744
    }
732
745
  }
733
746
  else
734
747
    passwd_len= 0;
844
857
  return buffer+8;
845
858
}
846
859
 
 
860
void ClientMySQLProtocol::makeScramble(char *scramble)
 
861
{
 
862
  /* This is the MySQL algorithm with minimal changes. */
 
863
  random_seed1= (random_seed1 * 3 + random_seed2) % random_max;
 
864
  random_seed2= (random_seed1 + random_seed2 + 33) % random_max;
 
865
  uint32_t seed= static_cast<uint32_t>((static_cast<double>(random_seed1) / random_max_double) * 0xffffffff);
 
866
 
 
867
  void *pointer= this;
 
868
  uint32_t pointer_seed;
 
869
  memcpy(&pointer_seed, &pointer, 4);
 
870
  uint32_t random1= (seed + pointer_seed) % random_max;
 
871
  uint32_t random2= (seed + global_thread_id + net.vio->sd) % random_max;
 
872
 
 
873
  for (char *end= scramble + SCRAMBLE_LENGTH; scramble != end; scramble++)
 
874
  {
 
875
    random1= (random1 * 3 + random2) % random_max;
 
876
    random2= (random1 + random2 + 33) % random_max;
 
877
    *scramble= static_cast<char>((static_cast<double>(random1) / random_max_double) * 94 + 33);
 
878
  }
 
879
}
 
880
 
847
881
static ListenMySQLProtocol *listen_obj= NULL;
 
882
plugin::Create_function<MySQLPassword> *mysql_password= NULL;
848
883
 
849
884
static int init(drizzled::plugin::Context &context)
850
885
{
 
886
  /* Initialize random seeds for the MySQL algorithm with minimal changes. */
 
887
  time_t seed_time= time(NULL);
 
888
  random_seed1= seed_time % random_max;
 
889
  random_seed2= (seed_time / 2) % random_max;
 
890
 
 
891
  mysql_password= new plugin::Create_function<MySQLPassword>(MySQLPasswordName);
 
892
  context.add(mysql_password);
 
893
 
851
894
  listen_obj= new ListenMySQLProtocol("mysql_protocol", true);
852
895
  context.add(listen_obj); 
 
896
 
853
897
  return 0;
854
898
}
855
899