Little mistake in loginserver :)

If you want to help us or give some corrections / codes, put it here ;)

Moderators: osRose dev team, ospRose dev team, osiRose dev team, Moderators

Little mistake in loginserver :)

Postby Juan on Tue Nov 10, 2009 2:27 pm

I checked your loginpacket.cpp and i noticed a mistake :
- change :
  1.  
  2. if( thisclient->accesslevel < Config.MinimumAccessLevel )
  3.                 { //The server are under inspection
  4.                     ADDBYTE( pak, 0 );
  5.                     ADDDWORD( pak, 0 );
  6.                     thisclient->SendPacket( &pak );
  7.                     DB->QFree( );
  8.                     return true;
  9.                 }
  10.                 if ( thisclient->accesslevel > 0 )
  11.                 {
  12.                     thisclient->userid = atoi(row[0]);
  13.                     thisclient->isLoggedIn = true;
  14.                     DB->QFree( );
  15.                     //OK!                
  16.                     ADDDWORD( pak, 0x0c000000 );
  17.                     ADDBYTE( pak, 0 );
  18.                     result = DB->QStore( "SELECT id,name FROM channels WHERE type=1" );
  19.                     if(result==NULL) return false;
  20.                     while( row = mysql_fetch_row(result) )
  21.                     {
  22.                         ADDBYTE( pak, 48 + atoi( row[0] ) );
  23.                         ADDSTRING( pak, row[1] );
  24.                         ADDBYTE( pak, 0 );
  25.                         ADDBYTE(pak, atoi( row[0] ) );
  26.                         ADDBYTE( pak, 0 );
  27.                         ADDWORD( pak, 0 );
  28.                     }
  29.                     DB->QFree( );
  30.                 }
  31.                 else{
  32.                     //BANNED
  33.                     ADDBYTE( pak, 5 );
  34.                     ADDDWORD( pak, 0 );
  35.                     DB->QFree( );
  36.                 }
  37.  


by :
  1.  
  2. if(thisclient ->accesslevel ==0)
  3. { //BANED
  4.                     ADDBYTE( pak, 5 );
  5.                     ADDDWORD( pak, 0 );
  6.                     DB->QFree( );
  7. }
  8. if( thisclient->accesslevel < Config.MinimumAccessLevel )
  9.                 { //The server are under inspection
  10.                     ADDBYTE( pak, 0 );
  11.                     ADDDWORD( pak, 0 );
  12.                     thisclient->SendPacket( &pak );
  13.                     DB->QFree( );
  14.                     return true;
  15.                 }
  16.                 if ( thisclient->accesslevel > 0 )
  17.                 {
  18.                     thisclient->userid = atoi(row[0]);
  19.                     thisclient->isLoggedIn = true;
  20.                     DB->QFree( );
  21.                     //OK!                
  22.                     ADDDWORD( pak, 0x0c000000 );
  23.                     ADDBYTE( pak, 0 );
  24.                     result = DB->QStore( "SELECT id,name FROM channels WHERE type=1" );
  25.                     if(result==NULL) return false;
  26.                     while( row = mysql_fetch_row(result) )
  27.                     {
  28.                         ADDBYTE( pak, 48 + atoi( row[0] ) );
  29.                         ADDSTRING( pak, row[1] );
  30.                         ADDBYTE( pak, 0 );
  31.                         ADDBYTE(pak, atoi( row[0] ) );
  32.                         ADDBYTE( pak, 0 );
  33.                         ADDWORD( pak, 0 );
  34.                     }
  35.                     DB->QFree( );
  36.                 }
  37.  


Else your code is a nonsense : a ban player will alway see "The server are under inspection" and not "Your account is ban"...

I found another mistake , but i can't remember where (it's was on the channel list , i think) :lol:
Last edited by lmame on Tue Nov 10, 2009 3:56 pm, edited 1 time in total.
Reason: Title changed.
User avatar
Juan
Rackie
Rackie
 
Posts: 219
Joined: Fri Oct 10, 2008 6:25 pm

