Guest User

Base Registro/Login SQLite (c/ Hash & s/ explicação)

a guest
Mar 5th, 2016
155
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.98 KB | None | 0 0
  1. /* ______________________________________
  2. |__SISTEMA_BASE_DE_REGISTRO_&_LOGIN__|
  3. |______________BY_F1N4L______________|
  4. |_____________05_03_2016_____________|
  5. |_______________v_0.3z_______________|
  6. */
  7.  
  8. #include < a_samp > // By SA:MP Team
  9. #include < sscanf2 > // By Y_Less
  10. #include < zcmd > // By Zeex
  11. native WP_Hash(buffer[], len, const str[]); // By Y_Less
  12.  
  13. #undef MAX_PLAYERS
  14. #define MAX_PLAYERS ( 50 )
  15.  
  16. #define DIALOG_LOGIN ( 100 )
  17. #define DIALOG_REGISTER ( 101 )
  18.  
  19. #define _UDB_ "Server.db"
  20. #define USER_DB "Users"
  21.  
  22. enum pInfo
  23. {
  24. pID,
  25. tkNOME[ MAX_PLAYER_NAME ],
  26. pSENHA[ 129 ],
  27. pADMIN,
  28.  
  29. bool: pLOGADO
  30. };
  31. new
  32. USER[ MAX_PLAYERS ][ pInfo ]
  33. ;
  34. new
  35. DB: User_Database
  36. ;
  37.  
  38. public OnFilterScriptInit ( )
  39. {
  40. new
  41. Query_User [ 500 ]
  42. ;
  43.  
  44. if ( ( User_Database = db_open ( _UDB_ ) ) == DB:0 )
  45. {
  46. SendRconCommand ( "exit" );
  47. }
  48. else
  49. {
  50. strcat ( Query_User, "CREATE TABLE IF NOT EXISTS `"USER_DB"`" );
  51. strcat ( Query_User, "(`ID` INTEGER PRIMARY KEY AUTOINCREMENT," );
  52. strcat ( Query_User, "`NOME` TEXT," );
  53. strcat ( Query_User, "`SENHA` TEXT," );
  54. strcat ( Query_User, "`ADMIN` NUMERIC )" );
  55. db_query ( User_Database, Query_User );
  56. }
  57.  
  58. return 1;
  59. }
  60.  
  61. public OnFilterScriptExit ( )
  62. {
  63. db_close ( User_Database );
  64. return 1;
  65. }
  66.  
  67. public OnPlayerConnect ( playerid )
  68. {
  69. new Reset[ pInfo ];
  70. USER[ playerid ] = Reset;
  71.  
  72. new
  73. Query_User [ 200 ],
  74. DBResult: Resultado
  75. ;
  76.  
  77. format ( Query_User, sizeof ( Query_User ) , "SELECT `SENHA` FROM `"USER_DB"` WHERE `NOME` = '%s'", DB_Escape ( pName ( playerid ) ) );
  78. Resultado = db_query ( User_Database, Query_User );
  79. if ( db_num_rows ( Resultado ) )
  80. {
  81. db_get_field_assoc ( Resultado, "SENHA", USER[ playerid ][ pSENHA ], 129 );
  82.  
  83. ShowPlayerDialog ( playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Painel de Login", "Bem Vindo novamente ao nosso servidor\nLogue-se para continuar de onde parou:", "LOGAR","SAIR" );
  84. }
  85. else
  86. {
  87. ShowPlayerDialog ( playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "Painel de Registro", "Bem Vindo ao nosso servidor\nRegistre-se para salvar seu dados:", "REGISTRAR","SAIR" );
  88. }
  89. db_query ( User_Database, Query_User );
  90. db_free_result ( Resultado );
  91.  
  92. return 1;
  93. }
  94.  
  95. public OnPlayerDisconnect ( playerid, reason )
  96. {
  97. new
  98. Query_User [ 500 ]
  99. ;
  100.  
  101. format ( Query_User, sizeof ( Query_User ) , "UPDATE `"USER_DB"` SET `ADMIN` = '%i' WHERE `NOME` = '%s'", USER[ playerid ][ pADMIN ], DB_Escape ( pName ( playerid ) ) );
  102. db_query ( User_Database, Query_User );
  103.  
  104. new Reset[ pInfo ];
  105. USER[ playerid ] = Reset;
  106.  
  107. return 1;
  108. }
  109.  
  110. public OnDialogResponse ( playerid, dialogid, response, listitem, inputtext[ ] )
  111. {
  112. if ( dialogid == DIALOG_REGISTER )
  113. {
  114. if ( response )
  115. {
  116. if ( !IsValidPassword ( inputtext ) )
  117. {
  118. ShowPlayerDialog ( playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "Painel de Registro", "Bem Vindo ao nosso servidor\nRegistre-se para salvar seu dados:", "REGISTRAR","SAIR" );
  119. SendClientMessage ( playerid, -1, "Utilize apenas LETRAS e NÚMEROS." );
  120. return 0;
  121. }
  122. if ( strlen ( inputtext ) < 3 || strlen ( inputtext ) > 20 )
  123. {
  124. ShowPlayerDialog ( playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "Painel de Registro", "Bem Vindo ao nosso servidor\nRegistre-se para salvar seu dados:", "REGISTRAR","SAIR" );
  125. SendClientMessage ( playerid, -1, "A senha deve ser entre 3-20." );
  126. return 0;
  127. }
  128.  
  129. new
  130. Query_User [ 500 ],
  131. HashPass[ 129 ]
  132. ;
  133.  
  134. WP_Hash ( HashPass, sizeof ( HashPass ), inputtext );
  135.  
  136. format ( Query_User, sizeof ( Query_User ) , "INSERT INTO `"USER_DB"` ( `NOME` ) VALUES ( '%s' ) ", DB_Escape ( pName ( playerid ) ) );
  137. db_query ( User_Database, Query_User );
  138. format ( Query_User, sizeof ( Query_User ) , "UPDATE `"USER_DB"` SET `SENHA` = '%s' WHERE `NOME` = '%s'", DB_Escape ( HashPass ) , DB_Escape ( pName ( playerid ) ) );
  139. db_query ( User_Database, Query_User );
  140. format ( Query_User, sizeof ( Query_User ) , "UPDATE `"USER_DB"` SET `ADMIN` = '0' WHERE `NOME` = '%s'", DB_Escape ( pName ( playerid ) ) );
  141. db_query ( User_Database, Query_User );
  142.  
  143. USER[playerid][pLOGADO] = true;
  144.  
  145. SendClientMessage ( playerid, -1, "Sua conta foir criada com sucesso e você foi automaticamente logado!" );
  146. }
  147. else
  148. {
  149. Kick(playerid);
  150. }
  151. }
  152. if ( dialogid == DIALOG_LOGIN )
  153. {
  154. if ( response )
  155. {
  156. new
  157. Query_User [ 500 ],
  158. HashPass[ 129 ],
  159. DBResult: Resultado
  160. ;
  161.  
  162. WP_Hash ( HashPass, sizeof ( HashPass ), inputtext );
  163.  
  164. if ( !strcmp ( HashPass, USER[ playerid ][ pSENHA ], false ) )
  165. {
  166. format ( Query_User, sizeof ( Query_User ) , "SELECT * FROM `"USER_DB"` WHERE `NOME` = '%s'", DB_Escape ( pName ( playerid ) ) );
  167. Resultado = db_query ( User_Database, Query_User );
  168. if ( db_num_rows ( Resultado ) )
  169. {
  170. db_get_field_assoc ( Resultado, "ID", Query_User, 3 );
  171. USER[ playerid ][ pID ] = strval ( Query_User );
  172.  
  173. db_get_field_assoc ( Resultado, "ADMIN", Query_User, 6 );
  174. USER[ playerid ][ pADMIN ] = strval ( Query_User );
  175. }
  176. db_query ( User_Database, Query_User );
  177. db_free_result ( Resultado );
  178.  
  179. SendClientMessage ( playerid, -1, "Você logou com sucesso!" );
  180.  
  181. USER[playerid][pLOGADO] = true;
  182. }
  183. else
  184. {
  185. SendClientMessage ( playerid, -1, "Você errou a senha!" );
  186. ShowPlayerDialog ( playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Painel de Login", "Bem Vindo novamente ao nosso servidor\nLogue-se para continuar de onde parou:", "LOGAR","SAIR" );
  187. }
  188. }
  189. else
  190. {
  191. Kick(playerid);
  192. }
  193. }
  194.  
  195. return 1;
  196. }
  197.  
  198. CMD:setlevel ( playerid, params[] )
  199. {
  200. new
  201. Target,
  202. Level,
  203. String[129]
  204. ;
  205.  
  206. if ( sscanf ( params, "ui", Target, Level ) ) return SendClientMessage(playerid, -1, "/SETLEVEL [ID] [LEVEL]");
  207.  
  208. format ( String, sizeof ( String ), "Admin %s setou level admin %i para o player %s", pName ( playerid ), Level, pName ( Target ) );
  209. SendClientMessageToAll(-1, String);
  210. format ( String, sizeof ( String ), "Admin %s setou seu level admin para %i", pName ( playerid ), Level );
  211. SendClientMessageToAll(-1, String);
  212.  
  213. USER[playerid][pADMIN] = Level;
  214.  
  215. return 1;
  216. }
  217.  
  218. stock pName ( playerid )
  219. {
  220. new
  221. GetName[ MAX_PLAYER_NAME ]
  222. ;
  223.  
  224. GetPlayerName ( playerid, GetName, sizeof ( GetName ) );
  225.  
  226. return GetName;
  227. }
  228.  
  229. stock DB_Escape ( text[ ] )
  230. {
  231. new
  232. ret[ 80 * 2 ],
  233. ch,
  234. i,
  235. j;
  236. while ( ( ch = text[ i++ ] ) && j < sizeof ( ret ) )
  237. {
  238. if ( ch == '\'' ) //'
  239. {
  240. if ( j < sizeof ( ret ) - 2 )
  241. {
  242. ret[ j++ ] = '\'';
  243. ret[ j++ ] = '\'';
  244. }
  245. }
  246. else if ( j < sizeof ( ret ) )
  247. {
  248. ret[ j++ ] = ch;
  249. }
  250. else
  251. {
  252. j++;
  253. }
  254. }
  255. ret[ sizeof ( ret ) - 1 ] = '\0';
  256. return ret;
  257. }
  258.  
  259. stock IsValidPassword ( const numeric[ ] )
  260. {
  261. for ( new i = 0; numeric[ i ] != EOS; ++i )
  262. {
  263. switch ( numeric[ i ] )
  264. {
  265. case '0'..'9', 'A'..'Z', 'a'..'z': continue;
  266. default: return 0;
  267. }
  268. }
  269. return 1;
  270. }
Advertisement
Add Comment
Please, Sign In to add comment