2 ===================================================================
3 --- mysql_conn.erl (revision 853)
4 +++ mysql_conn.erl (working copy)
7 %%--------------------------------------------------------------------
15 %%--------------------------------------------------------------------
16 %% Function: start(Host, Port, User, Password, Database, LogFun)
17 +%% Function: start(Host, Port, User, Password, Database, UserFlags, LogFun)
18 %% Function: start_link(Host, Port, User, Password, Database, LogFun)
22 %% Password = string()
23 %% Database = string()
24 +%% UserFlags = list()
25 %% LogFun = undefined | function() of arity 3
26 %% Descrip.: Starts a mysql_conn process that connects to a MySQL
27 %% server, logs in and chooses a database.
31 %%--------------------------------------------------------------------
32 -start(Host, Port, User, Password, Database, LogFun) when is_list(Host), is_integer(Port), is_list(User),
33 - is_list(Password), is_list(Database) ->
34 +start(Host, Port, User, Password, Database, LogFun) ->
35 + start(Host, Port, User, Password, Database, [], LogFun).
36 +start(Host, Port, User, Password, Database, UserFlags, LogFun) when is_list(Host), is_integer(Port), is_list(User),
37 + is_list(Password), is_list(Database), is_list(UserFlags) ->
40 - init(Host, Port, User, Password, Database, LogFun, ConnPid)
41 + init(Host, Port, User, Password, Database, UserFlags, LogFun, ConnPid)
43 post_start(Pid, LogFun).
45 start_link(Host, Port, User, Password, Database, LogFun) when is_list(Host), is_integer(Port), is_list(User),
46 - is_list(Password), is_list(Database) ->
47 + is_list(Password), is_list(Database) ->
49 Pid = spawn_link(fun () ->
50 - init(Host, Port, User, Password, Database, LogFun, ConnPid)
51 + init(Host, Port, User, Password, Database, [], LogFun, ConnPid)
53 post_start(Pid, LogFun).
56 %%====================================================================
58 %%--------------------------------------------------------------------
59 -%% Function: init(Host, Port, User, Password, Database, LogFun,
60 +%% Function: init(Host, Port, User, Password, Database, UserFlags, LogFun,
65 %% Password = string()
66 %% Database = string()
67 +%% UserFlags = list()
68 %% LogFun = undefined | function() of arity 3
69 %% Parent = pid() of process starting this mysql_conn
70 %% Descrip.: Connect to a MySQL server, log in and chooses a database.
72 %% we were successfull.
73 %% Returns : void() | does not return
74 %%--------------------------------------------------------------------
75 -init(Host, Port, User, Password, Database, LogFun, Parent) ->
76 +init(Host, Port, User, Password, Database, UserFlags, LogFun, Parent) ->
77 case mysql_recv:start_link(Host, Port, LogFun, self()) of
78 {ok, RecvPid, Sock} ->
79 - case mysql_init(Sock, RecvPid, User, Password, LogFun) of
80 + case mysql_init(Sock, RecvPid, User, Password, UserFlags, LogFun) of
82 case do_query(Sock, RecvPid, LogFun, "use " ++ Database, Version) of
85 %% Returns : ok | {error, Reason}
87 %%--------------------------------------------------------------------
88 -mysql_init(Sock, RecvPid, User, Password, LogFun) ->
89 +mysql_init(Sock, RecvPid, User, Password, UserFlags, LogFun) ->
90 case do_recv(LogFun, RecvPid, undefined) of
91 {ok, Packet, InitSeqNum} ->
92 {Version, Salt1, Salt2, Caps} = greeting(Packet, LogFun),
94 case Caps band ?SECURE_CONNECTION of
96 - mysql_auth:do_new_auth(Sock, RecvPid, InitSeqNum + 1, User, Password, Salt1, Salt2, LogFun);
97 + mysql_auth:do_new_auth(Sock, RecvPid, InitSeqNum + 1, User, Password, UserFlags, Salt1, Salt2, LogFun);
99 - mysql_auth:do_old_auth(Sock, RecvPid, InitSeqNum + 1, User, Password, Salt1, LogFun)
100 + mysql_auth:do_old_auth(Sock, RecvPid, InitSeqNum + 1, User, Password, UserFlags, Salt1, LogFun)
103 {ok, <<0:8, _Rest/binary>>, _RecvNum} ->
104 Index: mysql_auth.erl
105 ===================================================================
106 --- mysql_auth.erl (revision 853)
107 +++ mysql_auth.erl (working copy)
109 %% External exports (should only be used by the 'mysql_conn' module)
110 %%--------------------------------------------------------------------
118 %%--------------------------------------------------------------------
120 %% Descrip.: Perform old-style MySQL authentication.
121 %% Returns : result of mysql_conn:do_recv/3
122 %%--------------------------------------------------------------------
123 -do_old_auth(Sock, RecvPid, SeqNum, User, Password, Salt1, LogFun) ->
124 +do_old_auth(Sock, RecvPid, SeqNum, User, Password, UserFlags, Salt1, LogFun) ->
125 Auth = password_old(Password, Salt1),
126 - Packet2 = make_auth(User, Auth),
127 + Packet2 = make_auth(User, Auth, UserFlags),
128 do_send(Sock, Packet2, SeqNum, LogFun),
129 mysql_conn:do_recv(LogFun, RecvPid, SeqNum).
132 %% Descrip.: Perform MySQL authentication.
133 %% Returns : result of mysql_conn:do_recv/3
134 %%--------------------------------------------------------------------
135 -do_new_auth(Sock, RecvPid, SeqNum, User, Password, Salt1, Salt2, LogFun) ->
136 +do_new_auth(Sock, RecvPid, SeqNum, User, Password, UserFlags, Salt1, Salt2, LogFun) ->
137 Auth = password_new(Password, Salt1 ++ Salt2),
138 - Packet2 = make_new_auth(User, Auth, none),
139 + Packet2 = make_new_auth(User, Auth, none, UserFlags),
140 do_send(Sock, Packet2, SeqNum, LogFun),
141 case mysql_conn:do_recv(LogFun, RecvPid, SeqNum) of
142 {ok, Packet3, SeqNum2} ->
146 %% part of do_old_auth/4, which is part of mysql_init/4
147 -make_auth(User, Password) ->
148 - Caps = ?LONG_PASSWORD bor ?LONG_FLAG bor ?TRANSACTIONS,
149 +make_auth(User, Password, UserFlags) ->
150 + Flags = lists:append(UserFlags, [?LONG_PASSWORD, ?LONG_FLAG, ?TRANSACTIONS]),
151 + Caps = lists:foldl(fun(Flag, TCaps) when is_integer(Flag) ->
155 UserB = list_to_binary(User),
156 PasswordB = Password,
157 @@ -113,15 +116,19 @@
160 %% part of do_new_auth/4, which is part of mysql_init/4
161 -make_new_auth(User, Password, Database) ->
162 +make_new_auth(User, Password, Database, UserFlags) ->
163 DBCaps = case Database of
169 - Caps = ?LONG_PASSWORD bor ?LONG_FLAG bor ?TRANSACTIONS bor
170 - ?PROTOCOL_41 bor ?SECURE_CONNECTION bor DBCaps,
172 + Flags = lists:append(UserFlags, [?LONG_PASSWORD, ?LONG_FLAG, ?TRANSACTIONS, ?PROTOCOL_41, ?SECURE_CONNECTION]),
173 + Caps = lists:foldl(fun(Flag, TCaps) when is_integer(Flag) ->
175 + end, DBCaps, Flags),
177 Maxsize = ?MAX_PACKET_SIZE,
178 UserB = list_to_binary(User),
179 PasswordL = size(Password),