Re: Little mistake :)

Postby amaedict on Tue Nov 10, 2009 2:32 pm

cool :)
We Have it all ... Image
Image
User avatar
amaedict
Clown
Clown
 
Posts: 531
Joined: Thu Apr 23, 2009 2:44 pm

Re: Little mistake :)

Postby Choseal on Tue Nov 10, 2009 2:42 pm

Awesome, that should save me some topics to answer. =P
Choseal
Electric Ghost
Electric Ghost
 
Posts: 837
Joined: Fri Jan 09, 2009 6:40 pm

Re: Little mistake :)

Postby lmame on Tue Nov 10, 2009 3:19 pm

Actually if the idea is good, your code is wrong:
  1.  
  2.  if(thisclient ->accesslevel ==0)
  3. { //BANED
  4.                     ADDBYTE( pak, 5 );
  5.                     ADDDWORD( pak, 0 );
  6.                     DB->QFree( );
  7. }
  8. if( thisclient->accesslevel < Config.MinimumAccessLevel )
  9.                 { //The server are under inspection
  10.                     ADDBYTE( pak, 0 );
  11.                     ADDDWORD( pak, 0 );
  12.                     thisclient->SendPacket( &pak );
  13.                     DB->QFree( );
  14.                     return true;
  15.                 }
  16.                 if ( thisclient->accesslevel > 0 )
  17.                 {
  18.                     thisclient->userid = atoi(row[0]);
  19.                     thisclient->isLoggedIn = true;
  20.                     DB->QFree( );
  21.                     //OK!                
  22.                     ADDDWORD( pak, 0x0c000000 );
  23.                     ADDBYTE( pak, 0 );
  24.                     result = DB->QStore( "SELECT id,name FROM channels WHERE type=1" );
  25.                     if(result==NULL) return false;
  26.                     while( row = mysql_fetch_row(result) )
  27.                     {
  28.                         ADDBYTE( pak, 48 + atoi( row[0] ) );
  29.                         ADDSTRING( pak, row[1] );
  30.                         ADDBYTE( pak, 0 );
  31.                         ADDBYTE(pak, atoi( row[0] ) );
  32.                         ADDBYTE( pak, 0 );
  33.                         ADDWORD( pak, 0 );
  34.                     }
  35.                     DB->QFree( );
  36.                 }
  37.  


Doing this if a player is indeed banned will send a corrupt packet since you'll send:
  1.                    //from if(thisclient ->accesslevel ==0)
  2.                     ADDBYTE( pak, 5 );
  3.                     ADDDWORD( pak, 0 );
  4.                     //from if( thisclient->accesslevel < Config.MinimumAccessLevel )
  5.                     ADDBYTE( pak, 0 );
  6.                     ADDDWORD( pak, 0 );


And it'll crash the server too because you made two consecutive "DB->QFree( );"

So you need to send the packet too when you test the accesslevel==0 so something like:
  1.  
  2.  
  3. if(thisclient ->accesslevel ==0)
  4. { //BANED
  5.                     ADDBYTE( pak, 5 );
  6.                     ADDDWORD( pak, 0 );
  7.                     thisclient->SendPacket( &pak );
  8.                     DB->QFree( );
  9.                     return true;
  10. }
  11. if( thisclient->accesslevel < Config.MinimumAccessLevel )
  12.                 { //The server are under inspection
  13.                     ADDBYTE( pak, 0 );
  14.                     ADDDWORD( pak, 0 );
  15.                     thisclient->SendPacket( &pak );
  16.                     DB->QFree( );
  17.                     return true;
  18.                 }
  19.                 if ( thisclient->accesslevel > 0 )
  20.                 {
  21.                     thisclient->userid = atoi(row[0]);
  22.                     thisclient->isLoggedIn = true;
  23.                     DB->QFree( );
  24.                     //OK!                
  25.                     ADDDWORD( pak, 0x0c000000 );
  26.                     ADDBYTE( pak, 0 );
  27.                     result = DB->QStore( "SELECT id,name FROM channels WHERE type=1" );
  28.                     if(result==NULL) return false;
  29.                     while( row = mysql_fetch_row(result) )
  30.                     {
  31.                         ADDBYTE( pak, 48 + atoi( row[0] ) );
  32.                         ADDSTRING( pak, row[1] );
  33.                         ADDBYTE( pak, 0 );
  34.                         ADDBYTE(pak, atoi( row[0] ) );
  35.                         ADDBYTE( pak, 0 );
  36.                         ADDWORD( pak, 0 );
  37.                     }
  38.                     DB->QFree( );
  39.                 }
  40.  
