testldap.go 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. package main
  2. import (
  3. "crypto/hmac"
  4. "crypto/rand"
  5. "crypto/sha256"
  6. "fmt"
  7. "git.wecise.com/wecise/common/modb"
  8. "git.wecise.com/wecise/common/common"
  9. lp "git.wecise.com/wecise/common/ldap"
  10. "git.wecise.com/wecise/odb-go/odb"
  11. "hash"
  12. "sort"
  13. "strings"
  14. )
  15. func main() {
  16. db, err := getDB()
  17. if err != nil {
  18. fmt.Printf(err.Error())
  19. }
  20. // init data
  21. rands := getRandomString(10)
  22. salt := getRandomString(10)
  23. enAdminPasswd := PBKDF2([]byte("admin"), []byte(salt), 10000, 50, sha256.New)
  24. adminPasswd := fmt.Sprintf("%x", enAdminPasswd)
  25. users := []*lp.Object{
  26. {
  27. Id: "/", Parent: "", UserName: "/", FullName: "/",
  28. Passwd: "", Otype: "org", Lft: 0,
  29. },
  30. {
  31. Id: "/admin", Parent: "/", UserName: "admin", FullName: "/admin",
  32. Passwd: adminPasswd, Otype: "usr", Rands: rands, Salt: salt, IsAdmin: true, IsActive: true,
  33. },
  34. }
  35. buildTree(users[0].Parent, users[0].Lft, users)
  36. // Truncate ldap and group
  37. if _, err = db.Query("delete from /matrix/ldap with version").Do(); err != nil {
  38. fmt.Printf(err.Error())
  39. }
  40. if _, err = db.Query("delete from /matrix/group with version").Do(); err != nil {
  41. fmt.Printf(err.Error())
  42. }
  43. for _, u := range users {
  44. if err = createObjectFromObject("/matrix/ldap", u, db); err != nil {
  45. fmt.Printf(err.Error())
  46. }
  47. }
  48. // Create group
  49. res, err := db.Query("select id, username, fullname, parent from /matrix/ldap where otype = 'org' refresh").Do()
  50. if err != nil {
  51. fmt.Printf(err.Error())
  52. }
  53. orgs := res.Data
  54. mql := `insert into /matrix/group (parent, name, fullname, isldap, member) values (?, ?, ?, ?, ?)`
  55. var adminMember []string
  56. for _, org := range orgs {
  57. usrsRes, err := db.Query("select fullname, isadmin from /matrix/ldap where parent = '" + org["fullname"].(string) + "' and otype = 'usr' refresh").Do()
  58. if err != nil {
  59. fmt.Printf(err.Error())
  60. }
  61. usrs := usrsRes.Data
  62. var memeber []string
  63. for i := range usrs {
  64. umem := "U" + usrs[i]["fullname"].(string)
  65. memeber = append(memeber, umem)
  66. if usrs[i]["isadmin"].(bool) {
  67. adminMember = append(adminMember, umem)
  68. }
  69. }
  70. if org["fullname"].(string) == "/" {
  71. continue
  72. }
  73. if _, err = db.Query(mql, "", org["username"], org["fullname"], true, memeber).Do(); err != nil {
  74. fmt.Printf(err.Error())
  75. }
  76. // Update org grpset
  77. if _, err = db.Query("update /matrix/ldap set grpset = grpset + '" + org["fullname"].(string) + "' where fullname = '" + org["fullname"].(string) + "'").Do(); err != nil {
  78. fmt.Printf(err.Error())
  79. }
  80. }
  81. // Create admin group
  82. if _, err = db.Query(mql, "", "admin", "/admin", false, adminMember).Do(); err != nil {
  83. fmt.Printf(err.Error())
  84. }
  85. for _, ufn := range adminMember {
  86. if _, err = db.Query("update /matrix/ldap set grpset = grpset + '/admin' where fullname = '" + ufn[1:] + "'").Do(); err != nil {
  87. fmt.Printf(err.Error())
  88. }
  89. }
  90. }
  91. func buildTree(parent string, left int, tree []*lp.Object) int {
  92. right := left + 1
  93. // get children
  94. children := make([]*lp.Object, 0)
  95. for _, c := range tree {
  96. if c.Parent == parent {
  97. children = append(children, c)
  98. }
  99. }
  100. // range children to recursive
  101. for _, n := range children {
  102. right = buildTree(n.FullName, right, tree)
  103. }
  104. // set node left and right
  105. for i, c := range tree {
  106. if c.FullName == parent {
  107. tree[i].Lft = left
  108. tree[i].Rgt = right
  109. }
  110. }
  111. return right + 1
  112. }
  113. // GetRandomString generate random string by specify chars.
  114. // E:\Develop\golocal\src\janesware.com\web\modules\base\tool.go
  115. func getRandomString(n int, alphabets ...byte) string {
  116. const alphanum = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
  117. var bytes = make([]byte, n)
  118. _, _ = rand.Read(bytes)
  119. for i, b := range bytes {
  120. if len(alphabets) == 0 {
  121. bytes[i] = alphanum[b%byte(len(alphanum))]
  122. } else {
  123. bytes[i] = alphabets[b%byte(len(alphabets))]
  124. }
  125. }
  126. return string(bytes)
  127. }
  128. // http://code.google.com/p/go/source/browse/pbkdf2/pbkdf2.go?repo=crypto
  129. // E:\Develop\golocal\src\janesware.com\web\modules\base\tool.go
  130. func PBKDF2(password, salt []byte, iter, keyLen int, h func() hash.Hash) []byte {
  131. prf := hmac.New(h, password)
  132. hashLen := prf.Size()
  133. numBlocks := (keyLen + hashLen - 1) / hashLen
  134. var buf [4]byte
  135. dk := make([]byte, 0, numBlocks*hashLen)
  136. U := make([]byte, hashLen)
  137. for block := 1; block <= numBlocks; block++ {
  138. // N.B.: || means concatenation, ^ means XOR
  139. // for each block T_i = U_1 ^ U_2 ^ ... ^ U_iter
  140. // U_1 = PRF(password, salt || uint(i))
  141. prf.Reset()
  142. prf.Write(salt)
  143. buf[0] = byte(block >> 24)
  144. buf[1] = byte(block >> 16)
  145. buf[2] = byte(block >> 8)
  146. buf[3] = byte(block)
  147. prf.Write(buf[:4])
  148. dk = prf.Sum(dk)
  149. T := dk[len(dk)-hashLen:]
  150. copy(U, T)
  151. // U_n = PRF(password, U_(n-1))
  152. for n := 2; n <= iter; n++ {
  153. prf.Reset()
  154. prf.Write(U)
  155. U = U[:0]
  156. U = prf.Sum(U)
  157. for x := range U {
  158. T[x] ^= U[x]
  159. }
  160. }
  161. }
  162. return dk[:keyLen]
  163. }
  164. func createObjectFromObject(class string, u *lp.Object, db odb.Client) error {
  165. m := make(map[string]interface{})
  166. if err := common.Struct2Map(&u, &m); err != nil {
  167. return err
  168. }
  169. var (
  170. mql string
  171. fields []string
  172. qms []string
  173. values []interface{}
  174. )
  175. if len(m) != 0 {
  176. for k := range m {
  177. if k != "class" {
  178. fields = append(fields, k)
  179. }
  180. }
  181. if len(fields) != 0 {
  182. sort.Strings(fields)
  183. for _, k := range fields {
  184. qms = append(qms, "?")
  185. values = append(values, m[k])
  186. }
  187. mql = fmt.Sprintf(`insert into %s (%s) values (%s)`, class, strings.Join(fields, ", "), strings.Join(qms, ", "))
  188. fmt.Println(mql)
  189. fmt.Println( values...)
  190. if _, err := db.Query(mql, values...).Do(); err != nil {
  191. return err
  192. }
  193. }
  194. }
  195. return nil
  196. }
  197. func getDB() (odb.Client, error) {
  198. if db, err := modb.New("ootest"); err != nil {
  199. return nil, err
  200. } else {
  201. return db, nil
  202. }
  203. }