@@ -145,8 +145,21 @@ func (c *external) Observe(ctx context.Context, mg resource.Managed) (managed.Ex
145145 }
146146
147147 var name string
148-
149- query := "SELECT name FROM sys.database_principals WHERE type = 'S' AND name = @p1"
148+ var query string
149+ var userType string
150+ if cr .Spec .ForProvider .Type == nil {
151+ userType = v1alpha1 .UserTypeLocal
152+ } else {
153+ userType = * cr .Spec .ForProvider .Type
154+ }
155+ switch userType {
156+ case v1alpha1 .UserTypeAD :
157+ query = "SELECT name FROM sys.database_principals WHERE type IN ('E','X') AND name = @p1"
158+ case v1alpha1 .UserTypeLocal :
159+ query = "SELECT name FROM sys.database_principals WHERE type = 'S' AND name = @p1"
160+ default :
161+ return managed.ExternalObservation {}, errors .Errorf ("Type '%s' is not valid" , * cr .Spec .ForProvider .Type )
162+ }
150163 err := c .userDB .Scan (ctx , xsql.Query {
151164 String : query , Parameters : []interface {}{
152165 meta .GetExternalName (cr ),
@@ -177,30 +190,44 @@ func (c *external) Create(ctx context.Context, mg resource.Managed) (managed.Ext
177190 if ! ok {
178191 return managed.ExternalCreation {}, errors .New (errNotUser )
179192 }
180-
181- pw , _ , err := c .getPassword (ctx , cr )
182- if err != nil {
183- return managed.ExternalCreation {}, err
193+ var loginQuery string
194+ var pw string
195+ userType := v1alpha1 .UserTypeLocal
196+ if cr .Spec .ForProvider .Type != nil {
197+ userType = * cr .Spec .ForProvider .Type
184198 }
185- if pw == "" {
186- pw , err = password .Generate ()
199+ switch userType {
200+ case v1alpha1 .UserTypeAD :
201+ loginQuery = fmt .Sprintf ("CREATE USER %s FROM EXTERNAL PROVIDER" , mssql .QuoteIdentifier (meta .GetExternalName (cr )))
202+ case v1alpha1 .UserTypeLocal :
203+ var err error
204+ pw , _ , err = c .getPassword (ctx , cr )
187205 if err != nil {
188206 return managed.ExternalCreation {}, err
189207 }
208+ if pw == "" {
209+ pw , err = password .Generate ()
210+ if err != nil {
211+ return managed.ExternalCreation {}, err
212+ }
213+ }
214+ loginQuery = fmt .Sprintf ("CREATE LOGIN %s WITH PASSWORD=%s" , mssql .QuoteIdentifier (meta .GetExternalName (cr )), mssql .QuoteValue (pw ))
215+ default :
216+ return managed.ExternalCreation {}, errors .Errorf ("Type '%s' is not valid" , * cr .Spec .ForProvider .Type )
190217 }
191-
192- loginQuery := fmt .Sprintf ("CREATE LOGIN %s WITH PASSWORD=%s" , mssql .QuoteIdentifier (meta .GetExternalName (cr )), mssql .QuoteValue (pw ))
193218 if err := c .loginDB .Exec (ctx , xsql.Query {
194219 String : loginQuery ,
195220 }); err != nil {
196221 return managed.ExternalCreation {}, errors .Wrapf (err , errCreateLogin , meta .GetExternalName (cr ))
197222 }
223+ if userType != v1alpha1 .UserTypeAD {
198224
199- userQuery := fmt .Sprintf ("CREATE USER %s FOR LOGIN %s" , mssql .QuoteIdentifier (meta .GetExternalName (cr )), mssql .QuoteIdentifier (meta .GetExternalName (cr )))
200- if err := c .userDB .Exec (ctx , xsql.Query {
201- String : userQuery ,
202- }); err != nil {
203- return managed.ExternalCreation {}, errors .Wrapf (err , errCreateUser , meta .GetExternalName (cr ))
225+ userQuery := fmt .Sprintf ("CREATE USER %s FOR LOGIN %s" , mssql .QuoteIdentifier (meta .GetExternalName (cr )), mssql .QuoteIdentifier (meta .GetExternalName (cr )))
226+ if err := c .userDB .Exec (ctx , xsql.Query {
227+ String : userQuery ,
228+ }); err != nil {
229+ return managed.ExternalCreation {}, errors .Wrapf (err , errCreateUser , meta .GetExternalName (cr ))
230+ }
204231 }
205232
206233 return managed.ExternalCreation {
@@ -213,23 +240,34 @@ func (c *external) Update(ctx context.Context, mg resource.Managed) (managed.Ext
213240 if ! ok {
214241 return managed.ExternalUpdate {}, errors .New (errNotUser )
215242 }
243+ if t := cr .Spec .ForProvider .Type ; t == nil || * t == v1alpha1 .UserTypeLocal {
216244
217- pw , changed , err := c .getPassword (ctx , cr )
218- if err != nil {
219- return managed.ExternalUpdate {}, err
220- }
221-
222- if changed {
223- query := fmt .Sprintf ("ALTER LOGIN %s WITH PASSWORD=%s" , mssql .QuoteIdentifier (meta .GetExternalName (cr )), mssql .QuoteValue (pw ))
224- if err := c .loginDB .Exec (ctx , xsql.Query {
225- String : query ,
226- }); err != nil {
227- return managed.ExternalUpdate {}, errors .Wrap (err , errUpdateUser )
245+ pw , changed , err := c .getPassword (ctx , cr )
246+ if err != nil {
247+ return managed.ExternalUpdate {}, err
228248 }
229249
230- return managed.ExternalUpdate {
231- ConnectionDetails : c .userDB .GetConnectionDetails (meta .GetExternalName (cr ), pw ),
232- }, nil
250+ if changed {
251+ query := fmt .Sprintf ("ALTER LOGIN %s WITH PASSWORD=%s" , mssql .QuoteIdentifier (meta .GetExternalName (cr )), mssql .QuoteValue (pw ))
252+ if err := c .userDB .Exec (ctx , xsql.Query {
253+ String : query ,
254+ }); err != nil {
255+ return managed.ExternalUpdate {}, errors .Wrap (err , errUpdateUser )
256+ }
257+
258+ if changed {
259+ query := fmt .Sprintf ("ALTER USER %s WITH PASSWORD=%s" , mssql .QuoteIdentifier (meta .GetExternalName (cr )), mssql .QuoteValue (pw ))
260+ if err := c .userDB .Exec (ctx , xsql.Query {
261+ String : query ,
262+ }); err != nil {
263+ return managed.ExternalUpdate {}, errors .Wrap (err , errUpdateUser )
264+ }
265+
266+ return managed.ExternalUpdate {
267+ ConnectionDetails : c .userDB .GetConnectionDetails (meta .GetExternalName (cr ), pw ),
268+ }, nil
269+ }
270+ }
233271 }
234272 return managed.ExternalUpdate {}, nil
235273}
0 commit comments