The world is full of love and peace ^_^
Image
User avatar
lmame
Admin
Admin
 
Posts: 8997
Joined: Mon Aug 06, 2007 4:42 pm
Location: July City

Re: Little mistake :)

Postby Juan on Tue Nov 10, 2009 3:33 pm

As i'm using C# and not C++ , i haven't think about DB->QFree( );
And for the rest i fixed it long times ago, i forget the problem ;)
  1. public bool pakUserLogin(ref User user, Packet rpack)
  2.         {
  3.             user.Account = rpack.GetString(32, (ushort)(rpack.packetBuffer.Length - 6 - 32));
  4.             user.password = rpack.GetString(0, 32);
  5.             SqlDataReader myReader;
  6.             SqlCommand AuthenticateCommand = new SqlCommand("UserAuthenticate", logindb.myConnection);
  7.             AuthenticateCommand.CommandType = System.Data.CommandType.StoredProcedure;
  8.  
  9.             SqlParameter parameterAccount = new SqlParameter("@Account", SqlDbType.NVarChar, 20);
  10.             parameterAccount.Value = user.Account;
  11.             AuthenticateCommand.Parameters.Add(parameterAccount);
  12.  
  13.             logindb.myConnection.Open();
  14.             myReader = AuthenticateCommand.ExecuteReader();
  15.  
  16.  
  17.             Packet pak = new Packet(0x708);
  18.             if (myReader.HasRows)
  19.             {
  20.                 myReader.Read();
  21.                 if (user.password == myReader["MD5PassWord"].ToString())
  22.                 {
  23.                     if ((bool)myReader["MailIsConfirm"])
  24.                     {
  25.                         user.accesslevel = (int)myReader["Right"];
  26.  
  27.                         if (user.accesslevel == 0)
  28.                         {
  29.                             // BANNED !!!
  30.                             Log.log(Log.LogType.MSG_WARNING, "A banned player tried to relog in his account : " + user.Account + user.GetIP(), ClientLogPath);
  31.                             pak.AddByte(5);
  32.                             pak.AddDword(0);
  33.                             pak.EndPacket();
  34.                             user.clientsock.SendPacket(pak);
  35.                             logindb.myConnection.Close();
  36.                             return true;
  37.                         }
  38.                         if (user.accesslevel >= login_acceslevel)
  39.                         {
  40.                             //Player correctly login :)
  41.                             Log.log(Log.LogType.MSG_NOTICE, "Player succefully login : " + user.Account + user.GetIP(), ClientLogPath);
  42.                             user.isLoggedIn = true;
  43.                             pak.AddDword(0x0c000000);
  44.                             pak.AddByte(0);
  45.                             for (byte i = 0; i < listServer.Count; i++)
  46.                             {
  47.                                 pak.AddByte((byte)(48 + i));
  48.                                 pak.AddString(listServer[i].name);
  49.                                 pak.AddByte(0);
  50.                                 pak.AddDword(i);                                                            
  51.                            
  52.                             }
  53.                            
  54.                            }
  55.                         else
  56.                         {
  57.                             //The server are under inspection
  58.                             pak.AddByte(0);
  59.                             pak.AddDword(0);
  60.                             pak.EndPacket();
  61.                             user.clientsock.SendPacket(pak);
  62.                             logindb.myConnection.Close();
  63.                             return true;
  64.                         }
  65.                     }
  66.                     else
  67.                     {
  68.                         //ACCOUNT ISN'T ACTIVATE
  69.                         pak.AddByte(9);
  70.                         pak.AddDword(0);
  71.                     }
  72.  
  73.  
  74.                 }
  75.                 else
  76.                 {
  77.                     //WRONG PASSWORD
  78.                     Log.log(Log.LogType.MSG_WARNING, "An user try to login with a wrong password : " + user.Account + user.GetIP(), ClientLogPath);
  79.                     pak.AddByte(3);
  80.                     pak.AddDword(0);
  81.                 }
  82.  
  83.                 logindb.myConnection.Close();
  84.             }
  85.             else
  86.             {
  87.                 //account doesn't exist
  88.                 logindb.myConnection.Close();
  89.  
  90.                 if (CreateLoginAccount)
  91.                 {
  92.                     //create an account
  93.                     SqlCommand CreateAccountCommand = new SqlCommand("InsertAccount", logindb.myConnection);
  94.                     CreateAccountCommand.CommandType = System.Data.CommandType.StoredProcedure;
  95.  
  96.                     SqlParameter parameterAccount2 = new SqlParameter("@Account", SqlDbType.NVarChar, 20);
  97.                     parameterAccount2.Value = user.Account;
  98.                     CreateAccountCommand.Parameters.Add(parameterAccount2);
  99.  
  100.                     SqlParameter parameterMD5Password = new SqlParameter("@MD5Password", SqlDbType.NVarChar, 32);
  101.                     parameterMD5Password.Value = user.password;
  102.                     CreateAccountCommand.Parameters.Add(parameterMD5Password);
  103.  
  104.                     SqlParameter parameterMLName = new SqlParameter("@MLName", SqlDbType.NVarChar, 32);
  105.                     parameterMLName.Value = "auto-account";
  106.                     CreateAccountCommand.Parameters.Add(parameterMLName);
  107.  
  108.                     SqlParameter parameterFName = new SqlParameter("@FName", SqlDbType.NVarChar, 32);
  109.                     parameterFName.Value = "auto-account";
  110.                     CreateAccountCommand.Parameters.Add(parameterFName);
  111.  
  112.                     SqlParameter parameterMName = new SqlParameter("@MName", SqlDbType.NVarChar, 32);
  113.                     parameterMName.Value = "auto-account";
  114.                     CreateAccountCommand.Parameters.Add(parameterMName);
  115.  
  116.                     SqlParameter parameterLName = new SqlParameter("@LName", SqlDbType.NVarChar, 32);
  117.                     parameterLName.Value = "auto-account";
  118.                     CreateAccountCommand.Parameters.Add(parameterLName);
  119.  
  120.                     SqlParameter parameterAddress = new SqlParameter("@Address", SqlDbType.NVarChar, 128);
  121.                     parameterAddress.Value = "auto-account";
  122.                     CreateAccountCommand.Parameters.Add(parameterAddress);
  123.  
  124.                     SqlParameter parameterCity = new SqlParameter("@City", SqlDbType.NVarChar, 20);
  125.                     parameterCity.Value = "auto-account";
  126.                     CreateAccountCommand.Parameters.Add(parameterCity);
  127.  
  128.                     SqlParameter parameterZipCode = new SqlParameter("@ZipCode", SqlDbType.VarChar, 7);
  129.                     parameterZipCode.Value = "a-a";
  130.                     CreateAccountCommand.Parameters.Add(parameterZipCode);
  131.  
  132.                     SqlParameter parameterEMail = new SqlParameter("@EMail", SqlDbType.VarChar, 32);
  133.                     parameterEMail.Value = "auto-account";
  134.                     CreateAccountCommand.Parameters.Add(parameterEMail);
  135.  
  136.                     SqlParameter parameterMailOpt = new SqlParameter("@MailOpt", SqlDbType.Char, 3);
  137.                     parameterMailOpt.Value = "a-a";
  138.                     CreateAccountCommand.Parameters.Add(parameterMailOpt);
  139.  
  140.                     SqlParameter parameterTel = new SqlParameter("@Tel", SqlDbType.VarChar, 16);
  141.                     parameterTel.Value = "a-a";
  142.                     CreateAccountCommand.Parameters.Add(parameterTel);
  143.  
  144.                     SqlParameter parameterNation = new SqlParameter("@Nation", SqlDbType.VarChar, 30);
  145.                     parameterNation.Value = "gros land";
  146.                     CreateAccountCommand.Parameters.Add(parameterNation);
  147.  
  148.                     SqlParameter parameterGender = new SqlParameter("@Gender", SqlDbType.Char, 1);
  149.                     parameterGender.Value = "M";
  150.                     CreateAccountCommand.Parameters.Add(parameterGender);
  151.  
  152.                     SqlParameter parameterBirthDay = new SqlParameter("@BirthDay", SqlDbType.Char, 8);
  153.                     parameterBirthDay.Value = "01/12/91";
  154.                     CreateAccountCommand.Parameters.Add(parameterBirthDay);
  155.  
  156.                     SqlParameter parameterAscPassWord = new SqlParameter("@AscPassWord", SqlDbType.VarChar, 16);
  157.                     parameterAscPassWord.Value = "auto-acc";
  158.                     CreateAccountCommand.Parameters.Add(parameterAscPassWord);
  159.  
  160.                     SqlParameter parameterCh_PW = new SqlParameter("@Ch_PW", SqlDbType.VarChar, 30);
  161.                     parameterCh_PW.Value = "auto-account";
  162.                     CreateAccountCommand.Parameters.Add(parameterCh_PW);
  163.  
  164.  
  165.  
  166.  
  167.                     logindb.myConnection.Open();
  168.                     CreateAccountCommand.ExecuteNonQuery();
  169.                     logindb.myConnection.Close();
  170.                     Log.log(Log.LogType.MSG_NOTICE, " New account created on the login : " + user.Account + user.GetIP(), ClientLogPath);
  171.  
  172.                 }
  173.  
  174.                 pak.AddByte(2);
  175.                 pak.AddDword(0);
  176.  
  177.             }
  178.             /*
  179.             1 - general error   | 4 - your account is already logged
  180.             2 - account doesn't exist 5 - banned player
  181.             3 -
  182.             6 - topup account   | 7 - cannot connect to server please try again
  183.             8 - server exceeded | 9 - account have not been verified
  184.             10 - login failed   | 11 - ip capacity is full
  185.             */
  186.             pak.EndPacket();
  187.             user.clientsock.SendPacket(pak);
  188.  
  189.             return true;
  190.         }
User avatar
Juan
Rackie
Rackie
 
Posts: 219
Joined: Fri Oct 10, 2008 6:25 pm

Re: Little mistake in loginserver :)

Postby lmame on Tue Nov 10, 2009 3:56 pm

Thanks anyway :)

Thread moved to "submit code" forum.
The world is full of love and peace ^_^
Image
User avatar
lmame
Admin
Admin
 
Posts: 8997
Joined: Mon Aug 06, 2007 4:42 pm
Location: July City

Re: Little mistake in loginserver :)

Postby lmame on Tue Nov 10, 2009 4:03 pm

In next rev it'll be simply:
  1.                if( thisclient->accesslevel>0&&thisclient->accesslevel < Config.MinimumAccessLevel )
  2.                 { //The server are under inspection
  3.                     ADDBYTE( pak, 0 );
  4.                     ADDDWORD( pak, 0 );
  5.                     thisclient->SendPacket( &pak );
  6.                     DB->QFree( );
  7.                     return true;
  8.                 }


This way I just have to change one line ^_^
The world is full of love and peace ^_^
Image
User avatar
lmame
Admin
Admin
 
Posts: 8997
Joined: Mon Aug 06, 2007 4:42 pm
Location: July City


Return to Submit Code

Who is online

Users browsing this forum: No registered users and 3 guests

cron