Compare commits
1054 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| e4ec23919d | |||
| 1c095b609a | |||
| a819514e43 | |||
| 16cd93d587 | |||
| a8e5984f5f | |||
| 1a45637860 | |||
| 8cb3f61f88 | |||
| 4bc4f54e43 | |||
| 08774b1b5a | |||
| 300e765e20 | |||
| 951599be21 | |||
| 8bea14837e | |||
| 09250d6121 | |||
| 5968b35320 | |||
| f364fcda56 | |||
| 170874e115 | |||
| bec499a4a1 | |||
| d6709bd53a | |||
| 1cd1dd9f23 | |||
| af198dbe92 | |||
| 80ff4ad3d3 | |||
| 6e1691e2fa | |||
| e52c324a5e | |||
| e7b1f21e1c | |||
| a2d2581199 | |||
| eedd9496e4 | |||
| 3d4775d555 | |||
| 7f11f4a1fb | |||
| 612f15ab17 | |||
| af9ff6f1a1 | |||
| 9664de5242 | |||
| b13c51c8cf | |||
| 8229ee8dd8 | |||
| 476acbfa44 | |||
| 23dd81d18c | |||
| f08595b0e5 | |||
| 50b8500bd5 | |||
| 1cacd48261 | |||
| cf11acc450 | |||
| 0c18dd7068 | |||
| 4e807d69e8 | |||
| a61b7b1d98 | |||
| a55c85252f | |||
| 0168e39bb3 | |||
| 8f8b6870a0 | |||
| dc7208ed1c | |||
| 60b0b918a6 | |||
| d9e2d4e6a9 | |||
| 8fc80178b6 | |||
| c801bd9411 | |||
| b9d5a3350d | |||
| 2bb0095a32 | |||
| eda360914e | |||
| 042172eae1 | |||
| 0eaab78f67 | |||
| 5ec65571f8 | |||
| 7bbc98b04c | |||
| eda6b80ece | |||
| 2ddb7be19a | |||
| 04f20a21fb | |||
| 40ae9b33ef | |||
| e2357ecd96 | |||
| 0116287405 | |||
| 6ee534b262 | |||
| 42f72a49b1 | |||
| 771acc3ac7 | |||
| 5706aaa89c | |||
| c17bbc8859 | |||
| 8f317c0059 | |||
| d1c654a7e1 | |||
| ae5c31b06d | |||
| b09cda5c17 | |||
| 7887392c1d | |||
| cc2b7d2832 | |||
| 0a69935b6b | |||
| 4b7c74415f | |||
| 418baf4fa6 | |||
| fcf647738d | |||
| 3c9ab9e53d | |||
| c339c9b2ad | |||
| 4ef32bb18f | |||
| 0f87034539 | |||
| acee58f6bb | |||
| ceeef24faa | |||
| 201b0b3725 | |||
| 5f8b41a357 | |||
| a003ef556b | |||
| cb91e10803 | |||
| 5190866a24 | |||
| 473a58e3c2 | |||
| 3e6b88cbc3 | |||
| 362d7f617d | |||
| d11df52abf | |||
| 906161b27f | |||
| 347e8b28ef | |||
| c85c2796f4 | |||
| df72de96ae | |||
| e1f8233d08 | |||
| 38d2a27c56 | |||
| 6a42119292 | |||
| 89787875d4 | |||
| d76ae701cd | |||
| c4db156ad2 | |||
| d95778ea16 | |||
| a9b452fba9 | |||
| afed9e919e | |||
| 5252dcbd2c | |||
| a5cfac76dd | |||
| 45aa32f6fe | |||
| 2372e30150 | |||
| f3b55596b2 | |||
| 84eee8d5a7 | |||
| a800a5d4df | |||
| dfa47556d1 | |||
| 77111aeec1 | |||
| c9ac75474f | |||
| 0fcaef0566 | |||
| 031c7412a8 | |||
| 594ff79514 | |||
| 8f3f74a6d7 | |||
| ff2050b301 | |||
| 89ea1dd1c4 | |||
| 66902b788b | |||
| ec8cb81c0d | |||
| 1a24ac62e5 | |||
| 78fb913a00 | |||
| e521c8368a | |||
| ac8c536b50 | |||
| 84d9ee07b4 | |||
| ab9ac62138 | |||
| beaf351ba4 | |||
| 37d3a4e1f5 | |||
| 566c046cd5 | |||
| df921fef40 | |||
| 56e7affdfd | |||
| bef66dba24 | |||
| e62af41fa8 | |||
| 472089a328 | |||
| c4d582ace4 | |||
| a4e320c263 | |||
| 7d3d008940 | |||
| 3be9c27509 | |||
| 3ef6e4c834 | |||
| a15e689386 | |||
| 7c8a452b00 | |||
| e5d202a0bf | |||
| 083dfe01ea | |||
| f0c745b916 | |||
| 9ff1a80db4 | |||
| 5480ee29fd | |||
| 0d4b0b4218 | |||
| cfe396e155 | |||
| 2163cbb22e | |||
| 6b3f228327 | |||
| e58e6a09dd | |||
| 2d05ddd466 | |||
| 975f4c56d4 | |||
| 8eef2f02bf | |||
| 2f7c69fd14 | |||
| 02eeebd41a | |||
| 99610c3357 | |||
| aad740f34c | |||
| a70c72e50e | |||
| a2fdc75730 | |||
| b82789f11d | |||
| 6b7d70adf6 | |||
| 10f10a2fd3 | |||
| 35c4e740ab | |||
| e3085a4d48 | |||
| e8d008c392 | |||
| 674ab27700 | |||
| 9442a583bc | |||
| 9787416e88 | |||
| fbe2995696 | |||
| 33251cd5a8 | |||
| f387934886 | |||
| fb39b163df | |||
| 011535f0de | |||
| 75d3152a0f | |||
| 6c94d040fa | |||
| e8921d79ba | |||
| db8bd0126b | |||
| 6719d9669b | |||
| 8b13226d00 | |||
| 545f9ce525 | |||
| 437f68a9f3 | |||
| 7f1e9d3972 | |||
| 453e249de3 | |||
| 8688030d7a | |||
| 6e2003c2e2 | |||
| 5ed8959eba | |||
| 7623ebd327 | |||
| 522eb0fe9d | |||
| 7dd171322d | |||
| 752652e56c | |||
| 2582a478ab | |||
| 52ff5de564 | |||
| ba793af8b7 | |||
| 3304ecd1f0 | |||
| 4e0394cab3 | |||
| eaa963a840 | |||
| 31c13cc1c8 | |||
| 310aa7a00d | |||
| fafd605d4d | |||
| 078f3583f0 | |||
| 0b337329ba | |||
| f5df63554f | |||
| 46c4f46451 | |||
| e034864c12 | |||
| 91f38cc849 | |||
| e616d2686f | |||
| 5a09d671ab | |||
| 58d49d2867 | |||
| 8bb58ba3c3 | |||
| 017ce4e092 | |||
| 49859683b0 | |||
| 169b83b36d | |||
| 86435ba9aa | |||
| 431c34709c | |||
| cf6d67ceed | |||
| e2d6bc95a4 | |||
| ef0cf5d3d7 | |||
| 06f570f4ff | |||
| 730dfe8fc7 | |||
| e99ecf6d06 | |||
| 83c7da3831 | |||
| 8dc4dd7f3b | |||
| 66b7caafe0 | |||
| 7c0b2f5425 | |||
| 4645885180 | |||
| 472d046426 | |||
| 613d175f37 | |||
| 5619d39bd3 | |||
| 959e0ff1c9 | |||
| 2c228e6414 | |||
| 82468bff00 | |||
| 5f82846732 | |||
| 09c75af15c | |||
| 91964b1aba | |||
| af2e9169e6 | |||
| 4637e2c66b | |||
| 1f1a98d7ae | |||
| cea23b055b | |||
| 41a0eae0bd | |||
| 5fab00011e | |||
| ca5f028016 | |||
| b43444f674 | |||
| 866085c918 | |||
| 585c5afd1a | |||
| 6ec5c7c4d8 | |||
| 6b3875814c | |||
| a63bbe8a23 | |||
| bc118986b7 | |||
| 3a51c801e1 | |||
| 983da9c887 | |||
| 8d8dee5acf | |||
| 92feebd0fa | |||
| 0b423eb287 | |||
| f7b6446c74 | |||
| deb87f2dfa | |||
| 7d7c739cb3 | |||
| b1e2538488 | |||
| 7b9e59d15d | |||
| 794d0bbe69 | |||
| 60d422eb8e | |||
| 52df4fa024 | |||
| f7ffdfa15d | |||
| 4900ac31a7 | |||
| 6ebebdd02d | |||
| 112a18f966 | |||
| 7d623d5eb4 | |||
| 4819738e8f | |||
| e30e7686e3 | |||
| 290432c0ee | |||
| 6563267055 | |||
| ecf7b0282e | |||
| ea6e85d926 | |||
| b4d107301d | |||
| 948318ca19 | |||
| 89aa7baa5b | |||
| fead37d1c5 | |||
| 95928a7cd4 | |||
| 1ecc9ac48c | |||
| eaecb9b65c | |||
| 288196c7e8 | |||
| 2948cddebf | |||
| 438dc57def | |||
| 4d64fbb0ac | |||
| 0283c6cdfe | |||
| d4e7b0cda0 | |||
| e0781d9217 | |||
| bcdae19141 | |||
| 6edbbded40 | |||
| 684cac274d | |||
| ce7b008b8f | |||
| a3c58f2896 | |||
| f04fe5f743 | |||
| 3839f1055a | |||
| 66a5aff323 | |||
| 94350ddb3a | |||
| 5746c08f72 | |||
| 919cdc27db | |||
| 2029e39299 | |||
| 39acf823ef | |||
| 2ea9e6ed59 | |||
| 707bb0a321 | |||
| 298a4a3acf | |||
| 21c75ebce5 | |||
| 262157c88d | |||
| 37107af7b4 | |||
| 13a9ca65a4 | |||
| d3369c83e7 | |||
| 48308042b6 | |||
| d30ad8ba28 | |||
| cf973f27bb | |||
| 87df27109a | |||
| 32e0a88edc | |||
| bd91e2da16 | |||
| 89e4e822bf | |||
| b89d4c7476 | |||
| ee968b5573 | |||
| 1f97740cfa | |||
| f3d24b6a07 | |||
| d1377da151 | |||
| 07cfc000ea | |||
| d471be26cf | |||
| 31f6a9e66e | |||
| d736c47649 | |||
| 944791e888 | |||
| 0656377165 | |||
| 0e4806820e | |||
| 1a419972d2 | |||
| 98b150e1a4 | |||
| 3850b91571 | |||
| 7b0174a626 | |||
| 2270df86d9 | |||
| a04131c6d7 | |||
| 96800e9b75 | |||
| e5830253b9 | |||
| c1d479f863 | |||
| b7a07087d1 | |||
| adf56dedf3 | |||
| 4be7984a0e | |||
| 3b0b318730 | |||
| 6bfd8b8e9a | |||
| 39bc499b10 | |||
| de4d4a4bbb | |||
| 8631dd14e9 | |||
| e7d12f4b9e | |||
| f17a531e15 | |||
| ff57c8a58c | |||
| 499b884c67 | |||
| 0c261fb903 | |||
| 322263fd5c | |||
| 845f5cabec | |||
| f919349173 | |||
| a91ae03dc6 | |||
| faed7698c2 | |||
| eb8347f92b | |||
| c53ffe6dc5 | |||
| 7c8eab4f43 | |||
| b1d8168dd3 | |||
| c196c1f5e5 | |||
| 604563af76 | |||
| 6848d3affe | |||
| 6708914e99 | |||
| 5921f9c506 | |||
| 6193ed63b1 | |||
| 18dd0d08cb | |||
| 8dd6f128bf | |||
| 04267930de | |||
| d83716dece | |||
| c77358bdc1 | |||
| 44987479a5 | |||
| 30d89abf66 | |||
| f175be6b78 | |||
| 2a41ca0628 | |||
| c4f9a050c9 | |||
| 1babae067d | |||
| 32ff6b56eb | |||
| 33c0ebb100 | |||
| cb9aecf35e | |||
| d5b4d67858 | |||
| 9f4ae07100 | |||
| 32fc36b17d | |||
| 3ae4797848 | |||
| 33766a124d | |||
| ede8d57373 | |||
| 86f0a9790d | |||
| 54acf9bde4 | |||
| 2494e39c9e | |||
| 8f27a697c0 | |||
| 07fdd089a0 | |||
| c9a712a16a | |||
| d6e81ac06b | |||
| 228a587fc5 | |||
| e432ff58f9 | |||
| b8969f68e0 | |||
| dbb2d1c229 | |||
| 609b7ed5c5 | |||
| 3eca0259f7 | |||
| 20f3fc96c3 | |||
| 76a174a007 | |||
| 0fde148a9f | |||
| 6b0eb1f09d | |||
| f3c90ee266 | |||
| 2482c9c5ed | |||
| da555fb908 | |||
| 7ae7d6315f | |||
| eccb499346 | |||
| 0c1796ea40 | |||
| 826fab9999 | |||
| 3b95108a3a | |||
| ab2a298ebf | |||
| 8b5fa88b6f | |||
| de712e5ccb | |||
| ffdf5cb206 | |||
| f1a91108ef | |||
| ffe063a0e9 | |||
| d74f02e367 | |||
| 0da2107974 | |||
| 1994c8a174 | |||
| 2434be4803 | |||
| b0b371d23a | |||
| d6fcee4faa | |||
| 41d028d101 | |||
| 75fc431fb8 | |||
| 917d1be994 | |||
| 900b013658 | |||
| dd772404c5 | |||
| 84486dcb2c | |||
| 9a190f3bc4 | |||
| c76bbdf16f | |||
| 24c5063b99 | |||
| bed5e80ef9 | |||
| a0f8a2c3a4 | |||
| 3edea6c806 | |||
| 9ccdb5d78b | |||
| abebabc487 | |||
| 1ee6eae684 | |||
| 24852b9be8 | |||
| e80b92b481 | |||
| 5bef1a8f77 | |||
| 4f1637fa40 | |||
| 573a84b2ec | |||
| 796cb6634b | |||
| bb5480756a | |||
| edb030f49a | |||
| 0ed4ceebea | |||
| 31f7eadfca | |||
| 1c72c45404 | |||
| 75f8e174dc | |||
| f8fd9969e1 | |||
| 8d09655a89 | |||
| a06b627631 | |||
| e690afc33b | |||
| 493b664f19 | |||
| cb41c8ef80 | |||
| d4cea0f78f | |||
| 4d20abd7b6 | |||
| 351ad528f9 | |||
| 006da5589e | |||
| 5f32dd3959 | |||
| a9269df2aa | |||
| a7d82d6ecb | |||
| 5b10b58c9f | |||
| ae24f7d787 | |||
| 83014fb77b | |||
| 1dfd9fd568 | |||
| f655ab2ffc | |||
| 1a4722e909 | |||
| 369fefd5a8 | |||
| cc0aa707c4 | |||
| 7e14b2d46a | |||
| 1e88c3f180 | |||
| 49ee637a5c | |||
| 71f085fec0 | |||
| 302294faec | |||
| caa84e2731 | |||
| b6a637c121 | |||
| 60009ece44 | |||
| 2787df035c | |||
| 32da749041 | |||
| 0cbd702419 | |||
| 15f664af26 | |||
| d673ff5fad | |||
| f112df2cfc | |||
| 35644cf73c | |||
| 6cc6c04c4a | |||
| b9e1bc34da | |||
| f4d0b201ad | |||
| aff99097e7 | |||
| 18f6b02065 | |||
| 33544569fb | |||
| 529ab22a79 | |||
| 9f6afab09c | |||
| 2137c03da1 | |||
| 58fe9d3345 | |||
| deb5e45bff | |||
| bd1df027c6 | |||
| 20290cab01 | |||
| adcf2d5c4e | |||
| 8faafc5b0d | |||
| 370093afde | |||
| 32d3d1626b | |||
| d4d28e038b | |||
| 41fad8956b | |||
| d6a076dae8 | |||
| 2cacf21d51 | |||
| 0874b93e7c | |||
| f0c32433dc | |||
| ba9094a089 | |||
| bfebcebeb7 | |||
| 78f50c58bf | |||
| 1c0b99e162 | |||
| f850bcbbc9 | |||
| 133b8d42a3 | |||
| 7bc879c6f4 | |||
| f7d532f2f7 | |||
| 3785b3e951 | |||
| 70e1545d3a | |||
| 8aaf9bffa0 | |||
| d65b785f5d | |||
| 9aabd59a1f | |||
| 8806fdc1c2 | |||
| dfbf32ecba | |||
| 17abbf3d82 | |||
| 1922bf21f0 | |||
| dfbfd90f8c | |||
| c98ddeb59f | |||
| 613214da18 | |||
| 84c1cf8033 | |||
| 38693a670b | |||
| 5a0cfe7e2b | |||
| 714dce84db | |||
| a97a60a888 | |||
| b807b21a59 | |||
| 49365da481 | |||
| 70e84021f2 | |||
| 24e033ac79 | |||
| 658ab235ba | |||
| 2f16a160c0 | |||
| 4a2f62062e | |||
| 4f4c8eb61e | |||
| 3952888f94 | |||
| 9b145385af | |||
| 897b46c31d | |||
| 72299ab078 | |||
| e7ab83b612 | |||
| 07cf6f09b8 | |||
| 252ee6228b | |||
| cf6264f507 | |||
| 4f1ececbd1 | |||
| 70bf5b4eda | |||
| f59a979f7c | |||
| 05e3893f60 | |||
| 7d7621c67c | |||
| 33d4126290 | |||
| 449e56ed52 | |||
| aded966370 | |||
| dac1f328d7 | |||
| 87315e92a8 | |||
| 90ea752046 | |||
| 494add4fd0 | |||
| 3b7458bbc2 | |||
| f05a4d1638 | |||
| 75d2cbcb14 | |||
| f9fa168d84 | |||
| e4b3bd5005 | |||
| 5ad1d08b89 | |||
| dcb068c7ad | |||
| 2d32d2f25e | |||
| abcbcd1f2c | |||
| 18fd67b311 | |||
| b116957982 | |||
| a1f20a5bc0 | |||
| e0d14c3b8d | |||
| 1548a18b5e | |||
| 339fa6e41b | |||
| db0962804d | |||
| 677d8b1a29 | |||
| 850218c2df | |||
| 1c89914382 | |||
| 307e57a105 | |||
| fe40a9c5f6 | |||
| bc0ae5a017 | |||
| 8e68e89816 | |||
| 91ab7e029b | |||
| c3a88c713b | |||
| 1564060c6c | |||
| f39ccd73c5 | |||
| fd52f2cb7d | |||
| f91eb52890 | |||
| ca59a7f027 | |||
| 01689bc6b9 | |||
| 6dea2d2307 | |||
| 024a80d41f | |||
| f485109c39 | |||
| bde46896d6 | |||
| 0c30b012f7 | |||
| 650b2802b5 | |||
| 6ddc66db9f | |||
| 14b39a0ee4 | |||
| 792512459d | |||
| 0359e345b0 | |||
| a09c319357 | |||
| 36166aa40e | |||
| a25c9c5df3 | |||
| 6e3a9ac4fd | |||
| e380eee223 | |||
| 1959546ff9 | |||
| 92f5509b35 | |||
| f4c74c147b | |||
| 0edda6150b | |||
| 1a2e6b02ab | |||
| 56bf156b6f | |||
| 5632901820 | |||
| 92b6c12420 | |||
| 062d58026a | |||
| 7ef85dddea | |||
| 4a9e7f0a3a | |||
| bd43505db9 | |||
| cffe224d4a | |||
| 15c27c9ddd | |||
| a2e1d2030a | |||
| 149f8e2b45 | |||
| 4c8b034874 | |||
| 2ab31cb613 | |||
| b47c50145d | |||
| b9f4daca46 | |||
| 606c207e21 | |||
| 03870f962c | |||
| 405e9b24b0 | |||
| d9c01e8ed9 | |||
| 3c51ca06d5 | |||
| 02cfb11a6d | |||
| 4e875c7fb7 | |||
| 3e9c9fc750 | |||
| fbcb9bb154 | |||
| 6242fd2bb8 | |||
| 1c566057f8 | |||
| aa59d8f1f0 | |||
| 6dd35923b0 | |||
| b9bbe19d4c | |||
| 44b2002504 | |||
| faf422202f | |||
| eb884c80d0 | |||
| b83dd9f954 | |||
| fd828c3e9b | |||
| 79648ce853 | |||
| ddc94a8c96 | |||
| aa413d63da | |||
| 548be4cf3d | |||
| 21f2817f40 | |||
| 31e4ccf78b | |||
| bfedd21c98 | |||
| 0e5b0b43fa | |||
| 8258f5940b | |||
| c890b17834 | |||
| f0a848ef45 | |||
| 9f3cdad3f7 | |||
| 931866ee33 | |||
| 20d66e6736 | |||
| 731c9b86e0 | |||
| 955343f6aa | |||
| 1b73ac5118 | |||
| 9ee8191939 | |||
| f2231a2282 | |||
| 3e24408710 | |||
| 3e67200d64 | |||
| 6374b5b1e7 | |||
| 26ac75bdc9 | |||
| 1d1496a667 | |||
| e34eebb5ad | |||
| 776930fa06 | |||
| 38af7c85a6 | |||
| b3facf092a | |||
| 99b7a285d7 | |||
| 19e20f75d7 | |||
| b8d6aee1ce | |||
| 48b768b5b0 | |||
| bd604945c9 | |||
| 0a59ebe405 | |||
| 32eaa01929 | |||
| baf9363bdf | |||
| 12aaa0125b | |||
| cb7cd9abb8 | |||
| ca701e1675 | |||
| 9b88fd6646 | |||
| 76ca7ae7f0 | |||
| 1ab223568d | |||
| 043effc3ce | |||
| 4fd1a8ba63 | |||
| 36303fb4be | |||
| 62357b9589 | |||
| 808029b868 | |||
| cfd377b98e | |||
| 6eeb355a22 | |||
| a0e2e943b4 | |||
| 78931d8efa | |||
| 0d2a8cd04f | |||
| 97087eb3b9 | |||
| 6eeef62ce4 | |||
| 0ccff15599 | |||
| 325fb8caef | |||
| 18ef908759 | |||
| 1f1d2bd5f5 | |||
| 0c484369c9 | |||
| 100f2e9a13 | |||
| 510fd8cf73 | |||
| 080922a3de | |||
| cb7d8c8ead | |||
| c47252aea1 | |||
| f96074057c | |||
| dfaeb3bc88 | |||
| c31f59e326 | |||
| 7c2b9eaf97 | |||
| 79f5251d69 | |||
| 917e8640c2 | |||
| c4bc0e7252 | |||
| 1f16e4783c | |||
| 7f3a5066c6 | |||
| 6f3713a67d | |||
| abfb4a2841 | |||
| f672fd0824 | |||
| 60b36beda8 | |||
| c4289095e0 | |||
| 31757116fc | |||
| 70c1e1d0b1 | |||
| 2f68733708 | |||
| dccaff0544 | |||
| 184ec38510 | |||
| 2d59efb515 | |||
| 195d22d906 | |||
| ab80513755 | |||
| 8a116411bb | |||
| bd3889b6ec | |||
| 400fb69f15 | |||
| 9da45d40c7 | |||
| 23db206ea1 | |||
| 964b7b6b67 | |||
| 9c5f34794a | |||
| eca7588abf | |||
| a15d583d4d | |||
| e03c453c78 | |||
| aea394861d | |||
| 641dc7d695 | |||
| 0a1b0498a6 | |||
| a6858a6ce4 | |||
| f4beeb1706 | |||
| 2e33904bb8 | |||
| 75298b4c27 | |||
| 2d3bbd43d7 | |||
| 011464e6ac | |||
| 6c0e9ef575 | |||
| ca62271a89 | |||
| c96a1805e8 | |||
| babff870a8 | |||
| 5cd3de9cd7 | |||
| 437d8c6b7c | |||
| 440eef74e9 | |||
| c849552177 | |||
| 6134c67df4 | |||
| aa60140ba8 | |||
| 59135cac6f | |||
| 8d69d4aaba | |||
| 426b7ca769 | |||
| b61d16dd33 | |||
| 807af3c08a | |||
| c53e8012b2 | |||
| fe04d57284 | |||
| d07424365d | |||
| 70fe2948b9 | |||
| 0f3bd782c4 | |||
| 91cf9194d8 | |||
| e2dbad6242 | |||
| 84d4a1619b | |||
| 16fae4d117 | |||
| 76f7548935 | |||
| a5166f3946 | |||
| 2d08dcf11a | |||
| 7af47b9dbe | |||
| 437da38342 | |||
| 801ee586b7 | |||
| 6ff3fda14b | |||
| cfca2b502a | |||
| e1a4ae8264 | |||
| 19826858a4 | |||
| 0c2677bc50 | |||
| d1c1902687 | |||
| 11b00b92e9 | |||
| a5230c46c2 | |||
| 95ce77f80d | |||
| c10e43f95f | |||
| eeffc77a1a | |||
| 254686ab46 | |||
| 4a6fc46713 | |||
| bde3bce1e7 | |||
| f76dcd0d48 | |||
| 7da8d9e4e3 | |||
| a93f4f7750 | |||
| ac87749d55 | |||
| 3a7d02dbd3 | |||
| 350af319bf | |||
| 50b747041f | |||
| 36df8c9035 | |||
| 58a5ed9cdc | |||
| 5ea909885e | |||
| f81473fc65 | |||
| 1f2c9b7971 | |||
| c13940e1de | |||
| b6dcd41225 | |||
| db2baa8f84 | |||
| a894d25b1f | |||
| a93991bef2 | |||
| 7127d067c8 | |||
| ba326eb976 | |||
| fd50b2169b | |||
| 00d8b2ac30 | |||
| cac23c39c9 | |||
| a5813b798f | |||
| 8e5297f4c3 | |||
| 191cd2af3c | |||
| f2cfee11de | |||
| 3278f019cb | |||
| e2c3925b7d | |||
| b0c79c57b0 | |||
| 8ea523889b | |||
| b44c462b0e | |||
| 0987700a27 | |||
| ff4f052bb1 | |||
| 100b821c1a | |||
| 893c47a2e0 | |||
| 694af69982 | |||
| c576f340f9 | |||
| 179a0cf255 | |||
| a45ecb70ff | |||
| df1ab9149f | |||
| cb54444f00 | |||
| c77e7fbb7d | |||
| 40625b29f2 | |||
| 2624f3ba51 | |||
| 44832e12b3 | |||
| caa8d0c411 | |||
| 7e72d18292 | |||
| b0a81778af | |||
| 652774a83c | |||
| 2aea503a2a | |||
| 0d8aacb3e7 | |||
| e6be70943f | |||
| c86e4faba3 | |||
| c3c06ccd1c | |||
| 18b569a356 | |||
| 261acfce54 | |||
| c8567f1de2 | |||
| 8a0ccfc401 | |||
| 35a0e27d04 | |||
| 73f7b2ba38 | |||
| 8a693df6e6 | |||
| c41bdea1f1 | |||
| cccbf7de12 | |||
| 660a2735f0 | |||
| 77136bccdf | |||
| b8b6fc0da5 | |||
| 8ecf8d7e27 | |||
| 4134edf8de | |||
| a77d53d738 | |||
| 49a3424a26 | |||
| 92a60ff7fd | |||
| 33c7d36a95 | |||
| 6c7316cbdd | |||
| 09da9eeb95 | |||
| 76d4ba66b2 | |||
| f284fc3284 | |||
| c29b2fda99 | |||
| 86a59fb469 | |||
| 31da259a75 | |||
| 363711a370 | |||
| bf98fa0c01 | |||
| cd923838c3 | |||
| a22ebd3c49 | |||
| 353d16b8ef | |||
| 6bb0dc12f1 | |||
| ad00ec1518 | |||
| c75b7b2b12 | |||
| c754c91ad1 | |||
| c03140d4be | |||
| 6952324509 | |||
| 4b5ef8f2ce | |||
| d87fff1a4c | |||
| ea8aa1f25b | |||
| 8fe6ed011d | |||
| 35cde6787d | |||
| 3024bb0cbf | |||
| f8dd973373 | |||
| 23b28ec60f | |||
| 972440c2ca | |||
| b14899d41a | |||
| d2d8a09b4a | |||
| 1ea09b09a2 | |||
| 071c0a1afe | |||
| 4ed00c3d1f | |||
| 59ae9bea76 | |||
| 7be707f7bc | |||
| c9ff370278 | |||
| 8ab8da82c4 | |||
| 4b6a42f539 | |||
| 8a251ccafe | |||
| 550363cd52 | |||
| 367353100b | |||
| 5113d28bb4 | |||
| c8df607173 | |||
| c8033833f9 | |||
| cf4f0dbe6d | |||
| 200815dcdb | |||
| 2d1c416daf | |||
| 3aaebe98f4 | |||
| 8c4884d665 | |||
| 26f6eebaa9 | |||
| ac84267b22 | |||
| 2ee7642816 | |||
| bf63d09d80 | |||
| 5030f35558 | |||
| d7930d7f82 | |||
| 28c4c87956 | |||
| d0b7cd599b | |||
| cc1839a250 | |||
| 7d37715f8b | |||
| 091b4568d5 | |||
| cc0503fd5e | |||
| 4862251f34 | |||
| 987d796439 | |||
| 628571f8cf | |||
| 42ddc297fe | |||
| e82db8cc7f | |||
| 10d43c7cc6 | |||
| d539fd28c1 | |||
| 12e00c57f9 | |||
| 0c95cf7e61 | |||
| d106f741d9 | |||
| 6c96157d1b | |||
| a42a012f94 | |||
| 7e90d6cf92 | |||
| e19ac27803 | |||
| c100cbedd1 | |||
| 4c2e7e38a1 | |||
| fa22b23435 | |||
| c3c23a04f6 | |||
| ae6545989e | |||
| baeb3d076e | |||
| 0ac5684bf0 | |||
| 715cc5ea3b | |||
| d9e2931ed9 | |||
| 1531541331 | |||
| b7e02cc42e | |||
| 3ab90c9d3a | |||
| 1b7948f50a | |||
| fe23dbd76e | |||
| 21d2f4efab | |||
| f66f049ef3 | |||
| 49dd83e731 | |||
| 9cd2d5e0cf | |||
| fab705dc13 | |||
| a84f8bc9ef | |||
| 2477b735bf | |||
| 8db328af60 | |||
| bc2280be70 | |||
| a28aaa1fdd | |||
| afa0f4d403 | |||
| 0e5b930b22 | |||
| 7d8f8a7e99 | |||
| a7924adee9 | |||
| d4ec7a2f01 | |||
| e0fab19345 | |||
| 4646a5dbb8 | |||
| 1567592ac7 | |||
| 3b735c269c | |||
| 5bdef05f12 | |||
| 077626c40a | |||
| c544384c83 | |||
| d56522c8a0 | |||
| b83e77ca21 | |||
| 361400691d | |||
| ba9247c530 | |||
| 91d22109c8 | |||
| cb702a770d | |||
| db059bdfaf | |||
| 2291a6afea | |||
| af7fe0c21e | |||
| 7ce3291603 | |||
| 07e870271e | |||
| a5f8aeb6da | |||
| 1777ecd15a | |||
| d4d45f3a50 | |||
| 9900be3d68 | |||
| b88372c313 | |||
| e4aab7f749 | |||
| 42cbd0c1c4 | |||
| 9318678e08 | |||
| bd992bcb87 | |||
| 01d2bcfd92 | |||
| 0bfda4e628 | |||
| a2f659a2c6 | |||
| 9a04a60c7d | |||
| 7238ab6f05 | |||
| dd954ef1c2 | |||
| f1b8853339 | |||
| 479a2adaae | |||
| dd3c939025 | |||
| 767e7d65ef | |||
| 5feb20afd0 | |||
| 9038bbd3e7 | |||
| 506fbbe7f7 | |||
| 08f1f55e0c | |||
| 5ea9a0ddb7 | |||
| d4e0fab06b | |||
| 217aaf78f9 | |||
| 2ee788e0bf | |||
| f0f4b2719c | |||
| 406a31c8be | |||
| c32332898b | |||
| 4bbf6684b4 | |||
| 9476d8a2c3 | |||
| 6ac46c6171 | |||
| 6ae8b9c4d6 | |||
| 39119192a1 | |||
| 25e4038623 | |||
| f58d03c12e | |||
| 58590cf08d | |||
| cce57310b0 | |||
| 516d369174 | |||
| 7fc1207661 | |||
| 951808658d | |||
| cd9e1621f9 | |||
| 650966ce2c | |||
| 2a99af8cce | |||
| 3ba0061ada | |||
| 705c5b4c1c | |||
| 6ae1f62469 | |||
| 1c00a9713d | |||
| 5e7d8868c0 | |||
| 55dbdf5dba | |||
| 2ff291899d | |||
| 2d375e0429 | |||
| 4669ae0a81 | |||
| c2362db03d | |||
| 1405e9d375 | |||
| 84c4d75735 | |||
| 41aa693896 | |||
| 44b282474a | |||
| 70cfcb1008 | |||
| fa28c8baf6 | |||
| 584fa98564 | |||
| 214c62bf9c |
+18
@@ -0,0 +1,18 @@
|
||||
#
|
||||
# You can add personal rules in your file .git/info/exclude
|
||||
*.swp
|
||||
*~
|
||||
/contrib/extract_translations/extract_translations.beam
|
||||
/doc/*.aux
|
||||
/doc/*.haux
|
||||
/doc/*.html
|
||||
/doc/*.htoc
|
||||
/doc/*.idx
|
||||
/doc/*.ilg
|
||||
/doc/*.ind
|
||||
/doc/*.log
|
||||
/doc/*.out
|
||||
/doc/*.pdf
|
||||
/doc/*.toc
|
||||
/doc/contributed_modules.tex
|
||||
/doc/version.tex
|
||||
+238
@@ -0,0 +1,238 @@
|
||||
REBAR = @REBAR@
|
||||
INSTALL = @INSTALL@
|
||||
SED = @SED@
|
||||
ERL = @ERL@
|
||||
|
||||
prefix = @prefix@
|
||||
exec_prefix = @exec_prefix@
|
||||
|
||||
DESTDIR =
|
||||
|
||||
# /etc/ejabberd/
|
||||
ETCDIR = $(DESTDIR)@sysconfdir@/ejabberd
|
||||
|
||||
# /sbin/
|
||||
SBINDIR = $(DESTDIR)@sbindir@
|
||||
|
||||
# /lib/ejabberd/
|
||||
EJABBERDDIR = $(DESTDIR)@libdir@/ejabberd
|
||||
|
||||
# /share/doc/ejabberd
|
||||
PACKAGE_TARNAME = @PACKAGE_TARNAME@
|
||||
datarootdir = @datarootdir@
|
||||
DOCDIR = $(DESTDIR)@docdir@
|
||||
|
||||
# /usr/lib/ejabberd/ebin/
|
||||
BEAMDIR = $(EJABBERDDIR)/ebin
|
||||
|
||||
# /usr/lib/ejabberd/include/
|
||||
INCLUDEDIR = $(EJABBERDDIR)/include
|
||||
|
||||
# /usr/lib/ejabberd/priv/
|
||||
PRIVDIR = $(EJABBERDDIR)/priv
|
||||
|
||||
# /usr/lib/ejabberd/priv/bin
|
||||
PBINDIR = $(PRIVDIR)/bin
|
||||
|
||||
# /usr/lib/ejabberd/priv/lib
|
||||
SODIR = $(PRIVDIR)/lib
|
||||
|
||||
# /usr/lib/ejabberd/priv/msgs
|
||||
MSGSDIR = $(PRIVDIR)/msgs
|
||||
|
||||
# /var/lib/ejabberd/
|
||||
SPOOLDIR = $(DESTDIR)@localstatedir@/lib/ejabberd
|
||||
|
||||
# /var/lock/ejabberdctl
|
||||
CTLLOCKDIR = $(DESTDIR)@localstatedir@/lock/ejabberdctl
|
||||
|
||||
# /var/lib/ejabberd/.erlang.cookie
|
||||
COOKIEFILE = $(SPOOLDIR)/.erlang.cookie
|
||||
|
||||
# /var/log/ejabberd/
|
||||
LOGDIR = $(DESTDIR)@localstatedir@/log/ejabberd
|
||||
|
||||
INSTALLUSER=@INSTALLUSER@
|
||||
# if no user was enabled, don't set privileges or ownership
|
||||
ifeq ($(INSTALLUSER),)
|
||||
O_USER=
|
||||
G_USER=
|
||||
CHOWN_COMMAND=echo
|
||||
CHOWN_OUTPUT=/dev/null
|
||||
INIT_USER=root
|
||||
else
|
||||
O_USER=-o $(INSTALLUSER)
|
||||
G_USER=-g $(INSTALLUSER)
|
||||
CHOWN_COMMAND=chown
|
||||
CHOWN_OUTPUT=&1
|
||||
INIT_USER=$(INSTALLUSER)
|
||||
endif
|
||||
|
||||
all: deps src
|
||||
|
||||
deps:
|
||||
$(REBAR) get-deps
|
||||
|
||||
src:
|
||||
$(REBAR) compile
|
||||
|
||||
translations:
|
||||
contrib/extract_translations/prepare-translation.sh -updateall
|
||||
|
||||
doc:
|
||||
echo making $$target in doc; \
|
||||
(cd doc && $(MAKE) $$target) || exit 1
|
||||
|
||||
edoc:
|
||||
$(ERL) -noinput +B -eval \
|
||||
'case edoc:application(ejabberd, ".", []) of ok -> halt(0); error -> halt(1) end.'
|
||||
|
||||
install: all
|
||||
#
|
||||
# Configuration files
|
||||
$(INSTALL) -d -m 750 $(G_USER) $(ETCDIR)
|
||||
[ -f $(ETCDIR)/ejabberd.cfg ] \
|
||||
&& $(INSTALL) -b -m 640 $(G_USER) ejabberd.cfg.example $(ETCDIR)/ejabberd.cfg-new \
|
||||
|| $(INSTALL) -b -m 640 $(G_USER) ejabberd.cfg.example $(ETCDIR)/ejabberd.cfg
|
||||
$(SED) -e "s*{{rootdir}}*@prefix@*" \
|
||||
-e "s*{{installuser}}*@INSTALLUSER@*" \
|
||||
-e "s*{{libdir}}*@libdir@*" \
|
||||
-e "s*{{sysconfdir}}*@sysconfdir@*" \
|
||||
-e "s*{{localstatedir}}*@localstatedir@*" \
|
||||
-e "s*{{docdir}}*@docdir@*" \
|
||||
-e "s*{{erl}}*@ERL@*" ejabberdctl.template \
|
||||
> ejabberdctl.example
|
||||
[ -f $(ETCDIR)/ejabberdctl.cfg ] \
|
||||
&& $(INSTALL) -b -m 640 $(G_USER) ejabberdctl.cfg.example $(ETCDIR)/ejabberdctl.cfg-new \
|
||||
|| $(INSTALL) -b -m 640 $(G_USER) ejabberdctl.cfg.example $(ETCDIR)/ejabberdctl.cfg
|
||||
$(INSTALL) -b -m 644 $(G_USER) inetrc $(ETCDIR)/inetrc
|
||||
#
|
||||
# Administration script
|
||||
[ -d $(SBINDIR) ] || $(INSTALL) -d -m 755 $(SBINDIR)
|
||||
$(INSTALL) -m 550 $(G_USER) ejabberdctl.example $(SBINDIR)/ejabberdctl
|
||||
#
|
||||
# Init script
|
||||
$(SED) -e "s*@ctlscriptpath@*$(SBINDIR)*" \
|
||||
-e "s*@installuser@*$(INIT_USER)*" ejabberd.init.template \
|
||||
> ejabberd.init
|
||||
chmod 755 ejabberd.init
|
||||
#
|
||||
# Binary Erlang files
|
||||
$(INSTALL) -d $(BEAMDIR)
|
||||
$(INSTALL) -m 644 ebin/*.app $(BEAMDIR)
|
||||
$(INSTALL) -m 644 ebin/*.beam $(BEAMDIR)
|
||||
$(INSTALL) -m 644 deps/*/ebin/*.app $(BEAMDIR)
|
||||
$(INSTALL) -m 644 deps/*/ebin/*.beam $(BEAMDIR)
|
||||
rm -f $(BEAMDIR)/configure.beam
|
||||
#
|
||||
# ejabberd header files
|
||||
$(INSTALL) -d $(INCLUDEDIR)
|
||||
$(INSTALL) -m 644 include/*.hrl $(INCLUDEDIR)
|
||||
$(INSTALL) -m 644 deps/*/include/*.hrl $(INCLUDEDIR)
|
||||
#
|
||||
# Binary C programs
|
||||
$(INSTALL) -d $(PBINDIR)
|
||||
$(INSTALL) -m 750 $(O_USER) tools/captcha.sh $(PBINDIR)
|
||||
#
|
||||
# Binary system libraries
|
||||
$(INSTALL) -d $(SODIR)
|
||||
#$(INSTALL) -m 644 priv/lib/*.so $(SODIR)
|
||||
$(INSTALL) -m 644 deps/*/priv/lib/*.so $(SODIR)
|
||||
#
|
||||
# Translated strings
|
||||
$(INSTALL) -d $(MSGSDIR)
|
||||
$(INSTALL) -m 644 priv/msgs/*.msg $(MSGSDIR)
|
||||
#
|
||||
# Spool directory
|
||||
$(INSTALL) -d -m 750 $(O_USER) $(SPOOLDIR)
|
||||
$(CHOWN_COMMAND) -R @INSTALLUSER@ $(SPOOLDIR) >$(CHOWN_OUTPUT)
|
||||
chmod -R 750 $(SPOOLDIR)
|
||||
[ ! -f $(COOKIEFILE) ] || { $(CHOWN_COMMAND) @INSTALLUSER@ $(COOKIEFILE) >$(CHOWN_OUTPUT) ; chmod 400 $(COOKIEFILE) ; }
|
||||
#
|
||||
# ejabberdctl lock directory
|
||||
$(INSTALL) -d -m 750 $(O_USER) $(CTLLOCKDIR)
|
||||
$(CHOWN_COMMAND) -R @INSTALLUSER@ $(CTLLOCKDIR) >$(CHOWN_OUTPUT)
|
||||
chmod -R 750 $(CTLLOCKDIR)
|
||||
#
|
||||
# Log directory
|
||||
$(INSTALL) -d -m 750 $(O_USER) $(LOGDIR)
|
||||
$(CHOWN_COMMAND) -R @INSTALLUSER@ $(LOGDIR) >$(CHOWN_OUTPUT)
|
||||
chmod -R 750 $(LOGDIR)
|
||||
#
|
||||
# Documentation
|
||||
$(INSTALL) -d $(DOCDIR)
|
||||
$(INSTALL) -m 644 doc/dev.html $(DOCDIR)
|
||||
$(INSTALL) -m 644 doc/guide.html $(DOCDIR)
|
||||
$(INSTALL) -m 644 doc/*.png $(DOCDIR)
|
||||
$(INSTALL) -m 644 doc/*.txt $(DOCDIR)
|
||||
[ -f doc/guide.pdf ] \
|
||||
&& $(INSTALL) -m 644 doc/guide.pdf $(DOCDIR) \
|
||||
|| echo "No doc/guide.pdf was built"
|
||||
$(INSTALL) -m 644 COPYING $(DOCDIR)
|
||||
|
||||
uninstall: uninstall-binary
|
||||
|
||||
uninstall-binary:
|
||||
rm -f $(SBINDIR)/ejabberdctl
|
||||
rm -fr $(DOCDIR)
|
||||
rm -f $(BEAMDIR)/*.beam
|
||||
rm -f $(BEAMDIR)/*.app
|
||||
rm -fr $(BEAMDIR)
|
||||
rm -f $(INCLUDEDIR)/*.hrl
|
||||
rm -fr $(INCLUDEDIR)
|
||||
rm -fr $(PBINDIR)
|
||||
rm -f $(SODIR)/*.so
|
||||
rm -fr $(SODIR)
|
||||
rm -f $(MSGSDIR)/*.msgs
|
||||
rm -fr $(MSGSDIR)
|
||||
rm -fr $(PRIVDIR)
|
||||
rm -fr $(EJABBERDDIR)
|
||||
|
||||
uninstall-all: uninstall-binary
|
||||
rm -rf $(ETCDIR)
|
||||
rm -rf $(EJABBERDDIR)
|
||||
rm -rf $(SPOOLDIR)
|
||||
rm -rf $(CTLLOCKDIR)
|
||||
rm -rf $(LOGDIR)
|
||||
|
||||
clean:
|
||||
$(REBAR) clean
|
||||
|
||||
clean-rel:
|
||||
rm -rf rel/ejabberd
|
||||
|
||||
distclean: clean clean-rel
|
||||
rm -f config.status
|
||||
rm -f config.log
|
||||
rm -rf autom4te.cache
|
||||
rm -rf deps
|
||||
rm -rf ebin
|
||||
rm -f Makefile
|
||||
rm -f vars.config
|
||||
rm -f src/ejabberd.app.src
|
||||
[ ! -f ../ChangeLog ] || rm -f ../ChangeLog
|
||||
|
||||
rel: all
|
||||
$(REBAR) generate
|
||||
|
||||
TAGS:
|
||||
etags *.erl
|
||||
|
||||
Makefile: Makefile.in
|
||||
|
||||
deps := $(filter-out deps/riak_pb/ebin, $(wildcard deps/*/ebin))
|
||||
|
||||
erlang.plt:
|
||||
-dialyzer --build_plt --output_plt erlang.plt \
|
||||
--apps kernel stdlib sasl crypto public_key ssl mnesia \
|
||||
inets odbc tools compiler erts webtool runtime_tools asn1 \
|
||||
observer xmerl et gs wx syntax_tools $(deps)
|
||||
|
||||
plt: erlang.plt
|
||||
|
||||
dialyzer: plt
|
||||
-dialyzer --plt erlang.plt --add_to_plt --output_plt ejabberd.plt \
|
||||
--get_warnings -o dialyzer.log ebin
|
||||
|
||||
.PHONY: src doc edoc dialyzer Makefile TAGS clean clean-rel distclean rel plt \
|
||||
install uninstall uninstall-binary uninstall-all translations
|
||||
@@ -59,6 +59,8 @@ release : build release_clean
|
||||
copy mod_muc\*.erl $(SRC_DIR)\mod_muc
|
||||
mkdir $(SRC_DIR)\mod_pubsub
|
||||
copy mod_pubsub\*.erl $(SRC_DIR)\mod_pubsub
|
||||
mkdir $(SRC_DIR)\mod_pubsub_ng
|
||||
copy mod_pubsub_ng\*.erl $(SRC_DIR)\mod_pubsub_ng
|
||||
mkdir $(SRC_DIR)\mod_proxy65
|
||||
copy mod_proxy65\*.erl $(SRC_DIR)\mod_proxy65
|
||||
copy mod_proxy65\*.hrl $(SRC_DIR)\mod_proxy65
|
||||
@@ -100,6 +102,8 @@ all-recursive :
|
||||
nmake -nologo -f Makefile.win32
|
||||
cd ..\mod_pubsub
|
||||
nmake -nologo -f Makefile.win32
|
||||
cd ..\mod_pubsub_ng
|
||||
nmake -nologo -f Makefile.win32
|
||||
cd ..\mod_proxy65
|
||||
nmake -nologo -f Makefile.win32
|
||||
cd ..\stringprep
|
||||
@@ -143,6 +147,8 @@ clean-recursive :
|
||||
nmake -nologo -f Makefile.win32 clean
|
||||
cd ..\mod_pubsub
|
||||
nmake -nologo -f Makefile.win32 clean
|
||||
cd ..\mod_pubsub_ng
|
||||
nmake -nologo -f Makefile.win32 clean
|
||||
cd ..\mod_proxy65
|
||||
nmake -nologo -f Makefile.win32 clean
|
||||
cd ..\stringprep
|
||||
@@ -170,7 +176,7 @@ LD=link.exe
|
||||
LD_FLAGS=-release -nologo -incremental:no -dll "$(EI_DIR)\lib\ei_md.lib" "$(EI_DIR)\lib\erl_interface_md.lib" "$(EXPAT_LIB)" MSVCRT.LIB kernel32.lib advapi32.lib gdi32.lib user32.lib comctl32.lib comdlg32.lib shell32.lib
|
||||
|
||||
$(DLL) : $(OBJECT)
|
||||
$(LD) $(LD_FLAGS) -out:$(DLL) $(OBJECT)
|
||||
$(LD) $(LD_FLAGS) -out:$@ $<
|
||||
|
||||
$(OBJECT) : $(SOURCE)
|
||||
$(CC) $(CC_FLAGS) -c -Fo$(OBJECT) $(SOURCE)
|
||||
$(CC) $(CC_FLAGS) -c -Fo$@ $<
|
||||
@@ -9,24 +9,21 @@ To compile ejabberd you need:
|
||||
- GNU Make
|
||||
- GCC
|
||||
- Libexpat 1.95 or higher
|
||||
- Erlang/OTP R10B-9 or higher. The recommended version is R12B-5.
|
||||
Support for R13 is experimental.
|
||||
- OpenSSL 0.9.6 or higher, for STARTTLS, SASL and SSL
|
||||
encryption. Optional, highly recommended.
|
||||
- Erlang/OTP R10B-9 or higher. Recommended: R13B04 and R14B04.
|
||||
Avoid R14A and R14B.
|
||||
- OpenSSL 0.9.8 or higher, for STARTTLS, SASL and SSL encryption.
|
||||
- Zlib 1.2.3 or higher, for Stream Compression support
|
||||
(XEP-0138). Optional.
|
||||
- Erlang mysql library. Optional. MySQL authentication/storage.
|
||||
- Erlang pgsql library. Optional. PostgreSQL authentication/storage.
|
||||
- PAM library. Optional. For Pluggable Authentication Modules (PAM).
|
||||
- GNU Iconv 1.8 or higher, for the IRC Transport
|
||||
(mod_irc). Optional. Not needed on systems with GNU Libc.
|
||||
- ImageMagick's Convert program. Optional. For CAPTCHA challenges.
|
||||
- exmpp 0.9.2 or higher. Optional. For import/export XEP-0227 files.
|
||||
- exmpp 0.9.6 or higher. Optional. For import/export XEP-0227 files.
|
||||
|
||||
|
||||
1. Compile and install on *nix systems
|
||||
|
||||
To compile ejabberd, go to the directory src/ and execute the commands:
|
||||
To compile ejabberd execute the commands:
|
||||
./configure
|
||||
make
|
||||
|
||||
|
||||
@@ -286,6 +286,16 @@ ExtendedResponse ::= [APPLICATION 24] SEQUENCE {
|
||||
responseName [10] LDAPOID OPTIONAL,
|
||||
response [11] OCTET STRING OPTIONAL }
|
||||
|
||||
passwdModifyOID LDAPOID ::= "1.3.6.1.4.1.4203.1.11.1"
|
||||
|
||||
PasswdModifyRequestValue ::= SEQUENCE {
|
||||
userIdentity [0] OCTET STRING OPTIONAL,
|
||||
oldPasswd [1] OCTET STRING OPTIONAL,
|
||||
newPasswd [2] OCTET STRING OPTIONAL }
|
||||
|
||||
PasswdModifyResponseValue ::= SEQUENCE {
|
||||
genPasswd [0] OCTET STRING OPTIONAL }
|
||||
|
||||
END
|
||||
|
||||
|
||||
Vendored
+1633
-3218
File diff suppressed because it is too large
Load Diff
+266
@@ -0,0 +1,266 @@
|
||||
# -*- Autoconf -*-
|
||||
# Process this file with autoconf to produce a configure script.
|
||||
|
||||
AC_PREREQ(2.53)
|
||||
AC_PACKAGE_VERSION(3.0.0)
|
||||
AC_INIT(ejabberd, 3.0.0, [ejabberd@process-one.net], [ejabberd])
|
||||
|
||||
# Checks for programs.
|
||||
AC_PROG_MAKE_SET
|
||||
AC_PROG_INSTALL
|
||||
AC_PROG_SED
|
||||
|
||||
if test "x$GCC" = "xyes"; then
|
||||
CFLAGS="$CFLAGS -Wall"
|
||||
fi
|
||||
|
||||
# Checks Erlang runtime and compiler
|
||||
AC_ERLANG_NEED_ERL
|
||||
AC_ERLANG_NEED_ERLC
|
||||
|
||||
# Checks and sets ERLANG_ROOT_DIR and ERLANG_LIB_DIR variable
|
||||
# AC_ERLANG_SUBST_ROOT_DIR
|
||||
# AC_ERLANG_SUBST_LIB_DIR
|
||||
|
||||
#locating escript
|
||||
AC_PATH_PROG([ESCRIPT], [escript], [])
|
||||
|
||||
#locating rebar
|
||||
AC_PATH_PROG([REBAR], [rebar], [./rebar])
|
||||
|
||||
#locating make
|
||||
AC_CHECK_PROG([MAKE], [make], [make], [])
|
||||
|
||||
if test "x$ESCRIPT" = "x"; then
|
||||
AC_MSG_ERROR(['escript' was not found])
|
||||
fi
|
||||
|
||||
if test "x$MAKE" = "x"; then
|
||||
AC_MSG_ERROR(['make' was not found])
|
||||
fi
|
||||
|
||||
# Change default prefix
|
||||
AC_PREFIX_DEFAULT(/)
|
||||
|
||||
AC_ARG_ENABLE(hipe,
|
||||
[AC_HELP_STRING([--enable-hipe], [compile natively with HiPE, not recommended (default: no)])],
|
||||
[case "${enableval}" in
|
||||
yes) hipe=true ;;
|
||||
no) hipe=false ;;
|
||||
*) AC_MSG_ERROR(bad value ${enableval} for --enable-hipe) ;;
|
||||
esac],[hipe=false])
|
||||
|
||||
AC_ARG_ENABLE(roster_gateway_workaround,
|
||||
[AC_HELP_STRING([--enable-roster-gateway-workaround], [turn on workaround for processing gateway subscriptions (default: no)])],
|
||||
[case "${enableval}" in
|
||||
yes) roster_gateway_workaround=true ;;
|
||||
no) roster_gateway_workaround=false ;;
|
||||
*) AC_MSG_ERROR(bad value ${enableval} for --enable-roster-gateway-workaround) ;;
|
||||
esac],[roster_gateway_workaround=false])
|
||||
|
||||
AC_ARG_ENABLE(flash_hack,
|
||||
[AC_HELP_STRING([--enable-flash-hack], [support Adobe Flash client XML (default: no)])],
|
||||
[case "${enableval}" in
|
||||
yes) flash_hack=true ;;
|
||||
no) flash_hack=false ;;
|
||||
*) AC_MSG_ERROR(bad value ${enableval} for --enable-flash-hack) ;;
|
||||
esac],[flash_hack=false])
|
||||
|
||||
AC_ARG_ENABLE(transient_supervisors,
|
||||
[AC_HELP_STRING([--enable-transient_supervisors], [use Erlang supervision for transient process (default: no)])],
|
||||
[case "${enableval}" in
|
||||
yes) transient_supervisors=true ;;
|
||||
no) transient_supervisors=false ;;
|
||||
*) AC_MSG_ERROR(bad value ${enableval} for --enable-transient_supervisors) ;;
|
||||
esac],[transient_supervisors=false])
|
||||
|
||||
AC_ARG_ENABLE(full_xml,
|
||||
[AC_HELP_STRING([--enable-full-xml], [use XML features in XMPP stream (ex: CDATA) (default: no, requires XML compliant clients)])],
|
||||
[case "${enableval}" in
|
||||
yes) full_xml=true ;;
|
||||
no) full_xml=false ;;
|
||||
*) AC_MSG_ERROR(bad value ${enableval} for --enable-full-xml) ;;
|
||||
esac],[full_xml=false])
|
||||
|
||||
AC_ARG_ENABLE(mssql,
|
||||
[AC_HELP_STRING([--enable-mssql], [use Microsoft SQL Server database (default: no, requires --enable-odbc)])],
|
||||
[case "${enableval}" in
|
||||
yes) db_type=mssql ;;
|
||||
no) db_type=generic ;;
|
||||
*) AC_MSG_ERROR(bad value ${enableval} for --enable-mssql) ;;
|
||||
esac],[db_type=generic])
|
||||
|
||||
AC_ARG_ENABLE(tools,
|
||||
[AC_HELP_STRING([--enable-tools], [build development tools (currently the ejabberd profiler only, default: no)])],
|
||||
[case "${enableval}" in
|
||||
yes) tools=true ;;
|
||||
no) tools=false ;;
|
||||
*) AC_MSG_ERROR(bad value ${enableval} for --enable-tools) ;;
|
||||
esac],[tools=false])
|
||||
|
||||
AC_ARG_ENABLE(all,
|
||||
[AC_HELP_STRING([--enable-all], [same as --enable-nif --enable-mysql --enable-pgsql --enable-pam --enable-zlib --enable-stun --enable-riak --enable-json --enable-iconv --enable-debug --enable-pubsub-ng --enable-http (useful for Dialyzer checks, default: no)])],
|
||||
[case "${enableval}" in
|
||||
yes) nif=true mysql=true pgsql=true pam=true zlib=true stun=true riak=true json=true iconv=true debug=true pubsub_ng=true http=true ;;
|
||||
no) nif=false mysql=false pgsql=false pam=false zlib=false stun=false riak=false json=false iconv=false debug=false pubsub_ng=false http=false ;;
|
||||
*) AC_MSG_ERROR(bad value ${enableval} for --enable-all) ;;
|
||||
esac],[])
|
||||
|
||||
AC_ARG_ENABLE(nif,
|
||||
[AC_HELP_STRING([--enable-nif], [replace some functions with C equivalents. Requires Erlang R13B04 or higher (default: no)])],
|
||||
[case "${enableval}" in
|
||||
yes) nif=true ;;
|
||||
no) nif=false ;;
|
||||
*) AC_MSG_ERROR(bad value ${enableval} for --enable-nif) ;;
|
||||
esac],[if test "x$nif" = "x"; then nif=false; fi])
|
||||
|
||||
AC_ARG_ENABLE(mysql,
|
||||
[AC_HELP_STRING([--enable-mysql], [enable MySQL support (default: no)])],
|
||||
[case "${enableval}" in
|
||||
yes) mysql=true ;;
|
||||
no) mysql=false ;;
|
||||
*) AC_MSG_ERROR(bad value ${enableval} for --enable-mysql) ;;
|
||||
esac],[if test "x$mysql" = "x"; then mysql=false; fi])
|
||||
|
||||
AC_ARG_ENABLE(pgsql,
|
||||
[AC_HELP_STRING([--enable-pgsql], [enable PostgreSQL support (default: no)])],
|
||||
[case "${enableval}" in
|
||||
yes) pgsql=true ;;
|
||||
no) pgsql=false ;;
|
||||
*) AC_MSG_ERROR(bad value ${enableval} for --enable-pgsql) ;;
|
||||
esac],[if test "x$pgsql" = "x"; then pgsql=false; fi])
|
||||
|
||||
AC_ARG_ENABLE(pam,
|
||||
[AC_HELP_STRING([--enable-pam], [enable PAM support (default: no)])],
|
||||
[case "${enableval}" in
|
||||
yes) pam=true ;;
|
||||
no) pam=false ;;
|
||||
*) AC_MSG_ERROR(bad value ${enableval} for --enable-pam) ;;
|
||||
esac],[if test "x$pam" = "x"; then pam=false; fi])
|
||||
|
||||
AC_ARG_ENABLE(zlib,
|
||||
[AC_HELP_STRING([--enable-zlib], [enable Stream Compression (XEP-0138) using zlib (default: yes)])],
|
||||
[case "${enableval}" in
|
||||
yes) zlib=true ;;
|
||||
no) zlib=false ;;
|
||||
*) AC_MSG_ERROR(bad value ${enableval} for --enable-zlib) ;;
|
||||
esac],[if test "x$zlib" = "x"; then zlib=true; fi])
|
||||
|
||||
AC_ARG_ENABLE(stun,
|
||||
[AC_HELP_STRING([--enable-stun], [enable STUN support (default: no)])],
|
||||
[case "${enableval}" in
|
||||
yes) stun=true ;;
|
||||
no) stun=false ;;
|
||||
*) AC_MSG_ERROR(bad value ${enableval} for --enable-stun) ;;
|
||||
esac],[if test "x$stun" = "x"; then stun=false; fi])
|
||||
|
||||
AC_ARG_ENABLE(riak,
|
||||
[AC_HELP_STRING([--enable-riak], [enable Riak support (default: no)])],
|
||||
[case "${enableval}" in
|
||||
yes) riak=true ;;
|
||||
no) riak=false ;;
|
||||
*) AC_MSG_ERROR(bad value ${enableval} for --enable-riak) ;;
|
||||
esac],[if test "x$riak" = "x"; then riak=false; fi])
|
||||
|
||||
AC_ARG_ENABLE(json,
|
||||
[AC_HELP_STRING([--enable-json], [enable JSON support for mod_bosh (default: no)])],
|
||||
[case "${enableval}" in
|
||||
yes) json=true ;;
|
||||
no) json=false ;;
|
||||
*) AC_MSG_ERROR(bad value ${enableval} for --enable-json) ;;
|
||||
esac],[if test "x$json" = "x"; then json=false; fi])
|
||||
|
||||
AC_ARG_ENABLE(iconv,
|
||||
[AC_HELP_STRING([--enable-iconv], [enable iconv support (default: yes)])],
|
||||
[case "${enableval}" in
|
||||
yes) iconv=true ;;
|
||||
no) iconv=false ;;
|
||||
*) AC_MSG_ERROR(bad value ${enableval} for --enable-iconv) ;;
|
||||
esac],[if test "x$iconv" = "x"; then iconv=true; fi])
|
||||
|
||||
AC_ARG_ENABLE(debug,
|
||||
[AC_HELP_STRING([--enable-debug], [enable debug information (default: yes)])],
|
||||
[case "${enableval}" in
|
||||
yes) debug=true ;;
|
||||
no) debug=false ;;
|
||||
*) AC_MSG_ERROR(bad value ${enableval} for --enable-debug) ;;
|
||||
esac],[if test "x$debug" = "x"; then debug=true; fi])
|
||||
|
||||
AC_ARG_ENABLE(pubsub_ng,
|
||||
[AC_HELP_STRING([--enable-pubsub-ng], [enable PubSub NG (default: no)])],
|
||||
[case "${enableval}" in
|
||||
yes) pubsub_ng=true ;;
|
||||
no) pubsub_ng=false ;;
|
||||
*) AC_MSG_ERROR(bad value ${enableval} for --enable-pubsub-ng) ;;
|
||||
esac],[if test "x$pubsub_ng" = "x"; then pubsub_ng=false; fi])
|
||||
|
||||
AC_ARG_ENABLE(http,
|
||||
[AC_HELP_STRING([--enable-http], [build external HTTP libraries ('ibrowse' and 'lhttpc', default: no)])],
|
||||
[case "${enableval}" in
|
||||
yes) http=true ;;
|
||||
no) http=false ;;
|
||||
*) AC_MSG_ERROR(bad value ${enableval} for --enable-http) ;;
|
||||
esac],[if test "x$http" = "x"; then http=false; fi])
|
||||
|
||||
AC_CONFIG_FILES([Makefile
|
||||
vars.config
|
||||
src/ejabberd.app.src])
|
||||
|
||||
ENABLEUSER=""
|
||||
AC_ARG_ENABLE(user,
|
||||
[AS_HELP_STRING([--enable-user[[[[=USER]]]]], [allow this system user to start ejabberd (default: no)])],
|
||||
[case "${enableval}" in
|
||||
yes) ENABLEUSER=`whoami` ;;
|
||||
no) ENABLEUSER="" ;;
|
||||
*) ENABLEUSER=$enableval
|
||||
esac],
|
||||
[])
|
||||
if test "$ENABLEUSER" != ""; then
|
||||
echo "allow this system user to start ejabberd: $ENABLEUSER"
|
||||
AC_SUBST([INSTALLUSER], [$ENABLEUSER])
|
||||
fi
|
||||
|
||||
AC_ERLANG_CHECK_LIB([sasl], [],
|
||||
[AC_MSG_ERROR([Erlang application 'sasl' was not found])])
|
||||
AC_ERLANG_CHECK_LIB([crypto], [],
|
||||
[AC_MSG_ERROR([Erlang application 'crypto' was not found])])
|
||||
AC_ERLANG_CHECK_LIB([public_key], [],
|
||||
[AC_MSG_ERROR([Erlang application 'public_key' was not found])])
|
||||
AC_ERLANG_CHECK_LIB([ssl], [],
|
||||
[AC_MSG_ERROR([Erlang application 'ssl' was not found])])
|
||||
AC_ERLANG_CHECK_LIB([mnesia], [],
|
||||
[AC_MSG_ERROR([Erlang application 'mnesia' was not found])])
|
||||
AC_ERLANG_CHECK_LIB([inets], [],
|
||||
[AC_MSG_ERROR([Erlang application 'inets' was not found])])
|
||||
AC_ERLANG_CHECK_LIB([odbc], [],
|
||||
[AC_MSG_ERROR([Erlang application 'odbc' was not found])])
|
||||
AC_ERLANG_CHECK_LIB([compiler], [],
|
||||
[AC_MSG_ERROR([Erlang application 'compiler' was not found])])
|
||||
if test "x$tools" = "xtrue"; then
|
||||
AC_ERLANG_CHECK_LIB([tools], [],
|
||||
[AC_MSG_ERROR([Erlang application 'tools' was not found])])
|
||||
AC_ERLANG_CHECK_LIB([runtime_tools], [],
|
||||
[AC_MSG_ERROR([Erlang application 'runtime_tools' was not found])])
|
||||
fi
|
||||
|
||||
AC_SUBST(hipe)
|
||||
AC_SUBST(roster_gateway_workaround)
|
||||
AC_SUBST(flash_hack)
|
||||
AC_SUBST(transient_supervisors)
|
||||
AC_SUBST(full_xml)
|
||||
AC_SUBST(nif)
|
||||
AC_SUBST(db_type)
|
||||
AC_SUBST(mysql)
|
||||
AC_SUBST(pgsql)
|
||||
AC_SUBST(pam)
|
||||
AC_SUBST(zlib)
|
||||
AC_SUBST(stun)
|
||||
AC_SUBST(riak)
|
||||
AC_SUBST(json)
|
||||
AC_SUBST(iconv)
|
||||
AC_SUBST(debug)
|
||||
AC_SUBST(pubsub_ng)
|
||||
AC_SUBST(http)
|
||||
AC_SUBST(tools)
|
||||
|
||||
AC_OUTPUT
|
||||
@@ -1,5 +0,0 @@
|
||||
% List of ejabberd-modules to add for ejabberd packaging (source archive and installer)
|
||||
%
|
||||
% HTTP-binding:
|
||||
%https://svn.process-one.net/ejabberd-modules/http_bind/trunk
|
||||
%https://svn.process-one.net/ejabberd-modules/mod_http_fileserver/trunk
|
||||
@@ -281,14 +281,14 @@ build_additional_translators(List) ->
|
||||
List).
|
||||
|
||||
print_translation(File, Line, Str, StrT) ->
|
||||
{ok, StrQ, _} = regexp:gsub(Str, "\"", "\\\""),
|
||||
{ok, StrTQ, _} = regexp:gsub(StrT, "\"", "\\\""),
|
||||
StrQ = ejabberd_regexp:greplace(Str, "\\\"", "\\\\\""),
|
||||
StrTQ = ejabberd_regexp:greplace(StrT, "\\\"", "\\\\\""),
|
||||
io:format("#: ~s:~p~nmsgid \"~s\"~nmsgstr \"~s\"~n~n", [File, Line, StrQ, StrTQ]).
|
||||
|
||||
print_translation_obsolete(Str, StrT) ->
|
||||
File = "unknown.erl",
|
||||
Line = 1,
|
||||
{ok, StrQ, _} = regexp:gsub(Str, "\"", "\\\""),
|
||||
{ok, StrTQ, _} = regexp:gsub(StrT, "\"", "\\\""),
|
||||
StrQ = ejabberd_regexp:greplace(Str, "\\\"", "\\\\\""),
|
||||
StrTQ = ejabberd_regexp:greplace(StrT, "\\\"", "\\\\\""),
|
||||
io:format("#: ~s:~p~n#~~ msgid \"~s\"~n#~~ msgstr \"~s\"~n~n", [File, Line, StrQ, StrTQ]).
|
||||
|
||||
|
||||
@@ -15,13 +15,13 @@ prepare_dirs ()
|
||||
ERL=`which erl`
|
||||
|
||||
EJA_SRC_DIR=$EJA_DIR/src/
|
||||
EJA_MSGS_DIR=$EJA_SRC_DIR/msgs/
|
||||
EJA_MSGS_DIR=$EJA_DIR/priv/msgs/
|
||||
EXTRACT_DIR=$EJA_DIR/contrib/extract_translations/
|
||||
EXTRACT_ERL=$EXTRACT_DIR/extract_translations.erl
|
||||
EXTRACT_BEAM=$EXTRACT_DIR/extract_translations.beam
|
||||
|
||||
SRC_DIR=$RUN_DIR/src
|
||||
MSGS_DIR=$SRC_DIR/msgs
|
||||
MSGS_DIR=$EJA_DIR/priv/msgs
|
||||
|
||||
if !([[ -n $EJA_DIR ]])
|
||||
then
|
||||
@@ -91,7 +91,7 @@ extract_lang_all ()
|
||||
cd $MSGS_DIR
|
||||
for i in $( ls *.msg ) ; do
|
||||
MISSING=`cat $i.translate | grep "\", \"\"}." | wc -l`
|
||||
LANGUAGE=`grep "Language:" $i.translate | sed 's/% Language: //g'`
|
||||
LANGUAGE=`grep "X-Language:" $i.translate | sed 's/% Language: //g'`
|
||||
LASTAUTH=`grep "Author:" $i.translate | head -n 1 | sed 's/% Author: //g'`
|
||||
echo -e "$i\t$MISSING\t$LANGUAGE\t$LASTAUTH"
|
||||
done
|
||||
@@ -258,7 +258,7 @@ extract_lang_updateall ()
|
||||
MISSING=`msgfmt --statistics $PO 2>&1 | awk '{printf "%5s", $4 }'`
|
||||
echo -n " $MISSING"
|
||||
|
||||
LANGUAGE=`grep "Language:" $PO | sed 's/\"X-Language: //g' | sed 's/\\\\n\"//g' | awk '{printf "%-12s", $1}'`
|
||||
LANGUAGE=`grep "X-Language:" $PO | sed 's/\"X-Language: //g' | sed 's/\\\\n\"//g' | awk '{printf "%-12s", $1}'`
|
||||
echo -n " $LANGUAGE"
|
||||
|
||||
LASTAUTH=`grep "Last-Translator" $PO | sed 's/\"Last-Translator: //g' | sed 's/\\\\n\"//g'`
|
||||
@@ -288,8 +288,8 @@ translation_instructions ()
|
||||
echo " $MSGS_PATH"
|
||||
}
|
||||
|
||||
EJA_DIR=`pwd`/..
|
||||
RUN_DIR=`pwd`/..
|
||||
EJA_DIR=`pwd`
|
||||
RUN_DIR=`pwd`
|
||||
PROJECT=ejabberd
|
||||
|
||||
while [ $# -ne 0 ] ; do
|
||||
|
||||
+15
-2
@@ -21,10 +21,11 @@ release:
|
||||
@echo "\newcommand{\version}{"`sed '/vsn/!d;s/\(.*\)"\(.*\)"\(.*\)/\2/' ../src/ejabberd.app`"}" >> version.tex
|
||||
@echo -n "% Contributed modules (automatically generated)." > contributed_modules.tex
|
||||
@echo -e "$(CONTRIBUTED_MODULES)" >> contributed_modules.tex
|
||||
@echo "% mod_admin_p1 commands list."
|
||||
|
||||
html: guide.html dev.html features.html
|
||||
html: guide.html dev.html features.html commercial.html
|
||||
|
||||
pdf: guide.pdf features.pdf
|
||||
pdf: guide.pdf features.pdf commercial.pdf
|
||||
|
||||
clean:
|
||||
rm -f *.aux
|
||||
@@ -60,3 +61,15 @@ guide.pdf: guide.tex
|
||||
|
||||
features.pdf: features.tex
|
||||
pdflatex features.tex
|
||||
|
||||
commercial.html: commercial.tex
|
||||
./mod_admin_p1_commands.sh
|
||||
hevea -fix -pedantic commercial.tex
|
||||
|
||||
commercial.pdf: commercial.tex
|
||||
./mod_admin_p1_commands.sh
|
||||
pdflatex commercial.tex
|
||||
pdflatex commercial.tex
|
||||
pdflatex commercial.tex
|
||||
makeindex commercial.idx
|
||||
pdflatex commercial.tex
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
@author Mickael Remond <mickael.remond@process-one.net>
|
||||
[http://www.process-one.net/]
|
||||
@copyright 2007 ProcessOne
|
||||
@copyright 2012 ProcessOne
|
||||
@version {@vsn}, {@date} {@time}
|
||||
@title ejabberd Development API Documentation
|
||||
|
||||
|
||||
+6184
File diff suppressed because it is too large
Load Diff
+6
-3
@@ -2,7 +2,7 @@
|
||||
"http://www.w3.org/TR/REC-html40/loose.dtd">
|
||||
<HTML>
|
||||
<HEAD>
|
||||
<TITLE>Ejabberd 2.1.3 Developers Guide
|
||||
<TITLE>Ejabberd 2.1.11 Developers Guide
|
||||
</TITLE>
|
||||
|
||||
<META http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||
@@ -49,7 +49,7 @@ TD P{margin:0px;}
|
||||
<!--HEVEA command line is: /usr/bin/hevea -fix -pedantic dev.tex -->
|
||||
<!--CUT DEF section 1 --><P><A NAME="titlepage"></A>
|
||||
|
||||
</P><TABLE CLASS="title"><TR><TD><H1 CLASS="titlemain">Ejabberd 2.1.3 Developers Guide</H1><H3 CLASS="titlerest">Alexey Shchepin<BR>
|
||||
</P><TABLE CLASS="title"><TR><TD><H1 CLASS="titlemain">Ejabberd 2.1.11 Developers Guide</H1><H3 CLASS="titlerest">Alexey Shchepin<BR>
|
||||
<A HREF="mailto:alexey@sevcom.net"><TT>mailto:alexey@sevcom.net</TT></A><BR>
|
||||
<A HREF="xmpp:aleksey@jabber.ru"><TT>xmpp:aleksey@jabber.ru</TT></A></H3></TD></TR>
|
||||
</TABLE><DIV CLASS="center">
|
||||
@@ -170,7 +170,7 @@ manager.</P><!--TOC subsection Local Router-->
|
||||
name. If destination JID has a non-empty user part, then it routed to the
|
||||
session manager, else it is processed depending on it’s content.</P><!--TOC subsection Session Manager-->
|
||||
<H3 CLASS="subsection"><!--SEC ANCHOR --><A NAME="htoc6">3.3</A>  Session Manager</H3><!--SEC END --><P>This module routes packets to local users. It searches for what user resource
|
||||
packet must be sended via presence table. If this resource is connected to
|
||||
packet must be sent via presence table. If this resource is connected to
|
||||
this node, it is routed to C2S process, if it connected via another node, then
|
||||
the packet is sent to session manager on that node.</P><!--TOC subsection S2S Manager-->
|
||||
<H3 CLASS="subsection"><!--SEC ANCHOR --><A NAME="htoc7">3.4</A>  S2S Manager</H3><!--SEC END --><P>This module routes packets to other XMPP servers. First, it checks if an
|
||||
@@ -194,6 +194,9 @@ operation are as follows:
|
||||
auth:User:Server:Password (check if a username/password pair is correct)
|
||||
</LI><LI CLASS="li-itemize">isuser:User:Server (check if it’s a valid user)
|
||||
</LI><LI CLASS="li-itemize">setpass:User:Server:Password (set user’s password)
|
||||
</LI><LI CLASS="li-itemize">tryregister:User:Server:Password (try to register an account)
|
||||
</LI><LI CLASS="li-itemize">removeuser:User:Server (remove this account)
|
||||
</LI><LI CLASS="li-itemize">removeuser3:User:Server:Password (remove this account if the password is correct)
|
||||
</LI></UL>
|
||||
</LI></UL>
|
||||
</LI><LI CLASS="li-itemize">write to stdout: AABB
|
||||
|
||||
+4
-1
@@ -141,7 +141,7 @@ session manager, else it is processed depending on it's content.
|
||||
\subsection{Session Manager}
|
||||
|
||||
This module routes packets to local users. It searches for what user resource
|
||||
packet must be sended via presence table. If this resource is connected to
|
||||
packet must be sent via presence table. If this resource is connected to
|
||||
this node, it is routed to C2S process, if it connected via another node, then
|
||||
the packet is sent to session manager on that node.
|
||||
|
||||
@@ -176,6 +176,9 @@ That script is supposed to do theses actions, in an infinite loop:
|
||||
\item auth:User:Server:Password (check if a username/password pair is correct)
|
||||
\item isuser:User:Server (check if it's a valid user)
|
||||
\item setpass:User:Server:Password (set user's password)
|
||||
\item tryregister:User:Server:Password (try to register an account)
|
||||
\item removeuser:User:Server (remove this account)
|
||||
\item removeuser3:User:Server:Password (remove this account if the password is correct)
|
||||
\end{itemize}
|
||||
\end{itemize}
|
||||
\item write to stdout: AABB
|
||||
|
||||
+2
-2
@@ -2,7 +2,7 @@
|
||||
"http://www.w3.org/TR/REC-html40/loose.dtd">
|
||||
<HTML>
|
||||
<HEAD>
|
||||
<TITLE>Ejabberd 2.1.3 Feature Sheet
|
||||
<TITLE>Ejabberd 2.1.11 Feature Sheet
|
||||
</TITLE>
|
||||
|
||||
<META http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||
@@ -50,7 +50,7 @@ SPAN{width:20%; float:right; text-align:left; margin-left:auto;}
|
||||
<!--HEVEA command line is: /usr/bin/hevea -fix -pedantic features.tex -->
|
||||
<!--CUT DEF section 1 --><P><A NAME="titlepage"></A>
|
||||
|
||||
</P><TABLE CLASS="title"><TR><TD><H1 CLASS="titlemain">Ejabberd 2.1.3 Feature Sheet</H1><H3 CLASS="titlerest">Sander Devrieze<BR>
|
||||
</P><TABLE CLASS="title"><TR><TD><H1 CLASS="titlemain">Ejabberd 2.1.11 Feature Sheet</H1><H3 CLASS="titlerest">Sander Devrieze<BR>
|
||||
<A HREF="mailto:s.devrieze@pandora.be"><TT>mailto:s.devrieze@pandora.be</TT></A><BR>
|
||||
<A HREF="xmpp:sander@devrieze.dyndns.org"><TT>xmpp:sander@devrieze.dyndns.org</TT></A></H3></TD></TR>
|
||||
</TABLE><DIV CLASS="center">
|
||||
|
||||
+686
-222
File diff suppressed because it is too large
Load Diff
+901
-189
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,146 @@
|
||||
# Managing pubsub nodes through HTTP Atompub #
|
||||
|
||||
|
||||
## Configuration ##
|
||||
|
||||
These options will be used by the service to know how to build URLs. Using the previous configuration items the service should be accessed through `http://notify.push.bbc.co.uk:5280/pshb/<host>/<node>/`.
|
||||
|
||||
Also, in the ejabberd_http handler configuration, add the identified line.
|
||||
|
||||
{5280, ejabberd_http, [
|
||||
http_poll,
|
||||
web_admin,
|
||||
{request_handlers, [{["pshb"], pshb_http}]} % this should be added
|
||||
]}
|
||||
|
||||
It will automatically detect the version of mod_pubsub (odbc or mnesia) and call the appropriate module.
|
||||
|
||||
## Important notice ##
|
||||
|
||||
In the current version of the code, some security checks are not done :
|
||||
|
||||
* node creation uses the default `all` access_createnode acl, not checking for the actual configuration.
|
||||
|
||||
* most read operations are successfully executed without authentication. HOWEVER listing items can only be done when the node access_model is "open". In all other cases, the service returns 403. A finer grained authentication will be implemented.
|
||||
|
||||
|
||||
## Usage example with cURL ##
|
||||
|
||||
### Errors ###
|
||||
|
||||
HTTP status codes are used as intended. Additionally, the XMPP error stanza can also be set in the body :
|
||||
|
||||
$ curl -i -X POST -u cstar@localhost:encore -d @createnode.xml http://localhost:5280/pshb/localhost
|
||||
HTTP/1.1 409 Conflict
|
||||
Content-Type: text/html; charset=utf-8
|
||||
Content-Length: 95
|
||||
Content-type: application/xml
|
||||
|
||||
<error code='409' type='cancel'><conflict xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/></error>
|
||||
|
||||
or
|
||||
|
||||
$ curl -i -X DELETE -u cstar@localhost:encore http://localhost:5280/pshb/localhost/princely_musings
|
||||
HTTP/1.1 404 Not Found
|
||||
Content-Type: text/html; charset=utf-8
|
||||
Content-Length: 101
|
||||
Content-type: application/xml
|
||||
|
||||
<error code='404' type='cancel'><item-not-found xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/></error>
|
||||
|
||||
### Getting the service document ###
|
||||
|
||||
No authentication necessary. All nodes are listed.
|
||||
|
||||
$ curl -i http://host:port/pshb/domain/
|
||||
|
||||
### Getting items from a node ###
|
||||
|
||||
No authentication done, and all nodes are accessible.
|
||||
|
||||
$ curl -i http://host:port/pshb/domain/node/
|
||||
|
||||
|
||||
### Posting a new item ###
|
||||
|
||||
$ curl -u jid:password -i -X POST -d @entry.atom http://post:port/pshb/domain/node
|
||||
|
||||
User ability to post is based on node configuration.
|
||||
|
||||
### Editing a new item ###
|
||||
|
||||
$ curl -u jid:password -i -X POST -d @entry.atom http://post:port/pshb/domain/node/itemid
|
||||
|
||||
User ability to post is based on node configuration.
|
||||
|
||||
### Deleting an item ###
|
||||
|
||||
$ curl -u jid:password -i -X DELETE http://post:port/pshb/domain/node/itemid
|
||||
|
||||
User ability to post is based on node configuration.
|
||||
|
||||
|
||||
### Creating a new node ###
|
||||
|
||||
An instant node can be created if server configuration allows:
|
||||
|
||||
$ curl -X POST -u cstar@localhost:encore -d "" http://localhost:5280/pshb/localhost
|
||||
|
||||
or
|
||||
|
||||
$ curl -X POST -u cstar@localhost:encore -d "<pubsub><create node='princely_musings'/></pubsub>" http://localhost:5280/pshb/localhost
|
||||
|
||||
configure element (as per XEP-60) can be passed in the pubsub body.
|
||||
|
||||
$ cat createnode.xml
|
||||
<pubsub><create node='princely_musings' type='flat'/>
|
||||
<x xmlns='jabber:x:data' type='submit'>
|
||||
<field var='FORM_TYPE' type='hidden'>
|
||||
<value>http://jabber.org/protocol/pubsub#node_config</value>
|
||||
</field>
|
||||
<field var='pubsub#title'><value>Princely Musings (Atom)</value></field>
|
||||
<field var='pubsub#max_payload_size'><value>1028</value></field>
|
||||
<field var='pubsub#type'><value>Atom</value></field>
|
||||
</x>
|
||||
</pubsub>
|
||||
|
||||
$ curl -i -X POST -u cstar@localhost:encore -d @createnode.xml http://localhost:5280/pshb/localhost
|
||||
HTTP/1.1 200 OK
|
||||
Content-Length: 130
|
||||
Content-Type: application/xml
|
||||
|
||||
<?xml version="1.0" encoding="utf-8"?><pubsub xmlns='http://jabber.org/protocol/pubsub'><create node='princely_musings'/></pubsub>
|
||||
|
||||
### Editing a node configuration ###
|
||||
|
||||
$ cat editnode.xml
|
||||
<pubsub xmlns='http://jabber.org/protocol/pubsub#owner'>
|
||||
<configure node='princely_musings'>
|
||||
<x xmlns='jabber:x:data' type='submit'>
|
||||
<field var='FORM_TYPE' type='hidden'>
|
||||
<value>http://jabber.org/protocol/pubsub#node_config</value>
|
||||
</field>
|
||||
<field var='pubsub#title'><value>Princely Musings (Atom)</value></field>
|
||||
<field var='pubsub#deliver_notifications'><value>1</value></field>
|
||||
<field var='pubsub#deliver_payloads'><value>1</value></field>
|
||||
<field var='pubsub#persist_items'><value>1</value></field>
|
||||
<field var='pubsub#max_items'><value>10</value></field>
|
||||
<field var='pubsub#item_expire'><value>604800</value></field>
|
||||
<field var='pubsub#access_model'><value>roster</value></field>
|
||||
</x>
|
||||
</configure>
|
||||
</pubsub>
|
||||
|
||||
|
||||
$ curl -i -X PUT -u cstar@localhost:encore -d @createnode.xml http://localhost:5280/pshb/localhost/princely_musings
|
||||
|
||||
|
||||
|
||||
### Deleting a node ###
|
||||
|
||||
A node is deleted by:
|
||||
|
||||
$ curl -X DELETE -u cstar@localhost:encore http://localhost:5280/pshb/localhost/princely_musings
|
||||
|
||||
|
||||
|
||||
Executable
+99
@@ -0,0 +1,99 @@
|
||||
#!/usr/bin/env escript
|
||||
%% -*- erlang -*-
|
||||
|
||||
-record(cmd, {name, desc, longdesc, args, result}).
|
||||
|
||||
main(_) ->
|
||||
Dir = filename:absname(filename:join(["..", "src"])),
|
||||
FileIn = filename:join([Dir, "mod_admin_p1.erl"]),
|
||||
{ok, Forms1} = epp_dodger:parse_file(FileIn, [no_fail]),
|
||||
Comments = erl_comment_scan:file(FileIn),
|
||||
Forms = erl_recomment:recomment_forms(Forms1, Comments),
|
||||
Tree = erl_syntax:flatten_form_list(Forms),
|
||||
AuxFile = "mod_admin.tex",
|
||||
case file:open(AuxFile, [write]) of
|
||||
{ok, Fd} ->
|
||||
io:format(Fd, "\\newcommand{\\modadminsection}{\\begin{description}~n", []),
|
||||
process(Fd, Tree),
|
||||
io:format(Fd, "\\end{description}}~n", []),
|
||||
file:close(Fd),
|
||||
halt(0);
|
||||
{error, Why} ->
|
||||
io:format("failed to open file ~s: ~s",
|
||||
[AuxFile, file:format_error(Why)]),
|
||||
halt(1)
|
||||
end.
|
||||
|
||||
process(Fd, Tree) ->
|
||||
case erl_syntax:type(Tree) of
|
||||
record_expr ->
|
||||
case erl_syntax_lib:analyze_record_expr(Tree) of
|
||||
{record_expr, {ejabberd_commands, _}} ->
|
||||
Fs = erl_syntax:record_expr_fields(Tree),
|
||||
Cmd = lists:foldl(
|
||||
fun(F, C) ->
|
||||
Name = erl_syntax:record_field_name(F),
|
||||
Value = erl_syntax:record_field_value(F),
|
||||
case {erl_syntax:concrete(Name),
|
||||
catch erl_syntax:concrete(Value)} of
|
||||
{_, {'EXIT', _}} ->
|
||||
C;
|
||||
{name, V} ->
|
||||
C#cmd{name = V};
|
||||
{desc, V} ->
|
||||
C#cmd{desc = V};
|
||||
{longdesc, V} ->
|
||||
C#cmd{longdesc = V};
|
||||
{args, V} ->
|
||||
C#cmd{args = V};
|
||||
{result, V} ->
|
||||
C#cmd{result = V};
|
||||
_ ->
|
||||
C
|
||||
end
|
||||
end, #cmd{}, Fs),
|
||||
format_command(Fd, Cmd);
|
||||
_ ->
|
||||
ok
|
||||
end;
|
||||
_ ->
|
||||
case erl_syntax:subtrees(Tree) of
|
||||
[] ->
|
||||
ok;
|
||||
List ->
|
||||
lists:foreach(
|
||||
fun(Group) ->
|
||||
lists:foreach(
|
||||
fun(Subtree) ->
|
||||
process(Fd, Subtree)
|
||||
end, Group)
|
||||
end, List)
|
||||
end
|
||||
end.
|
||||
|
||||
-define(B(S), S).
|
||||
|
||||
format_command(Fd, #cmd{name = Cmd,
|
||||
desc = Desc,
|
||||
longdesc = _LongDesc,
|
||||
args = ArgsDef,
|
||||
result = _ResultDef}) ->
|
||||
io:format(Fd, "\\titem{~s ~s} ~s~n",
|
||||
[escape_underscores(atom_to_list(Cmd)),
|
||||
flatten_arguments(ArgsDef),
|
||||
escape_underscores(Desc)]).
|
||||
|
||||
flatten_arguments(Args) ->
|
||||
string:join(
|
||||
lists:map(
|
||||
fun({Name, _Type}) ->
|
||||
escape_underscores(io_lib:format("~s", [Name]))
|
||||
end, Args),
|
||||
" ").
|
||||
|
||||
escape_underscores(S) ->
|
||||
lists:flatten(
|
||||
[case C of
|
||||
$_ -> "\\_";
|
||||
_ -> C
|
||||
end || C <- S]).
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 140 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 78 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 23 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 21 KiB |
@@ -0,0 +1,39 @@
|
||||
|
||||
Release Notes
|
||||
ejabberd 2.1.10
|
||||
|
||||
ejabberd 2.1.10 includes a few bugfixes and improvements.
|
||||
|
||||
Read more details about the changes in:
|
||||
http://redir.process-one.net/ejabberd-2.1.10
|
||||
|
||||
Download the source code and installers from:
|
||||
http://www.process-one.net/en/ejabberd/
|
||||
|
||||
|
||||
The major changes are:
|
||||
|
||||
* Erlang/OTP compatibility
|
||||
- Support Erlang/OTP R15B regexp and drivers (EJAB-1521)
|
||||
- Fix modules update in R14B04 and higher
|
||||
- Fix modules update of stripped beams (EJAB-1520)
|
||||
|
||||
* XMPP Core
|
||||
- Fix presence problem in C2S after first unavailable (EJAB-1466)
|
||||
- Fix bug on S2S shaper when TLS is used
|
||||
- Prevent overload of incoming S2S connections
|
||||
|
||||
* XEPs
|
||||
- BOSH: Get rid of useless mnesia transaction (EJAB-1502)
|
||||
- MUC: Don't reveal invitee resource when room informs invitor
|
||||
- Privacy: Activate "Blocked Contacts" to current c2s connection (EJAB-1519)
|
||||
- Privacy: Always allow packets from user's server and bare jid (EJAB-1441)
|
||||
- Pubsub: Add hooks for node creation/deletion (EJAB-1470)
|
||||
- Shared Rosters: support groupname@vhost in Displayed Groups (EJAB-506)
|
||||
- Vcard: Fix error when lowercasing some search results (EJAB-1490)
|
||||
|
||||
|
||||
Bug reports
|
||||
|
||||
You can officially report bugs on ProcessOne support site:
|
||||
http://support.process-one.net/
|
||||
@@ -0,0 +1,58 @@
|
||||
|
||||
Release Notes
|
||||
ejabberd 2.1.11
|
||||
|
||||
ejabberd 2.1.11 includes a few bugfixes and improvements.
|
||||
|
||||
Read more details about the changes in:
|
||||
http://redir.process-one.net/ejabberd-2.1.11
|
||||
|
||||
Download the source code and installers from:
|
||||
http://www.process-one.net/en/ejabberd/
|
||||
|
||||
|
||||
The major changes are:
|
||||
|
||||
* HTTP service
|
||||
- Fix ejabberd_http:get_line
|
||||
- Don't use binary:match to extract lines from binaries
|
||||
- Parse and encode https header names like native http parser does
|
||||
- Parse correctly https request split into multiple packets
|
||||
- Properly handle HEAD request in mod_http_bind (EJAB-1538)
|
||||
- New option default_host for handling requests with ambiguous Host (EJAB-1261)
|
||||
|
||||
* ODBC
|
||||
- New ODBC support for mod_announce
|
||||
- New ODBC support for mod_blocking
|
||||
- New ODBC support for mod_irc
|
||||
- New ODBC support for mod_muc
|
||||
- New ODBC support for mod_shared_roster
|
||||
- New ODBC support for mod_vcard_xupdate
|
||||
- Add ODBC exporting function for privacy table
|
||||
- Work also with some unicode strings in PgSQL (EJAB-1490)
|
||||
- Replace a single quote with double quotes in an ODBC escape
|
||||
|
||||
* SSL
|
||||
- Make sure that res is initialized in all cases
|
||||
- Parse correctly https request split into multiple packets (EJAB-1537)
|
||||
- Added missed tls:recv_data/2
|
||||
- Don't ignore Length parameter in tls:recv
|
||||
- Avoid quadratic behavior in reading SSL data
|
||||
- Dix http_bind webserver TLS fail on Chrome (EJAB-1530)
|
||||
|
||||
* Miscelanea
|
||||
- Assume we have only one CPU when an auto-detection fails (EJAB-1516)
|
||||
- Auth: Relax digest-uri handling (EJAB-1529)
|
||||
- Caps: Cache caps timestamp before the IQ-request is done
|
||||
- IRC: Use of MUC password
|
||||
- Private: misc errors cases fixes
|
||||
- Pubsub: return user affiliation for a specified node (EJAB-1294)
|
||||
- Shared Roster: Foreign items were not pushed (EJAB-1509)
|
||||
- Shared Roster LDAP: user substitution in ldap_rfilter (EJAB-1555)
|
||||
- Windows: Fix makefile rules for building DLLs
|
||||
|
||||
|
||||
Bug reports
|
||||
|
||||
You can officially report bugs on ProcessOne support site:
|
||||
http://support.process-one.net/
|
||||
@@ -0,0 +1,80 @@
|
||||
|
||||
Release Notes
|
||||
ejabberd 2.1.4
|
||||
|
||||
ejabberd 2.1.4 is the fourth release in ejabberd 2.1.x branch,
|
||||
and includes many small bugfixes and improvements.
|
||||
|
||||
Read more details about the changes in:
|
||||
http://redir.process-one.net/ejabberd-2.1.4
|
||||
|
||||
Download the source code and installers from:
|
||||
http://www.process-one.net/en/ejabberd/
|
||||
|
||||
|
||||
This is the full list of changes:
|
||||
|
||||
* Authentication
|
||||
- Extauth: Optionally cache extauth users in mnesia (EJAB-641)
|
||||
- LDAP: Allow inband password change (EJAB-199)
|
||||
- LDAP: Extensible match support (EJAB-722)
|
||||
- LDAP: New option ldap_tls_verify is added (EJAB-1229)
|
||||
- PAM: New option pam_userinfotype to provide username or JID (EJAB-652)
|
||||
|
||||
* HTTP
|
||||
- Add xml default content type
|
||||
- Don't show HTTP request in logs, because reveals password (EJAB-1231)
|
||||
- Move HTTP session timeout log from warning level to info
|
||||
- New Access rule webadmin_view for read-only
|
||||
|
||||
* HTTP-Bind (BOSH)
|
||||
- Change max inactivity from 30 to 120 seconds
|
||||
- Export functions to facilitate prebinding methods
|
||||
- Use dirty_delete when removing the session
|
||||
- Remove an unneeded delay of 100 milliseconds
|
||||
|
||||
* Pubsub, PEP and Caps
|
||||
- Enforce pubsub#presence_based_delivery (EJAB-1221)
|
||||
- Enforce pubsub#show_values subscription option (EJAB-1096)
|
||||
- Fix error code when unsubscribing from a non-existent node
|
||||
- Fix to send node notifications (EJAB-1225)
|
||||
- Full support for XEP-0115 v1.5 (EJAB-1223)(EJAB-1189)
|
||||
- Make last_item_cache feature to be cluster aware
|
||||
- Prevent orphaned pubsub node (EJAB-1233)
|
||||
- Send created node notifications
|
||||
|
||||
* Other
|
||||
- Bounce messages when closing c2s session
|
||||
- Bugfixes when handling Service Discovery to contacts (EJAB-1207)
|
||||
- Compilation of ejabberd_debug.erl is now optional
|
||||
- Don't send error stanza as reply to error stanza (EJAB-930)
|
||||
- Don't store blocked messages in offline queue
|
||||
- Reduce verbosity of log when captcha_cmd is checked but not configured
|
||||
- Use a standard method to get a random seed (EJAB-1229)
|
||||
- Commands: new update_list and update to update modified modules (EJAB-1237)
|
||||
- Localization: Updated most translations
|
||||
- MUC: Refactor code to reduce calls to get_affiliation and get_role
|
||||
- ODBC: Add created_at column also to PostgreSQL schema
|
||||
- Vcard: Automatic vcard avatar addition in presence
|
||||
|
||||
|
||||
Upgrading From previous ejabberd releases:
|
||||
|
||||
- If you use PostgreSQL, maybe you want to add the column created_at
|
||||
to several tables. This is only a suggestion; ejabberd doesn't use
|
||||
that column. Add it to your existing database executing those SQL
|
||||
statements:
|
||||
|
||||
ALTER TABLE users ADD COLUMN created_at TIMESTAMP NOT NULL DEFAULT now();
|
||||
ALTER TABLE rosterusers ADD COLUMN created_at TIMESTAMP NOT NULL DEFAULT now();
|
||||
ALTER TABLE spool ADD COLUMN created_at TIMESTAMP NOT NULL DEFAULT now();
|
||||
ALTER TABLE vcard ADD COLUMN created_at TIMESTAMP NOT NULL DEFAULT now();
|
||||
ALTER TABLE privacy_list ADD COLUMN created_at TIMESTAMP NOT NULL DEFAULT now();
|
||||
ALTER TABLE privacy_storage ADD COLUMN created_at TIMESTAMP NOT NULL DEFAULT now();
|
||||
|
||||
|
||||
Bug reports
|
||||
|
||||
You can officially report bugs on ProcessOne support site:
|
||||
http://support.process-one.net/
|
||||
|
||||
@@ -0,0 +1,70 @@
|
||||
|
||||
Release Notes
|
||||
ejabberd 2.1.5
|
||||
|
||||
ejabberd 2.1.5 is the fifth release in ejabberd 2.1.x branch,
|
||||
and includes several minor bugfixes and a few improvements.
|
||||
|
||||
Read more details about the changes in:
|
||||
http://redir.process-one.net/ejabberd-2.1.4
|
||||
|
||||
Download the source code and installers from:
|
||||
http://www.process-one.net/en/ejabberd/
|
||||
|
||||
|
||||
This is the full list of changes:
|
||||
|
||||
* Authentication
|
||||
- Extauth: Support parallel script running (EJAB-1280)
|
||||
- mod_register: Return Registered element when account exists
|
||||
|
||||
* ejabberdctl
|
||||
- Fix print of command result that contains ~
|
||||
- Fix problem when FIREWALL_WINDOW options for erl kernel were used
|
||||
- Fix typo in update_list command (EJAB-1237)
|
||||
- Some systems delete the lock dir; in such case don't use flock at all
|
||||
- The command Update now returns meaningful message and exit-status (EJAB-1237)
|
||||
|
||||
* HTTP-Bind (BOSH)
|
||||
- Don't say v1.2 in the Bind HTTP page
|
||||
- New optional BOSH connection attribute process-delay (EJAB-1257)
|
||||
|
||||
* MUC
|
||||
- Document the mod_muc option captcha_protected
|
||||
- Now admins are able to see private rooms in disco (EJAB-1269)
|
||||
- Show some more room options in the log file
|
||||
|
||||
* ODBC
|
||||
- Correct handling of SQL boolean types (EJAB-1275)
|
||||
- Discard too old queued requests (the caller has already got a timeout)
|
||||
- Fixes wrong SQL escaping when --enable-full-xml is set
|
||||
- Use ets insead of asking supervisor in ejabberd_odbc_sup:get_pids/1
|
||||
|
||||
* Pubsub, PEP and Caps
|
||||
- Enforce disco features results (EJAB-1033, EJAB-1228, EJAB-1238)
|
||||
- Support all the hash functions required by Caps XEP-0115
|
||||
|
||||
* Requirements
|
||||
- Fixed support for Erlang R12; which doesn't support: true andalso ok
|
||||
- Support OTP R14A by using public_key library instead of old ssl (EJAB-953)
|
||||
- Requirement of OpenSSL increased from 0.9.6 to 0.9.8
|
||||
- OpenSSL is now required, not optional
|
||||
|
||||
* Other
|
||||
- Don't ask for client certificate when using tls (EJAB-1267)
|
||||
- Fix typo in --enable-transient_supervisors
|
||||
- Fix privacy check when serving local Last (EJAB-1271)
|
||||
- Inform client that SSL session caching is disabled
|
||||
- New configure option: --enable-nif
|
||||
- Use driver allocator in C files for reflecting memory in erlang:memory(system)
|
||||
- Debug: New p1_prof compiled with: make debugtools=true
|
||||
- Debug: Added functions to collect stats about queues, memory, reductions etc
|
||||
- HTTP: Log error if request has ambiguous Host header (EJAB-1261)
|
||||
- Logs: When logging s2s out connection attempt or success, log if TLS is used
|
||||
- Shared Rosters: When account is deleted, delete also member of stored rosters
|
||||
|
||||
|
||||
Bug reports
|
||||
|
||||
You can officially report bugs on ProcessOne support site:
|
||||
http://support.process-one.net/
|
||||
@@ -0,0 +1,67 @@
|
||||
|
||||
Release Notes
|
||||
ejabberd 2.1.6
|
||||
|
||||
ejabberd 2.1.6 is the sixth release in ejabberd 2.1.x branch,
|
||||
and includes a lot of bugfixes and improvements.
|
||||
|
||||
Read more details about the changes in:
|
||||
http://redir.process-one.net/ejabberd-2.1.6
|
||||
|
||||
Download the source code and installers from:
|
||||
http://www.process-one.net/en/ejabberd/
|
||||
|
||||
|
||||
Some of the changes are:
|
||||
|
||||
* Account register
|
||||
- mod_register: New ip_access option restricts which IPs can register (EJAB-915)
|
||||
- mod_register: Default configuration allows registrations only from localhost
|
||||
- mod_register: New password_strength for entropy check (EJAB-1326)
|
||||
- mod_register: New captcha_protected option to require CAPTCHA (EJAB-1262)
|
||||
- mod_register_web: New module, with CAPTCHA support (EJAB-471)
|
||||
|
||||
* BOSH
|
||||
- Don't loop when there is nothing after a stream start (EJAB-1358)
|
||||
- Fix http-bind supervisor to support multiple vhosts (EJAB-1321)
|
||||
- Support to restart http-bind (EJAB-1318)
|
||||
- Support for X-Forwarded-For HTTP header (EJAB-1356)
|
||||
|
||||
* Erlang/OTP compatibility
|
||||
- R11: Fix detection of Erlang R11 and older (EJAB-1287)
|
||||
- R12B5: Fix compatibility in ejabberd_http_bind.erl (EJAB-1343)
|
||||
- R14A: Make xml.c correctly compile (EJAB-1288)
|
||||
- R14A, R14B: Disapprove the use of R14A and R14B due to the rwlock bug
|
||||
- R14B: Use pg2 from this version in systems with older ones (EJAB-1349)
|
||||
|
||||
* Listeners
|
||||
- Bind listener ports early and start accepting connections later
|
||||
- Fix a leak of ejabberd_receiver processes
|
||||
- Speed up ejabberd_s2s:is_service/2, allow_host/2 (EJAB-1319)
|
||||
- S2S: New option to require encryption (EJAB-495)
|
||||
- S2S: New option to reject connection if untrusted certificate (EJAB-464)
|
||||
- S2S: Include From attribute in the stream header of outgoing S2S connections
|
||||
- S2S: Fix domain_certfile tlsopts modifications for S2S connections (EJAB-1086)
|
||||
|
||||
* Pubsub/PEP/Caps
|
||||
- Fix pubsub cross domain eventing (EJAB-1340)
|
||||
- Use one_queue IQ discipline by default
|
||||
- Implement lifetime for broken hashes
|
||||
- New CAPS processing
|
||||
|
||||
* ODBC
|
||||
- Increase maximum restart strategy to handle some SQL timeouts
|
||||
- Support PostgreSQL 9.0 (EJAB-1359)
|
||||
- Use MEDIUMTEXT type for vcard avatars in MySQL schema (EJAB-1252)
|
||||
|
||||
* Miscellanea:
|
||||
- mod_shared_roster_ldap: New Shared Roster Groups using LDAP information
|
||||
- mod_privacy: Fix to allow block by group and subscription again
|
||||
- Support timezone West of UTC (EJAB-1301)
|
||||
- Support to change loglevel per module at runtime (EJAB-225)
|
||||
|
||||
|
||||
Bug reports
|
||||
|
||||
You can officially report bugs on ProcessOne support site:
|
||||
http://support.process-one.net/
|
||||
@@ -0,0 +1,97 @@
|
||||
|
||||
Release Notes
|
||||
ejabberd 2.1.7
|
||||
|
||||
ejabberd 2.1.7 is the eighth release in ejabberd 2.1.x branch,
|
||||
and includes a lot of bugfixes and improvements.
|
||||
|
||||
Read more details about the changes in:
|
||||
http://redir.process-one.net/ejabberd-2.1.7
|
||||
|
||||
Download the source code and installers from:
|
||||
http://www.process-one.net/en/ejabberd/
|
||||
|
||||
|
||||
The changes are:
|
||||
|
||||
* BOSH and Web
|
||||
- Clarify error message when BOSH query is sent to non-running module
|
||||
- Keep the order of stanzas when BOSH sends several (EJAB-1374)
|
||||
- Show configuration for HTTPS http_bind
|
||||
- Support as read-only HTTP method not only GET, also HEAD
|
||||
- The responses to HEAD must have empty Body
|
||||
|
||||
* CAPTCHA
|
||||
- If the port number isn't listener, then specify the protocol (EJAB-1418)
|
||||
- New CAPTCHA limit
|
||||
- New CAPTCHA whitelist support
|
||||
- Only check system at startup if option is enabled
|
||||
- Provide HTTPS URL in CAPTCHA form when listener has 'tls' option (EJAB-1406)
|
||||
- Show captcha_limit option in the example config
|
||||
- Support more captcha_host value formats (EJAB-1418)
|
||||
- Throw error when captcha fails at server start, not later at runtime
|
||||
- captcha_host must have the port number to get protocol (EJAB-1418)
|
||||
|
||||
* Core ejabberd
|
||||
- Disable all entity expansions (EJAB-1451)
|
||||
- Do not accept XML with undefined prefixes (EJAB-680)
|
||||
- Make jlib:ip_to_list safe to use
|
||||
- Make sure 'closed' event is correctly processed on every state
|
||||
- New route_iq/5 accepting Timeout (EJAB-1398)
|
||||
- Take into consideration internal queue length when sorting processes queues
|
||||
- Use route instead of send_element to go through standard workflow
|
||||
|
||||
* Erlang/OTP compatibility
|
||||
- Remove Type and Spec, backport list comprehensions, so R12B-5 can compile
|
||||
- Tweak pg2_backport.erl to work with Erlang older than R13A (EJAB-1349)
|
||||
|
||||
* ODBC
|
||||
- Don't let presence-in privacy rule block a presence subscription (EJAB-255)
|
||||
- Escape user input in mod_privacy_odbc (EJAB-1442)
|
||||
- Try to improve support for roster_version in MSSQL (EJAB-1437)
|
||||
|
||||
* Pubsub/PEP/Caps
|
||||
- Apply filtered notification to PEP last items (EJAB-1456)
|
||||
- Fix empty pubsub payload check
|
||||
- Owner can delete any items from its own node (EJAB-1445)
|
||||
- Pubsub node maxitem forced to 0 if non persistent node (EJAB-1434)
|
||||
- Reorganize the push_item function, and handle version not_found (EJAB-1420)
|
||||
|
||||
* Scripts
|
||||
- ejabberd.init: Several fixes and improvements
|
||||
- ejabberdctl: Escape output from ctlexec() to erl script (EJAB-1399)
|
||||
- ejabberdctl: Fix bashism and mimic master branch (EJAB-1404)
|
||||
- ejabberdctl: Fix space between INET_DIST_INTERFACE (EJAB-1416)
|
||||
- ejabberdctl: New DIST_USE_INTERFACE restricts IP of erlang listen (EJAB-1404)
|
||||
- ejabberdctl: New ERL_EPMD_ADDRESS that works since Erlang/OTP R14B03
|
||||
- extauth: Fix delayed response of timeout was reused for next login (EJAB-1385)
|
||||
- extauth: Forward old messages to newly spawned extauth process (EJAB-1385)
|
||||
- extauth: If script crashes, ejabberd should restart it (EJAB-1428)
|
||||
|
||||
* XEP support
|
||||
- mod_blocking: New XEP-0191 Simple Communications Blocking (EJAB-695)
|
||||
- No need to inform that XEP-0237 is optional; clarified in XEP version 1.2
|
||||
|
||||
* Miscellanea:
|
||||
- If a module start fails during server start, stop erlang (EJAB-1446)
|
||||
- New Indonesian translation (EJAB-1407)
|
||||
- LDAP: Note that ejabberd works with CGP LDAP server
|
||||
- S2S: Handle Tigase's unexpected version=1.0 (EJAB-1379)
|
||||
- mod_irc: Send presence unavailable to the departing occupant (EJAB-1417)
|
||||
- mod_last: Allow user to query his own Last activity
|
||||
- mod_muc: Do not decrease MUC admin's role/affiliation
|
||||
- mod_muc: Send jid attribute when occupant is banned (EJAB-1432)
|
||||
- mod_offline: Change c2s state before offline messages resending
|
||||
- mod_ping: Use iqdisc no_queue by default (EJAB-1435)
|
||||
- mod_pres_counter: Prevent subscription flood (EJAB-1388)
|
||||
- mod_register Access now also controls account unregistrations
|
||||
- mod_register: Clarify more the expected content of welcome_message option
|
||||
- mod_shared_roster: Fix support for anonymous accounts in @all@ (EJAB-1264)
|
||||
- mod_shared_roster: New @online@ directive (EJAB-1391)
|
||||
|
||||
|
||||
Bug reports
|
||||
|
||||
You can officially report bugs on ProcessOne support site:
|
||||
http://support.process-one.net/
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
|
||||
Release Notes
|
||||
ejabberd 2.1.8
|
||||
|
||||
ejabberd 2.1.8 is the ninth release in ejabberd 2.1.x branch,
|
||||
and includes a PubSub regression bugfix.
|
||||
|
||||
Download the source code and installers from:
|
||||
http://www.process-one.net/en/ejabberd/
|
||||
|
||||
|
||||
The change is:
|
||||
|
||||
- Fix issue on PubSub preventing publication of items (EJAB-1457)
|
||||
|
||||
|
||||
|
||||
Bug reports
|
||||
|
||||
You can officially report bugs on ProcessOne support site:
|
||||
http://support.process-one.net/
|
||||
@@ -0,0 +1,56 @@
|
||||
|
||||
Release Notes
|
||||
ejabberd 2.1.9
|
||||
|
||||
ejabberd 2.1.9 is the eighth release in ejabberd 2.1.x branch,
|
||||
and includes a lot of bugfixes and improvements.
|
||||
|
||||
Read more details about the changes in:
|
||||
http://redir.process-one.net/ejabberd-2.1.9
|
||||
|
||||
Download the source code and installers from:
|
||||
http://www.process-one.net/en/ejabberd/
|
||||
|
||||
|
||||
The changes are:
|
||||
|
||||
* Core ejabberd
|
||||
- Decrease CPU usage caused by tls:send with large data
|
||||
- Escape iolist correctly when NIFs are disabled (EJAB-1462)
|
||||
- Fix code to satisfy Dialyzer warnings
|
||||
- Fix compilation in Windows
|
||||
- Replace calls of OTP's Binary, since they would require R14
|
||||
|
||||
* LDAP
|
||||
- Document ldap_tls_cacertfile and ldap_tls_depth options (EJAB-1299)
|
||||
- Log an error when an LDAP filter is incorrect (EJAB-1395)
|
||||
- New options: ldap_tls_cacertfile and ldap_tls_depth (EJAB-1299)
|
||||
- New option: ldap_deref_aliases (EJAB-639)
|
||||
- Match ldap_uidattr_format case-insensitively (EJAB-1449)
|
||||
|
||||
* MUC
|
||||
- Support for multiple entry with same nick to MUC rooms (EJAB-305)
|
||||
- Support voice request and approvement
|
||||
- New room option: allow_private_messages_from_visitors
|
||||
- New room options: allow_voice_requests and voice_request_min_interval
|
||||
- Include status 110 in presence to new occupant (EJAB-740)
|
||||
- Fix mod_muc_log crash when first log entry is room destroy (EJAB-1499)
|
||||
- Many fixes and improvements in mod_muc
|
||||
|
||||
* Pubsub
|
||||
- Enable pubsub#deliver_notification checking (EJAB-1453)
|
||||
- Fix Denial of Service when user sends malformed publish stanza (EJAB-1498)
|
||||
|
||||
* ODBC
|
||||
- Fix ODBC account counting (EJAB-1491)
|
||||
- Optimized mod_roster_odbc:get_roster
|
||||
|
||||
* Miscellanea:
|
||||
- New SASL SCRAM-SHA-1 authentication mechanism (EJAB-1196)
|
||||
- New option: resource_conflict (EJAB-650)
|
||||
|
||||
|
||||
Bug reports
|
||||
|
||||
You can officially report bugs on ProcessOne support site:
|
||||
http://support.process-one.net/
|
||||
+1
-1
@@ -1,2 +1,2 @@
|
||||
% ejabberd version (automatically generated).
|
||||
\newcommand{\version}{2.1.3}
|
||||
\newcommand{\version}{3.0.0}
|
||||
|
||||
@@ -154,6 +154,13 @@
|
||||
%%
|
||||
%%{{3478, udp}, ejabberd_stun, []},
|
||||
|
||||
%%
|
||||
%% To handle XML-RPC requests that provide admin credentials:
|
||||
%%
|
||||
%%{4560, ejabberd_xmlrpc, [
|
||||
%% {access_commands, [{admin, all, []}]}
|
||||
%% ]},
|
||||
|
||||
{5280, ejabberd_http, [
|
||||
%%{request_handlers,
|
||||
%% [
|
||||
@@ -162,6 +169,7 @@
|
||||
captcha,
|
||||
http_bind,
|
||||
http_poll,
|
||||
%%register,
|
||||
web_admin
|
||||
]}
|
||||
|
||||
@@ -169,10 +177,10 @@
|
||||
|
||||
%%
|
||||
%% s2s_use_starttls: Enable STARTTLS + Dialback for S2S connections.
|
||||
%% Allowed values are: true or false.
|
||||
%% Allowed values are: false optional required required_trusted
|
||||
%% You must specify a certificate file.
|
||||
%%
|
||||
%%{s2s_use_starttls, true}.
|
||||
%%{s2s_use_starttls, optional}.
|
||||
|
||||
%%
|
||||
%% s2s_certfile: Specify a certificate file.
|
||||
@@ -217,6 +225,13 @@
|
||||
%% comment this line and enable the correct ones.
|
||||
%%
|
||||
{auth_method, internal}.
|
||||
%%
|
||||
%% Store the plain passwords or hashed for SCRAM:
|
||||
%%{auth_password_format, plain}.
|
||||
%%{auth_password_format, scram}.
|
||||
%%
|
||||
%% Define the FQDN if ejabberd doesn't detect it:
|
||||
%%{fqdn, "server3.example.com"}.
|
||||
|
||||
%%
|
||||
%% Authentication using external script
|
||||
@@ -474,10 +489,14 @@
|
||||
%%{captcha_cmd, "/lib/ejabberd/priv/bin/captcha.sh"}.
|
||||
|
||||
%%
|
||||
%% Host part of the URL sent to the user.
|
||||
%% Host for the URL and port where ejabberd listens for CAPTCHA requests.
|
||||
%%
|
||||
%%{captcha_host, "example.org:5280"}.
|
||||
|
||||
%%
|
||||
%% Limit CAPTCHA calls per minute for JID/IP to avoid DoS.
|
||||
%%
|
||||
%%{captcha_limit, 5}.
|
||||
|
||||
%%%. =======
|
||||
%%%' MODULES
|
||||
@@ -489,6 +508,7 @@
|
||||
[
|
||||
{mod_adhoc, []},
|
||||
{mod_announce, [{access, announce}]}, % recommends mod_adhoc
|
||||
{mod_blocking,[]}, % requires mod_privacy
|
||||
{mod_caps, []},
|
||||
{mod_configure,[]}, % requires mod_adhoc
|
||||
{mod_disco, []},
|
||||
@@ -510,6 +530,7 @@
|
||||
%%{mod_muc_log,[]},
|
||||
{mod_offline, [{access_max_user_messages, max_user_offline_messages}]},
|
||||
{mod_ping, []},
|
||||
%%{mod_pres_counter,[{count, 5}, {interval, 60}]},
|
||||
{mod_privacy, []},
|
||||
{mod_private, []},
|
||||
%%{mod_proxy65,[]},
|
||||
@@ -521,6 +542,16 @@
|
||||
{plugins, ["flat", "hometree", "pep"]} % pep requires mod_caps
|
||||
]},
|
||||
{mod_register, [
|
||||
%%
|
||||
%% Protect In-Band account registrations with CAPTCHA.
|
||||
%%
|
||||
%%{captcha_protected, true},
|
||||
|
||||
%%
|
||||
%% Set the minimum informational entropy for passwords.
|
||||
%%
|
||||
%%{password_strength, 32},
|
||||
|
||||
%%
|
||||
%% After successful registration, the user receives
|
||||
%% a message with this subject and body.
|
||||
@@ -534,8 +565,26 @@
|
||||
%%
|
||||
%%{registration_watchers, ["admin1@example.org"]},
|
||||
|
||||
%%
|
||||
%% Only clients in the server machine can register accounts
|
||||
%%
|
||||
{ip_access, [{allow, "127.0.0.0/8"},
|
||||
{deny, "0.0.0.0/0"}]},
|
||||
|
||||
%%
|
||||
%% Local c2s or remote s2s users cannot register accounts
|
||||
%%
|
||||
%%{access_from, deny},
|
||||
|
||||
{access, register}
|
||||
]},
|
||||
%%{mod_register_web, [
|
||||
%%
|
||||
%% When a user registers, send a notification to
|
||||
%% these XMPP accounts.
|
||||
%%
|
||||
%%{registration_watchers, ["admin1@example.org"]}
|
||||
%% ]},
|
||||
{mod_roster, []},
|
||||
%%{mod_service_log,[]},
|
||||
{mod_shared_roster,[]},
|
||||
@@ -1,6 +1,20 @@
|
||||
#! /bin/sh
|
||||
|
||||
### BEGIN INIT INFO
|
||||
# Provides: ejabberd
|
||||
# Required-Start: $remote_fs $network $named $time
|
||||
# Required-Stop: $remote_fs $network $named $time
|
||||
# Default-Start: 2 3 4 5
|
||||
# Default-Stop: 0 1 6
|
||||
# Short-Description: Starts ejabberd jabber server
|
||||
# Description: Starts ejabberd jabber server, an XMPP
|
||||
# compliant server written in Erlang.
|
||||
### END INIT INFO
|
||||
|
||||
# chkconfig: 2345 90 10
|
||||
# description: ejabberd XMPP server
|
||||
|
||||
set -o errexit
|
||||
set -o nounset
|
||||
|
||||
DIR=@ctlscriptpath@
|
||||
CTL="$DIR"/ejabberdctl
|
||||
@@ -32,14 +46,17 @@ case "$1" in
|
||||
su - $USER -c "$CTL stopped"
|
||||
echo "done."
|
||||
;;
|
||||
|
||||
status)
|
||||
test -x "$CTL" || exit 0
|
||||
echo "Getting ejabberd status..."
|
||||
su - $USER -c "$CTL status"
|
||||
;;
|
||||
force-reload|restart)
|
||||
"$0" stop
|
||||
"$0" start
|
||||
;;
|
||||
|
||||
*)
|
||||
echo "Usage: $0 {start|stop|restart|force-reload}"
|
||||
echo "Usage: $0 {start|stop|restart|force-reload|status}"
|
||||
exit 1
|
||||
esac
|
||||
|
||||
@@ -50,12 +50,39 @@
|
||||
#
|
||||
#FIREWALL_WINDOW=
|
||||
|
||||
#.
|
||||
#' INET_DIST_INTERFACE: IP address where this Erlang node listens other nodes
|
||||
#
|
||||
# This communication is used by ejabberdctl command line tool,
|
||||
# and in a cluster of several ejabberd nodes.
|
||||
# Notice that the IP address must be specified in the Erlang syntax.
|
||||
#
|
||||
# Default: {127,0,0,1}
|
||||
#
|
||||
INET_DIST_INTERFACE={127,0,0,1}
|
||||
|
||||
#.
|
||||
#' ERL_EPMD_ADDRESS: IP addresses where epmd listens for connections
|
||||
#
|
||||
# IMPORTANT: This option works only in Erlang/OTP R14B03 and newer.
|
||||
#
|
||||
# This environment variable may be set to a comma-separated
|
||||
# list of IP addresses, in which case the epmd daemon
|
||||
# will listen only on the specified address(es) and on the
|
||||
# loopback address (which is implicitly added to the list if it
|
||||
# has not been specified). The default behaviour is to listen on
|
||||
# all available IP addresses.
|
||||
#
|
||||
# Default: 0.0.0.0
|
||||
#
|
||||
#ERL_EPMD_ADDRESS=127.0.0.1
|
||||
|
||||
#.
|
||||
#' ERL_PROCESSES: Maximum number of Erlang processes
|
||||
#
|
||||
# Erlang consumes a lot of lightweight processes. If there is a lot of activity
|
||||
# on ejabberd so that the maximum number of processes is reached, people will
|
||||
# experiment greater latency times. As these processes are implemented in
|
||||
# experience greater latency times. As these processes are implemented in
|
||||
# Erlang, and therefore not related to the operating system processes, you do
|
||||
# not have to worry about allowing a huge number of them.
|
||||
#
|
||||
@@ -106,9 +133,9 @@
|
||||
# The same as previous, but erlang will use long hostname
|
||||
# (see erl (1) manual for details)
|
||||
#
|
||||
# Default: ejabberd
|
||||
# Default: ejabberd@localhost
|
||||
#
|
||||
#ERLANG_NODE=ejabberd
|
||||
#ERLANG_NODE=ejabberd@localhost
|
||||
|
||||
#.
|
||||
#' EJABBERD_PID_PATH: ejabberd PID file
|
||||
Regular → Executable
+138
-88
@@ -7,12 +7,14 @@ ERL_MAX_PORTS=32000
|
||||
ERL_PROCESSES=250000
|
||||
ERL_MAX_ETS_TABLES=1400
|
||||
|
||||
SCRIPT_DIR=$(cd ${0%/*} && pwd)
|
||||
|
||||
# define default environment variables
|
||||
NODE=ejabberd
|
||||
HOST=localhost
|
||||
ERLANG_NODE=$NODE@$HOST
|
||||
ERL=@erl@
|
||||
INSTALLUSER=@installuser@
|
||||
ERL={{erl}}
|
||||
INSTALLUSER={{installuser}}
|
||||
|
||||
# parse command line parameters
|
||||
ARGS=
|
||||
@@ -33,7 +35,7 @@ done
|
||||
|
||||
# Define ejabberd variable if they have not been defined from the command line
|
||||
if [ "$ETCDIR" = "" ] ; then
|
||||
ETCDIR=@SYSCONFDIR@/ejabberd
|
||||
ETCDIR={{sysconfdir}}/ejabberd
|
||||
fi
|
||||
if [ "$EJABBERD_CONFIG_PATH" = "" ] ; then
|
||||
EJABBERD_CONFIG_PATH=$ETCDIR/ejabberd.cfg
|
||||
@@ -41,18 +43,21 @@ fi
|
||||
if [ "$EJABBERDCTL_CONFIG_PATH" = "" ] ; then
|
||||
EJABBERDCTL_CONFIG_PATH=$ETCDIR/ejabberdctl.cfg
|
||||
fi
|
||||
[ -f "$EJABBERDCTL_CONFIG_PATH" ] && . "$EJABBERDCTL_CONFIG_PATH"
|
||||
if [ -f "$EJABBERDCTL_CONFIG_PATH" ] ; then
|
||||
. "$EJABBERDCTL_CONFIG_PATH"
|
||||
fi
|
||||
if [ "$LOGS_DIR" = "" ] ; then
|
||||
LOGS_DIR=@LOCALSTATEDIR@/log/ejabberd
|
||||
LOGS_DIR={{localstatedir}}/log/ejabberd
|
||||
fi
|
||||
if [ "$SPOOLDIR" = "" ] ; then
|
||||
SPOOLDIR=@LOCALSTATEDIR@/lib/ejabberd
|
||||
SPOOLDIR={{localstatedir}}/lib/ejabberd
|
||||
fi
|
||||
if [ "$EJABBERD_DOC_PATH" = "" ] ; then
|
||||
EJABBERD_DOC_PATH=@DOCDIR@
|
||||
EJABBERD_DOC_PATH={{docdir}}
|
||||
fi
|
||||
if [ "$ERLANG_NODE_ARG" != "" ] ; then
|
||||
ERLANG_NODE=$ERLANG_NODE_ARG
|
||||
NODE=${ERLANG_NODE%@*}
|
||||
fi
|
||||
|
||||
# check the proper system user is used
|
||||
@@ -62,46 +67,52 @@ EJID=`id -g $INSTALLUSER`
|
||||
EXEC_CMD="false"
|
||||
for GID in $GIDS; do
|
||||
if [ $GID -eq 0 ] ; then
|
||||
EXEC_CMD="su ${INSTALLUSER} -p -c"
|
||||
EXEC_CMD="su ${INSTALLUSER} -p -c"
|
||||
fi
|
||||
done
|
||||
if [ "$ID" -eq "$EJID" ] ; then
|
||||
EXEC_CMD="sh -c"
|
||||
EXEC_CMD="sh -c"
|
||||
fi
|
||||
if [ "$EXEC_CMD" = "false" ] ; then
|
||||
echo "This command can only be run by root or the user $INSTALLUSER" >&2
|
||||
exit 4
|
||||
echo "This command can only be run by root or the user $INSTALLUSER" >&2
|
||||
exit 4
|
||||
fi
|
||||
|
||||
NAME=-name
|
||||
[ "$ERLANG_NODE" = "${ERLANG_NODE%.*}" ] && NAME=-sname
|
||||
|
||||
if [ "$FIREWALL_WINDOW" = "" ] ; then
|
||||
KERNEL_OPTS=""
|
||||
else
|
||||
KERNEL_OPTS="-kernel inet_dist_listen_min ${FIREWALL_WINDOW%-*} inet_dist_listen_max ${FIREWALL_WINDOW#*-}"
|
||||
if [ "$ERLANG_NODE" = "${ERLANG_NODE%.*}" ] ; then
|
||||
NAME=-sname
|
||||
fi
|
||||
|
||||
ERLANG_OPTS="+K $POLL -smp $SMP +P $ERL_PROCESSES $ERL_OPTIONS $KERNEL_OPTS"
|
||||
KERNEL_OPTS=""
|
||||
if [ "$FIREWALL_WINDOW" != "" ] ; then
|
||||
KERNEL_OPTS="${KERNEL_OPTS} -kernel inet_dist_listen_min ${FIREWALL_WINDOW%-*} inet_dist_listen_max ${FIREWALL_WINDOW#*-}"
|
||||
fi
|
||||
if [ "$INET_DIST_INTERFACE" != "" ] ; then
|
||||
KERNEL_OPTS="${KERNEL_OPTS} -kernel inet_dist_use_interface \"${INET_DIST_INTERFACE}\""
|
||||
fi
|
||||
|
||||
ERLANG_OPTS="+K $POLL -smp $SMP +P $ERL_PROCESSES $ERL_OPTIONS"
|
||||
|
||||
# define additional environment variables
|
||||
if [ "$EJABBERDDIR" = "" ]; then
|
||||
EJABBERDDIR=@LIBDIR@/ejabberd
|
||||
fi
|
||||
if [ "$EJABBERD_EBIN_PATH" = "" ]; then
|
||||
EJABBERD_EBIN_PATH=$EJABBERDDIR/ebin
|
||||
fi
|
||||
if [ "$EJABBERD_PRIV_PATH" = "" ]; then
|
||||
EJABBERD_PRIV_PATH=$EJABBERDDIR/priv
|
||||
fi
|
||||
if [ "$EJABBERD_BIN_PATH" = "" ]; then
|
||||
EJABBERD_BIN_PATH=$EJABBERD_PRIV_PATH/bin
|
||||
fi
|
||||
if [ "$EJABBERD_SO_PATH" = "" ]; then
|
||||
EJABBERD_SO_PATH=$EJABBERD_PRIV_PATH/lib
|
||||
fi
|
||||
if [ "$EJABBERD_MSGS_PATH" = "" ]; then
|
||||
EJABBERD_MSGS_PATH=$EJABBERD_PRIV_PATH/msgs
|
||||
if [ "{{release}}" != "true" ] ; then
|
||||
if [ "$EJABBERDDIR" = "" ] ; then
|
||||
EJABBERDDIR={{libdir}}/ejabberd
|
||||
fi
|
||||
if [ "$EJABBERD_EBIN_PATH" = "" ] ; then
|
||||
EJABBERD_EBIN_PATH=$EJABBERDDIR/ebin
|
||||
fi
|
||||
if [ "$EJABBERD_PRIV_PATH" = "" ] ; then
|
||||
EJABBERD_PRIV_PATH=$EJABBERDDIR/priv
|
||||
fi
|
||||
if [ "$EJABBERD_BIN_PATH" = "" ] ; then
|
||||
EJABBERD_BIN_PATH=$EJABBERD_PRIV_PATH/bin
|
||||
fi
|
||||
if [ "$EJABBERD_SO_PATH" = "" ] ; then
|
||||
EJABBERD_SO_PATH=$EJABBERD_PRIV_PATH/lib
|
||||
fi
|
||||
if [ "$EJABBERD_MSGS_PATH" = "" ] ; then
|
||||
EJABBERD_MSGS_PATH=$EJABBERD_PRIV_PATH/msgs
|
||||
fi
|
||||
fi
|
||||
|
||||
EJABBERD_LOG_PATH=$LOGS_DIR/ejabberd.log
|
||||
@@ -114,6 +125,10 @@ HOME=$SPOOLDIR
|
||||
# create the home dir with the proper user if doesn't exist, because it stores cookie file
|
||||
[ -d $HOME ] || $EXEC_CMD "mkdir -p $HOME"
|
||||
|
||||
# Change to a directory readable by INSTALLUSER to
|
||||
# prevent "File operation error: eacces." messages
|
||||
cd $HOME
|
||||
|
||||
# export global variables
|
||||
export EJABBERD_CONFIG_PATH
|
||||
export EJABBERD_MSGS_PATH
|
||||
@@ -123,6 +138,7 @@ export EJABBERD_BIN_PATH
|
||||
export EJABBERD_DOC_PATH
|
||||
export EJABBERD_PID_PATH
|
||||
export ERL_CRASH_DUMP
|
||||
export ERL_EPMD_ADDRESS
|
||||
export ERL_INETRC
|
||||
export ERL_MAX_PORTS
|
||||
export ERL_MAX_ETS_TABLES
|
||||
@@ -136,11 +152,13 @@ export EXEC_CMD
|
||||
# start server
|
||||
start ()
|
||||
{
|
||||
check_start
|
||||
$EXEC_CMD "$ERL \
|
||||
$NAME $ERLANG_NODE \
|
||||
-noinput -detached \
|
||||
-pa $EJABBERD_EBIN_PATH \
|
||||
-mnesia dir \"\\\"$SPOOLDIR\\\"\" \
|
||||
$KERNEL_OPTS \
|
||||
-s ejabberd \
|
||||
-sasl sasl_error_logger \\{file,\\\"$SASL_LOG_PATH\\\"\\} \
|
||||
$ERLANG_OPTS $ARGS \"$@\""
|
||||
@@ -166,7 +184,7 @@ debug ()
|
||||
echo " EJABBERD_BYPASS_WARNINGS=true"
|
||||
echo "Press any key to continue"
|
||||
if [ "$EJABBERD_BYPASS_WARNINGS" != "true" ] ; then
|
||||
read foo
|
||||
read foo
|
||||
fi
|
||||
echo ""
|
||||
TTY=`tty | sed -e 's/.*\///g'`
|
||||
@@ -174,12 +192,14 @@ debug ()
|
||||
$NAME debug-${TTY}-${ERLANG_NODE} \
|
||||
-remsh $ERLANG_NODE \
|
||||
-hidden \
|
||||
$KERNEL_OPTS \
|
||||
$ERLANG_OPTS $ARGS \"$@\""
|
||||
}
|
||||
|
||||
# start interactive server
|
||||
live ()
|
||||
{
|
||||
check_start
|
||||
echo "--------------------------------------------------------------------"
|
||||
echo ""
|
||||
echo "IMPORTANT: ejabberd is going to start in LIVE (interactive) mode."
|
||||
@@ -196,17 +216,25 @@ live ()
|
||||
echo " EJABBERD_BYPASS_WARNINGS=true"
|
||||
echo "Press any key to continue"
|
||||
if [ "$EJABBERD_BYPASS_WARNINGS" != "true" ] ; then
|
||||
read foo
|
||||
read foo
|
||||
fi
|
||||
echo ""
|
||||
$EXEC_CMD "$ERL \
|
||||
$NAME $ERLANG_NODE \
|
||||
-pa $EJABBERD_EBIN_PATH \
|
||||
-mnesia dir \"\\\"$SPOOLDIR\\\"\" \
|
||||
$KERNEL_OPTS \
|
||||
-s ejabberd \
|
||||
$ERLANG_OPTS $ARGS \"$@\""
|
||||
}
|
||||
|
||||
etop()
|
||||
{
|
||||
$EXEC_CMD "$ERL \
|
||||
$NAME debug-${TTY}-${ERLANG_NODE} \
|
||||
-hidden -s etop -s erlang halt -output text -node $ERLANG_NODE"
|
||||
}
|
||||
|
||||
help ()
|
||||
{
|
||||
echo ""
|
||||
@@ -234,69 +262,69 @@ ctl ()
|
||||
# using flock if available. Expects a linux-style
|
||||
# flock that can lock a file descriptor.
|
||||
MAXCONNID=100
|
||||
CONNLOCKDIR=@LOCALSTATEDIR@/lock/ejabberdctl
|
||||
CONNLOCKDIR={{localstatedir}}/lock/ejabberdctl
|
||||
FLOCK='/usr/bin/flock'
|
||||
if [ ! -x "$FLOCK" ] ; then
|
||||
JOT='/usr/bin/jot'
|
||||
if [ ! -x "$JOT" ] ; then
|
||||
# no flock or jot, simply invoke ctlexec()
|
||||
CTL_CONN="ctl-${ERLANG_NODE}"
|
||||
ctlexec $CTL_CONN $COMMAND
|
||||
result=$?
|
||||
else
|
||||
# no flock, but at least there is jot
|
||||
RAND=`jot -r 1 0 $MAXCONNID`
|
||||
CTL_CONN="ctl-${RAND}-${ERLANG_NODE}"
|
||||
ctlexec $CTL_CONN $COMMAND
|
||||
result=$?
|
||||
fi
|
||||
if [ ! -x "$FLOCK" ] || [ ! -d "$CONNLOCKDIR" ] ; then
|
||||
JOT='/usr/bin/jot'
|
||||
if [ ! -x "$JOT" ] ; then
|
||||
# no flock or jot, simply invoke ctlexec()
|
||||
CTL_CONN="ctl-${ERLANG_NODE}"
|
||||
ctlexec $CTL_CONN $COMMAND
|
||||
result=$?
|
||||
else
|
||||
# no flock, but at least there is jot
|
||||
RAND=`jot -r 1 0 $MAXCONNID`
|
||||
CTL_CONN="ctl-${RAND}-${ERLANG_NODE}"
|
||||
ctlexec $CTL_CONN $COMMAND
|
||||
result=$?
|
||||
fi
|
||||
else
|
||||
# we have flock so we get a lock
|
||||
# on one of a limited number of
|
||||
# conn names -- this allows
|
||||
# concurrent invocations using a bound
|
||||
# number of atoms
|
||||
for N in $(seq 1 $MAXCONNID); do
|
||||
CTL_CONN="ejabberdctl-$N"
|
||||
CTL_LOCKFILE="$CONNLOCKDIR/$CTL_CONN"
|
||||
(
|
||||
exec 8>"$CTL_LOCKFILE"
|
||||
if flock --nb 8; then
|
||||
ctlexec $CTL_CONN $COMMAND
|
||||
# we have flock so we get a lock
|
||||
# on one of a limited number of
|
||||
# conn names -- this allows
|
||||
# concurrent invocations using a bound
|
||||
# number of atoms
|
||||
for N in $(seq 1 $MAXCONNID); do
|
||||
CTL_CONN="ejabberdctl-$N"
|
||||
CTL_LOCKFILE="$CONNLOCKDIR/$CTL_CONN"
|
||||
(
|
||||
exec 8>"$CTL_LOCKFILE"
|
||||
if flock --nb 8; then
|
||||
ctlexec $CTL_CONN $COMMAND
|
||||
ssresult=$?
|
||||
# segregate from possible flock exit(1)
|
||||
ssresult=$(expr $ssresult \* 10)
|
||||
exit $ssresult
|
||||
else
|
||||
exit 1
|
||||
fi
|
||||
ssresult=$(expr $ssresult \* 10)
|
||||
exit $ssresult
|
||||
else
|
||||
exit 1
|
||||
fi
|
||||
)
|
||||
result=$?
|
||||
if [ $result -eq 1 ]; then
|
||||
result=$?
|
||||
if [ $result -eq 1 ] ; then
|
||||
# means we errored out in flock
|
||||
# rather than in the exec - stay in the loop
|
||||
# trying other conn names...
|
||||
badlock=1
|
||||
else
|
||||
badlock=""
|
||||
break;
|
||||
fi
|
||||
done
|
||||
result=$(expr $result / 10)
|
||||
badlock=1
|
||||
else
|
||||
badlock=""
|
||||
break;
|
||||
fi
|
||||
done
|
||||
result=$(expr $result / 10)
|
||||
fi
|
||||
|
||||
if [ "$badlock" ];then
|
||||
echo "Ran out of connections to try. Your ejabberd processes" >&2
|
||||
echo "may be stuck or this is a very busy server. For very" >&2
|
||||
echo "busy servers, consider raising MAXCONNID in ejabberdctl">&2
|
||||
exit 1;
|
||||
if [ "$badlock" ] ;then
|
||||
echo "Ran out of connections to try. Your ejabberd processes" >&2
|
||||
echo "may be stuck or this is a very busy server. For very" >&2
|
||||
echo "busy servers, consider raising MAXCONNID in ejabberdctl">&2
|
||||
exit 1;
|
||||
fi
|
||||
|
||||
case $result in
|
||||
0) :;;
|
||||
1) :;;
|
||||
2) help;;
|
||||
3) help;;
|
||||
0) :;;
|
||||
1) :;;
|
||||
2) help;;
|
||||
3) help;;
|
||||
esac
|
||||
return $result
|
||||
}
|
||||
@@ -310,6 +338,7 @@ ctlexec ()
|
||||
-noinput \
|
||||
-hidden \
|
||||
-pa $EJABBERD_EBIN_PATH \
|
||||
$KERNEL_OPTS \
|
||||
-s ejabberd_ctl -extra $ERLANG_NODE $COMMAND"
|
||||
}
|
||||
|
||||
@@ -326,6 +355,26 @@ stop_epmd()
|
||||
epmd -names | grep -q name || epmd -kill
|
||||
}
|
||||
|
||||
# make sure node not already running and node name unregistered
|
||||
check_start()
|
||||
{
|
||||
epmd -names | grep -q $NODE && {
|
||||
ps ux | grep -v grep | grep -q $ERLANG_NODE && {
|
||||
echo "ERROR: The ejabberd node '$ERLANG_NODE' is already running."
|
||||
exit 4
|
||||
} || {
|
||||
ps ux | grep beam | grep -v "grep beam" && {
|
||||
echo "ERROR: The ejabberd node '$ERLANG_NODE' is registered,"
|
||||
echo " but no ejabberd process has been found."
|
||||
echo "Shutdown other erlang nodes, and call 'epmd -kill'."
|
||||
exit 5
|
||||
} || {
|
||||
epmd -kill
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# allow sync calls
|
||||
wait_for_status()
|
||||
{
|
||||
@@ -333,7 +382,7 @@ wait_for_status()
|
||||
# return: 0 OK, 1 KO
|
||||
timeout=$2
|
||||
status=4
|
||||
while [ $status -ne $1 ]; do
|
||||
while [ $status -ne $1 ] ; do
|
||||
sleep $3
|
||||
timeout=$(($timeout - 1))
|
||||
[ $timeout -eq 0 ] && {
|
||||
@@ -355,6 +404,7 @@ case $ARGS in
|
||||
' start') start;;
|
||||
' debug') debug;;
|
||||
' live') live;;
|
||||
' etop') etop;;
|
||||
' started') wait_for_status 0 30 2;; # wait 30x2s before timeout
|
||||
' stopped') wait_for_status 3 15 2; stop_epmd;; # wait 15x2s before timeout
|
||||
*) ctl $ARGS;;
|
||||
Regular → Executable
+16
@@ -42,6 +42,22 @@ while(1)
|
||||
# password is null. Return 1 if the user $user\@$domain exitst.
|
||||
$result = 1;
|
||||
},last SWITCH;
|
||||
|
||||
$op eq 'tryregister' and do
|
||||
{
|
||||
$result = 1;
|
||||
},last SWITCH;
|
||||
|
||||
$op eq 'removeuser' and do
|
||||
{
|
||||
# password is null. Return 1 if the user $user\@$domain exitst.
|
||||
$result = 1;
|
||||
},last SWITCH;
|
||||
|
||||
$op eq 'removeuser3' and do
|
||||
{
|
||||
$result = 1;
|
||||
},last SWITCH;
|
||||
};
|
||||
my $out = pack "nn",2,$result ? 1 : 0;
|
||||
syswrite STDOUT,$out;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2010 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2013 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
@@ -19,14 +19,27 @@
|
||||
%%%
|
||||
%%%----------------------------------------------------------------------
|
||||
|
||||
-define(CT_XML, {"Content-Type", "text/xml; charset=utf-8"}).
|
||||
-define(CT_PLAIN, {"Content-Type", "text/plain"}).
|
||||
-record(adhoc_request,
|
||||
{
|
||||
lang = <<"">> :: binary(),
|
||||
node = <<"">> :: binary(),
|
||||
sessionid = <<"">> :: binary(),
|
||||
action = <<"">> :: binary(),
|
||||
xdata = false :: false | xmlel(),
|
||||
others = [] :: [xmlel()]
|
||||
}).
|
||||
|
||||
-define(AC_ALLOW_ORIGIN, {"Access-Control-Allow-Origin", "*"}).
|
||||
-define(AC_ALLOW_METHODS, {"Access-Control-Allow-Methods", "GET, POST, OPTIONS"}).
|
||||
-define(AC_ALLOW_HEADERS, {"Access-Control-Allow-Headers", "Content-Type"}).
|
||||
-define(AC_MAX_AGE, {"Access-Control-Max-Age", "86400"}).
|
||||
-record(adhoc_response,
|
||||
{
|
||||
lang = <<"">> :: binary(),
|
||||
node = <<"">> :: binary(),
|
||||
sessionid = <<"">> :: binary(),
|
||||
status :: atom(),
|
||||
defaultaction = <<"">> :: binary(),
|
||||
actions = [] :: [binary()],
|
||||
notes = [] :: [{binary(), binary()}],
|
||||
elements = [] :: [xmlel()]
|
||||
}).
|
||||
|
||||
-define(OPTIONS_HEADER, [?CT_PLAIN, ?AC_ALLOW_ORIGIN, ?AC_ALLOW_METHODS,
|
||||
?AC_ALLOW_HEADERS, ?AC_MAX_AGE]).
|
||||
-define(HEADER, [?CT_XML, ?AC_ALLOW_ORIGIN, ?AC_ALLOW_HEADERS]).
|
||||
-type adhoc_request() :: #adhoc_request{}.
|
||||
-type adhoc_response() :: #adhoc_response{}.
|
||||
@@ -0,0 +1,52 @@
|
||||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2013 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
%%% published by the Free Software Foundation; either version 2 of the
|
||||
%%% License, or (at your option) any later version.
|
||||
%%%
|
||||
%%% This program is distributed in the hope that it will be useful,
|
||||
%%% but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
%%% General Public License for more details.
|
||||
%%%
|
||||
%%% You should have received a copy of the GNU General Public License
|
||||
%%% along with this program; if not, write to the Free Software
|
||||
%%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
%%% 02111-1307 USA
|
||||
%%%
|
||||
%%%----------------------------------------------------------------------
|
||||
|
||||
-define(CT_XML,
|
||||
{<<"Content-Type">>, <<"text/xml; charset=utf-8">>}).
|
||||
|
||||
-define(CT_PLAIN,
|
||||
{<<"Content-Type">>, <<"text/plain">>}).
|
||||
|
||||
-define(CT_JSON,
|
||||
{<<"Content-Type">>, <<"application/json">>}).
|
||||
|
||||
-define(AC_ALLOW_ORIGIN,
|
||||
{<<"Access-Control-Allow-Origin">>, <<"*">>}).
|
||||
|
||||
-define(AC_ALLOW_METHODS,
|
||||
{<<"Access-Control-Allow-Methods">>,
|
||||
<<"GET, POST, OPTIONS">>}).
|
||||
|
||||
-define(AC_ALLOW_HEADERS,
|
||||
{<<"Access-Control-Allow-Headers">>,
|
||||
<<"Content-Type">>}).
|
||||
|
||||
-define(AC_MAX_AGE,
|
||||
{<<"Access-Control-Max-Age">>, <<"86400">>}).
|
||||
|
||||
-define(OPTIONS_HEADER,
|
||||
[?CT_PLAIN, ?AC_ALLOW_ORIGIN, ?AC_ALLOW_METHODS,
|
||||
?AC_ALLOW_HEADERS, ?AC_MAX_AGE]).
|
||||
|
||||
-define(HEADER(CType),
|
||||
[CType, ?AC_ALLOW_ORIGIN, ?AC_ALLOW_HEADERS]).
|
||||
|
||||
-define(PROCNAME, ejabberd_mod_bosh).
|
||||
@@ -0,0 +1,61 @@
|
||||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2013 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
%%% published by the Free Software Foundation; either version 2 of the
|
||||
%%% License, or (at your option) any later version.
|
||||
%%%
|
||||
%%% This program is distributed in the hope that it will be useful,
|
||||
%%% but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
%%% General Public License for more details.
|
||||
%%%
|
||||
%%% You should have received a copy of the GNU General Public License
|
||||
%%% along with this program; if not, write to the Free Software
|
||||
%%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
%%% 02111-1307 USA
|
||||
%%%
|
||||
%%%----------------------------------------------------------------------
|
||||
|
||||
-define(VERSION, ejabberd_config:get_version()).
|
||||
|
||||
-define(MYHOSTS, ejabberd_config:get_myhosts()).
|
||||
|
||||
-define(MYNAME, hd(ejabberd_config:get_myhosts())).
|
||||
|
||||
-define(MYLANG, ejabberd_config:get_mylang()).
|
||||
|
||||
-define(MSGS_DIR, filename:join(["priv", "msgs"])).
|
||||
|
||||
-define(CONFIG_PATH, <<"ejabberd.cfg">>).
|
||||
|
||||
-define(LOG_PATH, <<"ejabberd.log">>).
|
||||
|
||||
-ifdef(ENABLE_FLASH_HACK).
|
||||
|
||||
-define(FLASH_HACK, true).
|
||||
|
||||
-else.
|
||||
|
||||
-define(FLASH_HACK, false).
|
||||
|
||||
-endif.
|
||||
|
||||
-define(EJABBERD_URI,
|
||||
<<"http://www.process-one.net/en/ejabberd/">>).
|
||||
|
||||
-define(S2STIMEOUT, 600000).
|
||||
|
||||
%%-define(DBGFSM, true).
|
||||
|
||||
-record(scram,
|
||||
{storedkey = <<"">>,
|
||||
serverkey = <<"">>,
|
||||
salt = <<"">>,
|
||||
iterationcount = 0 :: integer()}).
|
||||
|
||||
-type scram() :: #scram{}.
|
||||
|
||||
-define(SCRAM_DEFAULT_ITERATION_COUNT, 4096).
|
||||
@@ -0,0 +1,93 @@
|
||||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2013 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
%%% published by the Free Software Foundation; either version 2 of the
|
||||
%%% License, or (at your option) any later version.
|
||||
%%%
|
||||
%%% This program is distributed in the hope that it will be useful,
|
||||
%%% but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
%%% General Public License for more details.
|
||||
%%%
|
||||
%%% You should have received a copy of the GNU General Public License
|
||||
%%% along with this program; if not, write to the Free Software
|
||||
%%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
%%% 02111-1307 USA
|
||||
%%%
|
||||
%%%----------------------------------------------------------------------
|
||||
|
||||
-ifndef(mod_privacy_hrl).
|
||||
|
||||
-include("mod_privacy.hrl").
|
||||
|
||||
-endif.
|
||||
|
||||
%-define(SETS, gb_sets).
|
||||
-define(SETS, ejabberd_sets).
|
||||
|
||||
-define(DICT, dict).
|
||||
|
||||
-record(state,
|
||||
{socket,
|
||||
sockmod = ejabberd_socket :: ejabberd_socket | ejabberd_frontend_socket,
|
||||
socket_monitor = make_ref() :: reference(),
|
||||
xml_socket = false :: boolean(),
|
||||
streamid = <<"">> :: binary(),
|
||||
sasl_state :: any(),
|
||||
access :: atom(),
|
||||
shaper = none :: shaper:shaper(),
|
||||
zlib = false :: boolean(),
|
||||
tls = false :: boolean(),
|
||||
tls_required = false :: boolean(),
|
||||
tls_enabled = false :: boolean(),
|
||||
tls_options = [] :: list(),
|
||||
authenticated = false :: boolean() | replaced | rebinded,
|
||||
jid = #jid{} :: jid(),
|
||||
user = <<"">> :: binary(),
|
||||
server = ?MYNAME :: binary(),
|
||||
resource = <<"">> :: binary(),
|
||||
sid = {now(), self()} :: ejabberd_sm:sid(),
|
||||
pres_t = (?SETS):new() :: ?SETS:ej_set() | {pres_t, non_neg_integer()},
|
||||
pres_f = (?SETS):new() :: ?SETS:ej_set() | {pres_f, non_neg_integer()},
|
||||
pres_a = (?SETS):new() :: ?SETS:ej_set() | {pres_a, non_neg_integer()},
|
||||
pres_last :: xmlel(),
|
||||
pres_timestamp :: calendar:datetime(),
|
||||
privacy_list = #userlist{} :: userlist(),
|
||||
conn = unknown :: atom(),
|
||||
auth_module = unknown :: atom(),
|
||||
ip :: {inet:ip_address(), inet:port_number()},
|
||||
redirect = false :: boolean(),
|
||||
aux_fields = [] :: [{atom(), any()}],
|
||||
fsm_limit_opts = [] :: [{atom(), any()}],
|
||||
lang = ?MYLANG :: binary(),
|
||||
debug = false :: boolean(),
|
||||
flash_hack = false :: boolean(),
|
||||
flash_connection = false :: boolean(),
|
||||
reception = true :: boolean(),
|
||||
standby = false :: boolean(),
|
||||
queue = queue:new() :: queue(),
|
||||
queue_len = 0 :: integer(),
|
||||
pres_queue = gb_trees:empty() :: gb_tree(),
|
||||
keepalive_timer :: reference(),
|
||||
keepalive_timeout :: timeout(),
|
||||
oor_timeout :: timeout(),
|
||||
oor_status = <<"">> :: binary(),
|
||||
oor_show = <<"">> :: binary(),
|
||||
oor_notification :: xmlel(),
|
||||
oor_send_body = all :: first_per_user | first | all | none,
|
||||
oor_send_groupchat = false :: boolean(),
|
||||
oor_send_from = jid :: jid | username | name | none,
|
||||
oor_appid = <<"">> :: binary(),
|
||||
oor_unread = 0 :: integer(),
|
||||
oor_unread_users = (?SETS):new() :: ?SETS:ej_set(),
|
||||
oor_unread_client = 0 :: integer(),
|
||||
oor_offline = false :: boolean(),
|
||||
ack_enabled = false :: boolean(),
|
||||
ack_counter = 0 :: integer(),
|
||||
ack_queue = queue:new() :: queue(),
|
||||
ack_timer :: reference()}).
|
||||
|
||||
-type c2s_state() :: #state{}.
|
||||
@@ -1,6 +1,6 @@
|
||||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2010 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2013 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
@@ -19,10 +19,40 @@
|
||||
%%%
|
||||
%%%----------------------------------------------------------------------
|
||||
|
||||
-record(ejabberd_commands, {name, tags = [],
|
||||
desc = "", longdesc = "",
|
||||
module, function,
|
||||
args = [], result = rescode}).
|
||||
-type aterm() :: {atom(), atype()}.
|
||||
-type atype() :: integer | string | binary |
|
||||
{tuple, [aterm()]} | {list, aterm()}.
|
||||
-type rterm() :: {atom(), rtype()}.
|
||||
-type rtype() :: integer | string | atom |
|
||||
{tuple, [rterm()]} | {list, rterm()} |
|
||||
rescode | restuple.
|
||||
|
||||
-record(ejabberd_commands,
|
||||
{name :: atom(),
|
||||
tags = [] :: [atom()] | '_' | '$2',
|
||||
desc = "" :: string() | '_' | '$3',
|
||||
longdesc = "" :: string() | '_',
|
||||
module :: atom(),
|
||||
function :: atom(),
|
||||
args = [] :: [aterm()] | '_' | '$1' | '$2',
|
||||
result = {res, rescode} :: rterm() | '_' | '$2',
|
||||
args_desc = none :: none | [string()],
|
||||
result_desc = none :: none | string(),
|
||||
args_example = none :: [any()],
|
||||
result_example = none :: any()}).
|
||||
|
||||
-type ejabberd_commands() :: #ejabberd_commands{name :: atom(),
|
||||
tags :: [atom()],
|
||||
desc :: string(),
|
||||
longdesc :: string(),
|
||||
module :: atom(),
|
||||
function :: atom(),
|
||||
args :: [aterm()],
|
||||
result :: rterm(),
|
||||
args_desc :: none | [string()],
|
||||
result_desc :: none | string(),
|
||||
args_example :: [any()],
|
||||
result_example :: any()}.
|
||||
|
||||
%% @type ejabberd_commands() = #ejabberd_commands{
|
||||
%% name = atom(),
|
||||
@@ -1,6 +1,6 @@
|
||||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2010 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2013 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
@@ -19,20 +19,16 @@
|
||||
%%%
|
||||
%%%----------------------------------------------------------------------
|
||||
|
||||
-define(LDAP_PORT, 389).
|
||||
-define(LDAPS_PORT, 636).
|
||||
-record(config, {key :: any(), value :: any()}).
|
||||
|
||||
-record(eldap_search, {scope = wholeSubtree,
|
||||
base = [],
|
||||
filter,
|
||||
limit = 0,
|
||||
attributes = [],
|
||||
types_only = false,
|
||||
timeout = 0}).
|
||||
-record(local_config, {key :: any(), value :: any()}).
|
||||
|
||||
-type config() :: #config{}.
|
||||
-type local_config() :: #local_config{}.
|
||||
|
||||
-record(eldap_search_result, {entries,
|
||||
referrals}).
|
||||
|
||||
-record(eldap_entry, {object_name,
|
||||
attributes}).
|
||||
-record(state,
|
||||
{opts = [] :: [acl:acl() | config() | local_config()],
|
||||
hosts = [] :: [binary()],
|
||||
override_local = false :: boolean(),
|
||||
override_global = false :: boolean(),
|
||||
override_acls = false :: boolean()}).
|
||||
@@ -1,6 +1,6 @@
|
||||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2010 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2013 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
@@ -20,6 +20,9 @@
|
||||
%%%----------------------------------------------------------------------
|
||||
|
||||
-define(STATUS_SUCCESS, 0).
|
||||
-define(STATUS_ERROR, 1).
|
||||
-define(STATUS_USAGE, 2).
|
||||
-define(STATUS_BADRPC, 3).
|
||||
|
||||
-define(STATUS_ERROR, 1).
|
||||
|
||||
-define(STATUS_USAGE, 2).
|
||||
|
||||
-define(STATUS_BADRPC, 3).
|
||||
@@ -0,0 +1,55 @@
|
||||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2013 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
%%% published by the Free Software Foundation; either version 2 of the
|
||||
%%% License, or (at your option) any later version.
|
||||
%%%
|
||||
%%% This program is distributed in the hope that it will be useful,
|
||||
%%% but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
%%% General Public License for more details.
|
||||
%%%
|
||||
%%% You should have received a copy of the GNU General Public License
|
||||
%%% along with this program; if not, write to the Free Software
|
||||
%%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
%%% 02111-1307 USA
|
||||
%%%
|
||||
%%%----------------------------------------------------------------------
|
||||
|
||||
-record(request,
|
||||
{method :: method(),
|
||||
path = [] :: [binary()],
|
||||
q = [] :: [{binary() | nokey, binary()}],
|
||||
us = {<<>>, <<>>} :: {binary(), binary()},
|
||||
auth :: {binary(), binary()} |
|
||||
{auth_jid, {binary(), binary()}, jlib:jid()},
|
||||
lang = <<"">> :: binary(),
|
||||
data = <<"">> :: binary(),
|
||||
ip :: {inet:ip_address(), inet:port_number()},
|
||||
host = <<"">> :: binary(),
|
||||
port = 5280 :: inet:port_number(),
|
||||
tp = http :: protocol(),
|
||||
headers = [] :: [{atom() | binary(), binary()}]}).
|
||||
|
||||
-record(ws,
|
||||
{socket :: inet:socket() | tls:tls_socket(),
|
||||
sockmod = gen_tcp :: gen_tcp | tls,
|
||||
ws_autoexit = false :: boolean(),
|
||||
ip :: {inet:ip_address(), inet:port_number()},
|
||||
vsn :: vsn(),
|
||||
origin = <<"">> :: binary(),
|
||||
host = <<"">> :: binary(),
|
||||
port = 5280 :: inet:port_number(),
|
||||
path = [] :: [binary()],
|
||||
headers = [] :: [{atom() | binary(), binary()}],
|
||||
local_path = [] :: [binary()],
|
||||
q = [] :: [{binary() | nokey, binary()}],
|
||||
buf :: binary()}).
|
||||
|
||||
-type method() :: 'GET' | 'HEAD' | 'DELETE' | 'OPTIONS' | 'PUT' | 'POST' | 'TRACE'.
|
||||
-type protocol() :: http | https.
|
||||
-type http_request() :: #request{}.
|
||||
-type vsn() :: {'draft-hybi' | 'draft-hixie', non_neg_integer()}.
|
||||
@@ -0,0 +1,102 @@
|
||||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2013 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
%%% published by the Free Software Foundation; either version 2 of the
|
||||
%%% License, or (at your option) any later version.
|
||||
%%%
|
||||
%%% This program is distributed in the hope that it will be useful,
|
||||
%%% but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
%%% General Public License for more details.
|
||||
%%%
|
||||
%%% You should have received a copy of the GNU General Public License
|
||||
%%% along with this program; if not, write to the Free Software
|
||||
%%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
%%% 02111-1307 USA
|
||||
%%%
|
||||
%%%----------------------------------------------------------------------
|
||||
|
||||
-define(X(Name),
|
||||
#xmlel{name = Name, attrs = [], children = []}).
|
||||
|
||||
-define(XA(Name, Attrs),
|
||||
#xmlel{name = Name, attrs = Attrs, children = []}).
|
||||
|
||||
-define(XE(Name, Els),
|
||||
#xmlel{name = Name, attrs = [], children = Els}).
|
||||
|
||||
-define(XAE(Name, Attrs, Els),
|
||||
#xmlel{name = Name, attrs = Attrs, children = Els}).
|
||||
|
||||
-define(C(Text), {xmlcdata, Text}).
|
||||
|
||||
-define(XC(Name, Text), ?XE(Name, [?C(Text)])).
|
||||
|
||||
-define(XAC(Name, Attrs, Text),
|
||||
?XAE(Name, Attrs, [?C(Text)])).
|
||||
|
||||
-define(T(Text), translate:translate(Lang, Text)).
|
||||
|
||||
-define(CT(Text), ?C((?T(Text)))).
|
||||
|
||||
-define(XCT(Name, Text), ?XC(Name, (?T(Text)))).
|
||||
|
||||
-define(XACT(Name, Attrs, Text),
|
||||
?XAC(Name, Attrs, (?T(Text)))).
|
||||
|
||||
-define(LI(Els), ?XE(<<"li">>, Els)).
|
||||
|
||||
-define(A(URL, Els),
|
||||
?XAE(<<"a">>, [{<<"href">>, URL}], Els)).
|
||||
|
||||
-define(AC(URL, Text), ?A(URL, [?C(Text)])).
|
||||
|
||||
-define(ACT(URL, Text), ?AC(URL, (?T(Text)))).
|
||||
|
||||
-define(P, ?X(<<"p">>)).
|
||||
|
||||
-define(BR, ?X(<<"br">>)).
|
||||
|
||||
-define(INPUT(Type, Name, Value),
|
||||
?XA(<<"input">>,
|
||||
[{<<"type">>, Type}, {<<"name">>, Name},
|
||||
{<<"value">>, Value}])).
|
||||
|
||||
-define(INPUTT(Type, Name, Value),
|
||||
?INPUT(Type, Name, (?T(Value)))).
|
||||
|
||||
-define(INPUTS(Type, Name, Value, Size),
|
||||
?XA(<<"input">>,
|
||||
[{<<"type">>, Type}, {<<"name">>, Name},
|
||||
{<<"value">>, Value}, {<<"size">>, Size}])).
|
||||
|
||||
-define(INPUTST(Type, Name, Value, Size),
|
||||
?INPUT(Type, Name, (?T(Value)), Size)).
|
||||
|
||||
-define(ACLINPUT(Text),
|
||||
?XE(<<"td">>,
|
||||
[?INPUT(<<"text">>, <<"value", ID/binary>>, Text)])).
|
||||
|
||||
-define(TEXTAREA(Name, Rows, Cols, Value),
|
||||
?XAC(<<"textarea">>,
|
||||
[{<<"name">>, Name}, {<<"rows">>, Rows},
|
||||
{<<"cols">>, Cols}],
|
||||
Value)).
|
||||
|
||||
-define(XRES(Text),
|
||||
?XAC(<<"p">>, [{<<"class">>, <<"result">>}], Text)).
|
||||
|
||||
-define(XREST(Text), ?XRES((?T(Text)))).
|
||||
|
||||
-define(GL(Ref, Title),
|
||||
?XAE(<<"div">>, [{<<"class">>, <<"guidelink">>}],
|
||||
[?XAE(<<"a">>,
|
||||
[{<<"href">>, <<"/admin/doc/guide.html#", Ref/binary>>},
|
||||
{<<"target">>, <<"_blank">>}],
|
||||
[?C(<<"[Guide: ", Title/binary, "]">>)])])).
|
||||
|
||||
-define(H1GL(Name, Ref, Title),
|
||||
[?XC(<<"h1">>, Name), ?GL(Ref, Title)]).
|
||||
@@ -0,0 +1,65 @@
|
||||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2013 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
%%% published by the Free Software Foundation; either version 2 of the
|
||||
%%% License, or (at your option) any later version.
|
||||
%%%
|
||||
%%% This program is distributed in the hope that it will be useful,
|
||||
%%% but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
%%% General Public License for more details.
|
||||
%%%
|
||||
%%% You should have received a copy of the GNU General Public License
|
||||
%%% along with this program; if not, write to the Free Software
|
||||
%%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
%%% 02111-1307 USA
|
||||
%%%
|
||||
%%%----------------------------------------------------------------------
|
||||
|
||||
-define(LDAP_PORT, 389).
|
||||
|
||||
-define(LDAPS_PORT, 636).
|
||||
|
||||
-type scope() :: baseObject | singleLevel | wholeSubtree.
|
||||
|
||||
-record(eldap_search,
|
||||
{scope = wholeSubtree :: scope(),
|
||||
base = <<"">> :: binary(),
|
||||
filter :: eldap:filter(),
|
||||
limit = 0 :: non_neg_integer(),
|
||||
attributes = [] :: [binary()],
|
||||
types_only = false :: boolean(),
|
||||
deref_aliases = neverDerefAliases :: neverDerefAliases |
|
||||
derefInSearching |
|
||||
derefFindingBaseObj |
|
||||
derefAlways,
|
||||
timeout = 0 :: non_neg_integer()}).
|
||||
|
||||
-record(eldap_search_result, {entries = [] :: [eldap_entry()],
|
||||
referrals = [] :: list()}).
|
||||
|
||||
-record(eldap_entry, {object_name = <<>> :: binary(),
|
||||
attributes = [] :: [{binary(), [binary()]}]}).
|
||||
|
||||
-type tlsopts() :: [{encrypt, tls | starttls | none} |
|
||||
{tls_cacertfile, binary() | undefined} |
|
||||
{tls_certfile, binary() | undefined} |
|
||||
{tls_depth, non_neg_integer() | undefined} |
|
||||
{tls_verify, hard | soft | false}].
|
||||
|
||||
-record(eldap_config, {servers = [] :: [binary()],
|
||||
backups = [] :: [binary()],
|
||||
tls_options = [] :: tlsopts(),
|
||||
port = ?LDAP_PORT :: inet:port_number(),
|
||||
dn = <<"">> :: binary(),
|
||||
password = <<"">> :: binary(),
|
||||
base = <<"">> :: binary(),
|
||||
deref_aliases = never :: never | searching |
|
||||
finding | always}).
|
||||
|
||||
-type eldap_config() :: #eldap_config{}.
|
||||
-type eldap_search() :: #eldap_search{}.
|
||||
-type eldap_entry() :: #eldap_entry{}.
|
||||
@@ -1,11 +1,6 @@
|
||||
%%%----------------------------------------------------------------------
|
||||
%%% File : sha.erl
|
||||
%%% Author : Alexey Shchepin <alexey@process-one.net>
|
||||
%%% Purpose :
|
||||
%%% Created : 20 Dec 2002 by Alexey Shchepin <alexey@process-one.net>
|
||||
%%%
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2010 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2013 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
@@ -24,26 +19,29 @@
|
||||
%%%
|
||||
%%%----------------------------------------------------------------------
|
||||
|
||||
-module(sha).
|
||||
-author('alexey@process-one.net').
|
||||
-define(CT_XML,
|
||||
{<<"Content-Type">>, <<"text/xml; charset=utf-8">>}).
|
||||
|
||||
-export([start/0, sha/1]).
|
||||
-define(CT_PLAIN,
|
||||
{<<"Content-Type">>, <<"text/plain">>}).
|
||||
|
||||
start() ->
|
||||
crypto:start().
|
||||
-define(AC_ALLOW_ORIGIN,
|
||||
{<<"Access-Control-Allow-Origin">>, <<"*">>}).
|
||||
|
||||
digit_to_xchar(D) when (D >= 0) and (D < 10) ->
|
||||
D + 48;
|
||||
digit_to_xchar(D) ->
|
||||
D + 87.
|
||||
-define(AC_ALLOW_METHODS,
|
||||
{<<"Access-Control-Allow-Methods">>,
|
||||
<<"GET, POST, OPTIONS">>}).
|
||||
|
||||
sha(Text) ->
|
||||
Bin = crypto:sha(Text),
|
||||
lists:reverse(ints_to_rxstr(binary_to_list(Bin), [])).
|
||||
-define(AC_ALLOW_HEADERS,
|
||||
{<<"Access-Control-Allow-Headers">>,
|
||||
<<"Content-Type">>}).
|
||||
|
||||
ints_to_rxstr([], Res) ->
|
||||
Res;
|
||||
ints_to_rxstr([N | Ns], Res) ->
|
||||
ints_to_rxstr(Ns, [digit_to_xchar(N rem 16),
|
||||
digit_to_xchar(N div 16) | Res]).
|
||||
-define(AC_MAX_AGE,
|
||||
{<<"Access-Control-Max-Age">>, <<"86400">>}).
|
||||
|
||||
-define(OPTIONS_HEADER,
|
||||
[?CT_PLAIN, ?AC_ALLOW_ORIGIN, ?AC_ALLOW_METHODS,
|
||||
?AC_ALLOW_HEADERS, ?AC_MAX_AGE]).
|
||||
|
||||
-define(HEADER,
|
||||
[?CT_XML, ?AC_ALLOW_ORIGIN, ?AC_ALLOW_HEADERS]).
|
||||
@@ -0,0 +1,701 @@
|
||||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2013 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
%%% published by the Free Software Foundation; either version 2 of the
|
||||
%%% License, or (at your option) any later version.
|
||||
%%%
|
||||
%%% This program is distributed in the hope that it will be useful,
|
||||
%%% but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
%%% General Public License for more details.
|
||||
%%%
|
||||
%%% You should have received a copy of the GNU General Public License
|
||||
%%% along with this program; if not, write to the Free Software
|
||||
%%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
%%% 02111-1307 USA
|
||||
%%%
|
||||
%%%----------------------------------------------------------------------
|
||||
|
||||
|
||||
-define(NS_DISCO_ITEMS,
|
||||
<<"http://jabber.org/protocol/disco#items">>).
|
||||
|
||||
-define(NS_DISCO_INFO,
|
||||
<<"http://jabber.org/protocol/disco#info">>).
|
||||
|
||||
-define(NS_VCARD, <<"vcard-temp">>).
|
||||
|
||||
-define(NS_VCARD_UPDATE, <<"vcard-temp:x:update">>).
|
||||
|
||||
-define(NS_AUTH, <<"jabber:iq:auth">>).
|
||||
|
||||
-define(NS_AUTH_ERROR, <<"jabber:iq:auth:error">>).
|
||||
|
||||
-define(NS_REGISTER, <<"jabber:iq:register">>).
|
||||
|
||||
-define(NS_SEARCH, <<"jabber:iq:search">>).
|
||||
|
||||
-define(NS_ROSTER, <<"jabber:iq:roster">>).
|
||||
|
||||
-define(NS_ROSTER_VER,
|
||||
<<"urn:xmpp:features:rosterver">>).
|
||||
|
||||
-define(NS_PRIVACY, <<"jabber:iq:privacy">>).
|
||||
|
||||
-define(NS_BLOCKING, <<"urn:xmpp:blocking">>).
|
||||
|
||||
-define(NS_PRIVATE, <<"jabber:iq:private">>).
|
||||
|
||||
-define(NS_VERSION, <<"jabber:iq:version">>).
|
||||
|
||||
-define(NS_TIME90, <<"jabber:iq:time">>).
|
||||
|
||||
-define(NS_TIME, <<"urn:xmpp:time">>).
|
||||
|
||||
-define(NS_LAST, <<"jabber:iq:last">>).
|
||||
|
||||
-define(NS_XDATA, <<"jabber:x:data">>).
|
||||
|
||||
-define(NS_IQDATA, <<"jabber:iq:data">>).
|
||||
|
||||
-define(NS_DELAY91, <<"jabber:x:delay">>).
|
||||
|
||||
-define(NS_DELAY, <<"urn:xmpp:delay">>).
|
||||
|
||||
-define(NS_EXPIRE, <<"jabber:x:expire">>).
|
||||
|
||||
-define(NS_EVENT, <<"jabber:x:event">>).
|
||||
|
||||
-define(NS_CHATSTATES,
|
||||
<<"http://jabber.org/protocol/chatstates">>).
|
||||
|
||||
-define(NS_XCONFERENCE, <<"jabber:x:conference">>).
|
||||
|
||||
-define(NS_STATS,
|
||||
<<"http://jabber.org/protocol/stats">>).
|
||||
|
||||
-define(NS_MUC, <<"http://jabber.org/protocol/muc">>).
|
||||
|
||||
-define(NS_MUC_USER,
|
||||
<<"http://jabber.org/protocol/muc#user">>).
|
||||
|
||||
-define(NS_MUC_ADMIN,
|
||||
<<"http://jabber.org/protocol/muc#admin">>).
|
||||
|
||||
-define(NS_MUC_OWNER,
|
||||
<<"http://jabber.org/protocol/muc#owner">>).
|
||||
|
||||
-define(NS_MUC_UNIQUE,
|
||||
<<"http://jabber.org/protocol/muc#unique">>).
|
||||
|
||||
-define(NS_PUBSUB,
|
||||
<<"http://jabber.org/protocol/pubsub">>).
|
||||
|
||||
-define(NS_PUBSUB_EVENT,
|
||||
<<"http://jabber.org/protocol/pubsub#event">>).
|
||||
|
||||
-define(NS_PUBSUB_META_DATA,
|
||||
<<"http://jabber.org/protocol/pubsub#meta-data">>).
|
||||
|
||||
-define(NS_PUBSUB_OWNER,
|
||||
<<"http://jabber.org/protocol/pubsub#owner">>).
|
||||
|
||||
-define(NS_PUBSUB_NMI,
|
||||
<<"http://jabber.org/protocol/pubsub#node-meta-info">>).
|
||||
|
||||
-define(NS_PUBSUB_ERRORS,
|
||||
<<"http://jabber.org/protocol/pubsub#errors">>).
|
||||
|
||||
-define(NS_PUBSUB_NODE_CONFIG,
|
||||
<<"http://jabber.org/protocol/pubsub#node_config">>).
|
||||
|
||||
-define(NS_PUBSUB_SUB_OPTIONS,
|
||||
<<"http://jabber.org/protocol/pubsub#subscribe_options">>).
|
||||
|
||||
-define(NS_PUBSUB_SUBSCRIBE_OPTIONS,
|
||||
<<"http://jabber.org/protocol/pubsub#subscribe_options">>).
|
||||
|
||||
-define(NS_PUBSUB_PUBLISH_OPTIONS,
|
||||
<<"http://jabber.org/protocol/pubsub#publish_options">>).
|
||||
|
||||
-define(NS_PUBSUB_SUB_AUTH,
|
||||
<<"http://jabber.org/protocol/pubsub#subscribe_authorization">>).
|
||||
|
||||
-define(NS_PUBSUB_GET_PENDING,
|
||||
<<"http://jabber.org/protocol/pubsub#get-pending">>).
|
||||
|
||||
-define(NS_COMMANDS,
|
||||
<<"http://jabber.org/protocol/commands">>).
|
||||
|
||||
-define(NS_BYTESTREAMS,
|
||||
<<"http://jabber.org/protocol/bytestreams">>).
|
||||
|
||||
-define(NS_ADMIN,
|
||||
<<"http://jabber.org/protocol/admin">>).
|
||||
-define(NS_ADMIN_ANNOUNCE,
|
||||
<<"http://jabber.org/protocol/admin#announce">>).
|
||||
-define(NS_ADMIN_ANNOUNCE_ALL,
|
||||
<<"http://jabber.org/protocol/admin#announce-all">>).
|
||||
-define(NS_ADMIN_SET_MOTD,
|
||||
<<"http://jabber.org/protocol/admin#set-motd">>).
|
||||
-define(NS_ADMIN_EDIT_MOTD,
|
||||
<<"http://jabber.org/protocol/admin#edit-motd">>).
|
||||
-define(NS_ADMIN_DELETE_MOTD,
|
||||
<<"http://jabber.org/protocol/admin#delete-motd">>).
|
||||
-define(NS_ADMIN_ANNOUNCE_ALLHOSTS,
|
||||
<<"http://jabber.org/protocol/admin#announce-allhosts">>).
|
||||
-define(NS_ADMIN_ANNOUNCE_ALL_ALLHOSTS,
|
||||
<<"http://jabber.org/protocol/admin#announce-all-allhosts">>).
|
||||
-define(NS_ADMIN_SET_MOTD_ALLHOSTS,
|
||||
<<"http://jabber.org/protocol/admin#set-motd-allhosts">>).
|
||||
-define(NS_ADMIN_EDIT_MOTD_ALLHOSTS,
|
||||
<<"http://jabber.org/protocol/admin#edit-motd-allhosts">>).
|
||||
-define(NS_ADMIN_DELETE_MOTD_ALLHOSTS,
|
||||
<<"http://jabber.org/protocol/admin#delete-motd-allhosts">>).
|
||||
|
||||
-define(NS_SERVERINFO,
|
||||
<<"http://jabber.org/network/serverinfo">>).
|
||||
|
||||
-define(NS_RSM, <<"http://jabber.org/protocol/rsm">>).
|
||||
|
||||
-define(NS_EJABBERD_CONFIG, <<"ejabberd:config">>).
|
||||
|
||||
-define(NS_STREAM,
|
||||
<<"http://etherx.jabber.org/streams">>).
|
||||
|
||||
-define(NS_FLASH_STREAM,
|
||||
<<"http://www.jabber.com/streams/flash">>).
|
||||
|
||||
-define(NS_STANZAS,
|
||||
<<"urn:ietf:params:xml:ns:xmpp-stanzas">>).
|
||||
|
||||
-define(NS_STREAMS,
|
||||
<<"urn:ietf:params:xml:ns:xmpp-streams">>).
|
||||
|
||||
-define(NS_TLS, <<"urn:ietf:params:xml:ns:xmpp-tls">>).
|
||||
|
||||
-define(NS_SASL,
|
||||
<<"urn:ietf:params:xml:ns:xmpp-sasl">>).
|
||||
|
||||
-define(NS_SESSION,
|
||||
<<"urn:ietf:params:xml:ns:xmpp-session">>).
|
||||
|
||||
-define(NS_BIND,
|
||||
<<"urn:ietf:params:xml:ns:xmpp-bind">>).
|
||||
|
||||
-define(NS_FEATURE_IQAUTH,
|
||||
<<"http://jabber.org/features/iq-auth">>).
|
||||
|
||||
-define(NS_FEATURE_IQREGISTER,
|
||||
<<"http://jabber.org/features/iq-register">>).
|
||||
|
||||
-define(NS_FEATURE_COMPRESS,
|
||||
<<"http://jabber.org/features/compress">>).
|
||||
|
||||
-define(NS_FEATURE_MSGOFFLINE, <<"msgoffline">>).
|
||||
|
||||
-define(NS_COMPRESS,
|
||||
<<"http://jabber.org/protocol/compress">>).
|
||||
|
||||
-define(NS_CAPS, <<"http://jabber.org/protocol/caps">>).
|
||||
|
||||
-define(NS_SHIM, <<"http://jabber.org/protocol/shim">>).
|
||||
|
||||
-define(NS_ADDRESS,
|
||||
<<"http://jabber.org/protocol/address">>).
|
||||
|
||||
-define(NS_OOB, <<"jabber:x:oob">>).
|
||||
|
||||
-define(NS_CAPTCHA, <<"urn:xmpp:captcha">>).
|
||||
|
||||
-define(NS_MEDIA, <<"urn:xmpp:media-element">>).
|
||||
|
||||
-define(NS_BOB, <<"urn:xmpp:bob">>).
|
||||
|
||||
-include("xml.hrl").
|
||||
|
||||
-define(STANZA_ERROR(Code, Type, Condition),
|
||||
#xmlel{name = <<"error">>,
|
||||
attrs = [{<<"code">>, Code}, {<<"type">>, Type}],
|
||||
children =
|
||||
[#xmlel{name = Condition,
|
||||
attrs = [{<<"xmlns">>, ?NS_STANZAS}],
|
||||
children = []}]}).
|
||||
|
||||
-define(ERR_BAD_FORMAT,
|
||||
?STANZA_ERROR(<<"406">>, <<"modify">>,
|
||||
<<"bad-format">>)).
|
||||
|
||||
-define(ERR_BAD_REQUEST,
|
||||
?STANZA_ERROR(<<"400">>, <<"modify">>,
|
||||
<<"bad-request">>)).
|
||||
|
||||
-define(ERR_CONFLICT,
|
||||
?STANZA_ERROR(<<"409">>, <<"cancel">>, <<"conflict">>)).
|
||||
|
||||
-define(ERR_FEATURE_NOT_IMPLEMENTED,
|
||||
?STANZA_ERROR(<<"501">>, <<"cancel">>,
|
||||
<<"feature-not-implemented">>)).
|
||||
|
||||
-define(ERR_FORBIDDEN,
|
||||
?STANZA_ERROR(<<"403">>, <<"auth">>, <<"forbidden">>)).
|
||||
|
||||
-define(ERR_GONE,
|
||||
?STANZA_ERROR(<<"302">>, <<"modify">>, <<"gone">>)).
|
||||
|
||||
-define(ERR_INTERNAL_SERVER_ERROR,
|
||||
?STANZA_ERROR(<<"500">>, <<"wait">>,
|
||||
<<"internal-server-error">>)).
|
||||
|
||||
-define(ERR_ITEM_NOT_FOUND,
|
||||
?STANZA_ERROR(<<"404">>, <<"cancel">>,
|
||||
<<"item-not-found">>)).
|
||||
|
||||
-define(ERR_JID_MALFORMED,
|
||||
?STANZA_ERROR(<<"400">>, <<"modify">>,
|
||||
<<"jid-malformed">>)).
|
||||
|
||||
-define(ERR_NOT_ACCEPTABLE,
|
||||
?STANZA_ERROR(<<"406">>, <<"modify">>,
|
||||
<<"not-acceptable">>)).
|
||||
|
||||
-define(ERR_NOT_ALLOWED,
|
||||
?STANZA_ERROR(<<"405">>, <<"cancel">>,
|
||||
<<"not-allowed">>)).
|
||||
|
||||
-define(ERR_NOT_AUTHORIZED,
|
||||
?STANZA_ERROR(<<"401">>, <<"auth">>,
|
||||
<<"not-authorized">>)).
|
||||
|
||||
-define(ERR_PAYMENT_REQUIRED,
|
||||
?STANZA_ERROR(<<"402">>, <<"auth">>,
|
||||
<<"payment-required">>)).
|
||||
|
||||
-define(ERR_POLICY_VIOLATION,
|
||||
?STANZA_ERROR(<<"405">>, <<"cancel">>,
|
||||
<<"policy-violation">>)).
|
||||
|
||||
-define(ERR_RECIPIENT_UNAVAILABLE,
|
||||
?STANZA_ERROR(<<"404">>, <<"wait">>,
|
||||
<<"recipient-unavailable">>)).
|
||||
|
||||
-define(ERR_REDIRECT,
|
||||
?STANZA_ERROR(<<"302">>, <<"modify">>, <<"redirect">>)).
|
||||
|
||||
-define(ERR_REGISTRATION_REQUIRED,
|
||||
?STANZA_ERROR(<<"407">>, <<"auth">>,
|
||||
<<"registration-required">>)).
|
||||
|
||||
-define(ERR_REMOTE_SERVER_NOT_FOUND,
|
||||
?STANZA_ERROR(<<"404">>, <<"cancel">>,
|
||||
<<"remote-server-not-found">>)).
|
||||
|
||||
-define(ERR_REMOTE_SERVER_TIMEOUT,
|
||||
?STANZA_ERROR(<<"504">>, <<"wait">>,
|
||||
<<"remote-server-timeout">>)).
|
||||
|
||||
-define(ERR_RESOURCE_CONSTRAINT,
|
||||
?STANZA_ERROR(<<"500">>, <<"wait">>,
|
||||
<<"resource-constraint">>)).
|
||||
|
||||
-define(ERR_SERVICE_UNAVAILABLE,
|
||||
?STANZA_ERROR(<<"503">>, <<"cancel">>,
|
||||
<<"service-unavailable">>)).
|
||||
|
||||
-define(ERR_SUBSCRIPTION_REQUIRED,
|
||||
?STANZA_ERROR(<<"407">>, <<"auth">>,
|
||||
<<"subscription-required">>)).
|
||||
|
||||
-define(ERR_UNEXPECTED_REQUEST,
|
||||
?STANZA_ERROR(<<"400">>, <<"wait">>,
|
||||
<<"unexpected-request">>)).
|
||||
|
||||
-define(ERR_UNEXPECTED_REQUEST_CANCEL,
|
||||
?STANZA_ERROR(<<"401">>, <<"cancel">>,
|
||||
<<"unexpected-request">>)).
|
||||
|
||||
%-define(ERR_,
|
||||
% ?STANZA_ERROR("", "", "")).
|
||||
|
||||
-define(STANZA_ERRORT(Code, Type, Condition, Lang,
|
||||
Text),
|
||||
#xmlel{name = <<"error">>,
|
||||
attrs = [{<<"code">>, Code}, {<<"type">>, Type}],
|
||||
children =
|
||||
[#xmlel{name = Condition,
|
||||
attrs = [{<<"xmlns">>, ?NS_STANZAS}], children = []},
|
||||
#xmlel{name = <<"text">>,
|
||||
attrs = [{<<"xmlns">>, ?NS_STANZAS}],
|
||||
children =
|
||||
[{xmlcdata,
|
||||
translate:translate(Lang, Text)}]}]}).
|
||||
|
||||
-define(ERRT_BAD_FORMAT(Lang, Text),
|
||||
?STANZA_ERRORT(<<"406">>, <<"modify">>,
|
||||
<<"bad-format">>, Lang, Text)).
|
||||
|
||||
-define(ERRT_BAD_REQUEST(Lang, Text),
|
||||
?STANZA_ERRORT(<<"400">>, <<"modify">>,
|
||||
<<"bad-request">>, Lang, Text)).
|
||||
|
||||
-define(ERRT_CONFLICT(Lang, Text),
|
||||
?STANZA_ERRORT(<<"409">>, <<"cancel">>, <<"conflict">>,
|
||||
Lang, Text)).
|
||||
|
||||
-define(ERRT_FEATURE_NOT_IMPLEMENTED(Lang, Text),
|
||||
?STANZA_ERRORT(<<"501">>, <<"cancel">>,
|
||||
<<"feature-not-implemented">>, Lang, Text)).
|
||||
|
||||
-define(ERRT_FORBIDDEN(Lang, Text),
|
||||
?STANZA_ERRORT(<<"403">>, <<"auth">>, <<"forbidden">>,
|
||||
Lang, Text)).
|
||||
|
||||
-define(ERRT_GONE(Lang, Text),
|
||||
?STANZA_ERRORT(<<"302">>, <<"modify">>, <<"gone">>,
|
||||
Lang, Text)).
|
||||
|
||||
-define(ERRT_INTERNAL_SERVER_ERROR(Lang, Text),
|
||||
?STANZA_ERRORT(<<"500">>, <<"wait">>,
|
||||
<<"internal-server-error">>, Lang, Text)).
|
||||
|
||||
-define(ERRT_ITEM_NOT_FOUND(Lang, Text),
|
||||
?STANZA_ERRORT(<<"404">>, <<"cancel">>,
|
||||
<<"item-not-found">>, Lang, Text)).
|
||||
|
||||
-define(ERRT_JID_MALFORMED(Lang, Text),
|
||||
?STANZA_ERRORT(<<"400">>, <<"modify">>,
|
||||
<<"jid-malformed">>, Lang, Text)).
|
||||
|
||||
-define(ERRT_NOT_ACCEPTABLE(Lang, Text),
|
||||
?STANZA_ERRORT(<<"406">>, <<"modify">>,
|
||||
<<"not-acceptable">>, Lang, Text)).
|
||||
|
||||
-define(ERRT_NOT_ALLOWED(Lang, Text),
|
||||
?STANZA_ERRORT(<<"405">>, <<"cancel">>,
|
||||
<<"not-allowed">>, Lang, Text)).
|
||||
|
||||
-define(ERRT_NOT_AUTHORIZED(Lang, Text),
|
||||
?STANZA_ERRORT(<<"401">>, <<"auth">>,
|
||||
<<"not-authorized">>, Lang, Text)).
|
||||
|
||||
-define(ERRT_PAYMENT_REQUIRED(Lang, Text),
|
||||
?STANZA_ERRORT(<<"402">>, <<"auth">>,
|
||||
<<"payment-required">>, Lang, Text)).
|
||||
|
||||
-define(ERRT_RECIPIENT_UNAVAILABLE(Lang, Text),
|
||||
?STANZA_ERRORT(<<"404">>, <<"wait">>,
|
||||
<<"recipient-unavailable">>, Lang, Text)).
|
||||
|
||||
-define(ERRT_REDIRECT(Lang, Text),
|
||||
?STANZA_ERRORT(<<"302">>, <<"modify">>, <<"redirect">>,
|
||||
Lang, Text)).
|
||||
|
||||
-define(ERRT_REGISTRATION_REQUIRED(Lang, Text),
|
||||
?STANZA_ERRORT(<<"407">>, <<"auth">>,
|
||||
<<"registration-required">>, Lang, Text)).
|
||||
|
||||
-define(ERRT_REMOTE_SERVER_NOT_FOUND(Lang, Text),
|
||||
?STANZA_ERRORT(<<"404">>, <<"cancel">>,
|
||||
<<"remote-server-not-found">>, Lang, Text)).
|
||||
|
||||
-define(ERRT_REMOTE_SERVER_TIMEOUT(Lang, Text),
|
||||
?STANZA_ERRORT(<<"504">>, <<"wait">>,
|
||||
<<"remote-server-timeout">>, Lang, Text)).
|
||||
|
||||
-define(ERRT_RESOURCE_CONSTRAINT(Lang, Text),
|
||||
?STANZA_ERRORT(<<"500">>, <<"wait">>,
|
||||
<<"resource-constraint">>, Lang, Text)).
|
||||
|
||||
-define(ERRT_SERVICE_UNAVAILABLE(Lang, Text),
|
||||
?STANZA_ERRORT(<<"503">>, <<"cancel">>,
|
||||
<<"service-unavailable">>, Lang, Text)).
|
||||
|
||||
-define(ERRT_SUBSCRIPTION_REQUIRED(Lang, Text),
|
||||
?STANZA_ERRORT(<<"407">>, <<"auth">>,
|
||||
<<"subscription-required">>, Lang, Text)).
|
||||
|
||||
-define(ERRT_UNEXPECTED_REQUEST(Lang, Text),
|
||||
?STANZA_ERRORT(<<"400">>, <<"wait">>,
|
||||
<<"unexpected-request">>, Lang, Text)).
|
||||
|
||||
-define(ERR_AUTH_NO_RESOURCE_PROVIDED(Lang),
|
||||
?ERRT_NOT_ACCEPTABLE(Lang, <<"No resource provided">>)).
|
||||
|
||||
-define(ERR_AUTH_BAD_RESOURCE_FORMAT(Lang),
|
||||
?ERRT_NOT_ACCEPTABLE(Lang,
|
||||
<<"Illegal resource format">>)).
|
||||
|
||||
-define(ERR_AUTH_RESOURCE_CONFLICT(Lang),
|
||||
?ERRT_CONFLICT(Lang, <<"Resource conflict">>)).
|
||||
|
||||
-define(STREAM_ERROR(Condition, Cdata),
|
||||
#xmlel{name = <<"stream:error">>, attrs = [],
|
||||
children =
|
||||
[#xmlel{name = Condition,
|
||||
attrs = [{<<"xmlns">>, ?NS_STREAMS}],
|
||||
children = [{xmlcdata, Cdata}]}]}).
|
||||
|
||||
-define(SERR_BAD_FORMAT,
|
||||
?STREAM_ERROR(<<"bad-format">>, <<"">>)).
|
||||
|
||||
-define(SERR_BAD_NAMESPACE_PREFIX,
|
||||
?STREAM_ERROR(<<"bad-namespace-prefix">>, <<"">>)).
|
||||
|
||||
-define(SERR_CONFLICT,
|
||||
?STREAM_ERROR(<<"conflict">>, <<"">>)).
|
||||
|
||||
-define(SERR_CONNECTION_TIMEOUT,
|
||||
?STREAM_ERROR(<<"connection-timeout">>, <<"">>)).
|
||||
|
||||
-define(SERR_HOST_GONE,
|
||||
?STREAM_ERROR(<<"host-gone">>, <<"">>)).
|
||||
|
||||
-define(SERR_HOST_UNKNOWN,
|
||||
?STREAM_ERROR(<<"host-unknown">>, <<"">>)).
|
||||
|
||||
-define(SERR_IMPROPER_ADDRESSING,
|
||||
?STREAM_ERROR(<<"improper-addressing">>, <<"">>)).
|
||||
|
||||
-define(SERR_INTERNAL_SERVER_ERROR,
|
||||
?STREAM_ERROR(<<"internal-server-error">>, <<"">>)).
|
||||
|
||||
-define(SERR_INVALID_FROM,
|
||||
?STREAM_ERROR(<<"invalid-from">>, <<"">>)).
|
||||
|
||||
-define(SERR_INVALID_ID,
|
||||
?STREAM_ERROR(<<"invalid-id">>, <<"">>)).
|
||||
|
||||
-define(SERR_INVALID_NAMESPACE,
|
||||
?STREAM_ERROR(<<"invalid-namespace">>, <<"">>)).
|
||||
|
||||
-define(SERR_INVALID_XML,
|
||||
?STREAM_ERROR(<<"invalid-xml">>, <<"">>)).
|
||||
|
||||
-define(SERR_NOT_AUTHORIZED,
|
||||
?STREAM_ERROR(<<"not-authorized">>, <<"">>)).
|
||||
|
||||
-define(SERR_POLICY_VIOLATION,
|
||||
?STREAM_ERROR(<<"policy-violation">>, <<"">>)).
|
||||
|
||||
-define(SERR_REMOTE_CONNECTION_FAILED,
|
||||
?STREAM_ERROR(<<"remote-connection-failed">>, <<"">>)).
|
||||
|
||||
-define(SERR_RESOURSE_CONSTRAINT,
|
||||
?STREAM_ERROR(<<"resource-constraint">>, <<"">>)).
|
||||
|
||||
-define(SERR_RESTRICTED_XML,
|
||||
?STREAM_ERROR(<<"restricted-xml">>, <<"">>)).
|
||||
|
||||
-define(SERR_SEE_OTHER_HOST(Host),
|
||||
?STREAM_ERROR(<<"see-other-host">>, Host)).
|
||||
|
||||
-define(SERR_SYSTEM_SHUTDOWN,
|
||||
?STREAM_ERROR(<<"system-shutdown">>, <<"">>)).
|
||||
|
||||
-define(SERR_UNSUPPORTED_ENCODING,
|
||||
?STREAM_ERROR(<<"unsupported-encoding">>, <<"">>)).
|
||||
|
||||
-define(SERR_UNSUPPORTED_STANZA_TYPE,
|
||||
?STREAM_ERROR(<<"unsupported-stanza-type">>, <<"">>)).
|
||||
|
||||
-define(SERR_UNSUPPORTED_VERSION,
|
||||
?STREAM_ERROR(<<"unsupported-version">>, <<"">>)).
|
||||
|
||||
-define(SERR_XML_NOT_WELL_FORMED,
|
||||
?STREAM_ERROR(<<"xml-not-well-formed">>, <<"">>)).
|
||||
|
||||
%-define(SERR_,
|
||||
% ?STREAM_ERROR("", "")).
|
||||
|
||||
-define(STREAM_ERRORT(Condition, Cdata, Lang, Text),
|
||||
#xmlel{name = <<"stream:error">>, attrs = [],
|
||||
children =
|
||||
[#xmlel{name = Condition,
|
||||
attrs = [{<<"xmlns">>, ?NS_STREAMS}],
|
||||
children = [{xmlcdata, Cdata}]},
|
||||
#xmlel{name = <<"text">>,
|
||||
attrs =
|
||||
[{<<"xml:lang">>, Lang},
|
||||
{<<"xmlns">>, ?NS_STREAMS}],
|
||||
children =
|
||||
[{xmlcdata,
|
||||
translate:translate(Lang, Text)}]}]}).
|
||||
|
||||
-define(SERRT_BAD_FORMAT(Lang, Text),
|
||||
?STREAM_ERRORT(<<"bad-format">>, <<"">>, Lang, Text)).
|
||||
|
||||
-define(SERRT_BAD_NAMESPACE_PREFIX(Lang, Text),
|
||||
?STREAM_ERRORT(<<"bad-namespace-prefix">>, <<"">>, Lang,
|
||||
Text)).
|
||||
|
||||
-define(SERRT_CONFLICT(Lang, Text),
|
||||
?STREAM_ERRORT(<<"conflict">>, <<"">>, Lang, Text)).
|
||||
|
||||
-define(SERRT_CONNECTION_TIMEOUT(Lang, Text),
|
||||
?STREAM_ERRORT(<<"connection-timeout">>, <<"">>, Lang,
|
||||
Text)).
|
||||
|
||||
-define(SERRT_HOST_GONE(Lang, Text),
|
||||
?STREAM_ERRORT(<<"host-gone">>, <<"">>, Lang, Text)).
|
||||
|
||||
-define(SERRT_HOST_UNKNOWN(Lang, Text),
|
||||
?STREAM_ERRORT(<<"host-unknown">>, <<"">>, Lang, Text)).
|
||||
|
||||
-define(SERRT_IMPROPER_ADDRESSING(Lang, Text),
|
||||
?STREAM_ERRORT(<<"improper-addressing">>, <<"">>, Lang,
|
||||
Text)).
|
||||
|
||||
-define(SERRT_INTERNAL_SERVER_ERROR(Lang, Text),
|
||||
?STREAM_ERRORT(<<"internal-server-error">>, <<"">>,
|
||||
Lang, Text)).
|
||||
|
||||
-define(SERRT_INVALID_FROM(Lang, Text),
|
||||
?STREAM_ERRORT(<<"invalid-from">>, <<"">>, Lang, Text)).
|
||||
|
||||
-define(SERRT_INVALID_ID(Lang, Text),
|
||||
?STREAM_ERRORT(<<"invalid-id">>, <<"">>, Lang, Text)).
|
||||
|
||||
-define(SERRT_INVALID_NAMESPACE(Lang, Text),
|
||||
?STREAM_ERRORT(<<"invalid-namespace">>, <<"">>, Lang,
|
||||
Text)).
|
||||
|
||||
-define(SERRT_INVALID_XML(Lang, Text),
|
||||
?STREAM_ERRORT(<<"invalid-xml">>, <<"">>, Lang, Text)).
|
||||
|
||||
-define(SERRT_NOT_AUTHORIZED(Lang, Text),
|
||||
?STREAM_ERRORT(<<"not-authorized">>, <<"">>, Lang,
|
||||
Text)).
|
||||
|
||||
-define(SERRT_POLICY_VIOLATION(Lang, Text),
|
||||
?STREAM_ERRORT(<<"policy-violation">>, <<"">>, Lang,
|
||||
Text)).
|
||||
|
||||
-define(SERRT_REMOTE_CONNECTION_FAILED(Lang, Text),
|
||||
?STREAM_ERRORT(<<"remote-connection-failed">>, <<"">>,
|
||||
Lang, Text)).
|
||||
|
||||
-define(SERRT_RESOURSE_CONSTRAINT(Lang, Text),
|
||||
?STREAM_ERRORT(<<"resource-constraint">>, <<"">>, Lang,
|
||||
Text)).
|
||||
|
||||
-define(SERRT_RESTRICTED_XML(Lang, Text),
|
||||
?STREAM_ERRORT(<<"restricted-xml">>, <<"">>, Lang,
|
||||
Text)).
|
||||
|
||||
-define(SERRT_SEE_OTHER_HOST(Host, Lang, Text),
|
||||
?STREAM_ERRORT(<<"see-other-host">>, Host, Lang, Text)).
|
||||
|
||||
-define(SERRT_SYSTEM_SHUTDOWN(Lang, Text),
|
||||
?STREAM_ERRORT(<<"system-shutdown">>, <<"">>, Lang,
|
||||
Text)).
|
||||
|
||||
-define(SERRT_UNSUPPORTED_ENCODING(Lang, Text),
|
||||
?STREAM_ERRORT(<<"unsupported-encoding">>, <<"">>, Lang,
|
||||
Text)).
|
||||
|
||||
-define(SERRT_UNSUPPORTED_STANZA_TYPE(Lang, Text),
|
||||
?STREAM_ERRORT(<<"unsupported-stanza-type">>, <<"">>,
|
||||
Lang, Text)).
|
||||
|
||||
-define(SERRT_UNSUPPORTED_VERSION(Lang, Text),
|
||||
?STREAM_ERRORT(<<"unsupported-version">>, <<"">>, Lang,
|
||||
Text)).
|
||||
|
||||
-define(SERRT_XML_NOT_WELL_FORMED(Lang, Text),
|
||||
?STREAM_ERRORT(<<"xml-not-well-formed">>, <<"">>, Lang,
|
||||
Text)).
|
||||
|
||||
-record(jid, {user = <<"">> :: binary(),
|
||||
server = <<"">> :: binary(),
|
||||
resource = <<"">> :: binary(),
|
||||
luser = <<"">> :: binary(),
|
||||
lserver = <<"">> :: binary(),
|
||||
lresource = <<"">> :: binary()}).
|
||||
|
||||
-type(jid() :: #jid{}).
|
||||
|
||||
-type(ljid() :: {binary(), binary(), binary()}).
|
||||
|
||||
-record(iq, {id = <<"">> :: binary(),
|
||||
type = get :: get | set | result | error,
|
||||
xmlns = <<"">> :: binary(),
|
||||
lang = <<"">> :: binary(),
|
||||
sub_el = #xmlel{} :: xmlel() | [xmlel()]}).
|
||||
|
||||
-type(iq_get()
|
||||
:: #iq{
|
||||
id :: binary(),
|
||||
type :: get,
|
||||
xmlns :: binary(),
|
||||
lang :: binary(),
|
||||
sub_el :: xmlel()
|
||||
}
|
||||
).
|
||||
|
||||
-type(iq_set()
|
||||
:: #iq{
|
||||
id :: binary(),
|
||||
type :: set,
|
||||
xmlns :: binary(),
|
||||
lang :: binary(),
|
||||
sub_el :: xmlel()
|
||||
}
|
||||
).
|
||||
|
||||
-type iq_request() :: iq_get() | iq_set().
|
||||
|
||||
-type(iq_result()
|
||||
:: #iq{
|
||||
id :: binary(),
|
||||
type :: result,
|
||||
xmlns :: binary(),
|
||||
lang :: binary(),
|
||||
sub_el :: [xmlel()]
|
||||
}
|
||||
).
|
||||
|
||||
-type(iq_error()
|
||||
:: #iq{
|
||||
id :: binary(),
|
||||
type :: error,
|
||||
xmlns :: binary(),
|
||||
lang :: binary(),
|
||||
sub_el :: [xmlel()]
|
||||
}
|
||||
).
|
||||
|
||||
-type iq_reply() :: iq_result() | iq_error() .
|
||||
|
||||
-type(iq() :: iq_request() | iq_reply()).
|
||||
|
||||
-record(rsm_in, {max :: integer(),
|
||||
direction :: before | aft,
|
||||
id :: binary(),
|
||||
index :: integer()}).
|
||||
|
||||
-record(rsm_out, {count :: integer(),
|
||||
index :: integer(),
|
||||
first :: binary(),
|
||||
last :: binary()}).
|
||||
|
||||
-type(rsm_in() :: #rsm_in{}).
|
||||
|
||||
-type(rsm_out() :: #rsm_out{}).
|
||||
|
||||
-type broadcast() :: {broadcast, broadcast_data()}.
|
||||
|
||||
-type broadcast_data() ::
|
||||
{rebind, pid(), binary()} | %% ejabberd_c2s
|
||||
{item, ljid(), mod_roster:subscription()} | %% mod_roster/mod_shared_roster
|
||||
{exit, binary()} | %% mod_roster/mod_shared_roster
|
||||
{privacy_list, mod_privacy:userlist(), binary()} | %% mod_privacy
|
||||
{blocking, unblock_all | {block | unblock, [ljid()]}}. %% mod_blocking
|
||||
|
||||
-record(xmlelement, {name = "" :: string(),
|
||||
attrs = [] :: [{string(), string()}],
|
||||
children = [] :: [{xmlcdata, iodata()} | xmlelement()]}).
|
||||
|
||||
-type xmlelement() :: #xmlelement{}.
|
||||
@@ -0,0 +1 @@
|
||||
-define(IS_VALID, true).
|
||||
@@ -1,6 +1,6 @@
|
||||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2010 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2013 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
@@ -18,20 +18,19 @@
|
||||
%%% 02111-1307 USA
|
||||
%%%
|
||||
%%%----------------------------------------------------------------------
|
||||
-define(PRINT(Format, Args), io:format(Format, Args)).
|
||||
|
||||
-record(privacy, {us,
|
||||
default = none,
|
||||
lists = []}).
|
||||
-define(DEBUG(Format, Args),
|
||||
ejabberd_logger:debug_msg(?MODULE, ?LINE, Format, Args)).
|
||||
|
||||
-record(listitem, {type = none,
|
||||
value = none,
|
||||
action,
|
||||
order,
|
||||
match_all = false,
|
||||
match_iq = false,
|
||||
match_message = false,
|
||||
match_presence_in = false,
|
||||
match_presence_out = false
|
||||
}).
|
||||
-define(INFO_MSG(Format, Args),
|
||||
ejabberd_logger:info_msg(?MODULE, ?LINE, Format, Args)).
|
||||
|
||||
-record(userlist, {name = none, list = [], needdb = false }).
|
||||
-define(WARNING_MSG(Format, Args),
|
||||
ejabberd_logger:warning_msg(?MODULE, ?LINE, Format, Args)).
|
||||
|
||||
-define(ERROR_MSG(Format, Args),
|
||||
ejabberd_logger:error_msg(?MODULE, ?LINE, Format, Args)).
|
||||
|
||||
-define(CRITICAL_MSG(Format, Args),
|
||||
ejabberd_logger:critical_msg(?MODULE, ?LINE, Format, Args)).
|
||||
@@ -0,0 +1,117 @@
|
||||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2013 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
%%% published by the Free Software Foundation; either version 2 of the
|
||||
%%% License, or (at your option) any later version.
|
||||
%%%
|
||||
%%% This program is distributed in the hope that it will be useful,
|
||||
%%% but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
%%% General Public License for more details.
|
||||
%%%
|
||||
%%% You should have received a copy of the GNU General Public License
|
||||
%%% along with this program; if not, write to the Free Software
|
||||
%%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
%%% 02111-1307 USA
|
||||
%%%
|
||||
%%%----------------------------------------------------------------------
|
||||
|
||||
-define(MAX_USERS_DEFAULT, 200).
|
||||
|
||||
-define(SETS, gb_sets).
|
||||
|
||||
-define(DICT, dict).
|
||||
|
||||
-record(lqueue,
|
||||
{
|
||||
queue :: queue(),
|
||||
len :: integer(),
|
||||
max :: integer()
|
||||
}).
|
||||
|
||||
-type lqueue() :: #lqueue{}.
|
||||
|
||||
-record(config,
|
||||
{
|
||||
title = <<"">> :: binary(),
|
||||
description = <<"">> :: binary(),
|
||||
allow_change_subj = true :: boolean(),
|
||||
allow_query_users = true :: boolean(),
|
||||
allow_private_messages = true :: boolean(),
|
||||
allow_private_messages_from_visitors = anyone :: anyone | moderators | nobody ,
|
||||
allow_visitor_status = true :: boolean(),
|
||||
allow_visitor_nickchange = true :: boolean(),
|
||||
public = true :: boolean(),
|
||||
public_list = true :: boolean(),
|
||||
persistent = false :: boolean(),
|
||||
moderated = true :: boolean(),
|
||||
captcha_protected = false :: boolean(),
|
||||
members_by_default = true :: boolean(),
|
||||
members_only = false :: boolean(),
|
||||
allow_user_invites = false :: boolean(),
|
||||
password_protected = false :: boolean(),
|
||||
password = <<"">> :: binary(),
|
||||
anonymous = true :: boolean(),
|
||||
allow_voice_requests = true :: boolean(),
|
||||
voice_request_min_interval = 1800 :: non_neg_integer(),
|
||||
max_users = ?MAX_USERS_DEFAULT :: non_neg_integer() | none,
|
||||
logging = false :: boolean(),
|
||||
captcha_whitelist = (?SETS):empty() :: gb_set()
|
||||
}).
|
||||
|
||||
-type config() :: #config{}.
|
||||
|
||||
-type role() :: moderator | participant | visitor | none.
|
||||
|
||||
-record(user,
|
||||
{
|
||||
jid :: jid(),
|
||||
nick :: binary(),
|
||||
role :: role(),
|
||||
last_presence :: xmlel()
|
||||
}).
|
||||
|
||||
-record(activity,
|
||||
{
|
||||
message_time = 0 :: integer(),
|
||||
presence_time = 0 :: integer(),
|
||||
message_shaper :: shaper:shaper(),
|
||||
presence_shaper :: shaper:shaper(),
|
||||
message :: xmlel(),
|
||||
presence :: {binary(), xmlel()}
|
||||
}).
|
||||
|
||||
-record(state,
|
||||
{
|
||||
room = <<"">> :: binary(),
|
||||
host = <<"">> :: binary(),
|
||||
server_host = <<"">> :: binary(),
|
||||
access = {none,none,none,none} :: {atom(), atom(), atom(), atom()},
|
||||
jid = #jid{} :: jid(),
|
||||
config = #config{} :: config(),
|
||||
users = (?DICT):new() :: dict(),
|
||||
last_voice_request_time = treap:empty() :: treap:treap(),
|
||||
robots = (?DICT):new() :: dict(),
|
||||
nicks = (?DICT):new() :: dict(),
|
||||
affiliations = (?DICT):new() :: dict(),
|
||||
history :: lqueue(),
|
||||
persist_history = false :: boolean(),
|
||||
subject = <<"">> :: binary(),
|
||||
subject_author = <<"">> :: binary(),
|
||||
just_created = false :: boolean(),
|
||||
activity = treap:empty() :: treap:treap(),
|
||||
room_shaper = none :: shaper:shaper(),
|
||||
room_queue = queue:new() :: queue()
|
||||
}).
|
||||
|
||||
-record(muc_online_users, {us = {<<>>, <<>>} :: {binary(), binary()},
|
||||
resource = <<>> :: binary() | '_',
|
||||
room = <<>> :: binary() | '_',
|
||||
host = <<>> :: binary() | '_'}).
|
||||
|
||||
-type muc_online_users() :: #muc_online_users{}.
|
||||
|
||||
-type muc_room_state() :: #state{}.
|
||||
@@ -0,0 +1,46 @@
|
||||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2013 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
%%% published by the Free Software Foundation; either version 2 of the
|
||||
%%% License, or (at your option) any later version.
|
||||
%%%
|
||||
%%% This program is distributed in the hope that it will be useful,
|
||||
%%% but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
%%% General Public License for more details.
|
||||
%%%
|
||||
%%% You should have received a copy of the GNU General Public License
|
||||
%%% along with this program; if not, write to the Free Software
|
||||
%%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
%%% 02111-1307 USA
|
||||
%%%
|
||||
%%%----------------------------------------------------------------------
|
||||
|
||||
-define(mod_privacy_hrl, true).
|
||||
|
||||
-record(privacy, {us = {<<"">>, <<"">>} :: {binary(), binary()},
|
||||
default = none :: none | binary(),
|
||||
lists = [] :: [{binary(), [listitem()]}]}).
|
||||
|
||||
-record(listitem, {type = none :: none | jid | group | subscription,
|
||||
value = none :: none | both | from | to | ljid() | binary(),
|
||||
action = allow :: allow | deny,
|
||||
order = 0 :: integer(),
|
||||
match_all = false :: boolean(),
|
||||
match_iq = false :: boolean(),
|
||||
match_message = false :: boolean(),
|
||||
match_presence_in = false :: boolean(),
|
||||
match_presence_out = false :: boolean()}).
|
||||
|
||||
-type listitem() :: #listitem{}.
|
||||
|
||||
-record(userlist, {name = none :: none | binary(),
|
||||
list = [] :: [listitem()],
|
||||
needdb = false :: boolean()}).
|
||||
|
||||
-type userlist() :: #userlist{}.
|
||||
|
||||
-export_type([userlist/0]).
|
||||
@@ -2,7 +2,7 @@
|
||||
%%% RFC 1928 constants.
|
||||
%%%
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2010 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2013 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
@@ -21,41 +21,48 @@
|
||||
%%%
|
||||
%%%----------------------------------------------------------------------
|
||||
|
||||
%% Version
|
||||
-define(VERSION_5, 5).
|
||||
|
||||
%% Authentication methods
|
||||
-define(AUTH_ANONYMOUS, 0).
|
||||
-define(AUTH_GSSAPI, 1).
|
||||
-define(AUTH_PLAIN, 2).
|
||||
-define(AUTH_NO_METHODS, 16#FF).
|
||||
|
||||
%% Address Type
|
||||
-define(AUTH_GSSAPI, 1).
|
||||
|
||||
-define(AUTH_PLAIN, 2).
|
||||
|
||||
-define(AUTH_NO_METHODS, 255).
|
||||
|
||||
-define(ATYP_IPV4, 1).
|
||||
|
||||
-define(ATYP_DOMAINNAME, 3).
|
||||
|
||||
-define(ATYP_IPV6, 4).
|
||||
|
||||
%% Commands
|
||||
-define(CMD_CONNECT, 1).
|
||||
|
||||
-define(CMD_BIND, 2).
|
||||
|
||||
-define(CMD_UDP, 3).
|
||||
|
||||
%% RFC 1928 replies
|
||||
-define(SUCCESS, 0).
|
||||
|
||||
-define(ERR_GENERAL_FAILURE, 1).
|
||||
|
||||
-define(ERR_NOT_ALLOWED, 2).
|
||||
|
||||
-define(ERR_NETWORK_UNREACHABLE, 3).
|
||||
|
||||
-define(ERR_HOST_UNREACHABLE, 4).
|
||||
|
||||
-define(ERR_CONNECTION_REFUSED, 5).
|
||||
|
||||
-define(ERR_TTL_EXPIRED, 6).
|
||||
|
||||
-define(ERR_COMMAND_NOT_SUPPORTED, 7).
|
||||
|
||||
-define(ERR_ADDRESS_TYPE_NOT_SUPPORTED, 8).
|
||||
|
||||
%% RFC 1928 defined timeout.
|
||||
-define(SOCKS5_REPLY_TIMEOUT, 10000).
|
||||
|
||||
-record(s5_request, {
|
||||
rsv = 0,
|
||||
cmd,
|
||||
sha1
|
||||
}).
|
||||
-record(s5_request, {rsv = 0 :: integer(),
|
||||
cmd = connect :: connect | udp,
|
||||
sha1 = <<"">> :: binary()}).
|
||||
@@ -0,0 +1,42 @@
|
||||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2013 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
%%% published by the Free Software Foundation; either version 2 of the
|
||||
%%% License, or (at your option) any later version.
|
||||
%%%
|
||||
%%% This program is distributed in the hope that it will be useful,
|
||||
%%% but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
%%% General Public License for more details.
|
||||
%%%
|
||||
%%% You should have received a copy of the GNU General Public License
|
||||
%%% along with this program; if not, write to the Free Software
|
||||
%%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
%%% 02111-1307 USA
|
||||
%%%
|
||||
%%%----------------------------------------------------------------------
|
||||
|
||||
-record(roster,
|
||||
{
|
||||
usj = {<<>>, <<>>, {<<>>, <<>>, <<>>}} :: {binary(), binary(), ljid()} | '_',
|
||||
us = {<<>>, <<>>} :: {binary(), binary()} | '_',
|
||||
jid = {<<>>, <<>>, <<>>} :: ljid(),
|
||||
name = <<>> :: binary() | '_',
|
||||
subscription = none :: subscription() | '_',
|
||||
ask = none :: ask() | '_',
|
||||
groups = [] :: [binary()] | '_',
|
||||
askmessage = <<"">> :: binary() | '_',
|
||||
xs = [] :: [xmlel()] | '_'
|
||||
}).
|
||||
|
||||
-record(roster_version,
|
||||
{
|
||||
us = {<<>>, <<>>} :: {binary(), binary()},
|
||||
version = <<>> :: binary()
|
||||
}).
|
||||
|
||||
-type ask() :: none | in | out | both | subscribe | unsubscribe.
|
||||
-type subscription() :: none | both | from | to | remove.
|
||||
@@ -0,0 +1,207 @@
|
||||
%%% ====================================================================
|
||||
%%% ``The contents of this file are subject to the Erlang Public License,
|
||||
%%% Version 1.1, (the "License"); you may not use this file except in
|
||||
%%% compliance with the License. You should have received a copy of the
|
||||
%%% Erlang Public License along with this software. If not, it can be
|
||||
%%% retrieved via the world wide web at http://www.erlang.org/.
|
||||
%%%
|
||||
%%% Software distributed under the License is distributed on an "AS IS"
|
||||
%%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
|
||||
%%% the License for the specific language governing rights and limitations
|
||||
%%% under the License.
|
||||
%%%
|
||||
%%% The Initial Developer of the Original Code is ProcessOne.
|
||||
%%% Portions created by ProcessOne are Copyright 2006-2013, ProcessOne
|
||||
%%% All Rights Reserved.''
|
||||
%%% This software is copyright 2006-2013, ProcessOne.
|
||||
%%%
|
||||
%%%
|
||||
%%% copyright 2006-2013 ProcessOne
|
||||
%%%
|
||||
%%% This file contains pubsub types definition.
|
||||
%%% ====================================================================
|
||||
|
||||
-define(ERR_EXTENDED(E, C),
|
||||
mod_pubsub:extended_error(E, C)).
|
||||
|
||||
-define(MAXITEMS, 10).
|
||||
|
||||
-define(MAX_PAYLOAD_SIZE, 60000).
|
||||
|
||||
%% -------------------------------
|
||||
%% Pubsub types
|
||||
|
||||
-type(hostPubsub() :: binary()).
|
||||
%% <p><tt>hostPubsub</tt> is the name of the PubSub service. For example, it can be
|
||||
%% <tt>"pubsub.localhost"</tt>.</p>
|
||||
|
||||
-type(hostPEP() :: {binary(), binary(), <<>>}).
|
||||
%% @type hostPEP() = {User, Server, Resource}
|
||||
%% User = string()
|
||||
%% Server = string()
|
||||
%% Resource = [].
|
||||
%% <p>For example, it can be :
|
||||
%% ```{"bob", "example.org", []}'''.</p>
|
||||
|
||||
-type(host() :: hostPubsub() | hostPEP()).
|
||||
%% @type host() = hostPubsub() | hostPEP().
|
||||
|
||||
-type(nodeId() :: binary()).
|
||||
%% @type nodeId() = binary().
|
||||
%% <p>A node is defined by a list of its ancestors. The last element is the name
|
||||
%% of the current node. For example:
|
||||
%% ```<<"/home/localhost/user">>'''</p>
|
||||
|
||||
-type(nodeIdx() :: pos_integer()).
|
||||
%% @type nodeIdx() = integer().
|
||||
|
||||
-type(itemId() :: binary()).
|
||||
%% @type itemId() = string().
|
||||
|
||||
-type(subId() :: binary()).
|
||||
%% @type subId() = string().
|
||||
|
||||
|
||||
%% @type payload() = [#xmlelement{} | #xmlcdata{}].
|
||||
|
||||
%% @type stanzaError() = #xmlelement{}.
|
||||
%% Example:
|
||||
%% ```{xmlelement, "error",
|
||||
%% [{"code", Code}, {"type", Type}],
|
||||
%% [{xmlelement, Condition, [{"xmlns", ?NS_STANZAS}], []}]}'''
|
||||
%% @type pubsubIQResponse() = #xmlelement{}.
|
||||
%% Example:
|
||||
%% ```{xmlelement, "pubsub",
|
||||
%% [{"xmlns", ?NS_PUBSUB_EVENT}],
|
||||
%% [{xmlelement, "affiliations", [],
|
||||
%% []}]}'''
|
||||
|
||||
-type(nodeOption() ::
|
||||
{Option::atom(),
|
||||
Value::binary() | [binary()] | boolean() | non_neg_integer()
|
||||
}).
|
||||
|
||||
-type(nodeOptions() :: [NodeOption::mod_pubsub:nodeOption(),...]).
|
||||
|
||||
%% @type nodeOption() = {Option, Value}
|
||||
%% Option = atom()
|
||||
%% Value = term().
|
||||
%% Example:
|
||||
%% ```{deliver_payloads, true}'''
|
||||
|
||||
-type(subOption() ::
|
||||
{Option::atom(),
|
||||
Value::binary() | [binary()] | boolean()
|
||||
}).
|
||||
|
||||
-type(subOptions() :: [SubOption::mod_pubsub:subOption(),...]).
|
||||
|
||||
%% @type nodeType() = string().
|
||||
%% <p>The <tt>nodeType</tt> is a string containing the name of the PubSub
|
||||
%% plugin to use to manage a given node. For example, it can be
|
||||
%% <tt>"flat"</tt>, <tt>"hometree"</tt> or <tt>"blog"</tt>.</p>
|
||||
|
||||
%% @type jid() = {jid, User, Server, Resource, LUser, LServer, LResource}
|
||||
%% User = string()
|
||||
%% Server = string()
|
||||
%% Resource = string()
|
||||
%% LUser = string()
|
||||
%% LServer = string()
|
||||
%% LResource = string().
|
||||
|
||||
%-type(ljid() :: {binary(), binary(), binary()}).
|
||||
%% @type ljid() = {User, Server, Resource}
|
||||
%% User = string()
|
||||
%% Server = string()
|
||||
%% Resource = string().
|
||||
|
||||
-type(affiliation() :: 'none'
|
||||
| 'owner'
|
||||
| 'publisher'
|
||||
%| 'publish-only'
|
||||
| 'member'
|
||||
| 'outcast'
|
||||
).
|
||||
%% @type affiliation() = 'none' | 'owner' | 'publisher' | 'publish-only' | 'member' | 'outcast'.
|
||||
|
||||
-type(subscription() :: 'none'
|
||||
| 'pending'
|
||||
| 'unconfigured'
|
||||
| 'subscribed'
|
||||
).
|
||||
%% @type subscription() = 'none' | 'pending' | 'unconfigured' | 'subscribed'.
|
||||
|
||||
-type(accessModel() :: 'open'
|
||||
| 'presence'
|
||||
| 'roster'
|
||||
| 'authorize'
|
||||
| 'whitelist'
|
||||
).
|
||||
%% @type accessModel() = 'open' | 'presence' | 'roster' | 'authorize' | 'whitelist'.
|
||||
|
||||
-type(publishModel() :: 'publishers'
|
||||
| 'subscribers'
|
||||
| 'open'
|
||||
).
|
||||
|
||||
|
||||
-record(pubsub_index,
|
||||
{
|
||||
index :: atom(),
|
||||
last :: mod_pubsub:nodeIdx(),
|
||||
free :: [mod_pubsub:nodeIdx()]
|
||||
}).
|
||||
|
||||
-record(pubsub_node,
|
||||
{
|
||||
nodeid ,%:: {Host::mod_pubsub:host(), NodeId::mod_pubsub:nodeId()},
|
||||
id ,%:: mod_pubsub:nodeIdx(),
|
||||
parents = [] ,%:: [Parent_NodeId::mod_pubsub:nodeId()],
|
||||
type = <<"flat">> ,%:: binary(),
|
||||
owners = [] ,%:: [Owner::ljid(),...],
|
||||
options = [] %:: mod_pubsub:nodeOptions()
|
||||
}).
|
||||
|
||||
|
||||
%-record(pubsub_state,
|
||||
% {stateid, nodeidx, items = [], affiliation = none,
|
||||
% subscriptions = []}).
|
||||
-record(pubsub_state,
|
||||
{
|
||||
stateid ,%:: {Entity::ljid(), NodeIdx::mod_pubsub:nodeIdx()},
|
||||
nodeidx ,%:: mod_pubsub:nodeIdx(),
|
||||
items = [] ,%:: [ItemId::mod_pubsub:itemId()],
|
||||
affiliation = 'none' ,%:: mod_pubsub:affiliation(),
|
||||
subscriptions = [] %:: [{mod_pubsub:subscription(), mod_pubsub:subId()}]
|
||||
}).
|
||||
|
||||
%-record(pubsub_item,
|
||||
% {itemid, nodeidx, creation = {unknown, unknown},
|
||||
% modification = {unknown, unknown}, payload = []}).
|
||||
|
||||
-record(pubsub_item,
|
||||
{
|
||||
itemid ,%:: {mod_pubsub:itemId(), mod_pubsub:nodeIdx()},
|
||||
nodeidx ,%:: mod_pubsub_nodeIdx(),
|
||||
creation = {unknown, unknown} ,%:: {erlang:timestamp(), ljid()},
|
||||
modification = {unknown, unknown} ,%:: {erlang:timestamp(), ljid()},
|
||||
payload = [] %:: mod_pubsub:payload()
|
||||
}).
|
||||
|
||||
%-record(pubsub_subscription, {subid, options}).
|
||||
-record(pubsub_subscription,
|
||||
{
|
||||
subid ,%:: mod_pubsub:subId(),
|
||||
options %:: [] | mod_pubsub:subOptions()
|
||||
}).
|
||||
|
||||
%-record(pubsub_last_item,
|
||||
% {nodeid, itemid, creation, payload}).
|
||||
|
||||
-record(pubsub_last_item,
|
||||
{
|
||||
nodeid ,%:: mod_pubsub:nodeIdx(),
|
||||
itemid ,%:: mod_pubsub:itemId(),
|
||||
creation ,%:: {erlang:timestamp(), ljid()},
|
||||
payload %:: mod_pubsub:payload()
|
||||
}).
|
||||
@@ -0,0 +1,685 @@
|
||||
%%% ====================================================================
|
||||
%%% ``The contents of this file are subject to the Erlang Public License,
|
||||
%%% Version 1.1, (the "License"); you may not use this file except in
|
||||
%%% compliance with the License. You should have received a copy of the
|
||||
%%% Erlang Public License along with this software. If not, it can be
|
||||
%%% retrieved via the world wide web at http://www.erlang.org/.
|
||||
%%%
|
||||
%%% Software distributed under the License is distributed on an "AS IS"
|
||||
%%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
|
||||
%%% the License for the specific language governing rights and limitations
|
||||
%%% under the License.
|
||||
%%%
|
||||
%%% The Initial Developer of the Original Code is ProcessOne.
|
||||
%%% Portions created by ProcessOne are Copyright 2006-2013, ProcessOne
|
||||
%%% All Rights Reserved.''
|
||||
%%% This software is copyright 2006-2013, ProcessOne.
|
||||
%%%
|
||||
%%% @copyright 2006-2013 ProcessOne
|
||||
%%% @author Karim Gemayel <karim.gemayel@process-one.net>
|
||||
%%% [http://www.process-one.net/]
|
||||
%%% @version {@vsn}, {@date} {@time}
|
||||
%%% @end
|
||||
%%% ====================================================================
|
||||
|
||||
%%% @headerfile "pubsub_dev.hrl"
|
||||
|
||||
-module(exmpp_pubsub).
|
||||
-author('karim.gemayel@process-one.net').
|
||||
|
||||
-compile(export_all).
|
||||
|
||||
-include("pubsub_dev.hrl").
|
||||
|
||||
|
||||
%% --------------------------------------------------------------------
|
||||
%% Documentation / type definitions.
|
||||
%% --------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
%-- Affiliations --%
|
||||
-export_type([
|
||||
affiliation/0,
|
||||
%%
|
||||
affiliation_owner/0,
|
||||
affiliation_publisher/0,
|
||||
affiliation_publish_only/0,
|
||||
affiliation_member/0,
|
||||
affiliation_none/0,
|
||||
affiliation_outcast/0
|
||||
]).
|
||||
|
||||
%% @type affiliation_owner() = 'owner'.
|
||||
-type(affiliation_owner() :: 'owner').
|
||||
|
||||
%% @type affiliation_publisher() = 'publisher'.
|
||||
-type(affiliation_publisher() :: 'publisher').
|
||||
|
||||
%% @type affiliation_publish_only() = 'publish-only'.
|
||||
-type(affiliation_publish_only() :: 'publish-only').
|
||||
|
||||
%% @type affiliation_member() = 'member'.
|
||||
-type(affiliation_member() :: 'member').
|
||||
|
||||
%% @type affiliation_none() = 'none'.
|
||||
-type(affiliation_none() :: 'none').
|
||||
|
||||
%% @type affiliation_outcast() = 'outcast'.
|
||||
-type(affiliation_outcast() :: 'outcast').
|
||||
|
||||
%% @type affiliation() = Owner | Publisher | Publish_Only | Member | None | Outcast
|
||||
%% Owner = exmpp_pubsub:affiliation_owner()
|
||||
%% Publisher = exmpp_pubsub:affiliation_publisher()
|
||||
%% Publish_Only = exmpp_pubsub:affiliation_publish_only()
|
||||
%% Member = exmpp_pubsub:affiliation_member()
|
||||
%% None = exmpp_pubsub:affiliation_none()
|
||||
%% Outcast = exmpp_pubsub:affiliation_outcast().
|
||||
-type(affiliation() :: exmpp_pubsub:affiliation_owner()
|
||||
| exmpp_pubsub:affiliation_publisher()
|
||||
| exmpp_pubsub:affiliation_publish_only()
|
||||
| exmpp_pubsub:affiliation_member()
|
||||
| exmpp_pubsub:affiliation_none()
|
||||
| exmpp_pubsub:affiliation_outcast()
|
||||
).
|
||||
|
||||
|
||||
%%
|
||||
|
||||
%-- Things identifiers --%
|
||||
-export_type([
|
||||
index/0,
|
||||
itemId/0,
|
||||
itemIds/0,
|
||||
level/0,
|
||||
nodeId/0,
|
||||
nodeIdx/0,
|
||||
subId/0,
|
||||
plugin/0
|
||||
]).
|
||||
|
||||
%% @type index() = 'node'.
|
||||
-type(index() :: 'node' ).
|
||||
|
||||
%% @type itemId() = binary().
|
||||
-type(itemId() :: binary()).
|
||||
|
||||
%% @type itemIds() = [ItemId::exmpp_pubsub:itemId(),...].
|
||||
-type(itemIds() :: [ItemId::exmpp_pubsub:itemId(),...]).
|
||||
|
||||
%% @type level() = non_neg_integer().
|
||||
-type(level() :: non_neg_integer()).
|
||||
|
||||
%% @type nodeId() = binary().
|
||||
-type(nodeId() :: binary()).
|
||||
|
||||
%% @type nodeIdx() = non_neg_integer().
|
||||
-type(nodeIdx() :: non_neg_integer()).
|
||||
|
||||
%% @type plugin() = module().
|
||||
-type(plugin() :: module()).
|
||||
|
||||
%% @type subId() = binary().
|
||||
-type(subId() :: binary()).
|
||||
|
||||
|
||||
-export_type([
|
||||
t_now/0
|
||||
]).
|
||||
|
||||
%% Temporary -type, until calendar.erl -type is exported
|
||||
-type(t_now()
|
||||
:: {MegaSec::non_neg_integer(),
|
||||
Sec::non_neg_integer(),
|
||||
MilliSec::non_neg_integer()}
|
||||
).
|
||||
|
||||
|
||||
%%
|
||||
-export_type([
|
||||
feature/0,
|
||||
features/0,
|
||||
pubsub_feature/0,
|
||||
pubsub_features/0
|
||||
]).
|
||||
|
||||
-type(feature() :: binary()).
|
||||
|
||||
-type(features() :: Features::[Feature::exmpp_pubsub:feature(),...]).
|
||||
|
||||
-type(pubsub_feature() :: exmpp_pubsub:feature()).
|
||||
|
||||
-type(pubsub_features() :: Pubsub_Features::[Pubsub_Feature::exmpp_pubsub:feature(),...]).
|
||||
|
||||
%%
|
||||
|
||||
%-- Payload types --%
|
||||
-export_type([
|
||||
payload/0,
|
||||
%%
|
||||
payload_empty/0,
|
||||
payload_full/0
|
||||
]).
|
||||
|
||||
%% @type payload_empty() = [].
|
||||
-type(payload_empty() :: []).
|
||||
|
||||
%% @type payload_full() = #xmlel{}.
|
||||
-type(payload_full() :: xmlel()).
|
||||
|
||||
%% @type payload() = Empty_Payload | Full_Payload
|
||||
%% Empty_Payload = exmpp_pubsub:payload_empty()
|
||||
%% Full_Payload = exmpp_pubsub:payload_full().
|
||||
-type(payload() :: exmpp_pubsub:payload_empty()
|
||||
| exmpp_pubsub:payload_full()
|
||||
).
|
||||
|
||||
|
||||
%%
|
||||
|
||||
%-- Pusbub Host --%
|
||||
-export_type([
|
||||
host/0,
|
||||
%%
|
||||
host_pubsub/0,
|
||||
host_pep/0
|
||||
]).
|
||||
|
||||
%% @type host_pubsub() = xmpp_jid:domain_jid().
|
||||
%% ```<<"pubsub.shakespeare.lit">>'''
|
||||
%% Identifier type of the Pubsub service
|
||||
-type(host_pubsub() :: binary()).
|
||||
|
||||
%% @type host_pep() = xmpp_jid:usr_contact_bare().
|
||||
%% ```{<<"juliet">>, <<"capulet.lit">>, undefined}'''
|
||||
%% Identifier type of the Pubsub-On-Jid service
|
||||
-type(host_pep() :: xmpp_jid:usr_contact_bare()).
|
||||
|
||||
%% @type host() = Pubsub_Host | Pubsub_On_Jid_Host
|
||||
%% Pubsub_Host = exmpp_pubsub:host_pubsub()
|
||||
%% Pubsub_On_Jid_Host = exmpp_pubsub:host_pep().
|
||||
%% Identifier types of the Pubsub and PEP (Pubsub-On-Jid) services
|
||||
%% ```* Pubsub_Host : <<"pubsub.shakespeare.lit">>
|
||||
%% * Pubsub_PEP : {<<"juliet">>, <<"capulet.lit">>, undefined}'''
|
||||
-type(host() :: exmpp_pubsub:host_pubsub()
|
||||
| exmpp_pubsub:host_pep()
|
||||
).
|
||||
|
||||
|
||||
%%
|
||||
|
||||
%-- Subscription States --%
|
||||
-export_type([
|
||||
subscription_state/0,
|
||||
%%
|
||||
subscription_state_none/0,
|
||||
subscription_state_pending/0,
|
||||
subscription_state_unconfigured/0,
|
||||
subscription_state_subscribed/0
|
||||
]).
|
||||
|
||||
%% @type subscription_state_none() = 'none'.
|
||||
-type(subscription_state_none() :: 'none').
|
||||
|
||||
%% @type subscription_state_pending() = 'pending'.
|
||||
-type(subscription_state_pending() :: 'pending').
|
||||
|
||||
%% @type subscription_state_unconfigured() = 'unconfigured'.
|
||||
-type(subscription_state_unconfigured() :: 'unconfigured').
|
||||
|
||||
%% @type subscription_state_subscribed() = 'subscribed'.
|
||||
-type(subscription_state_subscribed() :: 'subscribed').
|
||||
|
||||
%% @type subscription_state() = None | Pending | Unconfigured | Subscribed
|
||||
%% None = exmpp_pubsub:subscription_state_none()
|
||||
%% Pending = exmpp_pubsub:subscription_state_pending()
|
||||
%% Unconfigured = exmpp_pubsub:subscription_state_unconfigured()
|
||||
%% Subscribed = exmpp_pubsub:subscription_state_subscribed()
|
||||
-type(subscription_state() :: exmpp_pubsub:subscription_state_pending()
|
||||
| exmpp_pubsub:subscription_state_unconfigured()
|
||||
| exmpp_pubsub:subscription_state_subscribed()
|
||||
).
|
||||
|
||||
%%
|
||||
|
||||
%-- Subscription -- %%
|
||||
-export_type([
|
||||
subscriptions/0,
|
||||
subscription/0,
|
||||
%%
|
||||
subscription_subscribed/0,
|
||||
subscription_unconfigured/0,
|
||||
subscription_pending/0
|
||||
]).
|
||||
|
||||
-type(subscription_subscribed()
|
||||
:: {Subscription_State :: exmpp_pubsub:subscription_state_subscribed(),
|
||||
SubId :: exmpp_pubsub:subId(),
|
||||
Resource :: undefined | xmpp_jid:resource_jid() | {'caps', xmpp_jid:resource_jid()},
|
||||
Subscription_Options :: [] | pubsub_options:options_subscription()}
|
||||
).
|
||||
|
||||
-type(subscription_unconfigured()
|
||||
:: {Subscription_State :: exmpp_pubsub:subscription_state_unconfigured(),
|
||||
SubId :: exmpp_pubsub:subId(),
|
||||
Resource :: undefined | xmpp_jid:resource_jid() | {'caps', xmpp_jid:resource_jid()},
|
||||
Subscription_Options :: []}
|
||||
).
|
||||
|
||||
-type(subscription_pending()
|
||||
:: {Subscription_State :: exmpp_pubsub:subscription_state_pending(),
|
||||
SubId :: exmpp_pubsub:subId(),
|
||||
Resource :: undefined | xmpp_jid:resource_jid() | {'caps', xmpp_jid:resource_jid()},
|
||||
Subscription_Options :: []}
|
||||
).
|
||||
|
||||
%% -type(subscription()
|
||||
%% :: {Subscription_State :: exmpp_pubsub:subscription_state(),
|
||||
%% SubId :: exmpp_pubsub:subId(),
|
||||
%% Resource :: undefined | xmpp_jid:resource_jid() | {'caps', xmpp_jid:resource_jid()},
|
||||
%% Subscription_Options :: [] | pubsub_options:options_subscription()}
|
||||
%% %% :: exmpp_pubsub:subscription_subscribed()
|
||||
%% %% | exmpp_pubsub:subscription_pending()
|
||||
%% %% | exmpp_pubsub:subscription_unconfigured()
|
||||
%% ).
|
||||
|
||||
-type(subscriptions()
|
||||
:: [exmpp_pubsub:subscription(),...]
|
||||
%% :: [exmpp_pubsub:subscription_subscribed(),...]
|
||||
%% | [exmpp_pubsub:subscription_unconfigured(),...]
|
||||
%% | [exmpp_pubsub:subscription_pending(),...]
|
||||
).
|
||||
|
||||
%% TODO : commented -type unions return the following dialyzer error (bug ?) :
|
||||
%% ...
|
||||
%% Adding information from /home/meta/otp-exmpp.plt to ejabberd.plt...
|
||||
%%=ERROR REPORT==== 29-Jul-2011::15:14:42 ===
|
||||
%Error in process <0.2604.0> with exit value: {function_clause,[{erl_types,inf_tuples_in_sets,4},{erl_types,inf_tuple_sets,4},{erl_types,inf_tuple_sets,3},{erl_types,t_inf,3},{erl_types,t_inf_lists_strict,4},{erl_types,t_inf,3},{dialyzer_typesig,solve_one_c...
|
||||
%%
|
||||
%%
|
||||
%%dialyzer: Analysis failed with error: {function_clause,[{erl_types,inf_tuples_in_sets,4},
|
||||
%% {erl_types,inf_tuple_sets,4},
|
||||
%% {erl_types,inf_tuple_sets,3},
|
||||
%% {erl_types,t_inf,3},
|
||||
%% {erl_types,t_inf_lists_strict,4},
|
||||
%% {erl_types,t_inf,3},
|
||||
%% {dialyzer_typesig,solve_one_c,...},
|
||||
%% {dialyzer_typesig,...}]}
|
||||
%%Last messages in the log cache:
|
||||
%% Typesig analysis for SCC: [{ejabberd_web_admin,make_xhtml,5}]
|
||||
%% Typesig analysis for SCC: [{ejabberd_web_admin,make_xhtml,4}]
|
||||
%% Typesig analysis for SCC: [{ejabberd_web_admin,process_admin,2}]
|
||||
%% Typesig analysis for SCC: [{ejabberd_web_admin,process,2}]
|
||||
%% Typesig analysis for SCC: [{mod_stats,get_local_stat,3}]
|
||||
%% Typesig analysis for SCC: [{mod_stats,get_local_stats,3}]
|
||||
%% Typesig analysis for SCC: [{mod_stats,process_local_iq,3}]
|
||||
%% Typesig analysis for SCC: [{mod_register_web,send_registration_notifications,2}]
|
||||
%% Typesig analysis for SCC: [{mod_register_web,process,2}]
|
||||
%% Typesig analysis for SCC: [{pubsub_db,create_node,5}]
|
||||
|
||||
%%
|
||||
|
||||
|
||||
%% Pubsub #xmlel{} templates
|
||||
|
||||
|
||||
%% --------------------------------------------------------------------
|
||||
%% Functions.
|
||||
%% --------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
|
||||
%% @spec nodeId() -> NodeId::exmpp_pubsub:nodeId()
|
||||
-spec(nodeId/0 :: () -> NodeId::exmpp_pubsub:nodeId()).
|
||||
|
||||
nodeId() ->
|
||||
randoms:get_string().
|
||||
|
||||
%% @spec subId() -> SubId::exmpp_pubsub:subId()
|
||||
-spec(subId/0 :: () -> SubId::exmpp_pubsub:subId()).
|
||||
|
||||
subId() ->
|
||||
{T1, T2, T3} = now(),
|
||||
list_to_binary(lists:flatten(io_lib:fwrite("~.16B~.16B~.16B", [T1, T2, T3]))).
|
||||
|
||||
%% @spec itemId() -> ItemId::exmpp_pubsub:itemId()
|
||||
-spec(itemId/0 :: () -> ItemId::exmpp_pubsub:itemId()).
|
||||
|
||||
itemId() ->
|
||||
{T1, T2, T3} = now(),
|
||||
list_to_binary(lists:flatten(io_lib:fwrite("~.16B~.16B~.16B", [T1, T2, T3]))).
|
||||
|
||||
id() ->
|
||||
{T1, T2, T3} = now(),
|
||||
list_to_binary(lists:flatten(io_lib:fwrite("~.16B~.16B~.16B", [T1, T2, T3]))).
|
||||
|
||||
|
||||
|
||||
%%
|
||||
-spec(subscription_subscribed/2 ::
|
||||
(
|
||||
Resource :: undefined
|
||||
| xmpp_jid:resource_jid()
|
||||
| {'caps', xmpp_jid:resource_jid()},
|
||||
Subscription_Options :: [] | pubsub_options:options_subscription())
|
||||
-> Subscription_Subscribed::exmpp_pubsub:subscription_subscribed()
|
||||
).
|
||||
|
||||
subscription_subscribed(Resource, Subscription_Options) ->
|
||||
{'subscribed', subId(), Resource, Subscription_Options}.
|
||||
|
||||
%%
|
||||
-spec(subscription_pending/2 ::
|
||||
(
|
||||
Resource :: undefined
|
||||
| xmpp_jid:resource_jid()
|
||||
| {'caps', xmpp_jid:resource_jid()},
|
||||
Subscription_Options :: [] | pubsub_options:options_subscription())
|
||||
-> Subscription_Pending::exmpp_pubsub:subscription_pending()
|
||||
).
|
||||
|
||||
subscription_pending(Resource, Subscription_Options) ->
|
||||
{'pending', subId(), Resource, Subscription_Options}.
|
||||
|
||||
|
||||
|
||||
%% Pubsub Xmlel templates
|
||||
|
||||
xmlcdata(CData) ->
|
||||
{xmlcdata, CData}.
|
||||
|
||||
xmlattr(Name, Value) ->
|
||||
{Name, Value}.
|
||||
|
||||
|
||||
xmlel('disco#info', Name, Attrs, Children) ->
|
||||
xmlel(?NS_DISCO_INFO, Name, Attrs, Children);
|
||||
xmlel('disco#items', Name, Attrs, Children) ->
|
||||
xmlel(?NS_DISCO_ITEMS, Name, Attrs, Children);
|
||||
xmlel('jabber:client', Name, Attrs, Children) ->
|
||||
xmlel(?NS_JABBER_CLIENT, Name, Attrs, Children);
|
||||
xmlel('pubsub', Name, Attrs, Children) ->
|
||||
xmlel(?NS_PUBSUB, Name, Attrs, Children);
|
||||
xmlel('pubsub#event', Name, Attrs, Children) ->
|
||||
xmlel(?NS_PUBSUB_EVENT, Name, Attrs, Children);
|
||||
xmlel('pubsub#owner', Name, Attrs, Children) ->
|
||||
xmlel(?NS_PUBSUB_OWNER, Name, Attrs, Children);
|
||||
xmlel('shim', Name, Attrs, Children) ->
|
||||
xmlel(?NS_SHIM, Name, Attrs, Children);
|
||||
xmlel(NS, Name, Attrs, Children) ->
|
||||
#xmlel{name = Name, attrs = [{<<"xmlns">>, NS} | Attrs], children = Children}.
|
||||
%%
|
||||
xmlattr_affiliation(Affiliation) ->
|
||||
xmlattr(<<"affiliation">>, list_to_binary(atom_to_list(Affiliation))).
|
||||
%%
|
||||
xmlattr_category(Category) ->
|
||||
xmlattr(<<"category">>, Category).
|
||||
%%
|
||||
xmlattr_id(ItemId) ->
|
||||
xmlattr(<<"id">>, ItemId).
|
||||
%%
|
||||
xmlattr_jid(Jid) ->
|
||||
xmlattr(<<"jid">>, Jid).
|
||||
%%
|
||||
xmlattr_name(Name) ->
|
||||
xmlattr(<<"name">>, Name).
|
||||
%%
|
||||
xmlattr_node(NodeId) ->
|
||||
xmlattr(<<"node">>, NodeId).
|
||||
%%
|
||||
xmlattr_publisher(Publisher) ->
|
||||
xmlattr(<<"publisher">>, Publisher).
|
||||
%%
|
||||
xmlattr_subid(SubId) ->
|
||||
xmlattr(<<"subid">>, SubId).
|
||||
%%
|
||||
xmlattr_subscription(Subscription_State) ->
|
||||
xmlattr(<<"subscription">>, list_to_binary(atom_to_list(Subscription_State))).
|
||||
%%
|
||||
xmlattr_type(Type) when is_atom(Type)->
|
||||
xmlattr(<<"type">>, list_to_binary(atom_to_list(Type)));
|
||||
%%
|
||||
xmlattr_type(Type) ->
|
||||
xmlattr(<<"type">>, Type).
|
||||
%%
|
||||
xmlattr_uri(URI) ->
|
||||
xmlattr(<<"uri">>, URI).
|
||||
%%
|
||||
xmlattr_var(Var) ->
|
||||
xmlattr(<<"var">>, Var).
|
||||
|
||||
%%
|
||||
xmlel_affiliation('pubsub', NodeId, Affiliation) ->
|
||||
xmlel('pubsub', <<"affiliation">>,
|
||||
[xmlattr_node(NodeId),
|
||||
xmlattr_affiliation(Affiliation)],
|
||||
[]);
|
||||
xmlel_affiliation('pubsub#owner', Jid, Affiliation) ->
|
||||
xmlel('pubsub#owner', <<"affiliation">>,
|
||||
[xmlattr_jid(Jid),
|
||||
xmlattr_affiliation(Affiliation)],
|
||||
[]).
|
||||
%%
|
||||
xmlel_affiliations('pubsub', Xmlels) ->
|
||||
xmlel('pubsub', <<"affiliations">>, [], Xmlels).
|
||||
|
||||
xmlel_affiliations('pubsub#owner', NodeId, Xmlels) ->
|
||||
xmlel('pubsub#owner', <<"affiliations">>, [xmlattr_node(NodeId)], Xmlels).
|
||||
%%
|
||||
xmlel_create(NodeId) ->
|
||||
xmlel('pubsub', <<"create">>, [xmlattr_node(NodeId)], []).
|
||||
|
||||
%%
|
||||
xmlel_configure('pubsub#owner', NodeId, Xmlels) ->
|
||||
xmlel('pubsub#owner', <<"configure">>, [xmlattr_node(NodeId)], Xmlels).
|
||||
|
||||
%%
|
||||
xmlel_default('pubsub', Xmlels) ->
|
||||
xmlel('pubsub', <<"default">>, [], Xmlels);
|
||||
%%
|
||||
xmlel_default('pubsub#owner', Xmlels) ->
|
||||
xmlel('pubsub#owner', <<"default">>, [], Xmlels).
|
||||
|
||||
%%
|
||||
xmlel_default('pubsub', NodeId, Xmlels) ->
|
||||
xmlel('pubsub', <<"default">>, [xmlattr_node(NodeId)], Xmlels).
|
||||
|
||||
%%
|
||||
xmlel_delete(NodeId, RedirectURI) ->
|
||||
xmlel('pubsub#event', <<"delete">>,
|
||||
[xmlattr_node(NodeId)],
|
||||
case RedirectURI of
|
||||
undefined -> [];
|
||||
_RedirectURI -> [xmlel_redirect(RedirectURI)]
|
||||
end).
|
||||
%%
|
||||
xmlel_event(Xmlels) ->
|
||||
xmlel('pubsub#event', <<"event">>, [], Xmlels).
|
||||
%%
|
||||
xmlel_feature('disco#info', Feature) ->
|
||||
xmlel('disco#info', <<"feature">>, [xmlattr_var(Feature)], []).
|
||||
%%
|
||||
xmlel_header(SubId) ->
|
||||
xmlel('shim', <<"header">>, [xmlattr_name(<<"SubID">>)], [xmlcdata(SubId)]).
|
||||
%%
|
||||
xmlel_headers(Xmlels_Header) ->
|
||||
xmlel('shim', <<"headers">>, [], Xmlels_Header).
|
||||
|
||||
|
||||
xmlel_identity('disco#info', Category, Type, Name) ->
|
||||
xmlel('disco#info', <<"identity">>,
|
||||
case Name of
|
||||
undefined ->
|
||||
[xmlattr_category(Category),
|
||||
xmlattr_type(Type)];
|
||||
_ ->
|
||||
[xmlattr_category(Category),
|
||||
xmlattr_name(Name),
|
||||
xmlattr_type(Type)]
|
||||
end,
|
||||
[]).
|
||||
|
||||
%%
|
||||
xmlel_item('pubsub', ItemId) ->
|
||||
xmlel('pubsub', <<"item">>, [xmlattr_id(ItemId)], []).
|
||||
|
||||
%%
|
||||
xmlel_item('disco#items', ItemId, Jid) ->
|
||||
xmlel('disco#items', <<"item">>,
|
||||
[xmlattr_name(ItemId),
|
||||
xmlattr_jid(Jid)],
|
||||
[]);
|
||||
xmlel_item('pubsub', ItemId, Payload) ->
|
||||
xmlel('pubsub', <<"item">>, [xmlattr_id(ItemId)],
|
||||
case Payload of
|
||||
[] -> [];
|
||||
_Payload -> [Payload]
|
||||
end).
|
||||
|
||||
xmlel_item('disco#items', NodeId, Jid, Name) ->
|
||||
xmlel('disco#items', <<"item">>,
|
||||
case Name of
|
||||
undefined ->
|
||||
[xmlattr_jid(Jid),
|
||||
xmlattr_node(NodeId)];
|
||||
_ ->
|
||||
[xmlattr_jid(Jid),
|
||||
xmlattr_node(NodeId),
|
||||
xmlattr_name(Name)]
|
||||
end,
|
||||
[]);
|
||||
%%
|
||||
xmlel_item('pubsub#event', ItemId, Publisher, Payload) ->
|
||||
xmlel('pubsub#event', <<"item">>,
|
||||
case Publisher of
|
||||
undefined ->
|
||||
[xmlattr_id(ItemId)];
|
||||
_Publisher ->
|
||||
[xmlattr_id(ItemId),
|
||||
xmlattr_publisher(Publisher)]
|
||||
end,
|
||||
case Payload of
|
||||
[] -> [];
|
||||
_Payload -> [Payload]
|
||||
end).
|
||||
%%
|
||||
xmlel_items('pubsub', NodeId, Xmlels) ->
|
||||
xmlel('pubsub', <<"items">>, [xmlattr_node(NodeId)], Xmlels);
|
||||
%%
|
||||
xmlel_items('pubsub#event', undefined = _NodeId, Xmlels) ->
|
||||
xmlel('pubsub#event', <<"items">>, [], Xmlels);
|
||||
%%
|
||||
xmlel_items('pubsub#event', NodeId, Xmlels) ->
|
||||
xmlel('pubsub#event', <<"items">>, [xmlattr_node(NodeId)], Xmlels).
|
||||
%%
|
||||
xmlel_items('pubsub#event', NodeId, undefined = _ItemId, _Publisher, _Payload) ->
|
||||
xmlel('pubsub#event', <<"items">>, [xmlattr_node(NodeId)], []);
|
||||
xmlel_items('pubsub#event', NodeId, ItemId, Publisher, Payload) ->
|
||||
xmlel('pubsub#event', <<"items">>,
|
||||
[xmlattr_node(NodeId)],
|
||||
[xmlel_item('pubsub#event', ItemId, Publisher, Payload)]).
|
||||
%%
|
||||
xmlel_message(undefined = _Type, Xmlels) ->
|
||||
xmlel_message('normal', Xmlels);
|
||||
xmlel_message(Type, Xmlels) ->
|
||||
xmlel('jabber:client', <<"message">>,
|
||||
[xmlattr_type(Type),
|
||||
xmlattr_id(_Id = id())],
|
||||
Xmlels).
|
||||
%%
|
||||
xmlel_options('pubsub', NodeId, Jid, SubId, Xmlels) ->
|
||||
xmlel('pubsub', <<"options">>,
|
||||
case SubId of
|
||||
undefined ->
|
||||
[xmlattr_node(NodeId),
|
||||
xmlattr_jid(Jid)];
|
||||
_ ->
|
||||
[xmlattr_node(NodeId),
|
||||
xmlattr_jid(Jid),
|
||||
xmlattr_subid(SubId)]
|
||||
end,
|
||||
Xmlels).
|
||||
%%
|
||||
xmlel_publish('pubsub', NodeId, Xmlels) ->
|
||||
xmlel('pubsub', <<"publish">>, [xmlattr_node(NodeId)], Xmlels).
|
||||
%%
|
||||
xmlel_purge(NodeId) ->
|
||||
xmlel('pubsub#event', <<"purge">>, [xmlattr_node(NodeId)], []).
|
||||
|
||||
%%
|
||||
xmlel_query('disco#info', Xmlels) ->
|
||||
xmlel('disco#info', <<"query">>, [], Xmlels);
|
||||
%%
|
||||
xmlel_query('disco#items', Xmlels) ->
|
||||
xmlel('disco#items', <<"query">>, [], Xmlels).
|
||||
|
||||
%%
|
||||
xmlel_query('disco#info', NodeId, Xmlels) ->
|
||||
xmlel('disco#info', <<"query">>, [xmlattr_node(NodeId)], Xmlels);
|
||||
xmlel_query('disco#items', NodeId, Xmlels) ->
|
||||
xmlel('disco#items', 'query', [xmlattr_node(NodeId)], Xmlels).
|
||||
|
||||
%%
|
||||
xmlel_redirect(RedirectURI) ->
|
||||
xmlel('pubsub#event', <<"redirect">>, [xmlattr_uri(RedirectURI)], []).
|
||||
%%
|
||||
xmlel_retract(undefined = _ItemId) ->
|
||||
xmlel('pubsub#event', <<"retract">>, [], []);
|
||||
xmlel_retract(ItemId) ->
|
||||
xmlel('pubsub#event', <<"retract">>, [xmlattr_id(ItemId)], []).
|
||||
%%
|
||||
xmlel_subscription('pubsub', NodeId, Jid, SubId, Subscription_State) ->
|
||||
xmlel('pubsub', <<"subscription">>,
|
||||
[xmlattr_node(NodeId),
|
||||
xmlattr_jid(Jid),
|
||||
xmlattr_subid(SubId),
|
||||
xmlattr_subscription(Subscription_State)],
|
||||
[]);
|
||||
xmlel_subscription('pubsub#event', NodeId, Jid, SubId, Subscription_State) ->
|
||||
xmlel('pubsub#event', <<"subscription">>,
|
||||
case SubId of
|
||||
undefined ->
|
||||
[xmlattr_node(NodeId),
|
||||
xmlattr_jid(Jid),
|
||||
xmlattr_subscription(Subscription_State)];
|
||||
_SubId ->
|
||||
[xmlattr_node(NodeId),
|
||||
xmlattr_jid(Jid),
|
||||
xmlattr_subid(SubId),
|
||||
xmlattr_subscription(Subscription_State)]
|
||||
end,
|
||||
[]).
|
||||
%%
|
||||
xmlel_subscription('pubsub#owner', Jid, SubId, Subscription_State) ->
|
||||
xmlel('pubsub#owner', <<"subscription">>,
|
||||
case SubId of
|
||||
undefined ->
|
||||
[xmlattr_jid(Jid),
|
||||
xmlattr_subscription(Subscription_State)];
|
||||
_SubId ->
|
||||
[xmlattr_jid(Jid),
|
||||
xmlattr_subid(SubId),
|
||||
xmlattr_subscription(Subscription_State)]
|
||||
end,
|
||||
[]).
|
||||
%%
|
||||
xmlel_subscriptions('pubsub', Xmlels) ->
|
||||
xmlel('pubsub', <<"subscriptions">>, [], Xmlels).
|
||||
|
||||
xmlel_subscriptions('pubsub#owner', NodeId, Xmlels) ->
|
||||
xmlel('pubsub#owner', <<"subscriptions">>, [xmlattr_node(NodeId)], Xmlels).
|
||||
%%
|
||||
xmlel_publish(NodeId, undefined = _ItemId) ->
|
||||
xmlel('pubsub', <<"publish">>, [xmlattr_node(NodeId)], []);
|
||||
xmlel_publish(NodeId, ItemId) ->
|
||||
xmlel('pubsub', <<"publish">>,
|
||||
[xmlattr_node(NodeId)],
|
||||
[xmlel_item('pubsub', ItemId)]).
|
||||
%%
|
||||
xmlel_pubsub('pubsub', Children) ->
|
||||
xmlel('pubsub', <<"pubsub">>, [], Children);
|
||||
%%
|
||||
xmlel_pubsub('pubsub#owner', Children) ->
|
||||
xmlel('pubsub#owner', <<"pubsub">>, [], Children).
|
||||
|
||||
@@ -0,0 +1,863 @@
|
||||
%%% ====================================================================
|
||||
%%% ``The contents of this file are subject to the Erlang Public License,
|
||||
%%% Version 1.1, (the "License"); you may not use this file except in
|
||||
%%% compliance with the License. You should have received a copy of the
|
||||
%%% Erlang Public License along with this software. If not, it can be
|
||||
%%% retrieved via the world wide web at http://www.erlang.org/.
|
||||
%%%
|
||||
%%% Software distributed under the License is distributed on an "AS IS"
|
||||
%%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
|
||||
%%% the License for the specific language governing rights and limitations
|
||||
%%% under the License.
|
||||
%%%
|
||||
%%% The Initial Developer of the Original Code is ProcessOne.
|
||||
%%% Portions created by ProcessOne are Copyright 2006-2013, ProcessOne
|
||||
%%% All Rights Reserved.''
|
||||
%%% This software is copyright 2006-2013, ProcessOne.
|
||||
%%%
|
||||
%%% @copyright 2006-2013 ProcessOne
|
||||
%%% @author Christophe Romain <christophe.romain@process-one.net>
|
||||
%%% [http://www.process-one.net/]
|
||||
%%% @author Karim Gemayel <karim.gemayel@process-one.net>
|
||||
%%% [http://www.process-one.net/]
|
||||
%%% @version {@vsn}, {@date} {@time}
|
||||
%%% @end
|
||||
%%% ====================================================================
|
||||
|
||||
%%% @headerfile "pubsub_dev.hrl"
|
||||
|
||||
-module(mod_pubsub_dev).
|
||||
-author('christophe.romain@process-one.net').
|
||||
-author('karim.gemayel@process-one.net').
|
||||
-version('1.13-0').
|
||||
|
||||
-behaviour(gen_server).
|
||||
-behaviour(gen_mod).
|
||||
|
||||
-include("pubsub_dev.hrl").
|
||||
-include("pubsub_api.hrl").
|
||||
|
||||
-compile(export_all).
|
||||
%%% Export Functions
|
||||
|
||||
%% API and gen_server callbacks
|
||||
-export([
|
||||
start_link/2,
|
||||
start/2,
|
||||
stop/1,
|
||||
init/1,
|
||||
handle_call/3,
|
||||
handle_cast/2,
|
||||
handle_info/2,
|
||||
terminate/2,
|
||||
code_change/3
|
||||
]).
|
||||
|
||||
%%
|
||||
-export_type([
|
||||
resource_show/0,
|
||||
presence_cache/0
|
||||
]).
|
||||
|
||||
-type(resource_show()
|
||||
:: {Resource :: xmpp_jid:resource_jid(),
|
||||
Show :: 'away' | 'chat' | 'dnd' | 'online' | 'xa' }
|
||||
).
|
||||
|
||||
-type(presence_cache() :: [Resource_Show::resource_show()]).
|
||||
|
||||
%%
|
||||
-export_type([
|
||||
resource_subids/0,
|
||||
resources_subids/0
|
||||
]).
|
||||
|
||||
-type(resource_subids()
|
||||
:: {Resource :: xmpp_jid:resource_jid(),
|
||||
SubIds :: [SubId::exmpp_pubsub:subId(),...]}
|
||||
).
|
||||
|
||||
-type(resources_subids() :: [Resource_SubIds::resource_subids(),...]).
|
||||
|
||||
%%%
|
||||
-export_type([
|
||||
entity/0,
|
||||
n0de/0,
|
||||
cache/0,
|
||||
subids/0,
|
||||
event/0
|
||||
]).
|
||||
|
||||
-type(entity() :: #entity{}).
|
||||
% id :: xmpp_jid:usr_bare(),
|
||||
% affiliation :: 'member' | 'owner' | 'publisher',
|
||||
% subscriptions :: []%[exmpp_pubsub:subscription(),...]
|
||||
%}).
|
||||
|
||||
%%%
|
||||
-type(n0de() :: #node{}).
|
||||
% id :: exmpp_pubsub:nodeId(),
|
||||
% owners :: [Node_Owner::xmpp_jid:usr_bare(),...],
|
||||
% access_model :: pubsub_options:access_model(),
|
||||
% itemreply :: 'owner' | 'publisher',
|
||||
% notification_type :: 'headline' | 'normal',
|
||||
% presence_based_delivery :: boolean(),
|
||||
% rosters_groups_allowed :: [] | pubsub_options:rosters_groups_allowed()
|
||||
%}).
|
||||
|
||||
%%%
|
||||
-type(cache() :: #cache{}).
|
||||
% presence :: undefined | mod_pubsub_dev:presence_cache(),
|
||||
% presence_subscriptions :: undefined | boolean(),
|
||||
% rosters_groups :: undefined | boolean()
|
||||
%}).
|
||||
|
||||
%%%
|
||||
-type(subids() :: #subids{}).
|
||||
% presence :: undefined | [] | mod_pubsub_dev:resources_subids(),
|
||||
% no_presence :: undefined | [] | mod_pubsub_dev:resources_subids()
|
||||
%}).
|
||||
|
||||
%%
|
||||
-type(event() :: #event{
|
||||
% host :: xmpp_jid:raw_jid_component_bare(),
|
||||
% component :: xmpp_jid:component_bare(),
|
||||
% entity :: mod_pubsub_dev:entity(),
|
||||
% node :: mod_pubsub_dev:n0de(),
|
||||
% cache :: mod_pubsub_dev:cache(),
|
||||
% subids :: mod_pubsub_dev:subids()
|
||||
}).
|
||||
|
||||
%%%
|
||||
-export_type([
|
||||
item/0,
|
||||
published_item/0,
|
||||
retracted_item/0
|
||||
]).
|
||||
|
||||
-type(published_item() :: #item{
|
||||
access_model :: undefined | pubsub_options:access_model(),
|
||||
presence_based_delivery :: undefined | boolean(),
|
||||
rosters_groups_allowed :: [] | pubsub_options:rosters_groups_allowed(),
|
||||
stanza :: xmlel()
|
||||
}).
|
||||
|
||||
-type(retracted_item() :: #item{
|
||||
access_model :: undefined | pubsub_options:access_model(),
|
||||
presence_based_delivery :: undefined | boolean(),
|
||||
rosters_groups_allowed :: [] | pubsub_options:rosters_groups_allowed(),
|
||||
stanza :: xmlel()
|
||||
}).
|
||||
|
||||
-type(item() :: published_item() | retracted_item()).
|
||||
|
||||
|
||||
%%
|
||||
|
||||
-export_type([
|
||||
pubsub_itemId/0,
|
||||
pubsub_nodeId/0,
|
||||
pubsub_stateId/0,
|
||||
item_owners/0,
|
||||
node_owners/0,
|
||||
item_creation/0,
|
||||
item_modification/0,
|
||||
node_creation/0
|
||||
]).
|
||||
|
||||
-type(pubsub_itemId()
|
||||
:: {ItemId::exmpp_pubsub:itemId(), NodeIdx::exmpp_pubsub:nodeIdx()}
|
||||
).
|
||||
|
||||
-type(pubsub_nodeId()
|
||||
:: {Pubsub_Host :: exmpp_pubsub:host(), NodeId :: exmpp_pubsub:nodeId()}
|
||||
).
|
||||
|
||||
-type(pubsub_stateId()
|
||||
:: {Entity::xmpp_jid:usr_bare(), NodeIdx::exmpp_pubsub:nodeIdx()}
|
||||
).
|
||||
|
||||
-type(item_owners() :: [Entity::xmpp_jid:usr_bare(),...]).
|
||||
-type(node_owners() :: [Entity::xmpp_jid:usr_bare(),...]).
|
||||
|
||||
-type(item_creation()
|
||||
:: {DateTime::erlang:timestamp(), Entity::xmpp_jid:usr_entity()}
|
||||
).
|
||||
|
||||
-type(item_modification()
|
||||
:: {DateTime::erlang:timestamp(), Entity::xmpp_jid:usr_entity()}
|
||||
).
|
||||
|
||||
-type(node_creation()
|
||||
:: {DateTime::erlang:timestamp(), Entity::xmpp_jid:usr_entity()}
|
||||
).
|
||||
|
||||
|
||||
|
||||
%%
|
||||
-export_type([
|
||||
pubsub_state/0,
|
||||
pubsub_states/0,
|
||||
%
|
||||
pubsub_state_owner/0,
|
||||
pubsub_state_publisher/0,
|
||||
pubsub_state_publish_only/0,
|
||||
pubsub_state_member/0,
|
||||
pubsub_state_none/0,
|
||||
pubsub_state_outcast/0
|
||||
]).
|
||||
|
||||
-type(pubsub_state_owner()
|
||||
:: #pubsub_state_dev{
|
||||
id :: mod_pubsub_dev:pubsub_stateId(),
|
||||
nodeidx :: exmpp_pubsub:nodeIdx(),
|
||||
affiliation :: 'owner',
|
||||
access :: undefined | 'presence' | 'roster',
|
||||
%subscriptions :: [exmpp_pubsub:subscription_subscribed() |
|
||||
% exmpp_pubsub:subscription_unconfigured()],
|
||||
subscriptions :: [exmpp_pubsub:subscription()],
|
||||
itemids :: [] | exmpp_pubsub:itemIds()
|
||||
}
|
||||
).
|
||||
|
||||
%%
|
||||
-type(pubsub_state_publisher()
|
||||
:: #pubsub_state_dev{
|
||||
id :: mod_pubsub_dev:pubsub_stateId(),
|
||||
nodeidx :: exmpp_pubsub:nodeIdx(),
|
||||
affiliation :: 'publisher',
|
||||
access :: undefined | 'presence' | 'roster',
|
||||
%subscriptions :: [exmpp_pubsub:subscription_subscribed() |
|
||||
% exmpp_pubsub:subscription_unconfigured()],
|
||||
subscriptions :: [exmpp_pubsub:subscription()],
|
||||
itemids :: [] | exmpp_pubsub:itemIds()
|
||||
}
|
||||
).
|
||||
|
||||
%%
|
||||
-type(pubsub_state_publish_only()
|
||||
:: #pubsub_state_dev{
|
||||
id :: mod_pubsub_dev:pubsub_stateId(),
|
||||
nodeidx :: exmpp_pubsub:nodeIdx(),
|
||||
affiliation :: 'publish-only',
|
||||
access :: undefined | 'presence' | 'roster',
|
||||
subscriptions :: [],
|
||||
itemids :: [] | exmpp_pubsub:itemIds()
|
||||
}
|
||||
).
|
||||
|
||||
%%
|
||||
-type(pubsub_state_member()
|
||||
:: #pubsub_state_dev{
|
||||
id :: mod_pubsub_dev:pubsub_stateId(),
|
||||
nodeidx :: exmpp_pubsub:nodeIdx(),
|
||||
affiliation :: 'member',
|
||||
access :: undefined | 'pending' | 'presence' | 'roster',
|
||||
subscriptions :: [],
|
||||
itemids :: [] | exmpp_pubsub:itemIds()
|
||||
}
|
||||
%%
|
||||
| #pubsub_state_dev{
|
||||
id :: mod_pubsub_dev:pubsub_stateId(),
|
||||
nodeidx :: exmpp_pubsub:nodeIdx(),
|
||||
affiliation :: 'member',
|
||||
access :: undefined | 'pending' | 'presence' | 'roster',
|
||||
%subscriptions :: [exmpp_pubsub:subscription_pending(),...],
|
||||
subscriptions :: [exmpp_pubsub:subscription()],
|
||||
itemids :: [] | exmpp_pubsub:itemIds()
|
||||
}
|
||||
%%
|
||||
| #pubsub_state_dev{
|
||||
id :: mod_pubsub_dev:pubsub_stateId(),
|
||||
nodeidx :: exmpp_pubsub:nodeIdx(),
|
||||
affiliation :: 'member',
|
||||
subscriptions :: [exmpp_pubsub:subscription()],
|
||||
%subscriptions :: [exmpp_pubsub:subscription_pending() |
|
||||
% exmpp_pubsub:subscription_subscribed() |
|
||||
% exmpp_pubsub:subscription_unconfigured()],
|
||||
itemids :: [] | exmpp_pubsub:itemIds()
|
||||
}
|
||||
).
|
||||
|
||||
%%
|
||||
-type(pubsub_state_none()
|
||||
:: #pubsub_state_dev{
|
||||
id :: mod_pubsub_dev:pubsub_stateId(),
|
||||
nodeidx :: exmpp_pubsub:nodeIdx(),
|
||||
affiliation :: 'none',
|
||||
access :: undefined | 'presence' | 'roster',
|
||||
subscriptions :: [],
|
||||
itemids :: []
|
||||
}
|
||||
%%
|
||||
| #pubsub_state_dev{
|
||||
id :: mod_pubsub_dev:pubsub_stateId(),
|
||||
nodeidx :: exmpp_pubsub:nodeIdx(),
|
||||
affiliation :: 'none',
|
||||
access :: undefined | 'presence' | 'roster',
|
||||
subscriptions :: [],
|
||||
itemids :: exmpp_pubsub:itemIds()
|
||||
}
|
||||
%%
|
||||
| #pubsub_state_dev{
|
||||
id :: mod_pubsub_dev:pubsub_stateId(),
|
||||
nodeidx :: exmpp_pubsub:nodeIdx(),
|
||||
affiliation :: 'none',
|
||||
access :: undefined | 'presence' | 'roster',
|
||||
subscriptions :: [],
|
||||
itemids :: exmpp_pubsub:itemIds()
|
||||
}
|
||||
).
|
||||
|
||||
%%
|
||||
-type(pubsub_state_outcast()
|
||||
:: #pubsub_state_dev{
|
||||
id :: mod_pubsub_dev:pubsub_stateId(),
|
||||
nodeidx :: exmpp_pubsub:nodeIdx(),
|
||||
affiliation :: 'outcast',
|
||||
access :: undefined | 'presence' | 'roster',
|
||||
subscriptions :: [exmpp_pubsub:subscription()],
|
||||
%subscriptions :: [exmpp_pubsub:subscription_pending() |
|
||||
% exmpp_pubsub:subscription_subscribed() |
|
||||
% exmpp_pubsub:subscription_unconfigured()],
|
||||
itemids :: [] | exmpp_pubsub:itemIds()
|
||||
}
|
||||
).
|
||||
|
||||
|
||||
%%
|
||||
-type(pubsub_state() :: mod_pubsub_dev:pubsub_state_owner()
|
||||
| mod_pubsub_dev:pubsub_state_publisher()
|
||||
| mod_pubsub_dev:pubsub_state_publish_only()
|
||||
| mod_pubsub_dev:pubsub_state_member()
|
||||
| mod_pubsub_dev:pubsub_state_none()
|
||||
| mod_pubsub_dev:pubsub_state_outcast()
|
||||
).
|
||||
|
||||
-type(pubsub_states() :: [Pubsub_State::mod_pubsub_dev:pubsub_state(),...]).
|
||||
|
||||
|
||||
%%
|
||||
-export_type([
|
||||
pubsub_node/0,
|
||||
pubsub_nodes/0
|
||||
]).
|
||||
|
||||
-type(pubsub_node()
|
||||
:: #pubsub_node_dev{
|
||||
id :: mod_pubsub_dev:pubsub_nodeId(),
|
||||
idx :: exmpp_pubsub:nodeIdx(),
|
||||
creation :: mod_pubsub_dev:node_creation(),
|
||||
level :: exmpp_pubsub:level(),
|
||||
owners :: mod_pubsub_dev:node_owners(),
|
||||
itemids :: [] | exmpp_pubsub:itemIds(),
|
||||
options :: pubsub_options:options_node()
|
||||
}
|
||||
).
|
||||
|
||||
-type(pubsub_nodes() :: [Pubsub_Node::mod_pubsub_dev:pubsub_node(),...]).
|
||||
|
||||
|
||||
%%
|
||||
-export_type([
|
||||
pubsub_item/0,
|
||||
pubsub_items/0
|
||||
]).
|
||||
|
||||
-type(pubsub_item()
|
||||
:: #pubsub_item_dev{
|
||||
id :: mod_pubsub_dev:pubsub_itemId(),
|
||||
nodeidx :: exmpp_pubsub:nodeIdx(),
|
||||
owners :: mod_pubsub_dev:item_owners(),
|
||||
creation :: mod_pubsub_dev:item_creation(),
|
||||
modification :: mod_pubsub_dev:item_modification(),
|
||||
payload :: exmpp_pubsub:payload(),
|
||||
options :: [] | pubsub_options:options_item()
|
||||
}
|
||||
).
|
||||
|
||||
-type(pubsub_items() :: [Pubsub_Item::mod_pubsub_dev:pubsub_item(),...]).
|
||||
|
||||
%%
|
||||
-export_type([
|
||||
pubsub_last_item/0
|
||||
]).
|
||||
|
||||
-type(pubsub_last_item()
|
||||
:: #pubsub_last_item_dev{
|
||||
nodeidx :: exmpp_pubsub:nodeIdx(),
|
||||
id :: exmpp_pubsub:itemId(),
|
||||
owners :: mod_pubsub_dev:item_owners(),
|
||||
creation :: mod_pubsub_dev:item_creation(),
|
||||
payload :: exmpp_pubsub:payload(),
|
||||
options :: [] | pubsub_options:options_item()
|
||||
}
|
||||
).
|
||||
|
||||
%%
|
||||
-export_type([
|
||||
pubsub_subscription_pending/0
|
||||
]).
|
||||
|
||||
-type(pubsub_subscription_pending()
|
||||
:: #pubsub_subscription_pending{
|
||||
id :: {Entity::xmpp_jid:usr_bare(), NodeIdx::exmpp_pubsub:nodeIdx()},
|
||||
nodeidx :: exmpp_pubsub:nodeIdx(),
|
||||
subids :: [SubId::exmpp_pubsub:subId(),...]
|
||||
}
|
||||
).
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
-define(PROCNAME, ejabberd_mod_pubsub_dev).
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
-record(state,
|
||||
{
|
||||
host :: xmpp_jid:raw_jid_component_bare(),
|
||||
pubsub_host :: xmpp_jid:raw_jid_component_bare(),
|
||||
pubsub :: #capabilities{},
|
||||
pubsub_on_jid :: #capabilities{}
|
||||
}).
|
||||
|
||||
-type(state()
|
||||
:: #state{
|
||||
host :: xmpp_jid:raw_jid_component_bare(),
|
||||
pubsub_host :: xmpp_jid:raw_jid_component_bare(),
|
||||
pubsub :: #capabilities{},
|
||||
pubsub_on_jid :: #capabilities{}
|
||||
}
|
||||
).
|
||||
|
||||
|
||||
%%====================================================================
|
||||
%% API
|
||||
%%====================================================================
|
||||
%%--------------------------------------------------------------------
|
||||
%% Function: start_link() -> {ok,Pid} | ignore | {error,Error}
|
||||
%% Description: Starts the server
|
||||
%%--------------------------------------------------------------------
|
||||
|
||||
%% @spec start_link(Host, Options) -> {'ok', pid()} | 'ignore' | {'error', atom()}
|
||||
%% Host = string()
|
||||
%% Options = {Option::atom(), Value::term()}
|
||||
-spec(start_link/2 ::
|
||||
(
|
||||
Host :: string(),
|
||||
Options :: [Option::{Key::atom(), Value::term()}])
|
||||
-> {'ok', pid()} | 'ignore' | {'error', _}
|
||||
).
|
||||
|
||||
start_link(Host, Options) ->
|
||||
Proc = gen_mod:get_module_proc(Host, ?PROCNAME),
|
||||
gen_server:start_link({local, Proc}, ?MODULE, [Host, Options], []).
|
||||
|
||||
%% @spec start(Host, Options) -> {'error',atom()} | {'ok','undefined' | pid()} | {'ok','undefined' | pid(),any()}
|
||||
%% Host = string()
|
||||
%% Options = {Option::atom(), Value::term()}
|
||||
-spec(start/2 ::
|
||||
(
|
||||
Host :: string(),
|
||||
Options :: [Option::{Key::atom(), Value::term()}])
|
||||
-> {'error',_} | {'ok','undefined' | pid()} | {'ok','undefined' | pid(),_}
|
||||
).
|
||||
|
||||
start(Host, Options) ->
|
||||
Proc = gen_mod:get_module_proc(Host, ?PROCNAME),
|
||||
ChildSpec = {Proc,
|
||||
{?MODULE, start_link, [Host, Options]},
|
||||
transient, 1000, worker, [?MODULE]},
|
||||
supervisor:start_child(ejabberd_sup, ChildSpec).
|
||||
|
||||
%% @spec stop(Host) -> 'ok' | {'error','not_found' | 'running' | 'simple_one_for_one'}
|
||||
%% Host = string()
|
||||
-spec(stop/1 ::
|
||||
(
|
||||
Host :: string())
|
||||
-> 'ok' | {'error','not_found' | 'running' | 'simple_one_for_one'}
|
||||
).
|
||||
|
||||
stop(Host) ->
|
||||
Proc = gen_mod:get_module_proc(Host, ?PROCNAME),
|
||||
gen_server:call(Proc, stop),
|
||||
supervisor:delete_child(ejabberd_sup, Proc).
|
||||
|
||||
|
||||
|
||||
|
||||
%%====================================================================
|
||||
%% gen_server callbacks
|
||||
%%====================================================================
|
||||
|
||||
%%--------------------------------------------------------------------
|
||||
%% Function: init(Args) -> {ok, State} |
|
||||
%% {ok, State, Timeout} |
|
||||
%% ignore |
|
||||
%% {stop, Reason}
|
||||
%% Description: Initiates the server
|
||||
%%--------------------------------------------------------------------
|
||||
-spec(init/1 ::
|
||||
(
|
||||
Args :: [binary() | [{Option::atom(), Value::term()}]])
|
||||
-> {'ok', State::state()}
|
||||
).
|
||||
|
||||
init([Host, Options] = _Args) ->
|
||||
?DEBUG("pubsub init ~p ~p",[Host, Options]),
|
||||
Pubsub_Host = gen_mod:expand_host_name(Host, Options, <<"pubsub">>),
|
||||
IQDisc = gen_mod:get_opt('iqdisc', Options, 'one_queue'),
|
||||
|
||||
% mod_disco:register_feature(Server_HostB, ?NS_PUBSUB_s),
|
||||
%%
|
||||
%% Pubsub Hooks
|
||||
%% - Service disco hooks
|
||||
%% * disco_local_identity
|
||||
%% * disco_local_features
|
||||
%% * disco_local_items
|
||||
%% * disco_local_forms
|
||||
%% - Connectivity hooks
|
||||
%% * presence_probe_hook
|
||||
%% * sm_remove_connection_hook
|
||||
%% - Roster hooks
|
||||
%% * roster_in_subscription
|
||||
%% * roster_out_subscription
|
||||
%% - User managment hooks
|
||||
%% * remove_user
|
||||
%% * anonymous_purge_hook
|
||||
%%
|
||||
%% Pubsub On Jid hooks
|
||||
%% - Service disco hooks
|
||||
%% * disco_sm_identity
|
||||
%% * disco_sm_features
|
||||
%% * disco_sm_items
|
||||
%% * disco_sm_forms
|
||||
%% - Connectitivy
|
||||
%% * caps_update
|
||||
|
||||
|
||||
Pubsub_Features = node_flat_dev:pubsub_features(),
|
||||
% mod_disco:register_feature(Server_HostB, ?NS_PUBSUB_s),
|
||||
pubsub_db:init('mnesia', 'dev'),
|
||||
%% Register hooks according to available Pubsub Features
|
||||
register_hooks(Host, Pubsub_Features, pubsub_hooks),
|
||||
%%
|
||||
ejabberd_router:register_route(Pubsub_Host),
|
||||
{ok,
|
||||
#state{
|
||||
host = Host,
|
||||
pubsub_host = Pubsub_Host,
|
||||
pubsub = node_flat_dev:capabilities()
|
||||
}
|
||||
}.
|
||||
|
||||
%%--------------------------------------------------------------------
|
||||
%% Function:
|
||||
%% handle_call(Request, From, State) -> {reply, Reply, State} |
|
||||
%% {reply, Reply, State, Timeout} |
|
||||
%% {noreply, State} |
|
||||
%% {noreply, State, Timeout} |
|
||||
%% {stop, Reason, Reply, State} |
|
||||
%% {stop, Reason, State}
|
||||
%% Description: Handling call messages
|
||||
%%--------------------------------------------------------------------
|
||||
%% @private
|
||||
|
||||
handle_call(stop, _From, State) ->
|
||||
{stop, normal, ok, State}.
|
||||
|
||||
%%--------------------------------------------------------------------
|
||||
%% Function: handle_cast(Msg, State) -> {noreply, State} |
|
||||
%% {noreply, State, Timeout} |
|
||||
%% {stop, Reason, State}
|
||||
%% Description: Handling cast messages
|
||||
%%--------------------------------------------------------------------
|
||||
%% @private
|
||||
handle_cast(_Msg, State) ->
|
||||
{noreply, State}.
|
||||
|
||||
%%--------------------------------------------------------------------
|
||||
%% Function: handle_info(Info, State) -> {noreply, State} |
|
||||
%% {noreply, State, Timeout} |
|
||||
%% {stop, Reason, State}
|
||||
%% Description: Handling all non call/cast messages
|
||||
%%--------------------------------------------------------------------
|
||||
%% @private
|
||||
|
||||
handle_info({route, From, #jid{resource = undefined} = To, Stanza},
|
||||
#state{host = Host, pubsub = Capabilities} = State) ->
|
||||
do_route(Host, To, From, Stanza, Capabilities),
|
||||
{noreply, State};
|
||||
%%
|
||||
handle_info(_Info, State) ->
|
||||
{noreply, State}.
|
||||
|
||||
%%--------------------------------------------------------------------
|
||||
%% Function: terminate(Reason, State) -> void()
|
||||
%% Description: This function is called by a gen_server when it is about to
|
||||
%% terminate. It should be the opposite of Module:init/1 and do any necessary
|
||||
%% cleaning up. When it returns, the gen_server terminates with Reason.
|
||||
%% The return value is ignored.
|
||||
%%--------------------------------------------------------------------
|
||||
%% @private
|
||||
%% @todo : -spec
|
||||
-spec(terminate/2 ::
|
||||
(
|
||||
Reason :: _,
|
||||
State :: state())
|
||||
-> 'ok'
|
||||
).
|
||||
|
||||
terminate(_Reason, #state{host = Host, pubsub_host = Pubsub_Host}) ->
|
||||
ejabberd_router:unregister_route(Pubsub_Host),
|
||||
ok.
|
||||
|
||||
%%--------------------------------------------------------------------
|
||||
%% Func: code_change(OldVsn, State, Extra) -> {ok, NewState}
|
||||
%% Description: Convert process state when code is changed
|
||||
%%--------------------------------------------------------------------
|
||||
%% @private
|
||||
code_change(_OldVsn, State, _Extra) ->
|
||||
{ok, State}.
|
||||
|
||||
|
||||
%%
|
||||
-define(Is_Stanza_IQ(Stanza),
|
||||
(
|
||||
Stanza#xmlel.name == <<"iq">>
|
||||
)).
|
||||
|
||||
-define(Is_Stanza_Message(Stanza),
|
||||
(
|
||||
Stanza#xmlel.name == <<"message">>
|
||||
)).
|
||||
|
||||
-define(Is_Stanza_Presence(Stanza),
|
||||
(
|
||||
Stanza#xmlel.name == <<"presence">>
|
||||
)).
|
||||
|
||||
-define(Is_IQ_Ignore(IQ),
|
||||
(
|
||||
IQ#iq.type == 'result'
|
||||
orelse
|
||||
IQ#iq.type == 'error'
|
||||
)).
|
||||
|
||||
-define(Is_IQ_Pubsub(IQ),
|
||||
(
|
||||
(IQ#iq.type == 'set'
|
||||
orelse
|
||||
IQ#iq.type == 'get')
|
||||
andalso
|
||||
(IQ#iq.xmlns == ?NS_PUBSUB
|
||||
orelse
|
||||
IQ#iq.xmlns == ?NS_PUBSUB_OWNER)
|
||||
andalso
|
||||
IQ#iq.sub_el#xmlel.name == <<"pubsub">>
|
||||
)).
|
||||
|
||||
-define(Is_IQ_Get_Disco_Info(IQ),
|
||||
(
|
||||
IQ#iq.type == 'get'
|
||||
andalso
|
||||
IQ#iq.xmlns == ?NS_DISCO_INFO
|
||||
andalso
|
||||
IQ#iq.sub_el#xmlel.name == <<"query">>
|
||||
% andalso
|
||||
% IQ#iq.payload#xmlel.children == []
|
||||
)).
|
||||
|
||||
-define(Is_IQ_Get_Disco_Items(IQ),
|
||||
(
|
||||
IQ#iq.type == 'get'
|
||||
andalso
|
||||
IQ#iq.xmlns == ?NS_DISCO_ITEMS
|
||||
andalso
|
||||
IQ#iq.sub_el#xmlel.name == <<"query">>
|
||||
% andalso
|
||||
% IQ#iq.payload#xmlel.children == []
|
||||
)).
|
||||
|
||||
%%
|
||||
do_route(Host,
|
||||
#jid{lserver = Pubsub_Host} = Pubsub_Component,
|
||||
#jid{luser = U, lserver = S, lresource = R} = Entity, Stanza_IQ,
|
||||
#capabilities{privacy = Privacy, plugin = Plugin} = Capabilities)
|
||||
when ?Is_Stanza_IQ(Stanza_IQ) ->
|
||||
case IQ = jlib:iq_query_or_response_info(Stanza_IQ) of
|
||||
IQ when ?Is_IQ_Ignore(IQ) ->
|
||||
ok;
|
||||
IQ when ?Is_IQ_Get_Disco_Info(IQ) ->
|
||||
case
|
||||
pubsub_disco:iq_disco_info('dev', Host, Pubsub_Host,
|
||||
Privacy, {U,S,undefined},
|
||||
case S of
|
||||
Host -> 'local';
|
||||
_ -> 'remote'
|
||||
end,
|
||||
Plugin,
|
||||
case xml:get_tag_attr_s(<<"node">>, IQ#iq.sub_el) of
|
||||
<<>> -> undefined;
|
||||
NodeId -> NodeId
|
||||
end,
|
||||
xml:remove_cdata(IQ#iq.sub_el#xmlel.children))
|
||||
of
|
||||
{result, Xmlel_Query} ->
|
||||
ejabberd_router:route(Pubsub_Component, Entity,
|
||||
jlib:iq_to_xml(IQ#iq{
|
||||
type = result,
|
||||
sub_el = [Xmlel_Query]
|
||||
}));
|
||||
{error, Error} ->
|
||||
ejabberd_router:route(Pubsub_Component, Entity,
|
||||
jlib:make_error_reply(Stanza_IQ, Error))
|
||||
end;
|
||||
IQ when ?Is_IQ_Get_Disco_Items(IQ) ->
|
||||
case
|
||||
pubsub_disco:iq_disco_items('dev', Host, Pubsub_Host,
|
||||
Privacy, {U,S,undefined},
|
||||
case S of
|
||||
Host -> 'local';
|
||||
_ -> 'remote'
|
||||
end,
|
||||
Plugin,
|
||||
case xml:get_tag_attr_s(<<"node">>, IQ#iq.sub_el) of
|
||||
<<>> -> undefined;
|
||||
NodeId -> NodeId
|
||||
end,
|
||||
xml:remove_cdata(IQ#iq.sub_el#xmlel.children))
|
||||
of
|
||||
{result, Xmlel_Query} ->
|
||||
ejabberd_router:route(Pubsub_Component, Entity,
|
||||
jlib:iq_to_xml(IQ#iq{
|
||||
type = result,
|
||||
sub_el = [Xmlel_Query]
|
||||
}));
|
||||
{error, Error} ->
|
||||
ejabberd_router:route(Pubsub_Component, Entity,
|
||||
jlib:make_error_reply(Stanza_IQ, Error))
|
||||
end;
|
||||
IQ when ?Is_IQ_Pubsub(IQ) ->
|
||||
case
|
||||
iq_pubsub(Host, Pubsub_Host, {U,S,R}, IQ#iq.type,
|
||||
_Rsm = lists:member(?NS_RSM, Plugin:features()),
|
||||
xml:remove_cdata(IQ#iq.sub_el#xmlel.children),
|
||||
IQ#iq.lang, Capabilities)
|
||||
of
|
||||
{result, []} ->
|
||||
ejabberd_router:route(Pubsub_Component, Entity,
|
||||
jlib:iq_to_xml(IQ#iq{
|
||||
type = result,
|
||||
sub_el = []
|
||||
}));
|
||||
{result, Xmlels} ->
|
||||
ejabberd_router:route(Pubsub_Component, Entity,
|
||||
jlib:iq_to_xml(IQ#iq{
|
||||
type = result,
|
||||
sub_el = Xmlels
|
||||
}));
|
||||
{error, Error} ->
|
||||
ejabberd_router:route(Pubsub_Component, Entity,
|
||||
jlib:make_error_reply(Stanza_IQ, Error))
|
||||
end
|
||||
end;
|
||||
do_route(Host,
|
||||
#jid{lserver = Pubsub_Host} = Pubsub_Component,
|
||||
#jid{luser = U, lserver = S, lresource = R} = Entity, Stanza_Message,
|
||||
Capabilities)
|
||||
when ?Is_Stanza_Message(Stanza_Message) ->
|
||||
ok;
|
||||
do_route(Host,
|
||||
#jid{lserver = Pubsub_Host} = Pubsub_Component,
|
||||
#jid{luser = U, lserver = S, lresource = R} = Entity, Stanza_Presence,
|
||||
Capabilities)
|
||||
when ?Is_Stanza_Presence(Stanza_Presence) ->
|
||||
ok.
|
||||
|
||||
|
||||
iq_pubsub(Host, Pubsub_Host, Entity, IQ_Type, Rsm, Xmlels, _Lang,
|
||||
#capabilities{api = #api{parser = Parser, core = API_Core}} = Capabilities) ->
|
||||
case Parser:parse(IQ_Type, Xmlels, Rsm, API_Core) of
|
||||
{result, Module, Function, Parameters} ->
|
||||
Module:Function(Host, Pubsub_Host, Entity, Parameters, Capabilities);
|
||||
Error ->
|
||||
Error
|
||||
end.
|
||||
|
||||
|
||||
|
||||
register_hooks(Host, Pubsub_Features, Module) ->
|
||||
register_hooks('roster', Host, Pubsub_Features, Module),
|
||||
register_hooks('presence', Host, Pubsub_Features, Module).
|
||||
|
||||
%ejabberd_hooks:add(roster_in_subscription, Host, pubsub_hooks, roster_in_subscription, 50),
|
||||
%ejabberd_hooks:add(roster_out_subscription, Host, ?MODULE, roster_out_subscription, 50),
|
||||
%ejabberd_hooks:add(roster_get, Host, ?MODULE, roster_get, 50),
|
||||
%ejabberd_hooks:add(roster_get_jid_info, Host, ?MODULE, roster_get_jid_info, 50),
|
||||
%ejabberd_hooks:add(roster_get_subscription_lists, Host, ?MODULE, roster_get_subscription_lists, 50),
|
||||
%%ejabberd_hooks:add(roster_process_item, Host, pubsub_hooks, roster_process_item, 50).
|
||||
|
||||
|
||||
register_hooks('roster', Host, Pubsub_Features, Module) ->
|
||||
case lists:member("access-roster", Pubsub_Features) of
|
||||
true ->
|
||||
ejabberd_hooks:add(roster_process_item, Host, Module,
|
||||
roster_process_item, 50),
|
||||
ok;
|
||||
false ->
|
||||
ok
|
||||
end;
|
||||
%%
|
||||
register_hooks('presence', Host, Pubsub_Features, Module) ->
|
||||
case
|
||||
lists:member(<<"access-presence">>, Pubsub_Features)
|
||||
orelse
|
||||
lists:member(<<"last-published">>, Pubsub_Features)
|
||||
orelse
|
||||
lists:member(<<"leased-subscription">>, Pubsub_Features)
|
||||
orelse
|
||||
lists:member(<<"presence-notifications">>, Pubsub_Features)
|
||||
of
|
||||
true ->
|
||||
ejabberd_hooks:add(presence_probe_hook, Host, Module,
|
||||
presence_online, 80),
|
||||
ejabberd_hooks:add(sm_remove_connection_hook, Host, Module,
|
||||
presence_offline, 80),
|
||||
ok;
|
||||
false ->
|
||||
ok
|
||||
end.
|
||||
|
||||
|
||||
roster_get(Acc, {User, Server}) ->
|
||||
?INFO_MSG("ROSTER_GET Acc ~p ~nUser ~p ~nServer ~p ~n",
|
||||
[Acc, User, Server]).
|
||||
|
||||
roster_get_jid_info(Acc, User, Server, JID) ->
|
||||
?INFO_MSG("ROSTER_GET_JID_INFO Acc ~p ~nUser ~p ~nServer ~p ~nJID ~p ~n",
|
||||
[Acc, User, Server, JID]).
|
||||
|
||||
roster_get_subscription_lists(Acc, User, Server) ->
|
||||
?INFO_MSG("ROSTER_GET_SUBSCRIPTION_LISTS Acc ~p ~nUser ~p ~nServer ~p ~n",
|
||||
[Acc, User, Server]).
|
||||
|
||||
roster_in_subscription(User, Server, JID, SubscriptionType, Reason, A) ->
|
||||
?INFO_MSG("ROSTER_IN_SUBSCRITION User ~p ~n Server ~p ~n JID ~p ~n SubscriptionType ~p ~n, Reason ~p ~nA ~p ~n",
|
||||
[User, Server, JID, SubscriptionType, Reason, A]).
|
||||
|
||||
roster_out_subscription(User, Server, JID, SubscriptionType) ->
|
||||
?INFO_MSG("ROSTER_OUT_SUBSCRITION User ~p ~n Server ~p ~n JID ~p ~n SubscriptionType ~p ~n",
|
||||
[User, Server, JID, SubscriptionType]).
|
||||
|
||||
roster_process_item(RosterItem, Server) ->
|
||||
?INFO_MSG("ROSTER_PROCESS_ITEM RosterItem ~p ~nServer ~p ~n",
|
||||
[RosterItem, Server]),
|
||||
RosterItem.
|
||||
|
||||
@@ -0,0 +1,310 @@
|
||||
%%% ====================================================================
|
||||
%%% ``The contents of this file are subject to the Erlang Public License,
|
||||
%%% Version 1.1, (the "License"); you may not use this file except in
|
||||
%%% compliance with the License. You should have received a copy of the
|
||||
%%% Erlang Public License along with this software. If not, it can be
|
||||
%%% retrieved via the world wide web at http://www.erlang.org/.
|
||||
%%%
|
||||
%%% Software distributed under the License is distributed on an "AS IS"
|
||||
%%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
|
||||
%%% the License for the specific language governing rights and limitations
|
||||
%%% under the License.
|
||||
%%%
|
||||
%%% The Initial Developer of the Original Code is ProcessOne.
|
||||
%%% Portions created by ProcessOne are Copyright 2006-2013, ProcessOne
|
||||
%%% All Rights Reserved.''
|
||||
%%% This software is copyright 2006-2013, ProcessOne.
|
||||
%%%
|
||||
%%% @copyright 2006-2013 ProcessOne
|
||||
%%% @author Karim Gemayel <karim.gemayel@process-one.net>
|
||||
%%% [http://www.process-one.net/]
|
||||
%%% @version {@vsn}, {@date} {@time}
|
||||
%%% @end
|
||||
%%% ====================================================================
|
||||
|
||||
%%% @headerfile "pubsub_dev.hrl"
|
||||
|
||||
-module(node_flat_dev).
|
||||
-author('karim.gemayel@process-one.net').
|
||||
|
||||
-include("pubsub_dev.hrl").
|
||||
-include("pubsub_api.hrl").
|
||||
|
||||
-compile(export_all).
|
||||
|
||||
|
||||
|
||||
%%
|
||||
-spec(capabilities/0 :: () -> #capabilities{}).
|
||||
|
||||
capabilities() ->
|
||||
#capabilities{plugin = ?MODULE}.
|
||||
|
||||
|
||||
%%
|
||||
-spec(pubsub_features/0 :: () -> Pubsub_Features::exmpp_pubsub:pubsub_features()).
|
||||
|
||||
pubsub_features() ->
|
||||
[<<"access-authorize">>,
|
||||
<<"access-open">>,
|
||||
<<"access-presence">>,
|
||||
<<"access-roster">>,
|
||||
<<"access-whitelist">>,
|
||||
<<"auto-create">>,
|
||||
<<"auto-subscribe">>,
|
||||
%<<"collections">>,
|
||||
<<"config-node">>,
|
||||
<<"create-and-configure">>,
|
||||
<<"create-nodes">>,
|
||||
<<"delete-items">>,
|
||||
<<"delete-nodes">>,
|
||||
%<<"filtered-notifications">>,
|
||||
<<"get-pending">>,
|
||||
<<"instant-nodes">>,
|
||||
<<"item-ids">>,
|
||||
<<"last-published">>,
|
||||
<<"leased-subscription">>,
|
||||
<<"manage-subscriptions">>,
|
||||
<<"member-affiliation">>,
|
||||
<<"meta-data">>,
|
||||
<<"modify-affiliations">>,
|
||||
%<<"multi-collections">>,
|
||||
<<"multi-subscribe">>,
|
||||
<<"outcast-affiliation">>,
|
||||
<<"persistent-items">>,
|
||||
<<"presence-notifications">>,
|
||||
%"presence-subscribe">>,
|
||||
<<"publish">>,
|
||||
<<"publish-only-affiliation">>,
|
||||
<<"publish-options">>,
|
||||
<<"publisher-affiliation">>,
|
||||
<<"purge-nodes">>,
|
||||
<<"retract-items">>,
|
||||
<<"retrieve-affiliations">>,
|
||||
<<"retrieve-default">>,
|
||||
<<"retrieve-default-sub">>,
|
||||
<<"retrieve-items">>,
|
||||
<<"retrieve-subscriptions">>,
|
||||
<<"subscribe">>,
|
||||
<<"subscription-notifications">>,
|
||||
<<"subscription-options">>].
|
||||
|
||||
%%
|
||||
-spec(pubsub_features/1 ::
|
||||
(
|
||||
Entity_Type :: 'local' | 'remote')
|
||||
-> Pubsub_Features::exmpp_pubsub:pubsub_features()
|
||||
).
|
||||
|
||||
pubsub_features('local') ->
|
||||
[<<"access-authorize">>,
|
||||
<<"access-open">>,
|
||||
<<"access-presence">>,
|
||||
<<"access-roster">>,
|
||||
<<"access-whitelist">>,
|
||||
<<"auto-create">>,
|
||||
<<"auto-subscribe">>,
|
||||
%<<"collections">>,
|
||||
<<"config-node">>,
|
||||
<<"create-and-configure">>,
|
||||
<<"create-nodes">>,
|
||||
<<"delete-items">>,
|
||||
<<"delete-nodes">>,
|
||||
%<<"filtered-notifications">>,
|
||||
<<"get-pending">>,
|
||||
<<"instant-nodes">>,
|
||||
<<"item-ids">>,
|
||||
<<"last-published">>,
|
||||
<<"leased-subscription">>,
|
||||
<<"manage-subscriptions">>,
|
||||
<<"member-affiliation">>,
|
||||
<<"meta-data">>,
|
||||
<<"modify-affiliations">>,
|
||||
%<<"multi-collections">>,
|
||||
<<"multi-subscribe">>,
|
||||
<<"outcast-affiliation">>,
|
||||
<<"persistent-items">>,
|
||||
<<"presence-notifications">>,
|
||||
%<<"presence-subscribe">>,
|
||||
<<"publish">>,
|
||||
<<"publish-only-affiliation">>,
|
||||
<<"publish-options">>,
|
||||
<<"publisher-affiliation">>,
|
||||
<<"purge-nodes">>,
|
||||
<<"retract-items">>,
|
||||
<<"retrieve-affiliations">>,
|
||||
<<"retrieve-default">>,
|
||||
<<"retrieve-default-sub">>,
|
||||
<<"retrieve-items">>,
|
||||
<<"retrieve-subscriptions">>,
|
||||
<<"subscribe">>,
|
||||
<<"subscription-notifications">>,
|
||||
<<"subscription-options">>];
|
||||
%%
|
||||
pubsub_features('remote') ->
|
||||
[<<"access-authorize">>,
|
||||
<<"access-open">>,
|
||||
<<"access-presence">>,
|
||||
<<"access-roster">>,
|
||||
<<"access-whitelist">>,
|
||||
<<"auto-create">>,
|
||||
<<"auto-subscribe">>,
|
||||
%<<"collections">>,
|
||||
<<"config-node">>,
|
||||
<<"create-and-configure">>,
|
||||
<<"create-nodes">>,
|
||||
<<"delete-items">>,
|
||||
<<"delete-nodes">>,
|
||||
%<<"filtered-notifications">>,
|
||||
<<"get-pending">>,
|
||||
<<"instant-nodes">>,
|
||||
<<"item-ids">>,
|
||||
<<"last-published">>,
|
||||
%<<"leased-subscription">>,
|
||||
<<"manage-subscriptions">>,
|
||||
<<"member-affiliation">>,
|
||||
<<"meta-data">>,
|
||||
<<"modify-affiliations">>,
|
||||
%<<"multi-collections">>,
|
||||
<<"multi-subscribe">>,
|
||||
<<"outcast-affiliation">>,
|
||||
<<"persistent-items">>,
|
||||
<<"publish">>,
|
||||
<<"publish-only-affiliation">>,
|
||||
<<"publish-options">>,
|
||||
<<"publisher-affiliation">>,
|
||||
<<"purge-nodes">>,
|
||||
<<"retract-items">>,
|
||||
<<"retrieve-affiliations">>,
|
||||
<<"retrieve-default">>,
|
||||
<<"retrieve-default-sub">>,
|
||||
<<"retrieve-items">>,
|
||||
<<"retrieve-subscriptions">>,
|
||||
<<"subscribe">>,
|
||||
<<"subscription-notifications">>,
|
||||
<<"subscription-options">>].
|
||||
|
||||
%%
|
||||
%%
|
||||
-spec(node_options/1 ::
|
||||
(
|
||||
Node_Type :: 'leaf' | 'collection')
|
||||
-> Node_Options :: pubsub_options:options_node_leaf()
|
||||
| pubsub_options:options_node_collection()
|
||||
).
|
||||
|
||||
node_options('leaf') ->
|
||||
[{'access_model', open},
|
||||
{'contact', []},
|
||||
%{'collection', []},
|
||||
{'deliver_notifications', true},
|
||||
{'deliver_payloads', true},
|
||||
{'description', undefined},
|
||||
{'item_expire', undefined},
|
||||
{'itemreply', publisher},
|
||||
{'language', <<"en">>},
|
||||
{'max_items', 2},
|
||||
{'max_payload_size', undefined},
|
||||
{'node_type', leaf},
|
||||
{'notification_type', normal},
|
||||
{'notify_config', true},
|
||||
{'notify_delete', true},
|
||||
{'notify_retract', true},
|
||||
{'notify_sub', true},
|
||||
{'persist_items', true},
|
||||
{'presence_based_delivery', true},
|
||||
{'publish_model', open},
|
||||
{'purge_offline', false},
|
||||
{'roster_groups_allowed', []},
|
||||
{'send_last_published_item', on_sub_and_presence},
|
||||
{'subscribe', true},
|
||||
{'tempsub', false},
|
||||
{'title', undefined},
|
||||
{'type', undefined}];
|
||||
%%
|
||||
node_options('collection') ->
|
||||
[].
|
||||
|
||||
item_options() ->
|
||||
[{'access_model', open},
|
||||
{'deliver_notifications', true},
|
||||
{'deliver_payloads', true},
|
||||
{'item_expire', undefined},
|
||||
{'itemreply', publisher},
|
||||
% {'max_payload_size', undefined},
|
||||
{'notification_type', normal},
|
||||
{'notify_config', true},
|
||||
{'notify_retract', true},
|
||||
{'persist_items', true},
|
||||
{'presence_based_delivery', true},
|
||||
% {'publish_model', open},
|
||||
{'purge_offline', false},
|
||||
{'roster_groups_allowed', []},
|
||||
{'send_last_published_item', on_sub_and_presence},
|
||||
{'type', undefined}].
|
||||
|
||||
%%
|
||||
-spec(subscription_options/2 ::
|
||||
(
|
||||
Entity_Type :: 'local' | 'remote',
|
||||
Node_Type :: 'leaf' | 'collection')
|
||||
-> Subscription_Options :: [] | pubsub_options:options_subscription()
|
||||
).
|
||||
|
||||
subscription_options('local', 'leaf') ->
|
||||
[];
|
||||
subscription_options('remote', 'leaf') ->
|
||||
[];
|
||||
subscription_options('local', 'collection') ->
|
||||
[];
|
||||
subscription_options('remote', 'collection') ->
|
||||
[].
|
||||
|
||||
%%
|
||||
-spec(default_subscription_options/2 ::
|
||||
(
|
||||
Entity_Type :: 'local' | 'remote',
|
||||
Node_Type :: 'leaf')%| 'collection')
|
||||
-> Subscription_Options :: pubsub_options:options_subscription_leaf()
|
||||
).
|
||||
|
||||
default_subscription_options('local', 'leaf') ->
|
||||
[{'deliver', true},
|
||||
{'expire', undefined},
|
||||
%{'include_body', undefined},
|
||||
{'show-values', ['away', 'chat', 'dnd', 'online', 'xa']}];
|
||||
%%
|
||||
default_subscription_options('remote', 'leaf') ->
|
||||
[{'deliver', true}
|
||||
%{'include_body', undefined}
|
||||
].
|
||||
%%
|
||||
%%default_subscription_options('local', 'collection') ->
|
||||
%% [{'deliver', true},
|
||||
%% %{'expire', undefined},
|
||||
%% %{'include_body', undefined},
|
||||
%% {'show-values', ['away', 'chat', 'dnd', 'online', 'xa']},
|
||||
%% {'subscription_type', 'all'},
|
||||
%% {'subscription_depth', 1}];
|
||||
%%
|
||||
%%default_subscription_options('remote', 'collection') ->
|
||||
%% [{'deliver', true},
|
||||
%% %{'include_body', undefined},
|
||||
%% {'show-values', ['away', 'chat', 'dnd', 'online', 'xa']},
|
||||
%% {'subscription_type', 'all'},
|
||||
%% {'subscription_depth', 1}].
|
||||
|
||||
%%
|
||||
-spec(features/0 :: () -> Features::exmpp_pubsub:features()).
|
||||
|
||||
features() ->
|
||||
[%?NS_ADDRESS,
|
||||
?NS_DISCO_INFO,
|
||||
?NS_DISCO_ITEMS,
|
||||
%?NS_RSM,
|
||||
?NS_VCARD].
|
||||
|
||||
%%
|
||||
identity() ->
|
||||
[{<<"pubsub">>, <<"Publish-Subscribe">>, <<"service">>},
|
||||
{<<"pubsub">>, <<"ejabberd/mod_pubsub/flat">>, <<"service">>}].
|
||||
@@ -0,0 +1,101 @@
|
||||
%% API function definition
|
||||
|
||||
-record(api_core,
|
||||
{
|
||||
create_node = 'pubsub_core' :: module(),
|
||||
delete_node = 'pubsub_core' :: module(),
|
||||
purge_node = 'pubsub_core' :: module(),
|
||||
get_configure_node = 'pubsub_core' :: module(),
|
||||
get_configure_node_default = 'pubsub_core' :: module(),
|
||||
%%
|
||||
publish_item = 'pubsub_core' :: module(),
|
||||
retract_item = 'pubsub_core' :: module(),
|
||||
%%
|
||||
subscribe_node = 'pubsub_core' :: module(),
|
||||
unsubscribe_node = 'pubsub_core' :: module(),
|
||||
set_configure_subscription = 'pubsub_core' :: module(),
|
||||
get_configure_subscription = 'pubsub_core' :: module(),
|
||||
get_configure_subscription_default = 'pubsub_core' :: module(),
|
||||
get_items = 'pubsub_core' :: module(),
|
||||
%%
|
||||
get_entity_affiliations = 'pubsub_core' :: module(),
|
||||
get_entity_subscriptions = 'pubsub_core' :: module(),
|
||||
%%
|
||||
get_node_affiliations = 'pubsub_core' :: module(),
|
||||
get_node_subscriptions = 'pubsub_core' :: module()
|
||||
}).
|
||||
|
||||
-record(api_db,
|
||||
{
|
||||
create_node = 'pubsub_db' :: module(),
|
||||
delete_node = 'pubsub_db' :: module(),
|
||||
purge_node = 'pubsub_db' :: module(),
|
||||
get_configure_node = 'pubsub_db' :: module(),
|
||||
%get_configure_node_default = 'pubsub_db' :: module(),
|
||||
%%
|
||||
publish_item = 'pubsub_db' :: module(),
|
||||
retract_item = 'pubsub_db' :: module(),
|
||||
%%
|
||||
subscribe_node = 'pubsub_db' :: module(),
|
||||
unsubscribe_node = 'pubsub_db' :: module(),
|
||||
set_configure_subscription = 'pubsub_db' :: module(),
|
||||
get_configure_subscription = 'pubsub_db' :: module(),
|
||||
get_configure_subscription_default = 'pubsub_db' :: module(),
|
||||
get_items = 'pubsub_db' :: module(),
|
||||
%%
|
||||
get_entity_affiliations = 'pubsub_db' :: module(),
|
||||
get_entity_subscriptions = 'pubsub_db' :: module(),
|
||||
%%
|
||||
get_node_affiliations = 'pubsub_db' :: module(),
|
||||
get_node_subscriptions = 'pubsub_db' :: module()
|
||||
}).
|
||||
|
||||
-record(api_broadcast,
|
||||
{
|
||||
broadcast_publish = 'pubsub_broadcast' :: module(),
|
||||
broadcast_publish_last = 'pubsub_broadcast' :: module(),
|
||||
notify_create = 'pubsub_broadcast' :: module(),
|
||||
notify_delete = 'pubsub_broadcast' :: module(),
|
||||
notify_publish = 'pubsub_broadcast' :: module(),
|
||||
notify_purge = 'pubsub_broadcast' :: module(),
|
||||
notify_retract = 'pubsub_broadcast' :: module(),
|
||||
notify_subscription = 'pubsub_broadcast' :: module(),
|
||||
notify_subscriptions = 'pubsub_broadcast' :: module()
|
||||
}).
|
||||
|
||||
-record(api,
|
||||
{
|
||||
core = #api_core{} :: #api_core{},
|
||||
db = #api_db{} :: #api_db{},
|
||||
broadcast = #api_broadcast{} :: #api_broadcast{},
|
||||
parser = 'pubsub_parser' :: module(),
|
||||
options = 'pubsub_options' :: module()
|
||||
}).
|
||||
|
||||
-record(capabilities,
|
||||
{
|
||||
plugin :: exmpp_pubsub:plugin(),
|
||||
privacy = false :: boolean(),
|
||||
api = #api{} :: #api{}
|
||||
}).
|
||||
|
||||
-record(api2,
|
||||
{
|
||||
func,
|
||||
core :: 'core',
|
||||
db :: 'db',
|
||||
bkd :: 'mnesia',
|
||||
rtr :: 'router'
|
||||
}).
|
||||
|
||||
-record(mod_pubsub,
|
||||
{
|
||||
server,
|
||||
component,
|
||||
plugin,
|
||||
entity,
|
||||
parameters,
|
||||
features,
|
||||
parser,
|
||||
options
|
||||
}).
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,147 @@
|
||||
|
||||
|
||||
%-include_lib("exmpp/include/exmpp.hrl").
|
||||
%-include_lib("exmpp/include/exmpp_jid.hrl").
|
||||
-include("logger.hrl").
|
||||
-include("ejabberd.hrl").
|
||||
-include("mod_roster.hrl").
|
||||
-include("jlib.hrl").
|
||||
%-include("pubsub_api.hrl").
|
||||
|
||||
-define(NS_JABBER_CLIENT, <<"jabber:client">>).
|
||||
|
||||
%%
|
||||
%% Pubsub Node
|
||||
-record(pubsub_node_dev,
|
||||
{
|
||||
id ,%:: {Pubsub_Host :: exmpp_pubsub:host(),
|
||||
% NodeId :: undefined | exmpp_pubsub:nodeId()},
|
||||
idx ,%:: exmpp_pubsub:nodeIdx(),
|
||||
creation ,%:: {DateTime::erlang:timestamp(), Entity::xmpp_jid:usr_entity()},
|
||||
level = 0 ,%:: exmpp_pubsub:level(),
|
||||
owners = [] ,%:: [Owner::xmpp_jid:usr_bare(),...],
|
||||
itemids = [] ,%:: [ItemId::exmpp_pubsub:itemId()],
|
||||
options = [] %:: pubsub_options:options_node()
|
||||
}).
|
||||
|
||||
%%
|
||||
%% Pubsub State
|
||||
-record(pubsub_state_dev,
|
||||
{
|
||||
id ,%:: {Entity :: xmpp_jid:usr_bare(),
|
||||
% NodeIdx :: exmpp_pubsub:nodeIdx()},
|
||||
nodeidx ,%:: exmpp_pubsub:nodeIdx(),
|
||||
affiliation = 'none' ,%:: exmpp_pubsub:affiliation(),
|
||||
access ,%:: pubsub_options:access_model(),
|
||||
subscriptions = [] ,%:: [] | exmpp_pubsub:subscriptions(),
|
||||
%groups = [] ,%:: [Roster_Group::binary()],
|
||||
itemids = [] %:: [ItemId::exmpp_pubsub:itemId()]
|
||||
}).
|
||||
|
||||
%%
|
||||
%% Pubsub Item
|
||||
-record(pubsub_item_dev,
|
||||
{
|
||||
id ,%:: {ItemId::exmpp_pubsub:itemId(), NodeIdx::exmpp_pubsub:nodeIdx()},
|
||||
nodeidx ,%:: exmpp_pubsub:nodeIdx(),
|
||||
owners = [] ,%:: [Owner::xmpp_jid:usr_bare(),...],
|
||||
creation ,%:: {DateTime::erlang:timestamp(), Entity::xmpp_jid:usr_entity()},
|
||||
modification ,%:: {DateTime::erlang:timestamp(), Entity::xmpp_jid:usr_entity()},
|
||||
payload ,%:: exmpp_pubsub:payload(),
|
||||
options = [] %:: [] | pubsub_options:options_item()
|
||||
}).
|
||||
|
||||
%%
|
||||
%% Pubsub Last Item
|
||||
-record(pubsub_last_item_dev,
|
||||
{
|
||||
nodeidx ,%:: exmpp_pubsub:nodeIdx(),
|
||||
id ,%:: exmpp_pubsub:itemId(),
|
||||
owners = [] ,%:: [Owner::xmpp_jid:usr_bare(),...],
|
||||
creation ,%:: {DateTime::erlang:timestamp(), Entity::xmpp_jid:usr_entity()},
|
||||
payload ,%:: exmpp_pubsub:payload(),
|
||||
options = [] %:: [] | pubsub_options:options_item()
|
||||
}).
|
||||
|
||||
%%
|
||||
%% Pubsub Index
|
||||
-record(pubsub_index_dev,
|
||||
{
|
||||
index :: exmpp_pubsub:index(),
|
||||
last :: exmpp_pubsub:nodeIdx(),
|
||||
free :: [exmpp_pubsub:nodeIdx()]
|
||||
}).
|
||||
|
||||
%%
|
||||
%% Pubsub_Subscription_Pending
|
||||
-record(pubsub_subscription_pending,
|
||||
{
|
||||
id ,%:: {Entity::xmpp_jid:usr_bare(), NodeIdx::exmpp_pubsub:nodeIdx()}
|
||||
nodeidx ,%:: exmpp_pubsub:nodeIdx()
|
||||
subids %:: [SubId::exmpp_pubsub:subId(),...]
|
||||
}).
|
||||
|
||||
|
||||
|
||||
%%
|
||||
%% Internal data structures
|
||||
%%
|
||||
-record(entity,
|
||||
{
|
||||
id :: xmpp_jid:usr_bare(),
|
||||
local :: boolean(),
|
||||
affiliation :: 'member' | 'owner' | 'publisher',
|
||||
subscriptions :: []%[exmpp_pubsub:subscription(),...]
|
||||
}).
|
||||
|
||||
%%
|
||||
-record(node,
|
||||
{
|
||||
id :: exmpp_pubsub:nodeId(),
|
||||
owners :: [Node_Owner::xmpp_jid:usr_bare(),...],
|
||||
access_model :: pubsub_options:access_model(),
|
||||
% itemreply :: 'owner' | 'publisher',
|
||||
% notification_type :: 'headline' | 'normal',
|
||||
% presence_based_delivery :: boolean(),
|
||||
rosters_groups_allowed = [] :: [] | pubsub_options:rosters_groups_allowed()
|
||||
}).
|
||||
|
||||
%%
|
||||
-record(item,
|
||||
{
|
||||
access_model ,%:: undefined | pubsub_options:access_model(),
|
||||
presence_based_delivery ,%:: undefined | boolean(),
|
||||
rosters_groups_allowed = [],%:: [] | pubsub_options:rosters_groups_allowed()
|
||||
stanza %::#xmlel{}
|
||||
}).
|
||||
|
||||
%%
|
||||
-record(cache,
|
||||
{
|
||||
%% Entity is online
|
||||
presence :: undefined | mod_pubsub_dev:presence_cache(),
|
||||
%% Entity has presence subscriptions with at least one node owner
|
||||
presence_subscriptions :: undefined | boolean(),
|
||||
%% Entity has presence subscriptions with at least one node owner
|
||||
%% and is contained in at least one roster group from the node owner
|
||||
rosters_groups :: undefined | boolean() %% TODO : use a list
|
||||
}).
|
||||
|
||||
%%
|
||||
-record(subids,
|
||||
{
|
||||
presence = undefined :: undefined | [] | mod_pubsub_dev:resources_subids(),
|
||||
no_presence = undefined :: undefined | [] | mod_pubsub_dev:resources_subids()
|
||||
}).
|
||||
|
||||
%%
|
||||
-record(event,
|
||||
{
|
||||
host :: xmpp_jid:raw_jid_component_bare(),
|
||||
component :: xmpp_jid:component_bare(),
|
||||
entity :: mod_pubsub_dev:entity(),
|
||||
node :: mod_pubsub_dev:n0de(),
|
||||
cache :: mod_pubsub_dev:cache(),
|
||||
subids :: mod_pubsub_dev:subids()
|
||||
}).
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,904 @@
|
||||
%%% ====================================================================
|
||||
%%% ``The contents of this file are subject to the Erlang Public License,
|
||||
%%% Version 1.1, (the "License"); you may not use this file except in
|
||||
%%% compliance with the License. You should have received a copy of the
|
||||
%%% Erlang Public License along with this software. If not, it can be
|
||||
%%% retrieved via the world wide web at http://www.erlang.org/.
|
||||
%%%
|
||||
%%% Software distributed under the License is distributed on an "AS IS"
|
||||
%%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
|
||||
%%% the License for the specific language governing rights and limitations
|
||||
%%% under the License.
|
||||
%%%
|
||||
%%% The Initial Developer of the Original Code is ProcessOne.
|
||||
%%% Portions created by ProcessOne are Copyright 2006-2013, ProcessOne
|
||||
%%% All Rights Reserved.''
|
||||
%%% This software is copyright 2006-2013, ProcessOne.
|
||||
%%%
|
||||
%%% @copyright 2006-2013 ProcessOne
|
||||
%%% @author Karim Gemayel <karim.gemayel@process-one.net>
|
||||
%%% [http://www.process-one.net/]
|
||||
%%% @version {@vsn}, {@date} {@time}
|
||||
%%% @end
|
||||
%%% ====================================================================
|
||||
|
||||
%%% @headerfile "pubsub_dev.hrl"
|
||||
|
||||
-module(pubsub_groups).
|
||||
-author('karim.gemayel@process-one.net').
|
||||
|
||||
-compile(export_all).
|
||||
|
||||
-include("pubsub_dev.hrl").
|
||||
|
||||
-import(pubsub_tools,
|
||||
[
|
||||
get_option/2,
|
||||
get_option/3,
|
||||
get_value/2,
|
||||
get_value/3,
|
||||
set_value/3,
|
||||
%%
|
||||
check_acces_model/3,
|
||||
check_acces_model/7,
|
||||
check_publish_model/3,
|
||||
get_entity_roster/1,
|
||||
is_contact_subscribed_to_node_owners/3,
|
||||
is_contact_in_allowed_roster_groups/2,
|
||||
has_subscriptions/1,
|
||||
get_resources/2,
|
||||
get_resources_show/2,
|
||||
rosters_groups_allowed_cache/2
|
||||
]).
|
||||
|
||||
-import(pubsub_db_mnesia,
|
||||
[
|
||||
table/2
|
||||
]).
|
||||
|
||||
|
||||
-type(group() :: binary()).
|
||||
|
||||
-type(node_group() :: group()).
|
||||
|
||||
-type(roster_group() :: group()).
|
||||
|
||||
-type(node_groups() :: [Node_Group::node_group(),...]).
|
||||
|
||||
-type(roster_groups() :: [Roster_Group::roster_group(),...]).
|
||||
|
||||
-type(nodeIdxs() :: [NodeIdx::exmpp_pubsub:nodeIdx(),...]).
|
||||
|
||||
-type(n0de()
|
||||
:: {NodeIdx :: exmpp_pubsub:nodeIdx(),
|
||||
Groups :: node_groups()}
|
||||
).
|
||||
|
||||
-type(n0des() :: [Node::n0de(),...]).
|
||||
|
||||
%% -type(subscription()
|
||||
%% :: {NodeIdx :: exmpp_pubsub:nodeIdx(),
|
||||
%% Groups :: roster_groups()}
|
||||
%% ).
|
||||
|
||||
-type(subscriptions() :: [Subscription::subscription(),...]).
|
||||
|
||||
-type(contact()
|
||||
:: {Entity :: xmpp_jid:usr_bare(),
|
||||
Subscriptions :: subscriptions()}
|
||||
).
|
||||
|
||||
-type(contacts() :: [Contact::contact(),...]).
|
||||
|
||||
|
||||
-record(pubsub_groups,
|
||||
{
|
||||
owner :: xmpp_jid:usr_bare(),
|
||||
nodes = [] :: n0des(),
|
||||
contacts = [] :: [] | contacts()
|
||||
}).
|
||||
|
||||
|
||||
create_table_pubsub_groups(Suffix) ->
|
||||
mnesia:create_table(table('pubsub_groups', Suffix),
|
||||
[{type, set},
|
||||
{disc_copies, [node()]},
|
||||
{record_name, pubsub_groups},
|
||||
{attributes, record_info(fields, pubsub_groups)}]).
|
||||
|
||||
|
||||
|
||||
%%
|
||||
-spec(register_groups/4 ::
|
||||
(
|
||||
Suffix :: atom(),
|
||||
NodeIdx :: exmpp_pubsub:nodeIdx(),
|
||||
Owner :: xmpp_jid:usr_bare(),
|
||||
Groups :: [] | node_groups())
|
||||
-> undefined
|
||||
%
|
||||
| {Subscribers :: [Entity::xmpp_jid:usr_bare()],
|
||||
Unsubscribers :: [Entity::xmpp_jid:usr_bare()]}
|
||||
).
|
||||
|
||||
register_groups(Suffix, NodeIdx, Owner, [] = _Groups) ->
|
||||
case
|
||||
mnesia:read(Table_Pubsub_Groups = table('pubsub_groups', 'dev'),
|
||||
Owner, write)
|
||||
of
|
||||
%%
|
||||
[] ->
|
||||
undefined;
|
||||
%%
|
||||
[#pubsub_groups{nodes = [{NodeIdx, _Node_Groups}]} = Pubsub_Groups] ->
|
||||
mnesia:delete_object(Table_Pubsub_Groups, Pubsub_Groups, write),
|
||||
%
|
||||
{_Subscribers = [],
|
||||
_Unsubscribers = lists:foldl(fun
|
||||
({Entity, Subscriptions}, Unsubscribers) ->
|
||||
case lists:keymember(NodeIdx, 1, Subscriptions) of
|
||||
true -> [Entity | Unsubscribers];
|
||||
false -> Unsubscribers
|
||||
end
|
||||
%
|
||||
end, [], Pubsub_Groups#pubsub_groups.contacts)};
|
||||
%%
|
||||
[Pubsub_Groups] ->
|
||||
case lists:keyfind(NodeIdx, 1, Pubsub_Groups#pubsub_groups.nodes) of
|
||||
{_NodeIdx, Node_Groups} ->
|
||||
{Contacts, Unsubscribers} = subscriptions1(NodeIdx,
|
||||
Pubsub_Groups#pubsub_groups.contacts),
|
||||
%
|
||||
mnesia:write(Table_Pubsub_Groups,
|
||||
Pubsub_Groups#pubsub_groups{
|
||||
contacts = Contacts
|
||||
},
|
||||
write),
|
||||
%
|
||||
{_Subscribers = [],
|
||||
_Unsubscribers = Unsubscribers};
|
||||
false ->
|
||||
undefined
|
||||
end
|
||||
end;
|
||||
%%
|
||||
register_groups(Suffix, NodeIdx, Owner, Groups) ->
|
||||
case
|
||||
mnesia:read(Table_Pubsub_Groups = table('pubsub_groups', 'dev'), Owner,
|
||||
write)
|
||||
of
|
||||
[] ->
|
||||
{Contacts, Subscribers} = subscriptions2(NodeIdx, Owner, Groups),
|
||||
%
|
||||
mnesia:write(Table_Pubsub_Groups,
|
||||
#pubsub_groups{
|
||||
owner = Owner,
|
||||
nodes = [{NodeIdx, Groups}],
|
||||
contacts = Contacts
|
||||
},
|
||||
write),
|
||||
%
|
||||
{_Subscribers = Subscribers,
|
||||
_Unsubscribers = []};
|
||||
[Pubsub_Groups] ->
|
||||
case lists:keyfind(NodeIdx, 1, Pubsub_Groups#pubsub_groups.nodes) of
|
||||
{_NodeIdx, Node_Groups} ->
|
||||
case diff_groups(Groups, Node_Groups) of
|
||||
%%
|
||||
{[] = _New_Groups, [] = _Old_Groups} ->
|
||||
{_Subscribers = [],
|
||||
_Unsubscribers = []};
|
||||
%%
|
||||
{[] = _New_Groups, Old_Groups} ->
|
||||
{Contacts, Unsubscribers}
|
||||
= subscriptions3(NodeIdx, Old_Groups,
|
||||
Pubsub_Groups#pubsub_groups.contacts),
|
||||
%
|
||||
mnesia:write(Table_Pubsub_Groups,
|
||||
Pubsub_Groups#pubsub_groups{
|
||||
nodes = lists:keyreplace(NodeIdx, 1,
|
||||
Pubsub_Groups#pubsub_groups.nodes,
|
||||
{NodeIdx, Groups}),
|
||||
contacts = Contacts
|
||||
},
|
||||
write),
|
||||
%
|
||||
{_Subscribers = [],
|
||||
_Unsubscribers = Unsubscribers};
|
||||
%%
|
||||
{_New_Groups, _Old_Groups} ->
|
||||
{Contacts, Subscribers, Unsubscribers}
|
||||
= subscriptions4(NodeIdx, Owner, Node_Groups,
|
||||
Pubsub_Groups#pubsub_groups.contacts),
|
||||
%
|
||||
mnesia:write(Table_Pubsub_Groups,
|
||||
Pubsub_Groups#pubsub_groups{
|
||||
nodes = lists:keyreplace(NodeIdx, 1,
|
||||
Pubsub_Groups#pubsub_groups.nodes,
|
||||
{NodeIdx, Node_Groups}),
|
||||
contacts = Contacts
|
||||
},
|
||||
write),
|
||||
%
|
||||
{Subscribers = Subscribers,
|
||||
_Unsubscribers = Unsubscribers}
|
||||
end;
|
||||
false ->
|
||||
{Contacts, Subscribers}
|
||||
= subscriptions5(NodeIdx, Owner, Groups,
|
||||
_Contacts = Pubsub_Groups#pubsub_groups.contacts),
|
||||
%
|
||||
mnesia:write(Table_Pubsub_Groups,
|
||||
Pubsub_Groups#pubsub_groups{
|
||||
nodes = [{NodeIdx, Groups}
|
||||
| Pubsub_Groups#pubsub_groups.nodes],
|
||||
contacts = Contacts
|
||||
},
|
||||
write),
|
||||
%
|
||||
{_Subscribers = Subscribers,
|
||||
_Unsubscribers = []}
|
||||
end
|
||||
end.
|
||||
|
||||
|
||||
%% TODO : fix this hook managment
|
||||
-spec(monitor_contacts/3 ::
|
||||
(
|
||||
_ :: 'subscribed',
|
||||
Entity :: xmpp_jid:usr_bare(),
|
||||
Jid_Contacts :: xmpp_jid:entity_bare())
|
||||
-> undefined
|
||||
%
|
||||
| {Server :: xmpp_jid:raw_jid_component_bare(),
|
||||
Entity :: xmpp_jid:usr_bare(),
|
||||
Contact :: xmpp_jid:usr_bare(),
|
||||
_ :: {'subscribed', NodeIdxs :: nodeIdxs()}}
|
||||
).
|
||||
|
||||
monitor_contacts('subscribed', {_, Server, _} = Entity, Jid_Contact) ->
|
||||
case roster_groups(Entity, Contact = jlid:jid_to_lower(Jid_Contact)) of
|
||||
[] ->
|
||||
undefined;
|
||||
Roster_Groups ->
|
||||
case
|
||||
mnesia:read(Table_Pubsub_Groups = table('pubsub_groups', dev),
|
||||
_Owner = Entity, write)
|
||||
of
|
||||
[] ->
|
||||
undefined;
|
||||
[Pubsub_Groups] ->
|
||||
case
|
||||
filter_subscriptions(Pubsub_Groups#pubsub_groups.nodes,
|
||||
Roster_Groups)
|
||||
of
|
||||
[] ->
|
||||
undefined;
|
||||
Subscriptions ->
|
||||
mnesia:write(Table_Pubsub_Groups,
|
||||
Pubsub_Groups#pubsub_groups{
|
||||
contacts = case
|
||||
lists:keyreplace(Contact, 1,
|
||||
Pubsub_Groups#pubsub_groups.contacts,
|
||||
{Contact, Subscriptions})
|
||||
of
|
||||
_Contacts
|
||||
when _Contacts ==
|
||||
Pubsub_Groups#pubsub_groups.contacts ->
|
||||
[{Contact, Subscriptions}
|
||||
| Pubsub_Groups#pubsub_groups.contacts];
|
||||
Contacts ->
|
||||
Contacts
|
||||
end
|
||||
},
|
||||
write),
|
||||
{Server, Entity, Contact,
|
||||
{'subscribed',
|
||||
_NodeIdx = lists:map(fun
|
||||
({NodeIdx, _Groups}) ->
|
||||
NodeIdx
|
||||
end, Subscriptions)}}
|
||||
end
|
||||
end
|
||||
end.
|
||||
|
||||
|
||||
%%
|
||||
-spec(monitor_groups/2 ::
|
||||
(
|
||||
Server :: xmpp_jid:raw_jid_component_bare(),
|
||||
Roster :: #roster{groups :: [] | roster_groups()})
|
||||
-> undefined
|
||||
%
|
||||
| {Server :: xmpp_jid:raw_jid_component_bare(),
|
||||
Entity :: xmpp_jid:usr_bare(),
|
||||
Diff_NodeIdxs :: {NodeIdxs_Subscriptions :: [] | nodeIdxs(),
|
||||
NodeIdxs_Unsubscriptions :: [] | nodeIdxs()}}
|
||||
).
|
||||
|
||||
monitor_groups(Server, #roster{us = {U,S}} = _Roster) ->
|
||||
case
|
||||
mnesia:read(Table_Pubsub_Groups = table('pubsub_groups', dev),
|
||||
_Owner = {U,S,undefined}, write)
|
||||
of
|
||||
[] ->
|
||||
undefined;
|
||||
[Pubsub_Groups] ->
|
||||
case
|
||||
lists:keyfind(_Roster#roster.jid, 1,
|
||||
Pubsub_Groups#pubsub_groups.contacts)
|
||||
of %%
|
||||
{_Entity, Old_Subscriptions}
|
||||
when _Roster#roster.subscription == 'delete'
|
||||
orelse _Roster#roster.subscription == 'none' ->
|
||||
mnesia:write(Table_Pubsub_Groups,
|
||||
Pubsub_Groups#pubsub_groups{
|
||||
contacts = lists:keydelete(_Roster#roster.jid, 1,
|
||||
Pubsub_Groups#pubsub_groups.contacts)
|
||||
},
|
||||
write),
|
||||
{Server,
|
||||
_Entity = _Roster#roster.jid,
|
||||
_Diff_NodeIdxs = diff_nodeidxs(_New_Subscriptions = [],
|
||||
Old_Subscriptions)};
|
||||
%%
|
||||
{_Entity, Old_Subscriptions}
|
||||
when (_Roster#roster.subscription == 'both'
|
||||
orelse
|
||||
_Roster#roster.subscription == 'from')
|
||||
andalso _Roster#roster.groups == [] ->
|
||||
mnesia:write(Table_Pubsub_Groups,
|
||||
Pubsub_Groups#pubsub_groups{
|
||||
contacts = lists:keydelete(_Roster#roster.jid, 1,
|
||||
Pubsub_Groups#pubsub_groups.contacts)
|
||||
},
|
||||
write),
|
||||
{Server,
|
||||
_Roster#roster.jid,
|
||||
_Diff_NodeIdxs = diff_nodeidxs(_New_Subscriptions = [],
|
||||
Old_Subscriptions)};
|
||||
%%
|
||||
{_Entity, Old_Subscriptions}
|
||||
when _Roster#roster.subscription == 'both'
|
||||
orelse _Roster#roster.subscription == 'from' ->
|
||||
case
|
||||
filter_subscriptions(Pubsub_Groups#pubsub_groups.nodes,
|
||||
_Roster#roster.groups)
|
||||
of
|
||||
[] ->
|
||||
mnesia:write(Table_Pubsub_Groups,
|
||||
Pubsub_Groups#pubsub_groups{
|
||||
contacts = lists:keydelete(_Roster#roster.jid,
|
||||
1, Pubsub_Groups#pubsub_groups.contacts)
|
||||
},
|
||||
write),
|
||||
{Server, _Roster#roster.jid,
|
||||
diff_nodeidxs(_New_Subscriptions = [],
|
||||
Old_Subscriptions)};
|
||||
New_Subscriptions ->
|
||||
mnesia:write(Table_Pubsub_Groups,
|
||||
Pubsub_Groups#pubsub_groups{
|
||||
contacts = lists:keyreplace(_Roster#roster.jid,
|
||||
1, Pubsub_Groups#pubsub_groups.contacts,
|
||||
{_Roster#roster.jid, New_Subscriptions})
|
||||
},
|
||||
write),
|
||||
{Server,
|
||||
_Entity = _Roster#roster.jid,
|
||||
_Diff_NodeIdxs = diff_nodeidxs(New_Subscriptions,
|
||||
Old_Subscriptions)}
|
||||
end;
|
||||
%%
|
||||
false
|
||||
when (_Roster#roster.subscription == 'both'
|
||||
orelse
|
||||
_Roster#roster.subscription == 'from')
|
||||
andalso _Roster#roster.groups =/= [] ->
|
||||
case
|
||||
filter_subscriptions(Pubsub_Groups#pubsub_groups.nodes,
|
||||
_Roster#roster.groups)
|
||||
of
|
||||
[] ->
|
||||
undefined;
|
||||
New_Subscriptions ->
|
||||
mnesia:write(Table_Pubsub_Groups,
|
||||
Pubsub_Groups#pubsub_groups{
|
||||
contacts = [{_Roster#roster.jid, New_Subscriptions}
|
||||
| Pubsub_Groups#pubsub_groups.contacts]
|
||||
},
|
||||
write),
|
||||
{Server,
|
||||
_Entity = _Roster#roster.jid,
|
||||
_Diff_NodeIdxs = diff_nodeidxs(New_Subscriptions,
|
||||
_Old_Subscriptions = [])}
|
||||
end;
|
||||
%%
|
||||
_ ->
|
||||
undefined
|
||||
end
|
||||
end.
|
||||
|
||||
|
||||
|
||||
%%
|
||||
%%
|
||||
-spec(subscriptions1/2 ::
|
||||
(
|
||||
NodeIdx :: exmpp_pubsub:nodeIdx(),
|
||||
Old_Contacts :: [] | contacts())
|
||||
-> Diff_Contacts :: {New_Contacts :: [] | contacts(),
|
||||
Unsubscribers :: [Entity::xmpp_jid:usr_bare()]}
|
||||
).
|
||||
|
||||
subscriptions1(NodeIdx, Contacts) ->
|
||||
_Diff_Contacts = subscriptions1(NodeIdx, _Old_Contacts = Contacts,
|
||||
{_New_Contacts = [], _Unsubscribers = []}).
|
||||
|
||||
|
||||
%%
|
||||
-spec(subscriptions1/3 ::
|
||||
(
|
||||
NodeIdx :: exmpp_pubsub:nodeIdx(),
|
||||
Old_Contacts :: [] | contacts(),
|
||||
Diff_Contacts :: {Contacts :: [] | contacts(),
|
||||
Unsubscribers :: [Entity::xmpp_jid:usr_bare()]})
|
||||
-> Diff_Contacts :: {New_Contacts :: [] | contacts(),
|
||||
Unsubscribers :: [Entity::xmpp_jid:usr_bare()]}
|
||||
).
|
||||
|
||||
subscriptions1(_NodeIdx, [] = _Old_Contacts, Diff_Contacts) ->
|
||||
Diff_Contacts;
|
||||
%%
|
||||
subscriptions1(NodeIdx, [{Entity, Subscriptions} | Old_Contacts],
|
||||
{Contacts, Unsubscribers}) ->
|
||||
subscriptions1(NodeIdx, Old_Contacts,
|
||||
_Diff_Contacts = case lists:keydelete(NodeIdx, 1, Subscriptions) of
|
||||
[] ->
|
||||
{_Contacts = Contacts,
|
||||
_Unsubscribers = [Entity | Unsubscribers]};
|
||||
Subscriptions ->
|
||||
{_Contacts = [{Entity, Subscriptions} | Contacts],
|
||||
_Unsubscribers = Unsubscribers};
|
||||
New_Subscriptions ->
|
||||
{_Contacts = [{Entity, New_Subscriptions} | Contacts],
|
||||
_Unsubscribers = [Entity | Unsubscribers]}
|
||||
end).
|
||||
|
||||
|
||||
%%
|
||||
-spec(subscriptions2/3 ::
|
||||
(
|
||||
NodeIdx :: exmpp_pubsub:nodeIdx(),
|
||||
Owner :: xmpp_jid:usr_bare(),
|
||||
Node_Groups :: node_groups())
|
||||
-> Diff_Contacts :: {Contacts :: [] | contacts(),
|
||||
Subscribers :: [Entity::xmpp_jid:usr_bare()]}
|
||||
).
|
||||
|
||||
subscriptions2(NodeIdx, Owner, Node_Groups) ->
|
||||
subscriptions2(NodeIdx, _Rosters = get_entity_roster(Owner), Node_Groups,
|
||||
{_New_Contacts = [], _Subscribers = []}).
|
||||
|
||||
%%
|
||||
-spec(subscriptions2/4 ::
|
||||
(
|
||||
NodeIdx :: exmpp_pubsub:nodeIdx(),
|
||||
Rosters :: [Roster::#roster{groups :: [] | roster_groups()}],
|
||||
Node_Groups :: node_groups(),
|
||||
Diff_Contacts :: {Contacts :: [] | contacts(),
|
||||
Subscribers :: [Entity::xmpp_jid:usr_bare()]})
|
||||
-> Diff_Contacts :: {Contacts :: [] | contacts(),
|
||||
Subscribers :: [Entity::xmpp_jid:usr_bare()]}
|
||||
).
|
||||
|
||||
subscriptions2(_NodeIdx, [] = _Rosters, _Node_Groups, Diff_Contacts) ->
|
||||
Diff_Contacts;
|
||||
%%
|
||||
subscriptions2(NodeIdx, [_Roster | Rosters], Node_Groups, {Contacts, Subscribers})
|
||||
when _Roster#roster.groups =/= [] ->
|
||||
subscriptions2(NodeIdx, Rosters, Node_Groups,
|
||||
_Diff_Contacts = case
|
||||
filter_groups(_Roster#roster.groups, Node_Groups, [])
|
||||
of
|
||||
[] ->
|
||||
{_Contacts = Contacts,
|
||||
_Subscribers = Subscribers};
|
||||
Roster_Groups ->
|
||||
{_Contacts = [{_Roster#roster.jid, [{NodeIdx, Roster_Groups}]}
|
||||
| Contacts],
|
||||
_Subscribers = [_Roster#roster.jid | Subscribers]}
|
||||
end);
|
||||
%%
|
||||
subscriptions2(NodeIdx, [_Roster | Rosters], Node_Groups, Diff_Contacts) ->
|
||||
subscriptions2(NodeIdx, Rosters, Node_Groups, Diff_Contacts).
|
||||
|
||||
|
||||
%%
|
||||
-spec(subscriptions3/3 ::
|
||||
(
|
||||
NodeIdx :: exmpp_pubsub:nodeIdx(),
|
||||
Old_Groups :: roster_groups(),
|
||||
Contacts :: contacts() | [])
|
||||
-> Diff_Contacts :: {Contacts :: [] | contacts(),
|
||||
Unsubscribers :: [Entity::xmpp_jid:usr_bare()]}
|
||||
).
|
||||
subscriptions3(NodeIdx, Old_Groups, Contacts) ->
|
||||
subscriptions3(NodeIdx, Contacts, Old_Groups, {[],[]}).
|
||||
|
||||
%%
|
||||
-spec(subscriptions3/4 ::
|
||||
(
|
||||
NodeIdx :: exmpp_pubsub:nodeIdx(),
|
||||
Old_Contacts :: contacts() | [],
|
||||
Old_Groups :: roster_groups(),
|
||||
Diff_Contacts :: {Contacts :: [] | contacts(),
|
||||
Unsubscribers :: [Entity::xmpp_jid:usr_bare()]})
|
||||
-> Diff_Contacts :: {Contacts :: [] | contacts(),
|
||||
Unsubscribers :: [Entity::xmpp_jid:usr_bare()]}
|
||||
).
|
||||
|
||||
subscriptions3(_NodeIdx, [] = _Contacts, _Old_Groups, Diff_Contacts) ->
|
||||
Diff_Contacts;
|
||||
%%
|
||||
subscriptions3(NodeIdx, [{Entity, Subscriptions} | Old_Contacts], Old_Groups,
|
||||
{Contacts, Unsubscribers}) ->
|
||||
subscriptions3(NodeIdx, Old_Contacts, Old_Groups,
|
||||
_Diff_Contacts = case lists:keyfind(NodeIdx, 1, Subscriptions) of
|
||||
{_NodeIdx, Roster_Groups} ->
|
||||
case delete_groups(Old_Groups, Roster_Groups) of
|
||||
[] ->
|
||||
{_Contacts = Contacts,
|
||||
_Unsubscribers = [Entity | Unsubscribers]};
|
||||
Groups ->
|
||||
{_Contacts = [{Entity,
|
||||
lists:keyreplace(NodeIdx, 1,
|
||||
Subscriptions, {NodeIdx, Groups})}
|
||||
| Contacts],
|
||||
_Unsubscribers = Unsubscribers}
|
||||
end;
|
||||
false ->
|
||||
{_Contacts = [{Entity, Subscriptions} | Contacts],
|
||||
_Unsubscribers = Unsubscribers}
|
||||
end).
|
||||
|
||||
|
||||
%%
|
||||
-spec(subscriptions4/4 ::
|
||||
(
|
||||
NodeIdx :: exmpp_pubsub:nodeIdx(),
|
||||
_ :: xmpp_jid:usr_bare()
|
||||
| [Roster::#roster{groups :: [] | roster_groups()}],
|
||||
Node_Groups :: node_groups(),
|
||||
_ :: [] | contacts()
|
||||
| {Contacts :: [] | contacts(),
|
||||
Subscribers :: [Entity::xmpp_jid:usr_bare()],
|
||||
Unsubscribers :: [Entity::xmpp_jid:usr_bare()]})
|
||||
-> Diff_Contacts :: {Contacts :: [] | contacts(),
|
||||
Subscribers :: [Entity::xmpp_jid:usr_bare()],
|
||||
Unsubscribers :: [Entity::xmpp_jid:usr_bare()]}
|
||||
).
|
||||
|
||||
subscriptions4(_NodeIdx, [] = _Rosters, _Node_Groups, Diff_Contacts) ->
|
||||
Diff_Contacts;
|
||||
%%
|
||||
subscriptions4(NodeIdx, [_Roster | Rosters], Node_Groups,
|
||||
{Contacts, Subscribers, Unsubscribers})
|
||||
when _Roster#roster.groups =/= [] ->
|
||||
subscriptions4(NodeIdx, Rosters, Node_Groups,
|
||||
_Diff_Contacts = case
|
||||
{lists:keyfind(Entity = _Roster#roster.jid, 1, Contacts),
|
||||
filter_groups(_Roster#roster.groups, Node_Groups, [])}
|
||||
of
|
||||
%%
|
||||
{false, [] = _Groups} ->
|
||||
{_Contacts = Contacts,
|
||||
_Subscribers = Subscribers,
|
||||
_Unsubscribers = Unsubscribers};
|
||||
%%
|
||||
{false, Groups} ->
|
||||
{_Contacts = [{Entity, [{NodeIdx, Groups}]} | Contacts],
|
||||
_Subscribers = [Entity | Subscribers],
|
||||
_Unsubscribers = Unsubscribers};
|
||||
%%
|
||||
{{_Entity, [{NodeIdx, _Roster_Groups}] = _Subscriptions}, [] = _Groups} ->
|
||||
{_Contacts = lists:keydelete(Entity, 1, Contacts),
|
||||
_Subscribers = Subscribers,
|
||||
_Unsubscribers = [Entity | Unsubscribers]};
|
||||
%%
|
||||
{{_Entity, Subscriptions}, [] = _Groups} ->
|
||||
case lists:keydelete(NodeIdx, 1, Subscriptions) of
|
||||
Subscriptions ->
|
||||
{_Contacts = Contacts,
|
||||
_Subscribers = Subscribers,
|
||||
_Unsubscribers = Unsubscribers};
|
||||
New_Subscriptions ->
|
||||
{_Contacts = lists:keyreplace(Entity, 1, Contacts,
|
||||
{Entity, New_Subscriptions}),
|
||||
_Subscribers = Subscribers,
|
||||
_Unsubscribers = [Entity | Unsubscribers]}
|
||||
end;
|
||||
{{_Entity, Subscriptions}, Groups} ->
|
||||
case lists:keyreplace(NodeIdx, 1, Subscriptions, {NodeIdx, Groups}) of
|
||||
Subscriptions ->
|
||||
{_Contacts = lists:keyreplace(Entity, 1, Contacts,
|
||||
{Entity,
|
||||
[{NodeIdx, Groups} | Subscriptions]}),
|
||||
_Subscribers = [Entity | Subscribers],
|
||||
_Unsubscribers = Unsubscribers};
|
||||
New_Subscriptions ->
|
||||
{_Contacts = lists:keyreplace(Entity, 1, Contacts,
|
||||
{Entity, New_Subscriptions}),
|
||||
_Subscribers = Subscribers,
|
||||
_Unsubscribers = Unsubscribers}
|
||||
end
|
||||
end);
|
||||
%%
|
||||
subscriptions4(NodeIdx, [_Roster | Rosters], Node_Groups, Diff_Contacts) ->
|
||||
subscriptions4(NodeIdx, Rosters, Node_Groups, Diff_Contacts);
|
||||
%%
|
||||
subscriptions4(NodeIdx, Owner, Node_Groups, Contacts) ->
|
||||
subscriptions4(NodeIdx, _Rosters = get_entity_roster(Owner), Node_Groups,
|
||||
_Diff_Contacts = {Contacts, _Subscribers = [], _Unsubscribers = []}).
|
||||
|
||||
|
||||
|
||||
-spec(subscriptions5/4 ::
|
||||
(
|
||||
NodeIdx :: exmpp_pubsub:nodeIdx(),
|
||||
_ :: xmpp_jid:usr_bare()
|
||||
| [Roster::#roster{groups :: [] | roster_groups()}],
|
||||
Node_Groups :: node_groups(),
|
||||
_ :: [] | contacts()
|
||||
| {Contacts :: [] | contacts(),
|
||||
Subscribers :: [Entity::xmpp_jid:usr_bare()]})
|
||||
-> Diff_Contacts :: {Contacts :: [] | contacts(),
|
||||
Subscribers :: [Entity::xmpp_jid:usr_bare()]}
|
||||
).
|
||||
|
||||
subscriptions5(NodeIdx, [_Roster | Rosters], Node_Groups, {Contacts, Subscribers})
|
||||
when _Roster#roster.groups =/= [] ->
|
||||
subscriptions5(NodeIdx, Rosters, Node_Groups,
|
||||
_Diff_Contacts = case
|
||||
filter_groups(_Roster#roster.groups, Node_Groups, [])
|
||||
of
|
||||
[] ->
|
||||
{_Contacts = Contacts,
|
||||
_Subscribers = Subscribers};
|
||||
Groups ->
|
||||
{_Contacts = case
|
||||
lists:keyfind(_Roster#roster.jid, 1, Contacts)
|
||||
of
|
||||
false ->
|
||||
[{_Roster#roster.jid, [{NodeIdx, Groups}]} | Contacts];
|
||||
{Entity, Subscriptions} ->
|
||||
lists:keyreplace(Entity, 1, Contacts,
|
||||
{Entity, [{NodeIdx, Groups} | Subscriptions]})
|
||||
end,
|
||||
_Subscribers = [_Roster#roster.jid | Subscribers]}
|
||||
end);
|
||||
%%
|
||||
subscriptions5(NodeIdx, [_Roster | Rosters], Node_Groups, Diff_Contacts) ->
|
||||
subscriptions5(NodeIdx, Rosters, Node_Groups, Diff_Contacts);
|
||||
%%
|
||||
subscriptions5(NodeIdx, Owner, Node_Groups, Contacts) ->
|
||||
subscriptions5(NodeIdx, _Rosters = get_entity_roster(Owner), Node_Groups,
|
||||
_Diff_Contacts = {Contacts, _Subscribers = []}).
|
||||
|
||||
|
||||
%%
|
||||
-spec(delete_groups/2 ::
|
||||
(
|
||||
Old_Groups :: roster_groups(),
|
||||
Groups :: [] | roster_groups())
|
||||
-> Groups :: [] | roster_groups()
|
||||
).
|
||||
|
||||
delete_groups(_Old_Groups, [] = _Groups) ->
|
||||
_Groups = [];
|
||||
%%
|
||||
delete_groups([] = _Old_Groups, Groups) ->
|
||||
Groups;
|
||||
%%
|
||||
delete_groups([Old_Group | Old_Groups], Groups) ->
|
||||
_Groups = delete_groups(Old_Groups, lists:delete(Old_Group, Groups)).
|
||||
|
||||
|
||||
%%
|
||||
-spec(diff_groups/2 ::
|
||||
(
|
||||
Groups :: node_groups() | [],
|
||||
_ :: node_groups()
|
||||
| {New_Groups :: [] | node_groups(),
|
||||
Old_Groups :: [] | node_groups()})
|
||||
-> Diff_Groups :: {New_Groups :: [] | node_groups(),
|
||||
Old_Groups :: [] | node_groups()}
|
||||
).
|
||||
|
||||
diff_groups([] = _Groups, Diff_Groups) -> %% when is_tuple(Diff_Groups)
|
||||
Diff_Groups;
|
||||
%%
|
||||
diff_groups([Group | Groups], {New_Groups, Old_Groups}) ->
|
||||
diff_groups(Groups,
|
||||
_Diff_Groups = case lists:delete(Group, Old_Groups) of
|
||||
Old_Groups -> {[Group | New_Groups], Old_Groups};
|
||||
Old_Groups2 -> {New_Groups, Old_Groups2}
|
||||
end);
|
||||
%%
|
||||
diff_groups(New_Groups, Old_Groups) ->
|
||||
diff_groups(New_Groups, {[], Old_Groups}).
|
||||
|
||||
|
||||
%%
|
||||
-spec(filter_groups/3 ::
|
||||
(
|
||||
Roster_Groups :: roster_groups() | [],
|
||||
Node_Groups :: node_groups(),
|
||||
Groups :: [] | roster_groups())
|
||||
-> Groups :: [] | roster_groups()
|
||||
).
|
||||
|
||||
filter_groups([] = _Roster_Groups, _Node_Groups, Groups) ->
|
||||
Groups;
|
||||
%%
|
||||
filter_groups([Roster_Group | Roster_Groups], Node_Groups, Groups) ->
|
||||
filter_groups(Roster_Groups, Node_Groups,
|
||||
_Groups = case lists:member(Roster_Group, Node_Groups) of
|
||||
true -> [Roster_Group | Groups];
|
||||
false -> Groups
|
||||
end).
|
||||
|
||||
|
||||
%%
|
||||
-spec(filter_subscriptions/2 ::
|
||||
(
|
||||
Nodes :: n0des(),
|
||||
Roster_Groups :: roster_groups())
|
||||
-> Subscriptions :: [] | subscriptions()
|
||||
).
|
||||
|
||||
filter_subscriptions(Nodes, Roster_Groups) ->
|
||||
_Subscriptions = filter_subscriptions(Nodes, Roster_Groups, []).
|
||||
|
||||
%%
|
||||
-spec(filter_subscriptions/3 ::
|
||||
(
|
||||
Nodes :: n0des(),
|
||||
Roster_Groups :: roster_groups(),
|
||||
Subscriptions :: [] | subscriptions())
|
||||
-> Subscriptions :: [] | subscriptions()
|
||||
).
|
||||
|
||||
filter_subscriptions([] = _Nodes, _Roster_Groups, Subscriptions) ->
|
||||
Subscriptions;
|
||||
%%
|
||||
filter_subscriptions([{NodeIdx, Node_Groups} | Nodes], Roster_Groups,
|
||||
Subscriptions) ->
|
||||
filter_subscriptions(Nodes, Roster_Groups,
|
||||
_Subscriptions = case filter_groups(Roster_Groups, Node_Groups, []) of
|
||||
[] -> Subscriptions;
|
||||
Groups -> [{NodeIdx, Groups} | Subscriptions]
|
||||
end).
|
||||
|
||||
|
||||
%%
|
||||
-spec(diff_nodeidxs/2 ::
|
||||
(
|
||||
New_Subscriptions :: [] | subscriptions(),
|
||||
Old_Subscriptions :: [] | subscriptions())
|
||||
-> Diff_NodeIdxs :: {NodeIdxs_Subscriptions :: [] | nodeIdxs(),
|
||||
NodeIdxs_Unsubscriptions :: [] | nodeIdxs()}
|
||||
).
|
||||
|
||||
diff_nodeidxs(New_Subscriptions, Old_Subscriptions) ->
|
||||
_Diff_NodeIdxs = diff_nodeidxs(New_Subscriptions, Old_Subscriptions, []).
|
||||
|
||||
%%
|
||||
-spec(diff_nodeidxs/3 ::
|
||||
(
|
||||
New_Subscriptions :: [] | subscriptions(),
|
||||
Old_Subscriptions :: [] | subscriptions(),
|
||||
NodeIdxs_Subscriptions :: [] | nodeIdxs())
|
||||
-> Diff_NodeIdxs :: {NodeIdxs_Subscriptions :: [] | nodeIdxs(),
|
||||
NodeIdxs_Unsubscriptions :: [] | nodeIdxs()}
|
||||
).
|
||||
|
||||
diff_nodeidxs([] = _New_Subscriptions, Old_Subscriptions,
|
||||
NodeIdxs_Subscriptions) ->
|
||||
_Diff_NodeIdxs = {
|
||||
_NodeIdxs_Subscriptions = NodeIdxs_Subscriptions,
|
||||
_NodeIdxs_Unsubscriptions = lists:map(fun
|
||||
({NodeIdx, _Roster_Groups}) ->
|
||||
NodeIdx
|
||||
end, Old_Subscriptions)};
|
||||
%%
|
||||
diff_nodeidxs([{NodeIdx, _Groups} | New_Subscriptions], [] = Old_Subscriptions,
|
||||
NodeIdxs_Subscriptions) ->
|
||||
diff_nodeidxs(New_Subscriptions, Old_Subscriptions,
|
||||
[NodeIdx | NodeIdxs_Subscriptions]);
|
||||
%%
|
||||
diff_nodeidxs([{NodeIdx, _Groups} | New_Subscriptions], Old_Subscriptions,
|
||||
NodeIdxs_Subscriptions) ->
|
||||
case lists:keydelete(NodeIdx, 1, Old_Subscriptions) of
|
||||
Old_Subscriptions ->
|
||||
diff_nodeidxs(New_Subscriptions, Old_Subscriptions,
|
||||
[NodeIdx | NodeIdxs_Subscriptions]);
|
||||
Subscriptions ->
|
||||
diff_nodeidxs(New_Subscriptions, _Old_Subscriptions = Subscriptions,
|
||||
NodeIdxs_Subscriptions)
|
||||
end.
|
||||
|
||||
|
||||
%% TODO : use a new mod_roster_api for this call
|
||||
-spec(roster_groups/2 ::
|
||||
(
|
||||
Entity :: xmpp_jid:usr_bare(),
|
||||
Contact :: xmpp_jid:usr_bare())
|
||||
-> Roster_Groups :: [] | roster_groups()
|
||||
).
|
||||
|
||||
roster_groups({User, Server, _} = _Entity, Contact) ->
|
||||
_Roster_Groups = case
|
||||
gen_storage:transaction(Server, rosteritem,
|
||||
fun() ->
|
||||
gen_storage:select(Server, rostergroup,
|
||||
[{'=', user_host_jid, {User, Server, Contact}}])
|
||||
end)
|
||||
of
|
||||
{atomic, _RosterGroups} ->
|
||||
lists:map(fun
|
||||
(_RosterGroup) ->
|
||||
_RosterGroup#roster.groups
|
||||
end, _RosterGroups);
|
||||
_Error
|
||||
-> {error, 'internal-server-error'}
|
||||
end.
|
||||
|
||||
|
||||
%%
|
||||
-spec(select_roster_groups/1 ::
|
||||
(
|
||||
Entity :: xmpp_jid:usr_entity())
|
||||
-> Roster_Groups :: [] | roster_groups()
|
||||
).
|
||||
|
||||
select_roster_groups({User, Server, _} = Entity) ->
|
||||
_Roster_Groups = case
|
||||
gen_storage:transaction(Server, rosteritem,
|
||||
fun() ->
|
||||
gen_storage:select(Server, rostergroup,
|
||||
[{'=', user_host_jid, {User, Server, '_'}}])
|
||||
end)
|
||||
of
|
||||
{atomic, _RosterGroups} ->
|
||||
lists:map(fun
|
||||
(_RosterGroup) ->
|
||||
_RosterGroup#roster.groups
|
||||
end, _RosterGroups);
|
||||
_Error
|
||||
-> {error, 'internal-server-error'}
|
||||
end.
|
||||
|
||||
|
||||
%% TESTS
|
||||
|
||||
%%
|
||||
monitor_roster_groups(Server, Roster) ->
|
||||
?INFO_MSG("SERVER ~p ROSTER ~p", [Server, Roster]),
|
||||
Result = pubsub_db:transaction('mnesia', ?MODULE, monitor_groups,
|
||||
[Server, Roster]),
|
||||
?INFO_MSG("MONITOR ROSTER GROUPS ~p", [Result]).
|
||||
|
||||
|
||||
monitor_contacts2('subscribed', Entity, Jid_Contact) ->
|
||||
Result = pubsub_db:transaction('mnesia', ?MODULE, monitor_contacts,
|
||||
['subscribed', Entity, Jid_Contact]),
|
||||
?INFO_MSG("MONITOR CONTACTS2 ~p", [Result]).
|
||||
|
||||
register1(NodeIdx, User, Groups) ->
|
||||
Server = <<"localhost">>,
|
||||
Owner = {list_to_binary(atom_to_list(User)), Server, undefined},
|
||||
Groups_B = lists:map(fun(Group) -> list_to_binary(atom_to_list(Group)) end, Groups),
|
||||
register_groups(dev, NodeIdx, Owner, Groups_B).
|
||||
|
||||
register(NodeIdx, User, Groups) ->
|
||||
pubsub_db:transaction('mnesia', ?MODULE, register1, [NodeIdx, User, Groups]).
|
||||
@@ -0,0 +1,570 @@
|
||||
%%% ====================================================================
|
||||
%%% ``The contents of this file are subject to the Erlang Public License,
|
||||
%%% Version 1.1, (the "License"); you may not use this file except in
|
||||
%%% compliance with the License. You should have received a copy of the
|
||||
%%% Erlang Public License along with this software. If not, it can be
|
||||
%%% retrieved via the world wide web at http://www.erlang.org/.
|
||||
%%%
|
||||
%%% Software distributed under the License is distributed on an "AS IS"
|
||||
%%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
|
||||
%%% the License for the specific language governing rights and limitations
|
||||
%%% under the License.
|
||||
%%%
|
||||
%%% The Initial Developer of the Original Code is ProcessOne.
|
||||
%%% Portions created by ProcessOne are Copyright 2006-2013, ProcessOne
|
||||
%%% All Rights Reserved.''
|
||||
%%% This software is copyright 2006-2013, ProcessOne.
|
||||
%%%
|
||||
%%% @copyright 2006-2013 ProcessOne
|
||||
%%% @author Karim Gemayel <karim.gemayel@process-one.net>
|
||||
%%% [http://www.process-one.net/]
|
||||
%%% @version {@vsn}, {@date} {@time}
|
||||
%%% @end
|
||||
%%% ====================================================================
|
||||
|
||||
%%% @headerfile "pubsub_dev.hrl"
|
||||
|
||||
-module(pubsub_hooks).
|
||||
-author('karim.gemayel@process-one.net').
|
||||
|
||||
-compile(export_all).
|
||||
|
||||
-include("pubsub_dev.hrl").
|
||||
|
||||
-import(pubsub_tools,
|
||||
[
|
||||
get_option/2,
|
||||
get_option/3,
|
||||
get_value/2,
|
||||
get_value/3,
|
||||
set_value/3,
|
||||
%%
|
||||
check_access_model/3,
|
||||
check_access_model/7,
|
||||
check_publish_model/3,
|
||||
is_contact_subscribed_to_node_owners/3,
|
||||
is_contact_in_allowed_roster_groups/2,
|
||||
has_subscriptions/1
|
||||
]).
|
||||
|
||||
-import(pubsub_db_mnesia,
|
||||
[
|
||||
table/2
|
||||
]).
|
||||
|
||||
%% 'node_config#send_last_published_item'
|
||||
-spec(presence_online/3 ::
|
||||
(
|
||||
From :: xmpp_jid:entity_full(),
|
||||
To :: xmpp_jid:entity_full(),
|
||||
C2SPid :: pid())
|
||||
-> 'ok'
|
||||
).
|
||||
|
||||
presence_online(#jid{luser = U, lserver = S, lresource = R} = Jid, Jid, C2SPid) ->
|
||||
?INFO_MSG("PRESENCE ONLINE From ~p ~n, To ~p ~n, C2SPid ~p ~n",
|
||||
[Jid, Jid, C2SPid]),
|
||||
Pubsub_Features = node_flat_dev:pubsub_features(),
|
||||
case lists:member(<<"last-published">>, Pubsub_Features) of
|
||||
true ->
|
||||
spawn(?MODULE, last_published_items,
|
||||
[_Host = <<"localhost">>, {U,S,R}]);
|
||||
false ->
|
||||
ok
|
||||
end;
|
||||
%%
|
||||
presence_online(_, _, _) ->
|
||||
ok.
|
||||
|
||||
|
||||
%%
|
||||
-spec(last_published_items/2 ::
|
||||
(
|
||||
Host :: xmpp_jid:raw_jid_component_bare(),
|
||||
Entity :: xmpp_jid:usr_full())
|
||||
-> 'ok'
|
||||
).
|
||||
|
||||
last_published_items(Host, {U,S,_R} = Entity) ->
|
||||
Table_Pubsub_State = table('pubsub_state', 'dev'),
|
||||
Table_Pubsub_Node = table('pubsub_node', 'dev'),
|
||||
Table_Pubsub_Last_Item = table('pubsub_last_item', 'dev'),
|
||||
lists:foreach(fun
|
||||
(State) ->
|
||||
last_published_items(Host, Entity, Table_Pubsub_Node,
|
||||
Table_Pubsub_Last_Item, State)
|
||||
end,
|
||||
mnesia:dirty_select(Table_Pubsub_State,
|
||||
[{#pubsub_state_dev{
|
||||
id = {{U,S,undefined}, '$1'},
|
||||
affiliation = '$2',
|
||||
access = '$3',
|
||||
subscriptions = '$4',
|
||||
_ = '_'
|
||||
},
|
||||
[{'=/=', '$2', 'outcast'},
|
||||
{'=/=', '$3', 'pending'},
|
||||
{'=/=', '$4', []}],
|
||||
['$$']}])).
|
||||
|
||||
%%
|
||||
-spec(last_published_items/5 ::
|
||||
(
|
||||
Host :: xmpp_jid:raw_jid_component_bare(),
|
||||
Entity :: xmpp_jid:usr_full(),
|
||||
Table_Pubsub_Node :: atom(),
|
||||
Table_Pubsub_Last_Item :: atom(),
|
||||
State :: [exmpp_pubsub:nodeIdx() |
|
||||
'member' | 'owner' | 'publisher' |
|
||||
_ |
|
||||
exmpp_pubsub:subscriptions(),... ])
|
||||
-> 'ok'
|
||||
).
|
||||
|
||||
last_published_items(Host, {_, _, Online_Resource} = Entity,
|
||||
Table_Pubsub_Node, Table_Pubsub_Last_Item,
|
||||
[NodeIdx, Affiliation, _Access, Subscriptions]) ->
|
||||
case mnesia:dirty_index_read(Table_Pubsub_Node, NodeIdx, idx) of
|
||||
[#pubsub_node_dev{
|
||||
id = {Pubsub_Host, NodeId},
|
||||
owners = Node_Owners,
|
||||
options = Node_Options
|
||||
}] ->
|
||||
case get_value(Node_Options, 'send_last_published_item') of
|
||||
'on_sub_and_presence' ->
|
||||
case mnesia:dirty_read(Table_Pubsub_Last_Item, NodeIdx) of
|
||||
[#pubsub_last_item_dev{
|
||||
id = ItemId,
|
||||
creation = {DateTime, Publisher},
|
||||
payload = Payload,
|
||||
options = Item_Options
|
||||
}] ->
|
||||
spawn(pubsub_broadcast, broadcast_publish_last2,
|
||||
[Host, Pubsub_Host, NodeId, Node_Options,
|
||||
Node_Owners,
|
||||
[{ItemId, Item_Options, Payload, Publisher, DateTime}],
|
||||
Entity, Affiliation,
|
||||
lists:foldl(fun
|
||||
({Subscription_State, SubId, Resource, Subscription_Options},
|
||||
Acc)
|
||||
when Subscription_State =/= 'pending'
|
||||
andalso (Resource == undefined
|
||||
orelse
|
||||
Resource == Online_Resource) ->
|
||||
[{Subscription_State, SubId,
|
||||
Online_Resource, Subscription_Options}
|
||||
| Acc];
|
||||
(_Subscription, Acc) ->
|
||||
Acc
|
||||
end, [], Subscriptions)]);
|
||||
_ ->
|
||||
ok
|
||||
end;
|
||||
_ ->
|
||||
ok
|
||||
end;
|
||||
_ ->
|
||||
ok
|
||||
end.
|
||||
|
||||
%% 'node_config#purge_offline'
|
||||
%% 'node_config#tempsub'
|
||||
%% 'subscribe_options#expire'
|
||||
|
||||
-spec(presence_offline/3 ::
|
||||
(
|
||||
_ :: _,
|
||||
Jid :: xmpp_jid:entity_full(),
|
||||
_ :: _)
|
||||
-> 'ok'
|
||||
).
|
||||
|
||||
presence_offline({_DateTime, _Pid},
|
||||
#jid{luser = U, lserver = S, lresource = Offline_Resource} = _Jid, _) ->
|
||||
Host = <<"localhost">>,
|
||||
Pubsub_Features = node_flat_dev:pubsub_features(),
|
||||
Subscribe = lists:member(<<"subscribe">>, Pubsub_Features),
|
||||
Leased_Subscription = lists:member(<<"leased-subscription">>, Pubsub_Features),
|
||||
Purge_Nodes = lists:member(<<"purge-nodes">>, Pubsub_Features),
|
||||
Persistent_Items = lists:member(<<"persistent-items">>, Pubsub_Features),
|
||||
Subscription_Notifications = lists:member(<<"subscription-notifications">>,
|
||||
Pubsub_Features),
|
||||
Table_Pubsub_State = table('pubsub_state', 'dev'),
|
||||
Table_Pubsub_Node = table('pubsub_node', 'dev'),
|
||||
Online_Resources = case ejabberd_sm:get_user_resources(U, S) of
|
||||
[] -> false;
|
||||
_ -> true
|
||||
end,
|
||||
lists:foreach(fun
|
||||
(Pubsub_State) ->
|
||||
presence_offline(Host,
|
||||
_Entity = {U,S,undefined},
|
||||
Table_Pubsub_State,
|
||||
Pubsub_State,
|
||||
Table_Pubsub_Node,
|
||||
Offline_Resource,
|
||||
Online_Resources,
|
||||
{Subscribe,
|
||||
Leased_Subscription,
|
||||
Purge_Nodes,
|
||||
Persistent_Items,
|
||||
Subscription_Notifications})
|
||||
end,
|
||||
mnesia:dirty_match_object(Table_Pubsub_State,
|
||||
#pubsub_state_dev{
|
||||
id = {{U,S,undefined}, '_'},
|
||||
_ = '_'
|
||||
})).
|
||||
|
||||
%%
|
||||
-spec(presence_offline/8 ::
|
||||
(
|
||||
Host :: xmpp_jid:raw_jid_component_bare(),
|
||||
Entity :: xmpp_jid:usr_bare(),
|
||||
Table_Pubsub_State :: atom(),
|
||||
Pubsub_State :: mod_pubsub_dev:pubsub_state(),
|
||||
Table_Pubsub_Node :: atom(),
|
||||
Offline_Resource :: xmpp_jid:resource_jid(),
|
||||
Online_Resources :: boolean(),
|
||||
Pubsub_Features :: {Subscribe :: boolean(),
|
||||
Leased_Subscription :: boolean(),
|
||||
Purge_Nodes :: boolean(),
|
||||
Persistent_Items :: boolean(),
|
||||
Subscription_Notifications :: boolean()})
|
||||
-> 'ok'
|
||||
).
|
||||
|
||||
presence_offline(Host, Entity, Table_Pubsub_State, Pubsub_State,
|
||||
Table_Pubsub_Node, Offline_Resource, Online_Resources,
|
||||
{Subscribe, Leased_Subscription, Purge_Nodes, Persistent_Items,
|
||||
Subscription_Notifications}) ->
|
||||
case
|
||||
mnesia:dirty_index_read(Table_Pubsub_Node,
|
||||
Pubsub_State#pubsub_state_dev.nodeidx, idx)
|
||||
of
|
||||
[#pubsub_node_dev{id = {Pubsub_Host, NodeId}} = Pubsub_Node] ->
|
||||
Node_Options = Pubsub_Node#pubsub_node_dev.options,
|
||||
|
||||
case
|
||||
Subscribe == true
|
||||
andalso
|
||||
get_value(Node_Options, 'tempsub') == true
|
||||
of
|
||||
true ->
|
||||
case
|
||||
filter_tempsub_subscriptions(
|
||||
get_value(Node_Options, 'notify_sub'),
|
||||
Pubsub_State#pubsub_state_dev.subscriptions,
|
||||
Offline_Resource, Online_Resources, {[], []})
|
||||
of
|
||||
%%
|
||||
{_Unexpired_Subscriptions, [] = _Expired_Subscriptions} ->
|
||||
ok;
|
||||
%%
|
||||
{[] = _Unexpired_Subscriptions, Expired_Subscriptions}
|
||||
when Pubsub_State#pubsub_state_dev.affiliation == 'member'
|
||||
andalso Pubsub_State#pubsub_state_dev.itemids == [] ->
|
||||
mnesia:dirty_delete_object(Table_Pubsub_State,
|
||||
Pubsub_State),
|
||||
Notification_Type = get_value(Node_Options,
|
||||
'notification_type', 'headline'),
|
||||
notify_subscriptions(Host, Pubsub_Host,
|
||||
Entity, NodeId, Notification_Type,
|
||||
_Recipients = case Subscription_Notifications of
|
||||
true ->
|
||||
case
|
||||
lists:member(Entity,
|
||||
Pubsub_Node#pubsub_node_dev.owners)
|
||||
of
|
||||
true ->
|
||||
Pubsub_Node#pubsub_node_dev.owners;
|
||||
false ->
|
||||
[Entity
|
||||
| Pubsub_Node#pubsub_node_dev.owners]
|
||||
end;
|
||||
false ->
|
||||
Pubsub_Node#pubsub_node_dev.owners
|
||||
end,
|
||||
Expired_Subscriptions),
|
||||
ok;
|
||||
%%
|
||||
{Unexpired_Subscriptions, Expired_Subscriptions} ->
|
||||
mnesia:dirty_write(Table_Pubsub_State,
|
||||
Pubsub_State#pubsub_state_dev{
|
||||
subscriptions = Unexpired_Subscriptions
|
||||
}),
|
||||
Notification_Type = get_value(Node_Options,
|
||||
'notification_type', 'headline'),
|
||||
notify_subscriptions(Host, Pubsub_Host,
|
||||
Entity, NodeId, Notification_Type,
|
||||
_Recipients = case Subscription_Notifications of
|
||||
true ->
|
||||
case
|
||||
lists:member(Entity,
|
||||
Pubsub_Node#pubsub_node_dev.owners)
|
||||
of
|
||||
true ->
|
||||
Pubsub_Node#pubsub_node_dev.owners;
|
||||
false ->
|
||||
[Entity
|
||||
| Pubsub_Node#pubsub_node_dev.owners]
|
||||
end;
|
||||
false ->
|
||||
Pubsub_Node#pubsub_node_dev.owners
|
||||
end,
|
||||
Expired_Subscriptions),
|
||||
ok
|
||||
end;
|
||||
_ ->
|
||||
case Subscribe == true andalso Leased_Subscription == true of
|
||||
true ->
|
||||
case
|
||||
filter_expired_subscriptions(
|
||||
get_value(Node_Options, 'notify_sub'),
|
||||
Pubsub_State#pubsub_state_dev.subscriptions,
|
||||
Offline_Resource, Online_Resources, {[], []})
|
||||
of
|
||||
%%
|
||||
{_Unexpired_Subscriptions, [] = _Expired_Subscriptions} ->
|
||||
ok;
|
||||
%%
|
||||
{[] = _Unexpired_Subscriptions, Expired_Subscriptions}
|
||||
when Pubsub_State#pubsub_state_dev.affiliation == 'member' ->
|
||||
mnesia:dirty_delete_object(Table_Pubsub_State,
|
||||
Pubsub_State),
|
||||
Notification_Type = get_value(Node_Options,
|
||||
'notification_type', 'headline'),
|
||||
notify_subscriptions(Host, Pubsub_Host,
|
||||
Entity, NodeId, Notification_Type,
|
||||
_Recipients = case
|
||||
Subscription_Notifications
|
||||
of
|
||||
true ->
|
||||
case
|
||||
lists:member(Entity,
|
||||
Pubsub_Node#pubsub_node_dev.owners)
|
||||
of
|
||||
true ->
|
||||
Pubsub_Node#pubsub_node_dev.owners;
|
||||
false ->
|
||||
[Entity
|
||||
|Pubsub_Node#pubsub_node_dev.owners]
|
||||
end;
|
||||
false ->
|
||||
Pubsub_Node#pubsub_node_dev.owners
|
||||
end,
|
||||
Expired_Subscriptions),
|
||||
ok;
|
||||
%%
|
||||
{Unexpired_Subscriptions, Expired_Subscriptions} ->
|
||||
mnesia:dirty_write(Table_Pubsub_State,
|
||||
Pubsub_State#pubsub_state_dev{
|
||||
subscriptions = Unexpired_Subscriptions
|
||||
}),
|
||||
Notification_Type = get_value(Node_Options,
|
||||
'notification_type', 'headline'),
|
||||
notify_subscriptions(Host, Pubsub_Host,
|
||||
Entity, NodeId, Notification_Type,
|
||||
_Recipients = case
|
||||
Subscription_Notifications
|
||||
of
|
||||
true ->
|
||||
case
|
||||
lists:member(Entity,
|
||||
Pubsub_Node#pubsub_node_dev.owners)
|
||||
of
|
||||
true ->
|
||||
Pubsub_Node#pubsub_node_dev.owners;
|
||||
false ->
|
||||
[Entity
|
||||
| Pubsub_Node#pubsub_node_dev.owners]
|
||||
end;
|
||||
false ->
|
||||
Pubsub_Node#pubsub_node_dev.owners
|
||||
end,
|
||||
Expired_Subscriptions),
|
||||
ok
|
||||
end;
|
||||
false ->
|
||||
ok
|
||||
end
|
||||
end;
|
||||
[] ->
|
||||
ok
|
||||
end.
|
||||
|
||||
%%
|
||||
-spec(notify_subscriptions/7 ::
|
||||
(
|
||||
Host :: xmpp_jid:raw_jid_component_bare(),
|
||||
Pubsub_Host :: exmpp_pubsub:host(),
|
||||
Entity :: xmpp_jid:usr_bare(),
|
||||
NodeId :: exmpp_pubsub:nodeId(),
|
||||
Notification_Type :: 'message' | 'headline',
|
||||
Recipients :: [Entity::xmpp_jid:usr_bare(),...],
|
||||
Subscriptions :: [Subscription::exmpp_pubsub:subscription(),...])
|
||||
-> 'ok'
|
||||
).
|
||||
|
||||
notify_subscriptions(Host, Pubsub_Host, {U,S,_} = _Entity, NodeId,
|
||||
Notification_Type, Recipients, Subscriptions) ->
|
||||
Pubsub_Component_Jid = jlib:make_jid(<<>>, Pubsub_Host, <<>>),
|
||||
Jids = [pubsub_tools:make_jid(Recipient) || Recipient <- Recipients],
|
||||
lists:foreach(fun
|
||||
({_, SubId, Resource, _}) ->
|
||||
Subscriber = jlib:jid_to_string({U,S,Resource}),
|
||||
lists:foreach(fun
|
||||
(Recipient) ->
|
||||
spawn(pubsub_broadcast, notify_subscription,
|
||||
[Host, NodeId, Pubsub_Component_Jid, Recipient,
|
||||
Notification_Type, {Subscriber, 'none', SubId}])
|
||||
end, Jids)
|
||||
end, Subscriptions).
|
||||
|
||||
%%
|
||||
filter_purged_offline_itemids([Publisher_ItemId | Publisher_ItemIds],
|
||||
Table_Pubsub_Item, NodeIdx, {U,S,R} = _Entity,
|
||||
{Node_ItemIds, Unpurged_ItemIds, Purged_ItemIds}) ->
|
||||
filter_purged_offline_itemids(Publisher_ItemIds, Table_Pubsub_Item, NodeIdx,
|
||||
{U,S,R},
|
||||
case
|
||||
mnesia:dirty_index_match_object(Table_Pubsub_Item,
|
||||
#pubsub_item_dev{
|
||||
id = {Publisher_ItemId, NodeIdx},
|
||||
nodeidx = NodeIdx,
|
||||
_ = '_'
|
||||
},
|
||||
nodeidx)
|
||||
of
|
||||
[#pubsub_item_dev{creation = {_DateTime, {U,S,_}}} = Pubsub_Item] ->
|
||||
mnesia:dirty_delete_object(Table_Pubsub_Item, Pubsub_Item);
|
||||
_ ->
|
||||
{Node_ItemIds,
|
||||
[Publisher_ItemId | Unpurged_ItemIds],
|
||||
Purged_ItemIds}
|
||||
end).
|
||||
|
||||
|
||||
%%
|
||||
-spec(filter_tempsub_subscriptions/5 ::
|
||||
(
|
||||
Notify_Sub :: boolean() | 'none',
|
||||
Subscriptions :: [] | exmpp_pubsub:subscriptions(),
|
||||
Offline_Resource :: xmpp_jid:resource_jid(),
|
||||
Online_Resources :: boolean(),
|
||||
Filtered_TempSub_Subscriptions :: {
|
||||
Unexpired_Subscriptions :: [] | exmpp_pubsub:subscriptions(),
|
||||
Expired_Subscriptions :: [] | exmpp_pubsub:subscriptions()
|
||||
})
|
||||
-> Filtered_TempSub_Subscriptions :: {
|
||||
Unexpired_Subscriptions :: [] | exmpp_pubsub:subscriptions(),
|
||||
Expired_Subscriptions :: [] | exmpp_pubsub:subscriptions()
|
||||
}
|
||||
).
|
||||
|
||||
filter_tempsub_subscriptions(_Notify_Sub, [] = _Subscriptions,
|
||||
_Offline_Resource, _Online_Resources, Filtered_TempSub_Subscriptions) ->
|
||||
Filtered_TempSub_Subscriptions;
|
||||
%%
|
||||
filter_tempsub_subscriptions(Notify_Sub,
|
||||
[{Subscription_State, SubId, Resource, Subscription_Options} | Subscriptions],
|
||||
Offline_Resource, Online_Resources,
|
||||
{Unexpired_Subscriptions, Expired_Subscriptions})
|
||||
when ((Online_Resources == false
|
||||
andalso
|
||||
(Resource == undefined orelse Resource == Offline_Resource))
|
||||
orelse
|
||||
(Online_Resources == true
|
||||
andalso
|
||||
Resource == Offline_Resource)) ->
|
||||
filter_tempsub_subscriptions(Notify_Sub, Subscriptions, Offline_Resource,
|
||||
Online_Resources,
|
||||
{Unexpired_Subscriptions,
|
||||
_Expired_Subscriptions = case Notify_Sub of
|
||||
true ->
|
||||
[{Subscription_State, SubId, Resource, Subscription_Options}
|
||||
| Expired_Subscriptions];
|
||||
_ ->
|
||||
Expired_Subscriptions
|
||||
end});
|
||||
%%
|
||||
filter_tempsub_subscriptions(Notify_Sub, [Subscription | Subscriptions],
|
||||
Offline_Resource, Online_Resources,
|
||||
{Unexpired_Subscriptions, Expired_Subscriptions}) ->
|
||||
filter_tempsub_subscriptions(Notify_Sub, Subscriptions, Offline_Resource,
|
||||
Online_Resources,
|
||||
{[Subscription | Unexpired_Subscriptions], Expired_Subscriptions}).
|
||||
|
||||
%%
|
||||
-spec(filter_expired_subscriptions/5 ::
|
||||
(
|
||||
Notify_Sub :: boolean() | 'none',
|
||||
Subscriptions :: [] | exmpp_pubsub:subscriptions(),
|
||||
Offline_Resource :: xmpp_jid:resource_jid(),
|
||||
Online_Resources :: boolean(),
|
||||
Filtered_Expired_Subscriptions :: {
|
||||
Unexpired_Subscriptions :: [] | exmpp_pubsub:subscriptions(),
|
||||
Expired_Subscriptions :: [] | exmpp_pubsub:subscriptions()
|
||||
})
|
||||
-> Filtered_Expired_Subscriptions :: {
|
||||
Unexpired_Subscriptions :: [] | exmpp_pubsub:subscriptions(),
|
||||
Expired_Subscriptions :: [] | exmpp_pubsub:subscriptions()
|
||||
}
|
||||
).
|
||||
|
||||
filter_expired_subscriptions(_Notify_Sub, [] = _Subscriptions, _Offline_Resource,
|
||||
_Online_Resources, Filtered_Expired_Subscriptions) ->
|
||||
Filtered_Expired_Subscriptions;
|
||||
%%
|
||||
filter_expired_subscriptions(Notify_Sub,
|
||||
[{Subscription_State, SubId, Resource, Subscription_Options} | Subscriptions],
|
||||
Offline_Resource, Online_Resources,
|
||||
{Unexpired_Subscriptions, Expired_Subscriptions})
|
||||
when Subscription_Options =/= []
|
||||
andalso ((Online_Resources == false
|
||||
andalso
|
||||
(Resource == undefined orelse Resource == Offline_Resource))
|
||||
orelse
|
||||
(Online_Resources == true
|
||||
andalso
|
||||
Resource == Offline_Resource)) ->
|
||||
filter_expired_subscriptions(Notify_Sub, Subscriptions, Offline_Resource,
|
||||
Online_Resources,
|
||||
case get_value(Subscription_Options, 'expire') of
|
||||
'presence' ->
|
||||
{Unexpired_Subscriptions,
|
||||
_Expired_Subscriptions = case Notify_Sub of
|
||||
true ->
|
||||
[{Subscription_State, SubId, Resource, Subscription_Options}
|
||||
| Expired_Subscriptions];
|
||||
false ->
|
||||
Expired_Subscriptions
|
||||
end};
|
||||
_ ->
|
||||
{[{Subscription_State, SubId, Resource, Subscription_Options}
|
||||
| Unexpired_Subscriptions],
|
||||
Expired_Subscriptions}
|
||||
end);
|
||||
%%
|
||||
filter_expired_subscriptions(Notify_Sub, [Subscription | Subscriptions],
|
||||
Offline_Resource, Online_Resources,
|
||||
{Unexpired_Subscriptions, Expired_Subscriptions}) ->
|
||||
filter_expired_subscriptions(Notify_Sub, Subscriptions, Offline_Resource,
|
||||
Online_Resources,
|
||||
{[Subscription | Unexpired_Subscriptions], Expired_Subscriptions}).
|
||||
|
||||
|
||||
%%
|
||||
roster_process_item(Roster_Item, Server) ->
|
||||
spawn(pubsub_groups, monitor_roster_groups, [Server, Roster_Item]),
|
||||
Roster_Item.
|
||||
|
||||
|
||||
|
||||
roster_in_subscription(Boolean, User, Server, Jid_Contact,
|
||||
'subscribed' = _Subscription_Type) ->
|
||||
spawn(pubsub_groups, monitor_contacts2,
|
||||
['subscribed', {User, Server, undefined}, Jid_Contact]),
|
||||
Boolean;
|
||||
roster_in_subscription(Boolean, _User, _Server, _JID, _SubscriptionType) ->
|
||||
Boolean.
|
||||
@@ -0,0 +1,113 @@
|
||||
%%% ====================================================================
|
||||
%%% ``The contents of this file are subject to the Erlang Public License,
|
||||
%%% Version 1.1, (the "License"); you may not use this file except in
|
||||
%%% compliance with the License. You should have received a copy of the
|
||||
%%% Erlang Public License along with this software. If not, it can be
|
||||
%%% retrieved via the world wide web at http://www.erlang.org/.
|
||||
%%%
|
||||
%%% Software distributed under the License is distributed on an "AS IS"
|
||||
%%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
|
||||
%%% the License for the specific language governing rights and limitations
|
||||
%%% under the License.
|
||||
%%%
|
||||
%%% The Initial Developer of the Original Code is ProcessOne.
|
||||
%%% Portions created by ProcessOne are Copyright 2006-2013, ProcessOne
|
||||
%%% All Rights Reserved.''
|
||||
%%% This software is copyright 2006-2013, ProcessOne.
|
||||
%%%
|
||||
%%%
|
||||
%%% @copyright 2006-2013 ProcessOne
|
||||
%%% @author Christophe Romain <christophe.romain@process-one.net>
|
||||
%%% [http://www.process-one.net/]
|
||||
%%% @version {@vsn}, {@date} {@time}
|
||||
%%% @end
|
||||
%%% ====================================================================
|
||||
|
||||
%% important note:
|
||||
%% new/1 and free/2 MUST be called inside a transaction bloc
|
||||
|
||||
-module(pubsub_index_dev).
|
||||
-author('christophe.romain@process-one.net').
|
||||
|
||||
-include("pubsub_dev.hrl").
|
||||
|
||||
-export([
|
||||
init/1,
|
||||
new/2,
|
||||
free/3
|
||||
]).
|
||||
|
||||
-import(pubsub_db_mnesia,
|
||||
[
|
||||
table/2
|
||||
]).
|
||||
|
||||
|
||||
%%
|
||||
-spec(init/1 ::
|
||||
(
|
||||
Suffix::atom()) -> 'ok'
|
||||
).
|
||||
|
||||
init(Suffix) ->
|
||||
mnesia:create_table(table('pubsub_index_dev', Suffix),
|
||||
[{disc_copies, [node()]},
|
||||
{record_name, pubsub_index_dev},
|
||||
{attributes, record_info(fields, pubsub_index_dev)}]).
|
||||
|
||||
%%
|
||||
-spec(new/2 ::
|
||||
(
|
||||
Suffix :: atom(),
|
||||
Index :: exmpp_pubsub:index())
|
||||
-> Idx::exmpp_pubsub:nodeIdx()
|
||||
).
|
||||
|
||||
new(Suffix, Index) ->
|
||||
case
|
||||
mnesia:read(Table_Pubsub_Index = table('pubsub_index_dev', Suffix),
|
||||
Index, write)
|
||||
of
|
||||
[#pubsub_index_dev{free = []} = Pubsub_Index] ->
|
||||
mnesia:write(Table_Pubsub_Index,
|
||||
Pubsub_Index#pubsub_index_dev{
|
||||
last = Idx = Pubsub_Index#pubsub_index_dev.last + 1
|
||||
},
|
||||
write),
|
||||
Idx;
|
||||
[#pubsub_index_dev{free = [Idx|Free]} = Pubsub_Index] ->
|
||||
mnesia:write(Table_Pubsub_Index,
|
||||
Pubsub_Index#pubsub_index_dev{
|
||||
free = Free
|
||||
},
|
||||
write),
|
||||
Idx;
|
||||
_ ->
|
||||
mnesia:write(Table_Pubsub_Index,
|
||||
#pubsub_index_dev{index = Index, last = 1, free = []}, write),
|
||||
1
|
||||
end.
|
||||
|
||||
%%
|
||||
-spec(free/3 ::
|
||||
(
|
||||
Suffix :: atom(),
|
||||
Index :: exmpp_pubsub:index(),
|
||||
Idx :: exmpp_pubsub:nodeIdx())
|
||||
-> 'ok'
|
||||
).
|
||||
|
||||
free(Suffix, Index, Idx) ->
|
||||
case
|
||||
mnesia:read(Table_Pubsub_Index = table('pubsub_index_dev', Suffix),
|
||||
Index, write)
|
||||
of
|
||||
[Pubsub_Index] ->
|
||||
mnesia:write(Table_Pubsub_Index,
|
||||
Pubsub_Index#pubsub_index_dev{
|
||||
free = [Idx | Pubsub_Index#pubsub_index_dev.free]
|
||||
},
|
||||
write);
|
||||
_ ->
|
||||
ok
|
||||
end.
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,685 @@
|
||||
%%% ====================================================================
|
||||
%%% ``The contents of this file are subject to the Erlang Public License,
|
||||
%%% Version 1.1, (the "License"); you may not use this file except in
|
||||
%%% compliance with the License. You should have received a copy of the
|
||||
%%% Erlang Public License along with this software. If not, it can be
|
||||
%%% retrieved via the world wide web at http://www.erlang.org/.
|
||||
%%%
|
||||
%%% Software distributed under the License is distributed on an "AS IS"
|
||||
%%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
|
||||
%%% the License for the specific language governing rights and limitations
|
||||
%%% under the License.
|
||||
%%%
|
||||
%%% The Initial Developer of the Original Code is ProcessOne.
|
||||
%%% Portions created by ProcessOne are Copyright 2006-2013, ProcessOne
|
||||
%%% All Rights Reserved.''
|
||||
%%% This software is copyright 2006-2013, ProcessOne.
|
||||
%%%
|
||||
%%% @copyright 2006-2013 ProcessOne
|
||||
%%% @author Karim Gemayel <karim.gemayel@process-one.net>
|
||||
%%% [http://www.process-one.net/]
|
||||
%%% @version {@vsn}, {@date} {@time}
|
||||
%%% @end
|
||||
%%% ====================================================================
|
||||
|
||||
%%% @headerfile "pubsub_dev.hrl"
|
||||
|
||||
-module(pubsub_tools).
|
||||
-author('karim.gemayel@process-one.net').
|
||||
|
||||
-compile(export_all).
|
||||
|
||||
-include("pubsub_dev.hrl").
|
||||
|
||||
jid_to_string({undefined, S, undefined}) ->
|
||||
jlib:jid_to_string({<<>>, S, <<>>});
|
||||
jid_to_string({undefined, S, R}) ->
|
||||
jlib:jid_to_string({<<>>, S, R});
|
||||
jid_to_string({U, S, undefined}) ->
|
||||
jlib:jid_to_string({U, S, <<>>});
|
||||
jid_to_string(USR) ->
|
||||
jlib:jid_to_string(USR).
|
||||
|
||||
make_jid({undefined, S, undefined}) ->
|
||||
jlib:make_jid(<<>>, S, <<>>);
|
||||
make_jid({U, S, undefined}) ->
|
||||
jlib:make_jid({U, S, <<>>});
|
||||
make_jid(Entity) ->
|
||||
jlib:make_jid(Entity).
|
||||
|
||||
%% @doc Determine if data is a JID
|
||||
-spec(is_jid/1 ::
|
||||
(
|
||||
Data :: binary() | undefined)
|
||||
-> xmpp_jid:entity() | {error, 'jid-malformed'}
|
||||
).
|
||||
|
||||
is_jid(Data) ->
|
||||
try jlib:string_to_jid(Data) of
|
||||
#jid{} = Jid -> Jid
|
||||
catch
|
||||
_Error -> {error, 'jid-malformed'}
|
||||
end.
|
||||
|
||||
%%%
|
||||
%-spec(get_value/2 ::
|
||||
%(
|
||||
% Options :: {Node_Options :: pubsub_options:options_node(),
|
||||
% Item_Options :: [] | pubsub_options:options_item()}
|
||||
% | pubsub_options:options_item()
|
||||
% | pubsub_options:options_node()
|
||||
% | pubsub_options:options_subscription()
|
||||
% | [],
|
||||
% Key :: atom())
|
||||
% -> Value :: atom()
|
||||
% | binary()
|
||||
% | boolean()
|
||||
% | non_neg_integer()
|
||||
% | undefined
|
||||
% | []
|
||||
% | 'none'
|
||||
% | [atom(),...]
|
||||
% | [binary(),...]
|
||||
% | [boolean(),...]
|
||||
% | [non_neg_integer(),...]
|
||||
%).
|
||||
|
||||
get_value({Node_Options, [] = _Item_Options}, Key) ->
|
||||
get_value(Node_Options, Key, 0);
|
||||
%%
|
||||
get_value({Node_Options, Item_Options}, Key) ->
|
||||
case get_value(Item_Options, Key, 'none') of
|
||||
'none' -> get_value(Node_Options, Key, false);
|
||||
Value -> Value
|
||||
end;
|
||||
%%
|
||||
get_value([], _Key) -> 'none';
|
||||
%%
|
||||
get_value(Options, Key) ->
|
||||
get_value(Options, Key, 'none').
|
||||
|
||||
%%%
|
||||
%-spec(get_value/3 ::
|
||||
%(
|
||||
% Options :: {Node_Options :: pubsub_options:options_node(),
|
||||
% Item_Options :: [] | pubsub_options:options_item()}
|
||||
% | pubsub_options:options_item()
|
||||
% | pubsub_options:options_node()
|
||||
% | pubsub_options:options_subscription(),
|
||||
% Key :: atom(),
|
||||
% Default :: term())
|
||||
% -> Value :: atom()
|
||||
% | binary()
|
||||
% | boolean()
|
||||
% | non_neg_integer()
|
||||
% | undefined
|
||||
% | []
|
||||
% | [atom(),...]
|
||||
% | [binary(),...]
|
||||
% | [boolean(),...]
|
||||
% | [non_neg_integer(),...]
|
||||
%).
|
||||
get_value({Node_Options, [] = _Item_Options}, Key, Default) ->
|
||||
get_value(Node_Options, Key, Default);
|
||||
%%
|
||||
get_value({Node_Options, Item_Options}, Key, Default) ->
|
||||
case get_value(Item_Options, Key, 'none') of
|
||||
'none' -> get_value(Node_Options, Key, Default);
|
||||
Value -> Value
|
||||
end;
|
||||
%%
|
||||
get_value(Options, Key, Default) ->
|
||||
case lists:keyfind(Key, 1, Options) of
|
||||
{_Key, Value} -> Value;
|
||||
false -> Default
|
||||
end.
|
||||
|
||||
%%%
|
||||
%-spec(set_value/3 ::
|
||||
%(
|
||||
% Options :: pubsub_options:options_item()
|
||||
% | pubsub_options:options_node()
|
||||
% | pubsub_options:options_subscription(),
|
||||
% Key :: atom(),
|
||||
% Value :: atom()
|
||||
% | binary()
|
||||
% | boolean()
|
||||
% | non_neg_integer()
|
||||
% | undefined
|
||||
% | []
|
||||
% | [atom(),...]
|
||||
% | [binary(),...]
|
||||
% | [boolean(),...]
|
||||
% | [non_neg_integer(),...])
|
||||
% -> Options :: pubsub_options:options_item()
|
||||
% | pubsub_options:options_node()
|
||||
% | pubsub_options:options_subscription()
|
||||
%).
|
||||
|
||||
set_value(Options, Key, Value) ->
|
||||
lists:keyreplace(Key, 1, Options, {Key, Value}).
|
||||
|
||||
%%
|
||||
|
||||
%-spec(get_option/2 ::
|
||||
%(
|
||||
% Options :: {Node_Options :: pubsub_options:options_node(),
|
||||
% Item_Options :: [] | pubsub_options:options_item()}
|
||||
% | pubsub_options:options_item()
|
||||
% | pubsub_options:options_node()
|
||||
% | pubsub_options:options_subscription()
|
||||
% | [],
|
||||
% Key :: atom())
|
||||
% -> Option :: pubsub_options:option_item()
|
||||
% | pubsub_options:option_node()
|
||||
% | pubsub_options:option_subscription()
|
||||
% | 'none'
|
||||
%).
|
||||
|
||||
get_option({Node_Options, [] = _Item_Options}, Key) ->
|
||||
get_option(Node_Options, Key, 'none');
|
||||
%%
|
||||
get_option({Node_Options, Item_Options}, Key) ->
|
||||
case get_option(Item_Options, Key, 'none') of
|
||||
'none' -> get_option(Node_Options, Key, 'none');
|
||||
Option -> Option
|
||||
end;
|
||||
%%
|
||||
get_option([], _Key) -> 'none';
|
||||
%%
|
||||
get_option(Options, Key) ->
|
||||
get_option(Options, Key, 'none').
|
||||
|
||||
%%%
|
||||
%-spec(get_option/3 ::
|
||||
%(
|
||||
% Options :: {Node_Options :: pubsub_options:options_node(),
|
||||
% Item_Options :: [] | pubsub_options:options_item()}
|
||||
% | pubsub_options:options_item()
|
||||
% | pubsub_options:options_node()
|
||||
% | pubsub_options:options_subscription(),
|
||||
% Key :: atom(),
|
||||
% Default :: term())
|
||||
% -> Option :: pubsub_options:option_item()
|
||||
% | pubsub_options:option_node()
|
||||
% | pubsub_options:option_subscription()
|
||||
% | term()
|
||||
%).
|
||||
|
||||
get_option({Node_Options, [] = _Item_Options}, Key, Default) ->
|
||||
get_option(Node_Options, Key, Default);
|
||||
%%
|
||||
get_option({Node_Options, Item_Options}, Key, Default) ->
|
||||
case get_option(Item_Options, Key, 'none') of
|
||||
'none' -> get_option(Node_Options, Key, Default);
|
||||
Option -> Option
|
||||
end;
|
||||
%%
|
||||
get_option(Options, Key, Default) ->
|
||||
case lists:keyfind(Key, 1, Options) of
|
||||
{_Key, Value} -> _Option = {Key, Value};
|
||||
false -> Default
|
||||
end.
|
||||
|
||||
%%
|
||||
-spec(get_entity_roster/1 ::
|
||||
(
|
||||
Entity :: xmpp_jid:usr_entity()
|
||||
| xmpp_jid:entity())
|
||||
-> Roster::[Roster_Item::#roster{}]
|
||||
).
|
||||
|
||||
get_entity_roster({U,S, _R} = _USR_Entity) ->
|
||||
_Roster = ejabberd_hooks:run_fold(roster_get, S, [], [{U,S}]);
|
||||
get_entity_roster(#jid{luser = U, lserver = S} = _Jid_Entity) ->
|
||||
_Roster = get_entity_roster({U,S, undefined}).
|
||||
|
||||
%%
|
||||
-spec(check_access_model/3 ::
|
||||
(
|
||||
Host :: xmpp_jid:raw_jid_component_bare(),
|
||||
Entity :: xmpp_jid:usr_entity(),
|
||||
Criteria :: {Access_Model :: pubsub_options:access_model(),
|
||||
Affiliation :: exmpp_pubsub:affiliation(),
|
||||
Subscriptions :: exmpp_pubsub:subscriptions(),
|
||||
Node_Owners :: [Node_Owner::xmpp_jid:usr_bare(),...],
|
||||
Rosters_Groups_Allowed :: pubsub_options:rosters_groups_allowed()})
|
||||
-> ok
|
||||
%%%
|
||||
| {error, 'forbidden'}
|
||||
).
|
||||
|
||||
check_access_model(_Host, _Entity,
|
||||
{_Access_Model, 'outcast' = _Affiliation, _Subscriptions, _Node_Owners,
|
||||
_Rosters_Groups_Allowed}) ->
|
||||
{error, 'forbidden'};
|
||||
%%
|
||||
check_access_model(_Host, _Entity,
|
||||
{'open' = _Access_Model, _Affiliation, _Subscriptions, _Node_Owners,
|
||||
_Rosters_Groups_Allowed}) ->
|
||||
ok;
|
||||
%%
|
||||
check_access_model(Host, Entity,
|
||||
{'presence' = _Access_Model, _Affiliation, _Subscriptions, Node_Owners,
|
||||
_Rosters_Groups_Allowed}) ->
|
||||
case is_contact_subscribed_to_node_owners(Host, Entity, Node_Owners) of
|
||||
false ->
|
||||
{error, 'forbidden'};
|
||||
_Node_Owner ->
|
||||
ok
|
||||
end;
|
||||
%%
|
||||
check_access_model(_Host, Entity,
|
||||
{'roster' = _Access_Model, _Affiliation, _Subscriptions, _Node_Owners,
|
||||
Rosters_Groups_Allowed}) ->
|
||||
case is_contact_in_allowed_roster_groups(Entity, Rosters_Groups_Allowed) of
|
||||
false ->
|
||||
{error, 'forbidden'};
|
||||
{_Node_Owner, _Roster_Group_Allowed} ->
|
||||
ok
|
||||
end;
|
||||
%%
|
||||
check_access_model(_Host, _Entity,
|
||||
{'whitelist' = _Access_Model, Affiliation, _Subscriptions, _Node_Owners,
|
||||
_Roster_Groups_Allowed})
|
||||
when Affiliation == 'member'
|
||||
%%orelse Affiliation == 'owner'
|
||||
orelse Affiliation == 'publish-only'
|
||||
orelse Affiliation == 'publisher' ->
|
||||
ok;
|
||||
check_access_model(_Host, _Entity,
|
||||
{'whitelist' = _Access_Model, _Affiliation, _Subscriptions, _Node_Owners,
|
||||
_Roster_Groups_Allowed}) ->
|
||||
{error, 'forbidden'};
|
||||
%%
|
||||
check_access_model(_Host, _Entity,
|
||||
{'authorize' = _Access_Model, _Affiliation, Subscriptions, _Node_Owners,
|
||||
_Roster_Groups_Allowed}) ->
|
||||
case has_subscriptions(Subscriptions) of
|
||||
true -> ok;
|
||||
false -> {error, 'forbidden'}
|
||||
end.
|
||||
|
||||
|
||||
|
||||
%%
|
||||
-spec(check_access_model/7 ::
|
||||
(
|
||||
Host :: xmpp_jid:raw_jid_component_bare(),
|
||||
Entity :: xmpp_jid:usr_entity(),
|
||||
Access_Model :: pubsub_options:access_model(),
|
||||
Affiliation :: exmpp_pubsub:affiliation(),
|
||||
Subscriptions :: exmpp_pubsub:subscriptions(),
|
||||
Node_Owners :: [Node_Owner::xmpp_jid:usr_bare(),...],
|
||||
Rosters_Groups_Allowed :: pubsub_options:rosters_groups_allowed())
|
||||
-> ok
|
||||
%%%
|
||||
| {error, 'forbidden'}
|
||||
| {error, 'item-not-found'}
|
||||
).
|
||||
|
||||
check_access_model(_Host, _Entity, _Access_Model, 'owner' = _Affiliation,
|
||||
_Subscriptions, _Node_Owners, _Rosters_Groups_Allowed) ->
|
||||
ok;
|
||||
%%
|
||||
check_access_model(Host, Entity, Access_Model, 'outcast' = _Affiliation,
|
||||
_Subscriptions, Node_Owners, Rosters_Groups_Allowed) ->
|
||||
case Access_Model of
|
||||
%%
|
||||
'open'->
|
||||
{error, 'forbidden'};
|
||||
%%
|
||||
'presence' ->
|
||||
case
|
||||
is_contact_subscribed_to_node_owners(Host, Entity, Node_Owners)
|
||||
of
|
||||
false ->
|
||||
{error, 'item-not-found'};
|
||||
_Node_Owner ->
|
||||
{error, 'forbidden'}
|
||||
end;
|
||||
%%
|
||||
'roster' ->
|
||||
case
|
||||
is_contact_in_allowed_roster_groups(Entity,
|
||||
Rosters_Groups_Allowed)
|
||||
of
|
||||
false ->
|
||||
{error, 'item-not-found'};
|
||||
{_Node_Owner, _Roster_Group_Allowed} ->
|
||||
{error, 'forbidden'}
|
||||
end;
|
||||
%%
|
||||
'authorize' ->
|
||||
{error, 'forbidden'};
|
||||
%%
|
||||
'whitelist' ->
|
||||
{error, 'item-not-found'}
|
||||
end;
|
||||
%%
|
||||
check_access_model(_Host, _Entity, 'open' = _Access_Model, _Affiliation,
|
||||
_Subscriptions, _Node_Owners, _Rosters_Groups_Allowed) ->
|
||||
ok;
|
||||
%%
|
||||
check_access_model(Host, Entity, 'presence' = _Access_Model, _Affiliation,
|
||||
_Subscriptions, Node_Owners, _Rosters_Groups_Allowed) ->
|
||||
case is_contact_subscribed_to_node_owners(Host, Entity, Node_Owners) of
|
||||
false ->
|
||||
{error, 'item-not-found'};
|
||||
_Node_Owner ->
|
||||
ok
|
||||
end;
|
||||
%%
|
||||
check_access_model(_Host, Entity, 'roster' = _Access_Model, _Affiliation,
|
||||
_Subscriptions, _Node_Owners, Rosters_Groups_Allowed) ->
|
||||
case is_contact_in_allowed_roster_groups(Entity, Rosters_Groups_Allowed) of
|
||||
false ->
|
||||
{error, 'item-not-found'};
|
||||
{_Node_Owner, _Roster_Group_Allowed} ->
|
||||
ok
|
||||
end;
|
||||
%%
|
||||
check_access_model(_Host, _Entity, 'whitelist' = _Access_Model, Affiliation,
|
||||
_Subscriptions, _Node_Owners, _Roster_Groups_Allowed) ->
|
||||
case Affiliation of
|
||||
Affiliation
|
||||
when Affiliation == 'member'
|
||||
orelse Affiliation == 'publish-only'
|
||||
orelse Affiliation == 'publisher' ->
|
||||
ok;
|
||||
_Affiliation ->
|
||||
{error, 'item-not-found'}
|
||||
end;
|
||||
%%
|
||||
check_access_model(_Host, _Entity, 'authorize' = _Access_Model, _Affiliation,
|
||||
Subscriptions, _Node_Owners, _Roster_Groups_Allowed) ->
|
||||
case has_subscriptions(Subscriptions) of
|
||||
true ->
|
||||
ok;
|
||||
false ->
|
||||
{error, 'item-not-found'}
|
||||
end.
|
||||
|
||||
|
||||
-spec(check_publish_model/3 ::
|
||||
(
|
||||
Publish_Model :: pubsub_options:publish_model(),
|
||||
Affiliation :: exmpp_pubsub:affiliation(),
|
||||
Subscriptions :: exmpp_pubsub:subscriptions())
|
||||
-> ok
|
||||
%%%
|
||||
| {error, 'forbidden'}
|
||||
).
|
||||
|
||||
check_publish_model('open' = _Publish_Model, _Affiliation, _Subscriptions) ->
|
||||
ok;
|
||||
%%
|
||||
check_publish_model('publishers' = _Publish_Model, Affiliation, _Subscriptions) ->
|
||||
case Affiliation of
|
||||
Affiliation
|
||||
when Affiliation == 'owner'
|
||||
orelse Affiliation == 'publish-only'
|
||||
orelse Affiliation == 'publisher' ->
|
||||
ok;
|
||||
_Affiliation ->
|
||||
{error, 'forbidden'}
|
||||
end;
|
||||
%%
|
||||
check_publish_model('subscribers' = _Publish_Model, Affiliation, Subscriptions) ->
|
||||
case Affiliation of
|
||||
'owner' ->
|
||||
ok;
|
||||
_Affiliation ->
|
||||
case has_subscriptions(Subscriptions) of
|
||||
true ->
|
||||
ok;
|
||||
false ->
|
||||
{error, 'forbidden'}
|
||||
end
|
||||
end.
|
||||
|
||||
%%
|
||||
-spec(has_subscriptions/1 ::
|
||||
(
|
||||
Subscriptions :: exmpp_pubsub:subscriptions())
|
||||
-> Has_Subscriptions::boolean()
|
||||
).
|
||||
|
||||
has_subscriptions([] = _Subscriptions) ->
|
||||
false;
|
||||
has_subscriptions(
|
||||
[{'pending' = _Subscription_State, _SubId, _Resource, _Subscription_Options}]) ->
|
||||
false;
|
||||
has_subscriptions(_Subscriptions) ->
|
||||
true.
|
||||
|
||||
%%
|
||||
%% @doc Check if a contact is subscribed to at least one local node owner
|
||||
%% amongst a list of (remote and local) node owners
|
||||
-spec(is_contact_subscribed_to_node_owners/3 ::
|
||||
(
|
||||
Host :: xmpp_jid:raw_jid_component_bare(),
|
||||
Contact :: xmpp_jid:usr_entity(),
|
||||
Node_Owners :: [] | [Node_Owner::xmpp_jid:usr_bare(),...])
|
||||
-> Is_Contact_Subscribed_To_Node_Owners :: false | xmpp_jid:usr_bare()
|
||||
).
|
||||
|
||||
is_contact_subscribed_to_node_owners(_Host, _Contact, [] = _Node_Owners) ->
|
||||
false;
|
||||
%% The node owner is a local entity, check if the contact is subscribed to it
|
||||
is_contact_subscribed_to_node_owners(Host, Contact,
|
||||
[{_U, Host, _R} = Local_Node_Owner | Node_Owners] = _Node_Owners) ->
|
||||
_Is_Contact_Subscribed_To_Node_Owners = case
|
||||
is_contact_subscribed_to_entity(Contact,
|
||||
_Local_Node_Owner_Roster = get_entity_roster(Local_Node_Owner))
|
||||
of
|
||||
true ->
|
||||
Local_Node_Owner;
|
||||
false ->
|
||||
is_contact_subscribed_to_node_owners(Host, Contact, Node_Owners)
|
||||
end;
|
||||
%% The node owner is a remote entity, don't check if the contact is subscribed to it
|
||||
is_contact_subscribed_to_node_owners(Host, Contact,
|
||||
[_Remote_Node_Owner | Node_Owners] = _Node_Owners) ->
|
||||
is_contact_subscribed_to_node_owners(Host, Contact, Node_Owners).
|
||||
|
||||
%%
|
||||
%% @doc Check if an entity is in a #roster{}
|
||||
%% with #roster.subscription == 'from' or
|
||||
%% with #roster.subscription == 'both'
|
||||
-spec(is_contact_subscribed_to_entity/2 ::
|
||||
(
|
||||
Contact :: xmpp_jid:usr_entity(),
|
||||
Entity_Roster :: [] | [Roster_Item::#roster{},...])
|
||||
-> Is_Contact_Subscribed::boolean()
|
||||
).
|
||||
|
||||
is_contact_subscribed_to_entity(_Contact, [] = _Entity_Roster) ->
|
||||
_Is_Contact_Subscribed = false;
|
||||
%% Contact is included in a #roster{} item with
|
||||
%% a subscription of type 'from' and 'both' (i.e. is subscribed to it)
|
||||
is_contact_subscribed_to_entity({U, S, _R} = _Contact,
|
||||
[#roster{jid = {U, S, _}, subscription = Subscription} = _Roster_Item
|
||||
| _Roster_Items] = _Entity_Roster)
|
||||
when Subscription == 'from' orelse Subscription == 'both' ->
|
||||
_Is_Contact_Subscribed = true;
|
||||
%% Contact is not included in a #roster{} item
|
||||
%% or has a subscription of type different than 'from' and 'both'
|
||||
%% ( i.e. is not subscribed to it),
|
||||
%% check next roster items
|
||||
is_contact_subscribed_to_entity(Contact,
|
||||
[_Roster_Item | Roster_Items] = _Entity_Roster) ->
|
||||
_Is_Contact_Subscribed = is_contact_subscribed_to_entity(Contact,
|
||||
Roster_Items).
|
||||
|
||||
%%
|
||||
-spec(is_contact_in_allowed_roster_groups/2 ::
|
||||
(
|
||||
Contact :: xmpp_jid:usr_entity(),
|
||||
Rosters_Groups_Allowed :: pubsub_options:rosters_groups_allowed())
|
||||
-> Roster_Group_Allowed :: false
|
||||
| {Entity :: xmpp_jid:usr_bare(),
|
||||
Roster_Group :: pubsub_options:roster_group()}
|
||||
).
|
||||
|
||||
is_contact_in_allowed_roster_groups(_Contact, [] = _Rosters_Groups_Allowed) ->
|
||||
false;
|
||||
%%
|
||||
is_contact_in_allowed_roster_groups(Contact,
|
||||
[{Entity, Entity_Roster_Groups_Allowed} | Rosters_Groups_Allowed]
|
||||
= _Rosters_Groups_Allowed) ->
|
||||
case
|
||||
is_contact_in_allowed_roster_group(Contact,
|
||||
_Entity_Roster = get_entity_roster(Entity),
|
||||
Entity_Roster_Groups_Allowed)
|
||||
of
|
||||
false ->
|
||||
is_contact_in_allowed_roster_groups(Contact, Rosters_Groups_Allowed);
|
||||
Roster_Group ->
|
||||
{Entity, Roster_Group}
|
||||
end.
|
||||
|
||||
%%
|
||||
-spec(is_contact_in_allowed_roster_group/3 ::
|
||||
(
|
||||
Contact :: xmpp_jid:usr_entity(),
|
||||
Entity_Roster :: [] | [Roster_Item::#roster{groups::pubsub_options:roster_groups()}],
|
||||
Roster_Groups_Allowed :: [Roster_Group_Allowed::pubsub_options:roster_group(),...])
|
||||
-> Roster_Group :: false | pubsub_options:roster_group()
|
||||
).
|
||||
|
||||
is_contact_in_allowed_roster_group(_Contact, [] = _Entity_Roster,
|
||||
_Roster_Groups_Allowed) ->
|
||||
false;
|
||||
%%
|
||||
is_contact_in_allowed_roster_group({U, S, _R} = _Contact,
|
||||
[#roster{jid = {U, S, _}, subscription = Subscription, groups = Roster_Groups}
|
||||
| _Other_Roster_Items] = _Entity_Roster, Roster_Groups_Allowed)
|
||||
when Subscription == 'from' orelse Subscription == 'both' ->
|
||||
is_contact_in_allowed_roster_group(Roster_Groups, Roster_Groups_Allowed);
|
||||
%%
|
||||
is_contact_in_allowed_roster_group(Contact,
|
||||
[_Roster_Item | Roster_Items] = _Entity_Roster, Roster_Groups_Allowed) ->
|
||||
is_contact_in_allowed_roster_group(Contact, Roster_Items,
|
||||
Roster_Groups_Allowed).
|
||||
|
||||
%%
|
||||
-spec(is_contact_in_allowed_roster_group/2 ::
|
||||
(
|
||||
Roster_Groups :: [] | [Roster_Group::pubsub_options:roster_group()],
|
||||
Roster_Groups_Allowed :: [Roster_Group_Allowed::pubsub_options:roster_group(),...])
|
||||
-> Roster_Group :: false | pubsub_options:roster_group()
|
||||
).
|
||||
|
||||
is_contact_in_allowed_roster_group([] = _Roster_Groups, _Roster_Groups_Allowed) ->
|
||||
false;
|
||||
%%
|
||||
is_contact_in_allowed_roster_group([Roster_Group | Roster_Groups]
|
||||
= _Roster_Groups, Roster_Groups_Allowed) ->
|
||||
case lists:member(Roster_Group, Roster_Groups_Allowed) of
|
||||
true ->
|
||||
Roster_Group;
|
||||
false ->
|
||||
is_contact_in_allowed_roster_group(Roster_Groups,
|
||||
Roster_Groups_Allowed)
|
||||
end.
|
||||
|
||||
%%
|
||||
-spec(get_user_resources/2 ::
|
||||
(
|
||||
User :: binary(),
|
||||
Server :: binary())
|
||||
-> Resources::[Resource::xmpp_jid:resource_jid()]
|
||||
).
|
||||
|
||||
get_user_resources(User, Server) ->
|
||||
ejabberd_sm:get_user_resources(User, Server).
|
||||
|
||||
%%
|
||||
-spec(get_resources_show/2 ::
|
||||
(
|
||||
User :: binary(),
|
||||
Server :: binary())
|
||||
-> Resources_Show :: [{Resource :: xmpp_jid:resource_jid(),
|
||||
Show :: 'away' | 'chat' | 'dnd' | 'online' | 'xa' }]
|
||||
).
|
||||
|
||||
get_resources_show(User, Server) ->
|
||||
_Resources_Show = lists:foldl(fun
|
||||
(Resource, Resources_Show) ->
|
||||
case ejabberd_sm:get_session_pid(User, Server, Resource) of
|
||||
C2SPid when is_pid(C2SPid) ->
|
||||
case ejabberd_c2s:get_presence(C2SPid) of
|
||||
{_User, _Resource, Show, _} ->
|
||||
[{Resource, list_to_atom(Show)} | Resources_Show];
|
||||
_ ->
|
||||
Resources_Show
|
||||
end;
|
||||
_ ->
|
||||
Resources_Show
|
||||
end
|
||||
end, [], _Resources = ejabberd_sm:get_user_resources(User, Server)).
|
||||
|
||||
|
||||
%%
|
||||
-spec(rosters_groups_allowed_cache/2 ::
|
||||
(
|
||||
Rosters_Groups_Allowed :: pubsub_options:rosters_groups_allowed(),
|
||||
Rosters_Groups_Allowed_Cache :: pubsub_options:rosters_groups_allowed())
|
||||
-> Is_Roster_Groups_Cached::boolean()
|
||||
).
|
||||
|
||||
rosters_groups_allowed_cache(_Rosters_Groups_Allowed,
|
||||
[] = _Rosters_Groups_Allowed_Cache) ->
|
||||
false;
|
||||
%%
|
||||
rosters_groups_allowed_cache([] = _Rosters_Groups_Allowed,
|
||||
_Rosters_Groups_Allowed_Cache) ->
|
||||
false;
|
||||
%%
|
||||
rosters_groups_allowed_cache(
|
||||
[{Entity, Roster_Groups_Allowed} | Rosters_Groups_Allowed],
|
||||
Rosters_Groups_Allowed_Cache) ->
|
||||
case lists:keyfind(Entity, 1, Rosters_Groups_Allowed_Cache) of
|
||||
{_Entity, Roster_Groups_Allowed_Cache} ->
|
||||
case
|
||||
roster_groups_allowed_cache(Roster_Groups_Allowed,
|
||||
Roster_Groups_Allowed_Cache)
|
||||
of
|
||||
true ->
|
||||
true;
|
||||
false ->
|
||||
rosters_groups_allowed_cache(Rosters_Groups_Allowed,
|
||||
Rosters_Groups_Allowed_Cache)
|
||||
end;
|
||||
false ->
|
||||
rosters_groups_allowed_cache(Rosters_Groups_Allowed,
|
||||
Rosters_Groups_Allowed_Cache)
|
||||
end.
|
||||
|
||||
%%
|
||||
-spec(roster_groups_allowed_cache/2 ::
|
||||
(
|
||||
Roster_Groups_Allowed :: [Roster_Group_Allowed::pubsub_options:roster_group()],
|
||||
Roster_Groups_Allowed_Cache :: [Roster_Group_Allowed_Cache::pubsub_options:roster_group()])
|
||||
-> Is_Roster_Groups_Cached :: boolean()
|
||||
).
|
||||
|
||||
roster_groups_allowed_cache(_Roster_Groups_Allowed,
|
||||
[] = _Roster_Groups_Allowed_Cache) ->
|
||||
false;
|
||||
%%
|
||||
roster_groups_allowed_cache([] = _Roster_Groups_Allowed,
|
||||
_Roster_Groups_Allowed_Cache) ->
|
||||
false;
|
||||
%%
|
||||
roster_groups_allowed_cache([Roster_Group_Allowed | Roster_Groups_Allowed],
|
||||
Roster_Groups_Allowed_Cache) ->
|
||||
case lists:member(Roster_Group_Allowed, Roster_Groups_Allowed_Cache) of
|
||||
true ->
|
||||
true;
|
||||
false ->
|
||||
roster_groups_allowed_cache(Roster_Groups_Allowed,
|
||||
Roster_Groups_Allowed_Cache)
|
||||
end.
|
||||
|
||||
@@ -0,0 +1,108 @@
|
||||
-module(xmpp_xdata).
|
||||
|
||||
|
||||
-include("jlib.hrl").
|
||||
-include("ejabberd.hrl").
|
||||
-compile(export_all).
|
||||
|
||||
xmlcdata(CData) ->
|
||||
{xmlcdata, CData}.
|
||||
|
||||
xmlattr(Name, Value) ->
|
||||
% #xmlattr{name = Name, value = Value}.
|
||||
{Name, Value}.
|
||||
|
||||
xmlattr_label(Label) ->
|
||||
xmlattr(<<"label">>, Label).
|
||||
|
||||
xmlattr_type(Type) ->
|
||||
xmlattr(<<"type">>, Type).
|
||||
|
||||
xmlattr_var(Var) ->
|
||||
xmlattr(<<"var">>, Var).
|
||||
|
||||
|
||||
xmlel(NS, Name, Attrs, Children) ->
|
||||
#xmlel{name = Name, attrs = [{<<"xmlns">>, NS} | Attrs], children = Children}.
|
||||
|
||||
xmlel(Name, Attrs, Children) ->
|
||||
xmlel(?NS_XDATA, Name, Attrs, Children).
|
||||
|
||||
xmlel_desc(CData) ->
|
||||
xmlel(<<"desc">>, [], [xmlcdata(CData)]).
|
||||
|
||||
xmlel_value(Value) ->
|
||||
xmlel(<<"value">>, [], [xmlcdata(Value)]).
|
||||
|
||||
xmlel_option({Value, Label}) ->
|
||||
xmlel(<<"option">>, [xmlattr_label(Label)], [xmlel_value(Value)]);
|
||||
xmlel_option(Value) ->
|
||||
xmlel(<<"option">>, [], [xmlel_value(Value)]).
|
||||
|
||||
xmlel_field(Var, Type, Values) ->
|
||||
xmlel(<<"field">>,
|
||||
[xmlattr_var(Var),
|
||||
xmlattr_type(Type)],
|
||||
[xmlel_value(Value) || Value <- Values]).
|
||||
|
||||
xmlel_field(Var, Type, Label, Values, Options) ->
|
||||
xmlel(<<"field">>,
|
||||
[xmlattr_var(Var),
|
||||
xmlattr_label(Label),
|
||||
xmlattr_type(Type)],
|
||||
[xmlel_option(Option) || Option <- Options]
|
||||
++
|
||||
[xmlel_value(Value) || Value <- Values]).
|
||||
|
||||
xmlel_field_boolean(Var, Label, Value) ->
|
||||
xmlel_field(Var, <<"boolean">>, Label, [Value], []).
|
||||
|
||||
%%
|
||||
xmlel_field_fixed(Var, Label, Value) ->
|
||||
xmlel_field(Var, <<"fixed">>, Label, [Value], []).
|
||||
|
||||
%%
|
||||
xmlel_field_hidden(Var, Value) ->
|
||||
xmlel_field(Var, <<"hidden">>, [Value]).
|
||||
|
||||
%%
|
||||
xmlel_field_list_single(Var, Label, Value, Options) ->
|
||||
xmlel_field(Var, <<"list-single">>, Label, [Value], Options).
|
||||
|
||||
%%
|
||||
xmlel_field_list_multi(Var, Label, Values, Options) ->
|
||||
xmlel_field(Var, <<"list-multi">>, Label, Values, Options).
|
||||
|
||||
%%
|
||||
xmlel_field_text_single(Var, Label, undefined = _Text) ->
|
||||
xmlel_field(Var, <<"text-single">>, Label, [], []);
|
||||
%%
|
||||
xmlel_field_text_single(Var, Label, Text) ->
|
||||
xmlel_field(Var, <<"text-single">>, Label, [Text], []).
|
||||
|
||||
%%
|
||||
xmlel_field_text_multi(Var, Label, Values) ->
|
||||
xmlel_field(Var, <<"text-multi">>, Label, Values, []).
|
||||
|
||||
%%
|
||||
xmlel_field_jid_multi(Var, Label, Jids) ->
|
||||
xmlel_field(Var, <<"jid-multi">>, Label, Jids, []).
|
||||
|
||||
%%
|
||||
xmlel_field_jid_single(Var, Label, Jid) ->
|
||||
xmlel_field(Var, <<"jid-single">>, Label, [Jid], []).
|
||||
|
||||
%%
|
||||
xmlel_x(Type, Fields) ->
|
||||
xmlel(<<"x">>, [xmlattr_type(Type)], Fields).
|
||||
|
||||
%%
|
||||
xmlel_title(Title) ->
|
||||
xmlel(<<"title">>, [], [xmlcdata(Title)]).
|
||||
|
||||
%%
|
||||
xmlel_instructions(Instructions) when is_list(Instructions) ->
|
||||
lists:map(fun xmlel_instructions/1, Instructions);
|
||||
%%
|
||||
xmlel_instructions(Instruction) when is_binary(Instruction) ->
|
||||
xmlel(<<"instructions">>, [], [xmlcdata(Instruction)]).
|
||||
@@ -20,11 +20,13 @@
|
||||
{"Allow users to send invites","Permetre que els usuaris envien invitacions"}.
|
||||
{"Allow users to send private messages","Permetre que els usuaris envien missatges privats"}.
|
||||
{"Allow visitors to change nickname","Permetre als visitants canviar el Nickname"}.
|
||||
{"Allow visitors to send private messages to","Permetre als visitants enviar missatges privats a"}.
|
||||
{"Allow visitors to send status text in presence updates","Permetre als visitants enviar text d'estat en les actualitzacions de presència"}.
|
||||
{"Allow visitors to send voice requests","Permetre als visitants enviar peticions de veu"}.
|
||||
{"All Users","Tots els usuaris"}.
|
||||
{"Announcements","Anuncis"}.
|
||||
{"anyone","qualsevol"}.
|
||||
{"A password is required to enter this room","Es necessita password per a entrar en aquesta sala"}.
|
||||
{"A password is required to enter this room","Es necessita contrasenya per a entrar en aquesta sala"}.
|
||||
{"April","Abril"}.
|
||||
{"August","Agost"}.
|
||||
{"Backup","Guardar còpia de seguretat"}.
|
||||
@@ -33,11 +35,17 @@
|
||||
{"Backup to File at ","Desar còpia de seguretat a fitxer en "}.
|
||||
{"Bad format","Format erroni"}.
|
||||
{"Birthday","Aniversari"}.
|
||||
{"Change Password","Canviar password"}.
|
||||
{"Change User Password","Canviar Password d'Usuari"}.
|
||||
{"CAPTCHA web page","Pàgina web del CAPTCHA"}.
|
||||
{"Change Password","Canviar Contrasenya"}.
|
||||
{"Change User Password","Canviar Contrasenya d'Usuari"}.
|
||||
{"Characters not allowed:","Caràcters no permesos:"}.
|
||||
{"Chatroom configuration modified","Configuració de la sala de xat modificada"}.
|
||||
{"Chatroom is created","La sala s'ha creat"}.
|
||||
{"Chatroom is destroyed","La sala s'ha destruït"}.
|
||||
{"Chatroom is started","La sala s'ha iniciat"}.
|
||||
{"Chatroom is stopped","La sala s'ha aturat"}.
|
||||
{"Chatrooms","Sales de xat"}.
|
||||
{"Choose a username and password to register with this server","Tria nom d'usuari i password per a registrar-te en aquest servidor"}.
|
||||
{"Choose a username and password to register with this server","Tria nom d'usuari i contrasenya per a registrar-te en aquest servidor"}.
|
||||
{"Choose modules to stop","Selecciona mòduls a detindre"}.
|
||||
{"Choose storage type of tables","Selecciona el tipus d'almacenament de les taules"}.
|
||||
{"Choose whether to approve this entity's subscription.","Tria si aprova aquesta entitat de subscripció"}.
|
||||
@@ -65,15 +73,16 @@
|
||||
{"Description:","Descripció:"}.
|
||||
{"Disc only copy","Còpia sols en disc"}.
|
||||
{"Displayed Groups:","Mostrar grups:"}.
|
||||
{"Don't tell your password to anybody, not even the administrators of the Jabber server.","No li donis la teva contrasenya a ningú, ni tan sols als administradors del servidor Jabber."}.
|
||||
{"Dump Backup to Text File at ","Exporta còpia de seguretat a fitxer de text en "}.
|
||||
{"Dump to Text File","Exportar a fitxer de text"}.
|
||||
{"Edit Properties","Editar propietats"}.
|
||||
{"Either approve or decline the voice request.","Aprova o denega la petició de veu"}.
|
||||
{"ejabberd IRC module","mòdul ejabberd IRC"}.
|
||||
{"ejabberd MUC module","mòdul ejabberd MUC"}.
|
||||
{"ejabberd Publish-Subscribe module","Mòdul ejannerd Publicar-Subscriure"}.
|
||||
{"ejabberd Publish-Subscribe module","Mòdul ejabberd Publicar-Subscriure"}.
|
||||
{"ejabberd SOCKS5 Bytestreams module","mòdul ejabberd SOCKS5 Bytestreams"}.
|
||||
{"ejabberd vCard module","Mòdul ejabberd vCard"}.
|
||||
{"ejabberd virtual hosts","Hosts virtuals del ejabberd"}.
|
||||
{"ejabberd Web Admin","Web d'administració del ejabberd"}.
|
||||
{"Elements","Elements"}.
|
||||
{"Email","Email"}.
|
||||
@@ -86,14 +95,16 @@
|
||||
{"Enter path to jabberd14 spool dir","Introdueix la ruta al directori de jabberd14 spools"}.
|
||||
{"Enter path to jabberd14 spool file","Introdueix ruta al fitxer jabberd14 spool"}.
|
||||
{"Enter path to text file","Introdueix ruta al fitxer de text"}.
|
||||
{"Enter the text you see","Introdueix el textque veus"}.
|
||||
{"Enter the text you see","Introdueix el text que veus"}.
|
||||
{"Enter username and encodings you wish to use for connecting to IRC servers. Press 'Next' to get more fields to fill in. Press 'Complete' to save settings.","Introdueix el nom d'usuari i les codificacions de caràcters per a utilitzar als servidors de IRC. Apreta \"Seguent\" per veure més caps per omplir. Apreta \"Completar\" per guardar la configuració. "}.
|
||||
{"Enter username, encodings, ports and passwords you wish to use for connecting to IRC servers","Introdueix el nom d'usuari, les codificacions de caràcters, els ports i contrassenyes per a utilitzar al connectar als servidors de IRC "}.
|
||||
{"Enter username, encodings, ports and passwords you wish to use for connecting to IRC servers","Introdueix el nom d'usuari, les codificacions de caràcters, els ports i contrasenyes per a utilitzar al connectar als servidors de IRC"}.
|
||||
{"Erlang Jabber Server","Servidor Erlang Jabber"}.
|
||||
{"Error","Error"}.
|
||||
{"Example: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef.net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}].","Exemple: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef.net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."}.
|
||||
{"Exclude Jabber IDs from CAPTCHA challenge","Excloure Jabber IDs de la comprovació CAPTCHA"}.
|
||||
{"Export data of all users in the server to PIEFXIS files (XEP-0227):","Exportar dades de tots els usuaris del servidor a arxius PIEFXIS (XEP-0227):"}.
|
||||
{"Export data of users in a host to PIEFXIS files (XEP-0227):","Exportar dades d'usuaris d'un host a arxius PIEFXIS (XEP-0227):"}.
|
||||
{"Failed to extract JID from your voice request approval","No s'ha pogut extraure el JID de la teva aprovació de petició de veu"}.
|
||||
{"Family Name","Cognom"}.
|
||||
{"February","Febrer"}.
|
||||
{"Fill in fields to search for any matching Jabber User","Emplena camps per a buscar usuaris Jabber que concorden"}.
|
||||
@@ -105,8 +116,9 @@
|
||||
{"Get Number of Online Users","Obtenir Número d'Usuaris Connectats"}.
|
||||
{"Get Number of Registered Users","Obtenir Número d'Usuaris Registrats"}.
|
||||
{"Get User Last Login Time","Obtenir la última connexió d'Usuari"}.
|
||||
{"Get User Password","Obtenir Password d'usuari"}.
|
||||
{"Get User Password","Obtenir Contrasenya d'usuari"}.
|
||||
{"Get User Statistics","Obtenir Estadístiques d'Usuari"}.
|
||||
{"Grant voice to this person?","Concedir veu a aquesta persona?"}.
|
||||
{"Group ","Grup "}.
|
||||
{"Groups","Grups"}.
|
||||
{"has been banned","Has sigut banejat"}.
|
||||
@@ -116,7 +128,8 @@
|
||||
{"has been kicked","Has sigut expulsat"}.
|
||||
{" has set the subject to: "," ha posat l'assumpte: "}.
|
||||
{"Host","Host"}.
|
||||
{"If you want to specify different ports, passwords, encodings for IRC servers, fill this list with values in format '{\"irc server\", \"encoding\", port, \"password\"}'. By default this service use \"~s\" encoding, port ~p, empty password.","Si vols especificar codificacions de caràcters diferents per a cada servidor IRC emplena aquesta llista amb els valors amb el format '{\"servidor irc\", \"codificació\", port, \"contrassenya\"}'. Aquest servei utilitza per defecte la codificació \"~s\", port ~p, no contrassenya."}.
|
||||
{"If you don't see the CAPTCHA image here, visit the web page.","Si no veus la imatge CAPTCHA açí, visita la pàgina web."}.
|
||||
{"If you want to specify different ports, passwords, encodings for IRC servers, fill this list with values in format '{\"irc server\", \"encoding\", port, \"password\"}'. By default this service use \"~s\" encoding, port ~p, empty password.","Si vols especificar codificacions de caràcters diferents per a cada servidor IRC emplena aquesta llista amb els valors amb el format '{\"servidor irc\", \"codificació\", port, \"contrasenya\"}'. Aquest servei utilitza per defecte la codificació \"~s\", port ~p, no contrasenya."}.
|
||||
{"Import Directory","Importar directori"}.
|
||||
{"Import File","Importar fitxer"}.
|
||||
{"Import user data from jabberd14 spool file:","Importar dades d'usuaris de l'arxiu de spool de jabberd14"}.
|
||||
@@ -126,7 +139,7 @@
|
||||
{"Import Users from Dir at ","Importar usuaris des del directori en "}.
|
||||
{"Import Users From jabberd14 Spool Files","Importar usuaris de jabberd14"}.
|
||||
{"Improper message type","Tipus de missatge incorrecte"}.
|
||||
{"Incorrect password","Password incorrecte"}.
|
||||
{"Incorrect password","Contrasenya incorrecta"}.
|
||||
{"Invalid affiliation: ~s","Afiliació invàlida: ~s"}.
|
||||
{"Invalid role: ~s","Rol invàlid: ~s"}.
|
||||
{"IP addresses","Adreça IP"}.
|
||||
@@ -140,7 +153,8 @@
|
||||
{"is now known as","ara es conegut com"}.
|
||||
{"It is not allowed to send private messages","No està permés enviar missatges privats"}.
|
||||
{"It is not allowed to send private messages of type \"groupchat\"","No està permés enviar missatges del tipus \"groupchat\""}.
|
||||
{"It is not allowed to send private messages to the conference","No està permés l'enviament de missatges privats a la sala"}.
|
||||
{"It is not allowed to send private messages to the conference","No està permès l'enviament de missatges privats a la sala"}.
|
||||
{"Jabber Account Registration","Registre de compte Jabber"}.
|
||||
{"Jabber ID","ID Jabber"}.
|
||||
{"Jabber ID ~s is invalid","El Jabber ID ~s no és vàlid"}.
|
||||
{"January","Gener"}.
|
||||
@@ -160,10 +174,10 @@
|
||||
{"List of modules to start","Llista de mòduls a iniciar"}.
|
||||
{"Low level update script","Script d'actualització de baix nivell"}.
|
||||
{"Make participants list public","Crear una llista de participants pública"}.
|
||||
{"Make room captcha protected","Crear una sala protegida per captcha"}.
|
||||
{"Make room CAPTCHA protected","Crear una sala protegida per CAPTCHA"}.
|
||||
{"Make room members-only","Crear una sala de \"només membres\""}.
|
||||
{"Make room moderated","Crear una sala moderada"}.
|
||||
{"Make room password protected","Crear una sala amb password"}.
|
||||
{"Make room password protected","Crear una sala amb contrasenya"}.
|
||||
{"Make room persistent","Crear una sala persistent"}.
|
||||
{"Make room public searchable","Crear una sala pública"}.
|
||||
{"March","Març"}.
|
||||
@@ -173,9 +187,11 @@
|
||||
{"May","Maig"}.
|
||||
{"Membership is required to enter this room","Necessites ser membre d'aquesta sala per a poder entrar"}.
|
||||
{"Members:","Membre:"}.
|
||||
{"Memorize your password, or write it in a paper placed in a safe place. In Jabber there isn't an automated way to recover your password if you forget it.","Memoritza la teva contrasenya, o escriu-la en un paper guardat a un lloc segur.A Jabber no hi ha una forma automatitzada de recuperar la teva contrasenya si la oblides."}.
|
||||
{"Memory","Memòria"}.
|
||||
{"Message body","Missatge"}.
|
||||
{"Middle Name","Segon nom"}.
|
||||
{"Minimum interval between voice requests (in seconds)","Interval mínim entre peticions de veu (en segons)"}.
|
||||
{"Moderator privileges required","Es necessita tenir privilegis de moderador"}.
|
||||
{"moderators only","només moderadors"}.
|
||||
{"Modified modules","Mòduls modificats"}.
|
||||
@@ -186,9 +202,11 @@
|
||||
{"Name:","Nom:"}.
|
||||
{"Name","Nom"}.
|
||||
{"Never","Mai"}.
|
||||
{"New Password:","Nova Contrasenya:"}.
|
||||
{"Nickname","Nickname"}.
|
||||
{"Nickname Registration at ","Registre del Nickname en "}.
|
||||
{"Nickname ~s does not exist in the room","El Nickname ~s no existeix a la sala"}.
|
||||
{"nobody","ningú"}.
|
||||
{"No body provided for announce message","No hi ha proveedor per al missatge anunci"}.
|
||||
{"No Data","No hi ha dades"}.
|
||||
{"Node ID","ID del Node"}.
|
||||
@@ -210,14 +228,16 @@
|
||||
{"Offline Messages:","Missatges fora de línia:"}.
|
||||
{"Offline Messages","Missatges offline"}.
|
||||
{"OK","Acceptar"}.
|
||||
{"Old Password:","Antiga contrasenya:"}.
|
||||
{"Online","Connectat"}.
|
||||
{"Online Users","Usuaris conectats"}.
|
||||
{"Online Users:","Usuaris en línia:"}.
|
||||
{"Only deliver notifications to available users","Sols enviar notificacions als usuaris disponibles"}.
|
||||
{"Only moderators and participants are allowed to change the subject in this room","Només els moderadors i participants poden canviar l'assumpte d'aquesta sala"}.
|
||||
{"Only moderators are allowed to change the subject in this room","Només els moderadors poden canviar l'assumpte d'aquesta sala"}.
|
||||
{"Only moderators can approve voice requests","Només els moderadors poden aprovar les peticions de veu"}.
|
||||
{"Only occupants are allowed to send messages to the conference","Sols els ocupants poden enviar missatges a la sala"}.
|
||||
{"Only occupants are allowed to send queries to the conference","Sols els ocupants poden enviar solicituts a la sala"}.
|
||||
{"Only occupants are allowed to send queries to the conference","Sols els ocupants poden enviar sol·licituds a la sala"}.
|
||||
{"Only service administrators are allowed to send service messages","Sols els administradors del servei tenen permís per a enviar missatges de servei"}.
|
||||
{"Options","Opcions"}.
|
||||
{"Organization Name","Nom de la organizació"}.
|
||||
@@ -227,10 +247,11 @@
|
||||
{"Outgoing s2s Servers:","Servidors d'eixida de s2s"}.
|
||||
{"Owner privileges required","Es requerixen privilegis de propietari de la sala"}.
|
||||
{"Packet","Paquet"}.
|
||||
{"Password ~b","Password ~b"}.
|
||||
{"Password:","Password:"}.
|
||||
{"Password","Password"}.
|
||||
{"Password Verification","Verificació del Password"}.
|
||||
{"Password ~b","Contrasenya ~b"}.
|
||||
{"Password:","Contrasenya:"}.
|
||||
{"Password","Contrasenya"}.
|
||||
{"Password Verification:","Verificació de la Contrasenya:"}.
|
||||
{"Password Verification","Verificació de la Contrasenya"}.
|
||||
{"Path to Dir","Ruta al directori"}.
|
||||
{"Path to File","Ruta al fitxer"}.
|
||||
{"Pending","Pendent"}.
|
||||
@@ -238,6 +259,7 @@
|
||||
{"Persist items to storage","Persistir elements al guardar"}.
|
||||
{"Ping","Ping"}.
|
||||
{"Please note that these options will only backup the builtin Mnesia database. If you are using the ODBC module, you also need to backup your SQL database separately.","Recorda que aquestes opcions només fan còpia de seguretat de la base de dades Mnesia. Si estàs utilitzant el mòdul d'ODBC també deus de fer una còpia de seguretat de la base de dades de SQL a part."}.
|
||||
{"Please, wait for a while before sending new voice request","Si us plau, espera una mica abans d'enviar una nova petició de veu"}.
|
||||
{"Pong","Pong"}.
|
||||
{"Port ~b","Port ~b"}.
|
||||
{"Port","Port"}.
|
||||
@@ -246,14 +268,17 @@
|
||||
{"Protocol","Protocol"}.
|
||||
{"Publish-Subscribe","Publicar-subscriure't"}.
|
||||
{"PubSub subscriber request","Petició de subscriptor PubSub"}.
|
||||
{"Queries to the conference members are not allowed in this room"," En aquesta sala no es permeten solicituts als membres de la sala"}.
|
||||
{"Purge all items when the relevant publisher goes offline","Eliminar tots els elements quan el publicant relevant es desconnecti"}.
|
||||
{"Queries to the conference members are not allowed in this room"," En aquesta sala no es permeten sol·licituds als membres de la conferència"}.
|
||||
{"RAM and disc copy","Còpia en RAM i disc"}.
|
||||
{"RAM copy","Còpia en RAM"}.
|
||||
{"Raw","en format text"}.
|
||||
{"Really delete message of the day?","Segur que vols eliminar el missatge del dia?"}.
|
||||
{"Recipient is not in the conference room","El receptor no està en la sala de conferència"}.
|
||||
{"Register a Jabber account","Registrar un compte Jabber"}.
|
||||
{"Registered Users:","Usuaris registrats:"}.
|
||||
{"Registered Users","Usuaris registrats"}.
|
||||
{"Register","Registrar"}.
|
||||
{"Registration in mod_irc for ","Registre en mod_irc per a"}.
|
||||
{"Remote copy","Còpia remota"}.
|
||||
{"Remove All Offline Messages","Eliminar tots els missatges offline"}.
|
||||
@@ -290,6 +315,7 @@
|
||||
{"Send announcement to all users on all hosts","Enviar anunci a tots els usuaris de tots els hosts"}.
|
||||
{"September","Setembre"}.
|
||||
{"Server ~b","Servidor ~b"}.
|
||||
{"Server:","Servidor:"}.
|
||||
{"Set message of the day and send to online users","Configurar el missatge del dia i enviar a tots els usuaris"}.
|
||||
{"Set message of the day on all hosts and send to online users","Escriure missatge del dia en tots els hosts i enviar-ho als usuaris connectats"}.
|
||||
{"Shared Roster Groups","Grups de contactes compartits"}.
|
||||
@@ -297,7 +323,9 @@
|
||||
{"Show Ordinary Table","Mostrar Taula Ordinaria"}.
|
||||
{"Shut Down Service","Apager el Servei"}.
|
||||
{"~s invites you to the room ~s","~s et convida a la sala ~s"}.
|
||||
{"Some Jabber clients can store your password in your computer. Use that feature only if you trust your computer is safe.","Alguns clients Jabber poden emmagatzemar la teva contrasenya al teu ordinador. Fes servir aquesta característica només si saps que el teu ordinador és segur."}.
|
||||
{"Specify the access model","Especificar el model d'accés"}.
|
||||
{"Specify the event message type","Especifica el tipus de missatge d'event"}.
|
||||
{"Specify the publisher model","Especificar el model del publicant"}.
|
||||
{"~s's Offline Messages Queue","~s's cua de missatges offline"}.
|
||||
{"Start","Iniciar"}.
|
||||
@@ -320,9 +348,18 @@
|
||||
{"Sunday","Diumenge"}.
|
||||
{"That nickname is already in use by another occupant","El Nickname està siguent utilitzat per una altra persona"}.
|
||||
{"That nickname is registered by another person","El nickname ja està registrat per una altra persona"}.
|
||||
{"The captcha is valid.","El captcha es vàlid."}.
|
||||
{"The CAPTCHA is valid.","El CAPTCHA es vàlid."}.
|
||||
{"The CAPTCHA verification has failed","La verificació CAPTCHA ha fallat"}.
|
||||
{"The collections with which a node is affiliated","Les col.leccions amb les que un node està afiliat"}.
|
||||
{"the password is","el password és"}.
|
||||
{"the password is","la contrasenya és"}.
|
||||
{"The password is too weak","La contrasenya és massa simple"}.
|
||||
{"The password of your Jabber account was successfully changed.","La contrasenya del teu compte Jabber s'ha canviat correctament."}.
|
||||
{"There was an error changing the password: ","Hi ha hagut un error canviant la contrasenya: "}.
|
||||
{"There was an error creating the account: ","Hi ha hagut un error creant el compte: "}.
|
||||
{"There was an error deleting the account: ","Hi ha hagut un error esborrant el compte: "}.
|
||||
{"This is case insensitive: macbeth is the same that MacBeth and Macbeth.","Això no distingeix majúscules de minúscules: macbeth es el mateix que MacBeth i Macbeth."}.
|
||||
{"This page allows to create a Jabber account in this Jabber server. Your JID (Jabber IDentifier) will be of the form: username@server. Please read carefully the instructions to fill correctly the fields.","Aquesta pàgina permet crear un compte Jabber en aquest servidor Jabber. El teu JID (Jabber IDentifier; Identificador Jabber) tindrà aquesta forma: usuari@servidor. Si us plau, llegeix amb cura les instruccions per emplenar correctament els camps."}.
|
||||
{"This page allows to unregister a Jabber account in this Jabber server.","Aquesta pàgina permet anul·lar el registre d'un compte Jabber en aquest servidor Jabber."}.
|
||||
{"This participant is kicked from the room because he sent an error message","Aquest participant ha sigut expulsat de la sala perque ha enviat un missatge d'error"}.
|
||||
{"This participant is kicked from the room because he sent an error message to another participant","Aquest participant ha sigut expulsat de la sala perque ha enviat un missatge erroni a un altre participant"}.
|
||||
{"This participant is kicked from the room because he sent an error presence","Aquest participant ha sigut expulsat de la sala perque ha enviat un error de presencia"}.
|
||||
@@ -330,6 +367,7 @@
|
||||
{"Thursday","Dijous"}.
|
||||
{"Time","Data"}.
|
||||
{"Time delay","Temps de retard"}.
|
||||
{"Too many CAPTCHA requests","Massa peticions de CAPTCHA"}.
|
||||
{"To","Per a"}.
|
||||
{"To ~s","A ~s"}.
|
||||
{"Traffic rate limit is exceeded","El llímit de tràfic ha sigut sobrepassat"}.
|
||||
@@ -338,8 +376,10 @@
|
||||
{"Transactions Logged:","Transaccions registrades"}.
|
||||
{"Transactions Restarted:","Transaccions reiniciades"}.
|
||||
{"Tuesday","Dimarts"}.
|
||||
{"Unable to generate a captcha","No s'ha pogut generar un captcha"}.
|
||||
{"Unable to generate a CAPTCHA","No s'ha pogut generar un CAPTCHA"}.
|
||||
{"Unauthorized","No autoritzat"}.
|
||||
{"Unregister a Jabber account","Anul·lar el registre d'un compte Jabber"}.
|
||||
{"Unregister","Anul·lar el registre"}.
|
||||
{"Update ","Actualitzar"}.
|
||||
{"Update","Actualitzar"}.
|
||||
{"Update message of the day (don't send)","Actualitzar el missatge del dia (no enviar)"}.
|
||||
@@ -348,7 +388,9 @@
|
||||
{"Update script","Script d'actualització"}.
|
||||
{"Uptime:","Temps en marxa"}.
|
||||
{"Use of STARTTLS required","És obligatori utilitzar STARTTLS"}.
|
||||
{"User JID","JID del usuari "}.
|
||||
{"User Management","Gestió d'Usuaris"}.
|
||||
{"Username:","Nom d'usuari:"}.
|
||||
{"Users are not allowed to register accounts so quickly","Els usuaris no tenen permís per a crear comptes tan depresa"}.
|
||||
{"Users Last Activity","Última activitat d'usuari"}.
|
||||
{"Users","Usuaris"}.
|
||||
@@ -356,16 +398,24 @@
|
||||
{"User","Usuari"}.
|
||||
{"Validate","Validar"}.
|
||||
{"vCard User Search","Recerca de vCard d'usuari"}.
|
||||
{"Virtual Hosts","Hosts virtuals"}.
|
||||
{"Visitors are not allowed to change their nicknames in this room","Els visitants no tenen permés canviar el seus Nicknames en esta sala"}.
|
||||
{"Visitors are not allowed to send messages to all occupants","Els visitants no poden enviar missatges a tots els ocupants"}.
|
||||
{"Voice request","Petició de veu"}.
|
||||
{"Voice requests are disabled in this conference","Les peticions de veu es troben desactivades en aquesta conferència"}.
|
||||
{"Wednesday","Dimecres"}.
|
||||
{"When to send the last published item","Quan s'ha enviat l'última publicació"}.
|
||||
{"Whether to allow subscriptions","Permetre subscripcions"}.
|
||||
{"You can later change your password using a Jabber client.","Podràs canviar la teva contrasenya més endavant utilitzant un client Jabber."}.
|
||||
{"You have been banned from this room","Has sigut bloquejat en aquesta sala"}.
|
||||
{"You must fill in field \"Nickname\" in the form","Deus d'omplir el camp \"Nickname\" al formulari"}.
|
||||
{"You need a client that supports x:data and CAPTCHA to register","Necessites un client amb suport x:data i de CAPTCHA para poder registrar-te"}.
|
||||
{"You need a client that supports x:data to register the nickname","Necessites un client amb suport x:data per a poder registrar el Nickname"}.
|
||||
{"You need an x:data capable client to configure mod_irc settings","Necessites un client amb suport x:data per a configurar les opcions de mod_irc"}.
|
||||
{"You need an x:data capable client to configure room","Necessites un client amb suport x:data per a configurar la sala"}.
|
||||
{"You need an x:data capable client to register nickname","Necessites un client amb suport x:data per a poder registrar el Nickname"}.
|
||||
{"You need an x:data capable client to search","Necesites un client amb suport x:data per a poder buscar"}.
|
||||
{"You need an x:data capable client to search","Necessites un client amb suport x:data per a poder buscar"}.
|
||||
{"Your active privacy list has denied the routing of this stanza.","La teva llista de privacitat activa ha denegat l'encaminament d'aquesta stanza."}.
|
||||
{"Your contact offline message queue is full. The message has been discarded.","La cua de missatges offline és plena. El missatge ha sigut descartat"}.
|
||||
{"Your Jabber account was successfully created.","El teu compte Jabber ha sigut creat correctament."}.
|
||||
{"Your Jabber account was successfully deleted.","El teu compte Jabber ha sigut esborrat correctament."}.
|
||||
{"Your messages to ~s are being blocked. To unblock them, visit ~s","Els teus missatges per ~s s'estan bloquejant. Per desbloquejar-los, visita ~s"}.
|
||||
+1872
File diff suppressed because it is too large
Load Diff
@@ -20,7 +20,9 @@
|
||||
{"Allow users to send invites","Povolit uživatelům posílání pozvánek"}.
|
||||
{"Allow users to send private messages","Povolit uživatelům odesílat soukromé zprávy"}.
|
||||
{"Allow visitors to change nickname","Povolit návštěvníkům měnit přezdívku"}.
|
||||
{"Allow visitors to send private messages to","Povolit návštěvníkům odesílat soukromé zprávy"}.
|
||||
{"Allow visitors to send status text in presence updates","Povolit návštěvníkům posílat stavové zprávy ve statusu"}.
|
||||
{"Allow visitors to send voice requests","Povolit uživatelům posílat žádosti o voice práva"}.
|
||||
{"All Users","Všichni uživatelé"}.
|
||||
{"Announcements","Oznámení"}.
|
||||
{"anyone","každému"}.
|
||||
@@ -33,9 +35,15 @@
|
||||
{"Backup","Zálohovat"}.
|
||||
{"Bad format","Nesprávný formát"}.
|
||||
{"Birthday","Datum narození"}.
|
||||
{"CAPTCHA web page","Webová stránka CAPTCHA"}.
|
||||
{"Change Password","Změnit heslo"}.
|
||||
{"Change User Password","Změnit heslo uživatele"}.
|
||||
{"Characters not allowed:","Nepřípustné znaky:"}.
|
||||
{"Chatroom configuration modified","Nastavení diskuzní místnosti bylo změněno"}.
|
||||
{"Chatroom is created","Konference vytvořena"}.
|
||||
{"Chatroom is destroyed","Konference zrušena"}.
|
||||
{"Chatroom is started","Konference spuštěna"}.
|
||||
{"Chatroom is stopped","Konference zastavena"}.
|
||||
{"Chatrooms","Konference"}.
|
||||
{"Choose a username and password to register with this server","Zadejte jméno uživatele a heslo pro registraci na tomto serveru"}.
|
||||
{"Choose modules to stop","Vyberte moduly, které mají být zastaveny"}.
|
||||
@@ -65,15 +73,16 @@
|
||||
{"Description:","Popis:"}.
|
||||
{"Disc only copy","Jen kopie disku"}.
|
||||
{"Displayed Groups:","Zobrazené skupiny:"}.
|
||||
{"Don't tell your password to anybody, not even the administrators of the Jabber server.","Nikdy nikomu nesdělujte své heslo, ani administrátorovi serveru Jabberu."}.
|
||||
{"Dump Backup to Text File at ","Uložit zálohu do textového souboru na "}.
|
||||
{"Dump to Text File","Uložit do textového souboru"}.
|
||||
{"Edit Properties","Upravit vlastnosti"}.
|
||||
{"Either approve or decline the voice request.","Povolit nebo odmítnout voice žádost."}.
|
||||
{"ejabberd IRC module","ejabberd IRC modul"}.
|
||||
{"ejabberd MUC module","ejabberd MUC modul"}.
|
||||
{"ejabberd Publish-Subscribe module","ejabberd Publish-Subscribe modul"}.
|
||||
{"ejabberd SOCKS5 Bytestreams module","ejabberd SOCKS5 Bytestreams modul"}.
|
||||
{"ejabberd vCard module","ejabberd vCard modul"}.
|
||||
{"ejabberd virtual hosts","Virtuální hostitelé ejabberd"}.
|
||||
{"ejabberd Web Admin","Webová administrace ejabberd"}.
|
||||
{"Elements","Položek"}.
|
||||
{"Email","E-mail"}.
|
||||
@@ -92,8 +101,10 @@
|
||||
{"Erlang Jabber Server","Erlang Jabber Server"}.
|
||||
{"Error","Chyba"}.
|
||||
{"Example: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef.net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}].","Příklad: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef.net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}].2\"}]."}.
|
||||
{"Exclude Jabber IDs from CAPTCHA challenge","Vyloučit Jabber ID z procesu CAPTCHA ověřování"}.
|
||||
{"Export data of all users in the server to PIEFXIS files (XEP-0227):","Exportovat všechny uživatele do souboru ve formátu PIEFXIS (XEP-0227):"}.
|
||||
{"Export data of users in a host to PIEFXIS files (XEP-0227):","Exportovat uživatele na hostiteli do souboru ve formátu PIEFXIS (XEP-0227):"}.
|
||||
{"Failed to extract JID from your voice request approval","Došlo k chybě při získávání Jabber ID z vaší žádosti o voice práva"}.
|
||||
{"Family Name","Příjmení"}.
|
||||
{"February",". února"}.
|
||||
{"Fill in fields to search for any matching Jabber User","Vyplňte políčka pro vyhledání uživatele Jabberu"}.
|
||||
@@ -107,6 +118,7 @@
|
||||
{"Get User Last Login Time","Získat čas podleního přihlášení uživatele"}.
|
||||
{"Get User Password","Získat heslo uživatele"}.
|
||||
{"Get User Statistics","Získat statistiky uživatele"}.
|
||||
{"Grant voice to this person?","Udělit voice práva této osobě?"}.
|
||||
{"Group ","Skupina "}.
|
||||
{"Groups","Skupiny"}.
|
||||
{"has been banned","byl(a) zablokován(a)"}.
|
||||
@@ -116,6 +128,7 @@
|
||||
{"has been kicked","byl(a) vyhozen(a) z místnosti"}.
|
||||
{" has set the subject to: "," změnil(a) téma na: "}.
|
||||
{"Host","Hostitel"}.
|
||||
{"If you don't see the CAPTCHA image here, visit the web page.","Pokud zde nevidíte obrázek CAPTCHA, přejděte na webovou stránku."}.
|
||||
{"If you want to specify different ports, passwords, encodings for IRC servers, fill this list with values in format '{\"irc server\", \"encoding\", port, \"password\"}'. By default this service use \"~s\" encoding, port ~p, empty password.","Pokud chcete zadat jiné kódování pro IRC servery, vyplňte seznam s hodnotami ve formátu '{\"irc server\",\"encoding\", port, \"password\"}'. Výchozí kódování pro tuto službu je \"~s\", port ~p, empty password."}.
|
||||
{"Import Directory","Import adresáře"}.
|
||||
{"Import File","Import souboru"}.
|
||||
@@ -141,6 +154,7 @@
|
||||
{"It is not allowed to send private messages","Je zakázáno posílat soukromé zprávy"}.
|
||||
{"It is not allowed to send private messages of type \"groupchat\"","Není dovoleno odeslání soukromé zprávy typu \"skupinová zpráva\" "}.
|
||||
{"It is not allowed to send private messages to the conference","Není povoleno odesílat soukromé zprávy do konference"}.
|
||||
{"Jabber Account Registration","Registrace účtu Jabberu"}.
|
||||
{"Jabber ID","Jabber ID"}.
|
||||
{"Jabber ID ~s is invalid","Jabber ID ~s je neplatné"}.
|
||||
{"January",". ledna"}.
|
||||
@@ -160,7 +174,7 @@
|
||||
{"List of modules to start","Seznam modulů, které mají být spuštěné"}.
|
||||
{"Low level update script","Nízkoúrovňový aktualizační skript"}.
|
||||
{"Make participants list public","Nastavit seznam účastníků jako veřejný"}.
|
||||
{"Make room captcha protected","Chránit místnost pomocí CAPTCHA"}.
|
||||
{"Make room CAPTCHA protected","Chránit místnost pomocí CAPTCHA"}.
|
||||
{"Make room members-only","Zpřístupnit místnost jen členům"}.
|
||||
{"Make room moderated","Nastavit místnost jako moderovanou"}.
|
||||
{"Make room password protected","Chránit místnost heslem"}.
|
||||
@@ -173,9 +187,11 @@
|
||||
{"May",". května"}.
|
||||
{"Members:","Členové:"}.
|
||||
{"Membership is required to enter this room","Pro vstup do místnosti musíte být členem"}.
|
||||
{"Memorize your password, or write it in a paper placed in a safe place. In Jabber there isn't an automated way to recover your password if you forget it.","Svoje heslo si zapamatujte, nebo si jej poznamenejte na papírek a ten uschovejte v bezpečí. Jabber nemá žádný automatizovaný způsob obnovy hesla."}.
|
||||
{"Memory","Paměť"}.
|
||||
{"Message body","Tělo zprávy"}.
|
||||
{"Middle Name","Druhé jméno"}.
|
||||
{"Minimum interval between voice requests (in seconds)","Minimální interval mezi žádostmi o voice práva (v sekundách)"}.
|
||||
{"Moderator privileges required","Potřebujete práva moderátora"}.
|
||||
{"moderators only","moderátorům"}.
|
||||
{"Modified modules","Aktualizované moduly"}.
|
||||
@@ -186,9 +202,11 @@
|
||||
{"Name:","Jméno:"}.
|
||||
{"Name","Jméno"}.
|
||||
{"Never","Nikdy"}.
|
||||
{"New Password:","Nové heslo:"}.
|
||||
{"Nickname","Přezdívka"}.
|
||||
{"Nickname Registration at ","Registrace přezdívky na "}.
|
||||
{"Nickname ~s does not exist in the room","Přezdívka ~s v místnosti neexistuje"}.
|
||||
{"nobody","nikdo"}.
|
||||
{"No body provided for announce message","Zpráva neobsahuje text"}.
|
||||
{"No Data","Žádná data"}.
|
||||
{"Node ID","ID uzlu"}.
|
||||
@@ -210,12 +228,14 @@
|
||||
{"Offline Messages:","Offline zprávy:"}.
|
||||
{"Offline Messages","Offline zprávy"}.
|
||||
{"OK","OK"}.
|
||||
{"Old Password:","Současné heslo:"}.
|
||||
{"Online","Online"}.
|
||||
{"Online Users:","Online uživatelé:"}.
|
||||
{"Online Users","Online uživatelé"}.
|
||||
{"Only deliver notifications to available users","Doručovat upozornění jen právě přihlášeným uživatelům"}.
|
||||
{"Only moderators and participants are allowed to change the subject in this room","Jen moderátoři a účastníci mají povoleno měnit téma této místnosti"}.
|
||||
{"Only moderators are allowed to change the subject in this room","Jen moderátoři mají povoleno měnit téma místnosti"}.
|
||||
{"Only moderators can approve voice requests","Pouze moderátoři mohou schválit žádosti o voice práva"}.
|
||||
{"Only occupants are allowed to send messages to the conference","Jen členové mají povolené zasílat zprávy do konference"}.
|
||||
{"Only occupants are allowed to send queries to the conference","Jen členové mohou odesílat požadavky (query) do konference"}.
|
||||
{"Only service administrators are allowed to send service messages","Pouze správci služby smí odesílat servisní zprávy"}.
|
||||
@@ -230,6 +250,7 @@
|
||||
{"Password ~b","Heslo ~b"}.
|
||||
{"Password:","Heslo:"}.
|
||||
{"Password","Heslo"}.
|
||||
{"Password Verification:","Ověření hesla:"}.
|
||||
{"Password Verification","Ověření hesla"}.
|
||||
{"Path to Dir","Cesta k adresáři"}.
|
||||
{"Path to File","Cesta k souboru"}.
|
||||
@@ -238,6 +259,7 @@
|
||||
{"Persist items to storage","Uložit položky natrvalo do úložiště"}.
|
||||
{"Ping","Ping"}.
|
||||
{"Please note that these options will only backup the builtin Mnesia database. If you are using the ODBC module, you also need to backup your SQL database separately.","Podotýkáme, že tato nastavení budou zálohována do zabudované databáze Mnesia. Pokud používáte ODBC modul, musíte zálohovat svoji SQL databázi samostatně."}.
|
||||
{"Please, wait for a while before sending new voice request","Prosím, počkejte chvíli před posláním nové žádosti o voice práva"}.
|
||||
{"Pong","Pong"}.
|
||||
{"Port ~b","Port ~b"}.
|
||||
{"Port","Port"}.
|
||||
@@ -246,14 +268,17 @@
|
||||
{"Protocol","Protokol"}.
|
||||
{"Publish-Subscribe","Publish-Subscribe"}.
|
||||
{"PubSub subscriber request","Žádost odběratele PubSub"}.
|
||||
{"Purge all items when the relevant publisher goes offline","Smazat všechny položky, pokud se příslušný poskytovatel odpojí"}.
|
||||
{"Queries to the conference members are not allowed in this room","Požadavky (queries) na členy konference nejsou v této místnosti povolené"}.
|
||||
{"RAM and disc copy","Kopie RAM a disku"}.
|
||||
{"RAM copy","Kopie RAM"}.
|
||||
{"Raw","Zdroj"}.
|
||||
{"Really delete message of the day?","Skutečně smazat zprávu dne?"}.
|
||||
{"Recipient is not in the conference room","Příjemce se nenachází v konferenční místnosti"}.
|
||||
{"Register a Jabber account","Zaregistrujte si účet Jabberu"}.
|
||||
{"Registered Users","Registrovaní uživatelé"}.
|
||||
{"Registered Users:","Registrovaní živatelé:"}.
|
||||
{"Register","Zaregistrovat se"}.
|
||||
{"Registration in mod_irc for ","Registrace do mod_irc na "}.
|
||||
{"Remote copy","Vzdálená kopie"}.
|
||||
{"Remove All Offline Messages","Odstranit všechny offline zprávy"}.
|
||||
@@ -290,6 +315,7 @@
|
||||
{"Send announcement to all users on all hosts","Odeslat oznámení všem uživatelům na všech hostitelích"}.
|
||||
{"September",". září"}.
|
||||
{"Server ~b","Server ~b"}.
|
||||
{"Server:","Server:"}.
|
||||
{"Set message of the day and send to online users","Nastavit zprávu dne a odeslat ji online uživatelům"}.
|
||||
{"Set message of the day on all hosts and send to online users","Nastavit zprávu dne a odeslat ji online uživatelům"}.
|
||||
{"Shared Roster Groups","Skupiny pro sdílený seznam kontaktů"}.
|
||||
@@ -297,7 +323,9 @@
|
||||
{"Show Ordinary Table","Zobrazit běžnou tabulku"}.
|
||||
{"Shut Down Service","Vypnout službu"}.
|
||||
{"~s invites you to the room ~s","~s vás zve do místnosti ~s"}.
|
||||
{"Some Jabber clients can store your password in your computer. Use that feature only if you trust your computer is safe.","Někteří klienti umí uložit vaše heslo na disk počítače. Tuto funkci používejte, pouze pokud věříte zabezpečení svého počítače."}.
|
||||
{"Specify the access model","Uveďte přístupový model"}.
|
||||
{"Specify the event message type","Zvolte typ zpráv pro události"}.
|
||||
{"Specify the publisher model","Specifikovat model pro publikování"}.
|
||||
{"~s's Offline Messages Queue","Fronta offline zpráv uživatele ~s"}.
|
||||
{"Start Modules at ","Spustit moduly na "}.
|
||||
@@ -320,9 +348,18 @@
|
||||
{"Sunday","Neděle"}.
|
||||
{"That nickname is already in use by another occupant","Přezdívka je již používána jiným členem"}.
|
||||
{"That nickname is registered by another person","Přezdívka je zaregistrována jinou osobou"}.
|
||||
{"The captcha is valid.","CAPTCHA souhlasí."}.
|
||||
{"The CAPTCHA is valid.","CAPTCHA souhlasí."}.
|
||||
{"The CAPTCHA verification has failed","Ověření CAPTCHA se nezdařilo"}.
|
||||
{"The collections with which a node is affiliated","Kolekce, se kterými je uzel spřízněn"}.
|
||||
{"the password is","heslo je"}.
|
||||
{"The password is too weak","Heslo je příliš slabé"}.
|
||||
{"The password of your Jabber account was successfully changed.","Heslo vašeho účtu Jabberu bylo úspěšně změněno."}.
|
||||
{"There was an error changing the password: ","Při změně hesla došlo k chybě: "}.
|
||||
{"There was an error creating the account: ","Při vytváření účtu došlo k chybě."}.
|
||||
{"There was an error deleting the account: ","Při mazání účtu došlo k chybě: "}.
|
||||
{"This is case insensitive: macbeth is the same that MacBeth and Macbeth.","Zde nezáleží na velikosti písmen: macbeth je stejný jako MacBeth a Macbeth."}.
|
||||
{"This page allows to create a Jabber account in this Jabber server. Your JID (Jabber IDentifier) will be of the form: username@server. Please read carefully the instructions to fill correctly the fields.","Na této stránce si můžete vytvořit účet na tomto serveru Jabberu. Vaše JID (Jabber IDentifikátor) bude mít tvar: uživatelskéjméno@server. Přečtěte si prosím pozorně instrukce pro vyplnění údajů."}.
|
||||
{"This page allows to unregister a Jabber account in this Jabber server.","Zde můžete zrušit registraci účtu na tomto serveru Jabberu."}.
|
||||
{"This participant is kicked from the room because he sent an error message","Tento účastník byl vyhozen, protože odeslal chybovou zprávu"}.
|
||||
{"This participant is kicked from the room because he sent an error message to another participant","Tento účastník byl vyhozen, protože odeslal chybovou zprávu jinému účastníkovi"}.
|
||||
{"This participant is kicked from the room because he sent an error presence","Tento účastník byl vyhozen, protože odeslal chybový status"}.
|
||||
@@ -330,6 +367,7 @@
|
||||
{"Thursday","Čtvrtek"}.
|
||||
{"Time","Čas"}.
|
||||
{"Time delay","Časový posun"}.
|
||||
{"Too many CAPTCHA requests","Přiliš mnoho CAPTCHA žádostí"}.
|
||||
{"To","Pro"}.
|
||||
{"To ~s","Pro ~s"}.
|
||||
{"Traffic rate limit is exceeded","Byl překročen limit"}.
|
||||
@@ -338,8 +376,10 @@
|
||||
{"Transactions Logged:","Transakce zaznamenána"}.
|
||||
{"Transactions Restarted:","Transakce restartována"}.
|
||||
{"Tuesday","Úterý"}.
|
||||
{"Unable to generate a captcha","Nebylo možné vygenerovat CAPTCHA"}.
|
||||
{"Unable to generate a CAPTCHA","Nebylo možné vygenerovat CAPTCHA"}.
|
||||
{"Unauthorized","Nemáte oprávnění"}.
|
||||
{"Unregister a Jabber account","Zrušte registraci účtu Jabberu"}.
|
||||
{"Unregister","Zrušit registraci"}.
|
||||
{"Update ","Aktualizovat "}.
|
||||
{"Update","Aktualizovat"}.
|
||||
{"Update message of the day (don't send)","Aktualizovat zprávu dne (neodesílat)"}.
|
||||
@@ -347,8 +387,10 @@
|
||||
{"Update plan","Aktualizovat plán"}.
|
||||
{"Update script","Aktualizované skripty"}.
|
||||
{"Uptime:","Čas běhu:"}.
|
||||
{"Use of STARTTLS required","Je vyžadováno STARTTLS."}.
|
||||
{"Use of STARTTLS required","Je vyžadováno STARTTLS"}.
|
||||
{"User JID","Jabber ID uživatele"}.
|
||||
{"User Management","Správa uživatelů"}.
|
||||
{"Username:","Uživatelské jméno:"}.
|
||||
{"Users are not allowed to register accounts so quickly","Je zakázáno registrovat účty v tak rychlém sledu"}.
|
||||
{"Users Last Activity","Poslední aktivita uživatele"}.
|
||||
{"Users","Uživatelé"}.
|
||||
@@ -356,16 +398,24 @@
|
||||
{"User","Uživatel"}.
|
||||
{"Validate","Ověřit"}.
|
||||
{"vCard User Search","Hledání uživatelů podle vizitek"}.
|
||||
{"Virtual Hosts","Virtuální hostitelé"}.
|
||||
{"Visitors are not allowed to change their nicknames in this room","Návštěvníkům této místnosti je zakázáno měnit přezdívku"}.
|
||||
{"Visitors are not allowed to send messages to all occupants","Návštevníci nemají povoleno zasílat zprávy všem účastníkům konference"}.
|
||||
{"Voice requests are disabled in this conference","Voice žádosti jsou v této konferenci zakázány"}.
|
||||
{"Voice request","Žádost o voice práva"}.
|
||||
{"Wednesday","Středa"}.
|
||||
{"When to send the last published item","Kdy odeslat poslední publikovanou položku"}.
|
||||
{"Whether to allow subscriptions","Povolit odebírání"}.
|
||||
{"You can later change your password using a Jabber client.","Později můžete své heslo změnit pomocí klienta Jabberu."}.
|
||||
{"You have been banned from this room","Byl jste vyloučen z této místnosti"}.
|
||||
{"You must fill in field \"Nickname\" in the form","Musíte vyplnit políčko \"Přezdívka\" ve formuláři"}.
|
||||
{"You need a client that supports x:data and CAPTCHA to register","Pro registraci potřebujete klienta s podporou x:data a CAPTCHA"}.
|
||||
{"You need a client that supports x:data to register the nickname","Pro registraci přezdívky potřebujete klienta s podporou x:data"}.
|
||||
{"You need an x:data capable client to configure mod_irc settings","Pro konfiguraci mod_irc potřebujete klienta s podporou x:data"}.
|
||||
{"You need an x:data capable client to configure room","Ke konfiguraci místnosti potřebujete klienta podporujícího x:data"}.
|
||||
{"You need an x:data capable client to register nickname","K registraci přezdívky potřebujete klienta s podporou x:data"}.
|
||||
{"You need an x:data capable client to search","K vyhledávání potřebujete klienta podporujícího x:data"}.
|
||||
{"Your active privacy list has denied the routing of this stanza.","Vaše nastavení soukromí znemožnilo směrování této stance."}.
|
||||
{"Your contact offline message queue is full. The message has been discarded.","Fronta offline zpráv pro váš kontakt je plná. Zpráva byla zahozena."}.
|
||||
{"Your Jabber account was successfully created.","Váš účet Jabberu byl úspěšně vytvořen."}.
|
||||
{"Your Jabber account was successfully deleted.","Váš účet Jabberu byl úspěšně smazán."}.
|
||||
{"Your messages to ~s are being blocked. To unblock them, visit ~s","Nesmíte posílat zprávy na ~s. Pro povolení navštivte ~s"}.
|
||||
+686
-448
File diff suppressed because it is too large
Load Diff
+153
-103
@@ -1,112 +1,124 @@
|
||||
{"Access Configuration","Zugangskonfiguration"}.
|
||||
{"Access Control List Configuration","Zugangskontroll-Liste (ACL) Konfiguration"}.
|
||||
{"Access Control List Configuration","Konfiguration der Zugangskontrolllisten"}.
|
||||
{"Access control lists","Zugangskontroll-Listen (ACL)"}.
|
||||
{"Access Control Lists","Zugangskontroll-Listen (ACL)"}.
|
||||
{"Access denied by service policy","Zugang aufgrund der Dienstrichtlinien verweigert"}.
|
||||
{"Access rules","Zugangsregeln"}.
|
||||
{"Access Rules","Zugangsregeln"}.
|
||||
{"Action on user","Aktion auf Benutzer"}.
|
||||
{"Add Jabber ID","Jabber ID hinzufügen"}.
|
||||
{"Add New","Neuen hinzufügen"}.
|
||||
{"Add Jabber ID","Jabber-ID hinzufügen"}.
|
||||
{"Add New","Neue hinzufügen"}.
|
||||
{"Add User","Benutzer hinzufügen"}.
|
||||
{"Administration of ","Administration von "}.
|
||||
{"Administration","Verwaltung"}.
|
||||
{"Administrator privileges required","Administratorenrechte benötigt"}.
|
||||
{"A friendly name for the node","Ein passender Name für den Knoten"}.
|
||||
{"A friendly name for the node","Ein merkbarer Name für den Knoten"}.
|
||||
{"All activity","Alle Aktivitäten"}.
|
||||
{"Allow this Jabber ID to subscribe to this pubsub node?","Erlauben sie dieser Jabber ID das Abonnement dieses pubsub Knotens?"}.
|
||||
{"Allow this Jabber ID to subscribe to this pubsub node?","Dieser Jabber-ID das Abonnement dieses pubsub-Knotens erlauben?"}.
|
||||
{"Allow users to change the subject","Erlaube Benutzern das Thema zu ändern"}.
|
||||
{"Allow users to query other users","Erlaube Benutzern andere Benutzer abzufragen"}.
|
||||
{"Allow users to query other users","Erlaube Benutzern Informationen über andere Benutzer abzufragen"}.
|
||||
{"Allow users to send invites","Erlaube Benutzern Einladungen zu senden"}.
|
||||
{"Allow users to send private messages","Erlaube Benutzern private Nachrichten zu senden"}.
|
||||
{"Allow visitors to change nickname","Erlaube Besuchern ihren Spitznamen zu ändern"}.
|
||||
{"Allow visitors to send status text in presence updates","Erlaube Besuchern einen Text bei Statusänderung zu setzen"}.
|
||||
{"Allow visitors to send private messages to","Erlaube Besuchern das Senden von privaten Nachrichten an"}.
|
||||
{"Allow visitors to send status text in presence updates","Erlaube Besuchern einen Text bei Statusänderung zu senden"}.
|
||||
{"Allow visitors to send voice requests","Anfragen von Sprachrechten für Benutzer erlauben"}.
|
||||
{"All Users","Alle Benutzer"}.
|
||||
{"Announcements","Ankündigungen"}.
|
||||
{"anyone","jeder"}.
|
||||
{"anyone","jeden"}.
|
||||
{"A password is required to enter this room","Sie brauchen ein Passwort um diesen Raum zu betreten"}.
|
||||
{"April","April"}.
|
||||
{"August","August"}.
|
||||
{"Backup","Datensicherung"}.
|
||||
{"Backup Management","Datensicherungsmanagement"}.
|
||||
{"Backup Management","Datensicherungsverwaltung"}.
|
||||
{"Backup of ","Sicherung von "}.
|
||||
{"Backup to File at ","Datensicherung in die Datei "}.
|
||||
{"Bad format","Ungültiges Format"}.
|
||||
{"Birthday","Geburtsdatum"}.
|
||||
{"CAPTCHA web page","CAPTCHA Webseite"}.
|
||||
{"Change Password","Passwort ändern"}.
|
||||
{"Change User Password","Benutzer Passwort ändern"}.
|
||||
{"Chatroom configuration modified","Chatraum Konfiguration geändert"}.
|
||||
{"Change User Password","Benutzer-Passwort ändern"}.
|
||||
{"Characters not allowed:","Nicht erlaubte Zeichen:"}.
|
||||
{"Chatroom configuration modified","Chatraum-Konfiguration geändert"}.
|
||||
{"Chatroom is created","Chatraum wurde erstellt"}.
|
||||
{"Chatroom is destroyed","Chatraum wurde entfernt"}.
|
||||
{"Chatroom is started","Chatraum wurde gestartet"}.
|
||||
{"Chatroom is stopped","Chatraum wurde beendet"}.
|
||||
{"Chatrooms","Chaträume"}.
|
||||
{"Choose a username and password to register with this server","Wählen sie zum Registrieren einen Benutzernamen und ein Passwort"}.
|
||||
{"Choose modules to stop","Wähle zu stoppende Module"}.
|
||||
{"Choose storage type of tables","Wähle Speichertyp der Tabellen"}.
|
||||
{"Choose whether to approve this entity's subscription.","Wähle ob dieses Abonnement bestätigt wird."}.
|
||||
{"Choose whether to approve this entity's subscription.","Wähle Sie, ob dieses Abonnement akzeptiert werden soll."}.
|
||||
{"City","Stadt"}.
|
||||
{"Commands","Befehle"}.
|
||||
{"Conference room does not exist","Konferenzraum existiert nicht"}.
|
||||
{"Configuration","Konfiguration"}.
|
||||
{"Configuration of room ~s","Konfiguration für Raum ~s"}.
|
||||
{"Connected Resources:","Verbundene Resourcen"}.
|
||||
{"Connected Resources:","Verbundene Ressourcen:"}.
|
||||
{"Connections parameters","Verbindungsparameter"}.
|
||||
{"Country","Land"}.
|
||||
{"CPU Time:","CPU Zeit:"}.
|
||||
{"CPU Time:","CPU-Zeit:"}.
|
||||
{"Database","Datenbank"}.
|
||||
{"Database Tables at ","Datenbank Tabellen bei "}.
|
||||
{"Database Tables Configuration at ","Datenbank Tabellen Konfiguration bei "}.
|
||||
{"Database Tables at ","Datenbanktabellen auf "}.
|
||||
{"Database Tables Configuration at ","Datenbanktabellen-Konfiguration auf "}.
|
||||
{"December","Dezember"}.
|
||||
{"Default users as participants","Standardbenutzer als Teilnehmer"}.
|
||||
{"Delete","Löschen"}.
|
||||
{"Delete message of the day","Lösche Nachricht des Tages"}.
|
||||
{"Delete message of the day on all hosts","Lösche Nachricht des Tages auf allen Hosts"}.
|
||||
{"Delete Selected","Markiertes löschen"}.
|
||||
{"Delete Selected","Markierte löschen"}.
|
||||
{"Delete User","Benutzer löschen"}.
|
||||
{"Deliver event notifications","Versende Ereignisbenachrichtigungen"}.
|
||||
{"Deliver payloads with event notifications","Versende Nutzlast mit Ereignisbenachrichtigungen"}.
|
||||
{"Deliver event notifications","Ereignisbenachrichtigung zustellen"}.
|
||||
{"Deliver payloads with event notifications","Nachrichten mit Ereignis-Benachrichtigungen zustellen"}.
|
||||
{"Description:","Beschreibung:"}.
|
||||
{"Disc only copy","Festplatten Kopie"}.
|
||||
{"Disc only copy","Nur auf Festplatte"}.
|
||||
{"Displayed Groups:","Angezeigte Gruppen:"}.
|
||||
{"Don't tell your password to anybody, not even the administrators of the Jabber server.","Geben sie niemandem ihr Passwort, auch nicht den Administratoren des Jabber Servers."}.
|
||||
{"Dump Backup to Text File at ","Ausgabe der Sicherung in diese Textdatei "}.
|
||||
{"Dump to Text File","Ausgabe in Textdatei"}.
|
||||
{"Edit Properties","Einstellungen ändern"}.
|
||||
{"ejabberd IRC module","ejabberd IRC Modul"}.
|
||||
{"ejabberd MUC module","ejabberd MUC Modul"}.
|
||||
{"ejabberd Publish-Subscribe module","ejabberd Publish-Subscribe Modul"}.
|
||||
{"ejabberd SOCKS5 Bytestreams module","ejabberd SOCKS5 Bytestreams Modul"}.
|
||||
{"ejabberd vCard module","ejabberd vCard Modul"}.
|
||||
{"ejabberd virtual hosts","ejabberd virtuelle Hosts"}.
|
||||
{"ejabberd Web Admin","ejabberd Web Admin"}.
|
||||
{"Either approve or decline the voice request.","Diese Anfrage für Sprachrechte bestätigen oder ablehnen."}.
|
||||
{"ejabberd IRC module","ejabberd IRC-Modul"}.
|
||||
{"ejabberd MUC module","ejabberd MUC-Modul"}.
|
||||
{"ejabberd Publish-Subscribe module","ejabberd Publish-Subscribe-Modul"}.
|
||||
{"ejabberd SOCKS5 Bytestreams module","ejabberd SOCKS5-Bytestreams-Modul"}.
|
||||
{"ejabberd vCard module","ejabberd vCard-Modul"}.
|
||||
{"ejabberd Web Admin","ejabberd Web-Admin"}.
|
||||
{"Elements","Elemente"}.
|
||||
{"Email","E-Mail"}.
|
||||
{"Enable logging","Log-Funktion aktivieren"}.
|
||||
{"Enable logging","Protokollierung aktivieren"}.
|
||||
{"Encoding for server ~b","Kodierung für Server ~b"}.
|
||||
{"End User Session","Benutzer Sitzung beenden"}.
|
||||
{"End User Session","Benutzer-Sitzung beenden"}.
|
||||
{"Enter list of {Module, [Options]}","Geben sie eine Liste bestehend aus {Modul, [Optionen]} ein"}.
|
||||
{"Enter nickname you want to register","Geben sie den zu registrierenden Spitznamen ein"}.
|
||||
{"Enter nickname you want to register","Geben sie den zu registrierenden Benutzernamen ein"}.
|
||||
{"Enter path to backup file","Geben sie den Pfad zur Datensicherung ein"}.
|
||||
{"Enter path to jabberd14 spool dir","Geben sie den Pfad zum jabberd14 spool Verzeichnis ein"}.
|
||||
{"Enter path to jabberd14 spool file","Geben sie den Pfad zur jabberd14 spool Datei ein"}.
|
||||
{"Enter path to jabberd14 spool dir","Geben Sie den Pfad zum jabberd14-Spool-Verzeichnis ein"}.
|
||||
{"Enter path to jabberd14 spool file","Geben Sie den Pfad zur jabberd14-Spool-Datei ein"}.
|
||||
{"Enter path to text file","Geben sie den Pfad zur Textdatei ein"}.
|
||||
{"Enter the text you see","Geben sie den Text den sie sehen ein"}.
|
||||
{"Enter username and encodings you wish to use for connecting to IRC servers. Press 'Next' to get more fields to fill in. Press 'Complete' to save settings.","Geben sie Benutzernamen und Kodierung für Verbindungen zu IRC Servern an. Drücken sie 'Mehr' um leere Felder hinzuzufügen. Drücken sie 'Beenden' um die Einstellungen zu speichern."}.
|
||||
{"Enter username, encodings, ports and passwords you wish to use for connecting to IRC servers","Geben sie Benutzernamen, Kodierungen, Ports und Passwörter für die Verbindung zu IRC Servern an"}.
|
||||
{"Enter username, encodings, ports and passwords you wish to use for connecting to IRC servers","Geben Sie Benutzernamen und Zeichenkodierung für die Verbindung zum IRC-Server an"}.
|
||||
{"Erlang Jabber Server","Erlang Jabber Server"}.
|
||||
{"Error","Fehler"}.
|
||||
{"Example: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef.net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}].","Beispiel: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef.net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."}.
|
||||
{"Exclude Jabber IDs from CAPTCHA challenge","Von CAPTCHA Überprüfung ausgeschlossene Jabber IDs"}.
|
||||
{"Export data of all users in the server to PIEFXIS files (XEP-0227):","Alle Benutzerdaten des Servers in PIEFXIS Dateien (XEP-0227) exportieren:"}.
|
||||
{"Export data of users in a host to PIEFXIS files (XEP-0227):","Alle Benutzerdaten des Hosts in PIEFXIS Dateien (XEP-0227) exportieren:"}.
|
||||
{"Failed to extract JID from your voice request approval","Fehler beim Auslesen der JID aus der Anfragenbestätigung für Sprachrechte"}.
|
||||
{"Family Name","Nachname"}.
|
||||
{"February","Februar"}.
|
||||
{"Fill in fields to search for any matching Jabber User","Felder ausfüllen, um nach passenden Jabber Benutzern zu suchen"}.
|
||||
{"Fill in the form to search for any matching Jabber User (Add * to the end of field to match substring)","Füllen sie die Felder aus, um nach passenden Jabber Benutzern zu suchen (beenden sie ein Feld mit *, um auch nach Teilzeichenketten zu suchen)"}.
|
||||
{"Fill in fields to search for any matching Jabber User","Füllen Sie die Felder aus, um nach passenden Jabber-Benutzern zu suchen"}.
|
||||
{"Fill in the form to search for any matching Jabber User (Add * to the end of field to match substring)","Füllen Sie die Felder aus, um nach passenden Jabber-Benutzern zu suchen (beenden Sie ein Feld mit *, um auch nach Teilzeichenketten zu suchen)"}.
|
||||
{"Friday","Freitag"}.
|
||||
{"From ~s","Von ~s"}.
|
||||
{"From","Von"}.
|
||||
{"Full Name","Gesamter Name"}.
|
||||
{"Full Name","Vollständiger Name"}.
|
||||
{"Get Number of Online Users","Anzahl der angemeldeten Benutzer abrufen"}.
|
||||
{"Get Number of Registered Users","Anzahl der registrierten Benutzer abrufen"}.
|
||||
{"Get User Last Login Time","letzte Anmeldezeit abrufen"}.
|
||||
{"Get User Password","Benutzer Passwort abrufen"}.
|
||||
{"Get User Statistics","Benutzer Statistik abrufen"}.
|
||||
{"Get User Password","Benutzer-Passwort abrufen"}.
|
||||
{"Get User Statistics","Benutzer-Statistiken abrufen"}.
|
||||
{"Grant voice to this person?","Sprachrechte dieser Person erteilen?"}.
|
||||
{"Group ","Gruppe "}.
|
||||
{"Groups","Gruppen"}.
|
||||
{"has been banned","wurde gebannt"}.
|
||||
@@ -116,41 +128,43 @@
|
||||
{"has been kicked","wurde gekickt"}.
|
||||
{" has set the subject to: "," hat das Thema geändert auf: "}.
|
||||
{"Host","Host"}.
|
||||
{"If you want to specify different ports, passwords, encodings for IRC servers, fill this list with values in format '{\"irc server\", \"encoding\", port, \"password\"}'. By default this service use \"~s\" encoding, port ~p, empty password.","Wenn sie verschiedene Ports, Passwörter und Kodierungen für IRC Server angeben wollen, erstellen sie die Liste mit folgendem Format '{\"IRC Server\", \"Kodierung\", Port, \"Passwort\"}'. Standardmässig benutzt dieser Dienst die \"~s\" Kodierung, den Port ~p und kein Passwort."}.
|
||||
{"If you don't see the CAPTCHA image here, visit the web page.","Wenn sie das CAPTCHA Bild nicht sehen, besuchen sie bitte die Webseite."}.
|
||||
{"If you want to specify different ports, passwords, encodings for IRC servers, fill this list with values in format '{\"irc server\", \"encoding\", port, \"password\"}'. By default this service use \"~s\" encoding, port ~p, empty password.","Wenn sie verschiedene Ports, Passwörter und Kodierungen für IRC Server angeben wollen, erstellen sie die Liste mit folgendem Format '{\"IRC Server\", \"Kodierung\", Port, \"Passwort\"}'. Standardmäßig benutzt dieser Dienst die \"~s\" Kodierung, den Port ~p und kein Passwort."}.
|
||||
{"Import Directory","Verzeichnis importieren"}.
|
||||
{"Import File","Datei importieren"}.
|
||||
{"Import user data from jabberd14 spool file:","Importiere Benutzer von jabberd14 Spool Datei:"}.
|
||||
{"Import User from File at ","Benutzer aus dieser Datei importieren "}.
|
||||
{"Import users data from a PIEFXIS file (XEP-0227):","Benutzerdaten von einer PIEFXIS Datei (XEP-0227) importieren:"}.
|
||||
{"Import users data from jabberd14 spool directory:","Importiere Benutzer von jabberd14 Spool Verzeichnis:"}.
|
||||
{"Import Users from Dir at ","Benutzer vom Verzeichnis importieren "}.
|
||||
{"Import Users From jabberd14 Spool Files","Importiere Benutzer von jabberd14 Spool Dateien"}.
|
||||
{"Import Users from Dir at ","Benutzer importieren aus dem Verzeichnis "}.
|
||||
{"Import Users From jabberd14 Spool Files","Importiere Benutzer aus jabberd14-Spool-Dateien"}.
|
||||
{"Improper message type","Unzulässiger Nachrichtentyp"}.
|
||||
{"Incorrect password","Falsches Passwort"}.
|
||||
{"Invalid affiliation: ~s","Ungültige Mitgliedschaft: ~s"}.
|
||||
{"Invalid role: ~s","Ungültige Rolle: ~s"}.
|
||||
{"IP addresses","IP Addresse"}.
|
||||
{"IP addresses","IP Adressen"}.
|
||||
{"IP","IP"}.
|
||||
{"IRC channel (don't put the first #)","IRC Channel (ohne dem ersten #)"}.
|
||||
{"IRC server","IRC Server"}.
|
||||
{"IRC settings","IRC Einstellungen"}.
|
||||
{"IRC Transport","IRC Transport"}.
|
||||
{"IRC username","IRC Benutzername"}.
|
||||
{"IRC Username","IRC Benutzername"}.
|
||||
{"IRC Username","IRC-Benutzername"}.
|
||||
{"is now known as","ist nun bekannt als"}.
|
||||
{"It is not allowed to send private messages","Es ist nicht erlaubt private Nachrichten zu senden"}.
|
||||
{"It is not allowed to send private messages of type \"groupchat\"","Es ist nicht erlaubt private Nachrichten des Typs \"Gruppenchat\" zu senden"}.
|
||||
{"It is not allowed to send private messages to the conference","Es ist nicht erlaubt private Nachrichten an den Raum zu schicken"}.
|
||||
{"Jabber Account Registration","Jabber Konto Anmeldung"}.
|
||||
{"Jabber ID","Jabber ID"}.
|
||||
{"Jabber ID ~s is invalid","Jabber ID ~s ist ungültig"}.
|
||||
{"Jabber ID ~s is invalid","Die Jabber-ID ~s ist ungültig"}.
|
||||
{"January","Januar"}.
|
||||
{"Join IRC channel","IRC Channel beitreten"}.
|
||||
{"joins the room","kommt in den Raum"}.
|
||||
{"joins the room","betretet den Raum"}.
|
||||
{"Join the IRC channel here.","Hier den IRC Channel beitreten."}.
|
||||
{"Join the IRC channel in this Jabber ID: ~s","Den IRC Channel mit dieser Jabber ID beitreten: ~s"}.
|
||||
{"July","Juli"}.
|
||||
{"June","Juni"}.
|
||||
{"Last Activity","Letzte Aktion"}.
|
||||
{"Last Activity","Letzte Aktivität"}.
|
||||
{"Last login","Letzte Anmeldung"}.
|
||||
{"Last month","Letzter Monat"}.
|
||||
{"Last year","Letztes Jahr"}.
|
||||
@@ -160,10 +174,10 @@
|
||||
{"List of modules to start","Liste der zu startenden Module"}.
|
||||
{"Low level update script","Low level Aktualisierungsscript"}.
|
||||
{"Make participants list public","Teilnehmerliste öffentlich machen"}.
|
||||
{"Make room captcha protected","Raum mit Verifizierung (Captcha) versehen"}.
|
||||
{"Make room CAPTCHA protected","Raum mit Verifizierung (Captcha) versehen"}.
|
||||
{"Make room members-only","Raum nur für Mitglieder zugänglich machen"}.
|
||||
{"Make room moderated","Raum modieriert machen"}.
|
||||
{"Make room password protected","Raum passwortgeschützt machen"}.
|
||||
{"Make room moderated","Raum moderiert machen"}.
|
||||
{"Make room password protected","Raum mit Passwort schützen"}.
|
||||
{"Make room persistent","Raum persistent machen"}.
|
||||
{"Make room public searchable","Raum öffentlich suchbar machen"}.
|
||||
{"March","März"}.
|
||||
@@ -173,9 +187,11 @@
|
||||
{"May","Mai"}.
|
||||
{"Membership is required to enter this room","Um diesen Raum zu betreten müssen sie Mitglied sein"}.
|
||||
{"Members:","Mitglieder:"}.
|
||||
{"Memorize your password, or write it in a paper placed in a safe place. In Jabber there isn't an automated way to recover your password if you forget it.","Merken sie sich ihr Passwort, oder schreiben sie es auf einen Zettel den sie sicher verwahren. Bei Jabber gibt es keine automatische Möglichkeit, das Passwort wiederherzustellen."}.
|
||||
{"Memory","Speicher"}.
|
||||
{"Message body","Nachrichtentext"}.
|
||||
{"Middle Name","Zweiter Vorname"}.
|
||||
{"Minimum interval between voice requests (in seconds)","Mindestdauer zwischen Anfragen für Sprachrechte (in Sekunden)"}.
|
||||
{"Moderator privileges required","Moderatorrechte benötigt"}.
|
||||
{"moderators only","ausschliesslich Moderatoren"}.
|
||||
{"Modified modules","Geänderte Module"}.
|
||||
@@ -186,72 +202,81 @@
|
||||
{"Name:","Name:"}.
|
||||
{"Name","Vorname"}.
|
||||
{"Never","Nie"}.
|
||||
{"Nickname Registration at ","Registrieren des Spitznamens bei"}.
|
||||
{"Nickname ~s does not exist in the room","Spitzname ~s existiert im Raum nicht"}.
|
||||
{"Nickname","Spitzname"}.
|
||||
{"New Password:","Neues Passwort:"}.
|
||||
{"Nickname","Benutzername"}.
|
||||
{"Nickname Registration at ","Registrieren des Benutzernames auf"}.
|
||||
{"Nickname ~s does not exist in the room","Der Benutzername ~s existiert im Raum nicht"}.
|
||||
{"nobody","niemanden"}.
|
||||
{"No body provided for announce message","Kein Text für die Ankündigung angegeben"}.
|
||||
{"No Data","Keine Daten"}.
|
||||
{"Node ID","Knoten ID"}.
|
||||
{"Node ID","Knoten-ID"}.
|
||||
{"Node ","Knoten "}.
|
||||
{"Node not found","Knoten nicht gefunden"}.
|
||||
{"Nodes","Knoten"}.
|
||||
{"No limit","Keine Begrenzung"}.
|
||||
{"None","Keine"}.
|
||||
{"No resource provided","Keine Ressource angegeben"}.
|
||||
{"Not Found","nicht gefunden"}.
|
||||
{"Not Found","Nicht gefunden"}.
|
||||
{"Notify subscribers when items are removed from the node","Abonnenten benachrichtigen, wenn Einträge vom Knoten entfernt werden"}.
|
||||
{"Notify subscribers when the node configuration changes","Abonnenten benachrichtigen, wenn die Knotenkonfiguration sich ändert"}.
|
||||
{"Notify subscribers when the node configuration changes","Abonnenten benachrichtigen, wenn sich die Knotenkonfiguration ändert"}.
|
||||
{"Notify subscribers when the node is deleted","Abonnenten benachrichtigen, wenn der Knoten gelöscht wird"}.
|
||||
{"November","November"}.
|
||||
{"Number of occupants","Anzahl der Teilnehmer"}.
|
||||
{"Number of online users","Anzahl der angemeldeten Benutzer"}.
|
||||
{"Number of registered users","Anzahl der registrierten Benutzer"}.
|
||||
{"October","Oktober"}.
|
||||
{"Offline Messages:","Offline Nachrichten:"}.
|
||||
{"Offline Messages","Offline Nachrichten"}.
|
||||
{"Offline Messages:","Offline-Nachrichten:"}.
|
||||
{"Offline Messages","Offline-Nachrichten"}.
|
||||
{"OK","OK"}.
|
||||
{"Old Password:","Aktuelles Passwort:"}.
|
||||
{"Online","Angemeldet"}.
|
||||
{"Online Users:","Angemeldete Benutzer:"}.
|
||||
{"Online Users","Angemeldete Benutzer"}.
|
||||
{"Only deliver notifications to available users","Benachrichtigungen nur an verfügbare Benutzer schicken"}.
|
||||
{"Only moderators and participants are allowed to change the subject in this room","Nur Moderatoren und Mitglieder dürfen das Thema in diesem Raum ändern"}.
|
||||
{"Only moderators are allowed to change the subject in this room","Nur Moderatoren dürfen das Thema in diesem Raum ändern"}.
|
||||
{"Only moderators can approve voice requests","Nur Moderatoren können Anfragen für Sprachrechte bestätigen"}.
|
||||
{"Only occupants are allowed to send messages to the conference","Nur Teilnehmer dürfen Nachrichten an den Raum schicken"}.
|
||||
{"Only occupants are allowed to send queries to the conference","Nur Teilnehmer sind berechtig Anfragen an die Konferenz zu senden"}.
|
||||
{"Only service administrators are allowed to send service messages","Nur Service Administratoren sind berechtigt, Servicenachrichten zu senden"}.
|
||||
{"Only occupants are allowed to send queries to the conference","Nur Teilnehmer sind berechtigt Anfragen an die Konferenz zu senden"}.
|
||||
{"Only service administrators are allowed to send service messages","Nur Service-Administratoren sind berechtigt, Servicenachrichten zu versenden"}.
|
||||
{"Options","Optionen"}.
|
||||
{"Organization Name","Firmenname"}.
|
||||
{"Organization Name","Organisation"}.
|
||||
{"Organization Unit","Abteilung"}.
|
||||
{"Outgoing s2s Connections:","Ausgehende s2s Verbindungen:"}.
|
||||
{"Outgoing s2s Connections","Ausgehende s2s Verbindungen"}.
|
||||
{"Outgoing s2s Servers:","Ausgehende s2s Server:"}.
|
||||
{"Outgoing s2s Connections:","Ausgehende s2s-Verbindungen:"}.
|
||||
{"Outgoing s2s Connections","Ausgehende s2s-Verbindungen"}.
|
||||
{"Outgoing s2s Servers:","Ausgehende s2s-Server:"}.
|
||||
{"Owner privileges required","Besitzerrechte benötigt"}.
|
||||
{"Packet","Paket"}.
|
||||
{"Password ~b","Passwort ~b"}.
|
||||
{"Password:","Passwort:"}.
|
||||
{"Password","Passwort"}.
|
||||
{"Password Verification:","Passwort bestätigen:"}.
|
||||
{"Password Verification","Passwort bestätigen"}.
|
||||
{"Path to Dir","Pfad zum Verzeichnis"}.
|
||||
{"Path to File","Pfad zur Datei"}.
|
||||
{"Pending","schwebend"}.
|
||||
{"Pending","anhängig"}.
|
||||
{"Period: ","Zeitraum: "}.
|
||||
{"Persist items to storage","Einträge dauerhaft speichern"}.
|
||||
{"Ping","Ping"}.
|
||||
{"Please note that these options will only backup the builtin Mnesia database. If you are using the ODBC module, you also need to backup your SQL database separately.","Beachten sie, das diese Optionen nur die eingebaute Mnesia Datenbank sichert. Wenn sie das ODBC Modul verwenden müssen sie die SQL Datenbank zusätzlich manuell sichern."}.
|
||||
{"Please note that these options will only backup the builtin Mnesia database. If you are using the ODBC module, you also need to backup your SQL database separately.","Beachten sie, das diese Optionen nur die eingebaute Mnesia-Datenbank sichern. Wenn sie das ODBC-Modul verwenden, müssen sie die SQL-Datenbank manuell sichern."}.
|
||||
{"Please, wait for a while before sending new voice request","Bitte warten sie ein wenig, bevor sie eine weitere Anfrage für Sprachrechte senden"}.
|
||||
{"Pong","Pong"}.
|
||||
{"Port ~b","Port ~b"}.
|
||||
{"Port","Port"}.
|
||||
{"Present real Jabber IDs to","Echte Jabber IDs anzeigen für"}.
|
||||
{"Present real Jabber IDs to","Echte Jabber-IDs anzeigen für"}.
|
||||
{"private, ","privat, "}.
|
||||
{"Protocol","Protokoll"}.
|
||||
{"Publish-Subscribe","Publish-Subscribe"}.
|
||||
{"PubSub subscriber request","PubSub Abonnenten Anfrage"}.
|
||||
{"PubSub subscriber request","PubSub-Abonnenten-Anfrage"}.
|
||||
{"Purge all items when the relevant publisher goes offline","Alle Einträge entfernen, wenn der relevante Veröffentlicher offline geht"}.
|
||||
{"Queries to the conference members are not allowed in this room","Anfragen an die Teilnehmer sind in diesem Raum nicht erlaubt"}.
|
||||
{"RAM and disc copy","RAM und Festplatten Kopie"}.
|
||||
{"RAM copy","RAM Kopie"}.
|
||||
{"RAM and disc copy","RAM und Festplatte"}.
|
||||
{"RAM copy","Nur RAM"}.
|
||||
{"Raw","Unformatiert"}.
|
||||
{"Really delete message of the day?","Wirklich die Nachricht des Tages löschen?"}.
|
||||
{"Really delete message of the day?","Die Nachricht des Tages wirklich löschen?"}.
|
||||
{"Recipient is not in the conference room","Der Empfänger ist nicht im Raum"}.
|
||||
{"Register a Jabber account","Jabber Konto registrieren"}.
|
||||
{"Register","Anmelden"}.
|
||||
{"Registered Users:","Registrierte Benutzer:"}.
|
||||
{"Registered Users","Registrierte Benutzer"}.
|
||||
{"Registration in mod_irc for ","Registrierung in mod_irc für "}.
|
||||
@@ -264,11 +289,11 @@
|
||||
{"Restart","Neustart"}.
|
||||
{"Restart Service","Dienst neustarten"}.
|
||||
{"Restore Backup from File at ","Datenwiederherstellung aus der Datei "}.
|
||||
{"Restore binary backup after next ejabberd restart (requires less memory):","Stelle binäre Sicherung beim nächsten ejabberd Neustart wieder her (benötigt weniger Speicher):"}.
|
||||
{"Restore binary backup after next ejabberd restart (requires less memory):","Stelle binäre Sicherung beim nächsten ejabberd-Neustart wieder her (benötigt weniger Speicher):"}.
|
||||
{"Restore binary backup immediately:","Stelle binäre Sicherung sofort wieder her:"}.
|
||||
{"Restore plain text backup immediately:","Stelle Klartext-Sicherung sofort wieder her:"}.
|
||||
{"Restore","Wiederherstellung"}.
|
||||
{"Room Configuration","Raum Konfiguration"}.
|
||||
{"Room Configuration","Raum-Konfiguration"}.
|
||||
{"Room creation is denied by service policy","Anlegen des Raumes aufgrund der Dienstrichtlinien verweigert"}.
|
||||
{"Room description","Raum Beschreibung"}.
|
||||
{"Room Occupants","Teilnehmer in diesem Raum"}.
|
||||
@@ -277,11 +302,11 @@
|
||||
{"Roster","Kontaktliste"}.
|
||||
{"Roster of ","Kontaktliste von "}.
|
||||
{"Roster size","Kontaktlistengröße"}.
|
||||
{"RPC Call Error","RPC Abruf-Fehler"}.
|
||||
{"RPC Call Error","Fehler bei RPC-Aufruf"}.
|
||||
{"Running Nodes","Aktive Knoten"}.
|
||||
{"~s access rule configuration","~s Zugangsregel Konfiguration"}.
|
||||
{"~s access rule configuration","~s Zugangsregel-Konfiguration"}.
|
||||
{"Saturday","Samstag"}.
|
||||
{"Script check","Script Überprüfung"}.
|
||||
{"Script check","Script-Überprüfung"}.
|
||||
{"Search Results for ","Suchergebnisse für "}.
|
||||
{"Search users in ","Benutzer suchen in "}.
|
||||
{"Send announcement to all online users on all hosts","Sende Ankündigung an alle angemeldeten Benutzer auf allen Hosts"}.
|
||||
@@ -290,56 +315,71 @@
|
||||
{"Send announcement to all users","Sende Ankündigung an alle Benutzer"}.
|
||||
{"September","September"}.
|
||||
{"Server ~b","Server ~b"}.
|
||||
{"Server:","Server:"}.
|
||||
{"Set message of the day and send to online users","Setze Nachricht des Tages und sende sie an alle angemeldeten Benutzer"}.
|
||||
{"Set message of the day on all hosts and send to online users","Setze Nachricht des Tages auf allen Hosts und sende sie an alle angemeldeten Benutzer"}.
|
||||
{"Shared Roster Groups","Gruppen der gemeinsamen Kontaktliste"}.
|
||||
{"Show Integral Table","Vollständige Tabelle anzeigen"}.
|
||||
{"Show Ordinary Table","Normale Tabelle anzeigen"}.
|
||||
{"Shut Down Service","Dienst herunterfahren"}.
|
||||
{"~s invites you to the room ~s","~s lädt sie in den Raum ~s ein"}.
|
||||
{"~s invites you to the room ~s","~s lädt Sie in den Raum ~s ein"}.
|
||||
{"Some Jabber clients can store your password in your computer. Use that feature only if you trust your computer is safe.","Einige Jabber Client Programme speichern ihr Passwort auf ihrem Computer. Verwenden sie diese Möglichkeit nur auf Computern, die sie als sicher einstufen."}.
|
||||
{"Specify the access model","Geben sie das Zugangsmodell an"}.
|
||||
{"Specify the event message type","Geben sie den Ereignis-Nachrichtentyp an"}.
|
||||
{"Specify the publisher model","Geben sie das Publikationsmodell an"}.
|
||||
{"~s's Offline Messages Queue","~s's Offline Nachrichten Warteschlange"}.
|
||||
{"Start","Anfang"}.
|
||||
{"Start Modules at ","Starte Module bei "}.
|
||||
{"~s's Offline Messages Queue","~s's Offline-Nachrichten-Warteschlange"}.
|
||||
{"Start Modules at ","Starte Module auf "}.
|
||||
{"Start Modules","Module starten"}.
|
||||
{"Start","Starten"}.
|
||||
{"Statistics of ~p","Statistiken von ~p"}.
|
||||
{"Statistics","Statistik"}.
|
||||
{"Stop Modules at ","Stoppe Module bei "}.
|
||||
{"Stop Modules at ","Stoppe Module auf "}.
|
||||
{"Stop Modules","Module stoppen"}.
|
||||
{"Stopped Nodes","Inaktive Knoten"}.
|
||||
{"Stop","Stop"}.
|
||||
{"Stop","Stoppen"}.
|
||||
{"Storage Type","Speichertyp"}.
|
||||
{"Store binary backup:","Speichere binäre Sicherung:"}.
|
||||
{"Store plain text backup:","Speichere Klartext-Sicherung:"}.
|
||||
{"Subject","Thema"}.
|
||||
{"Subject","Betreff"}.
|
||||
{"Submit","Senden"}.
|
||||
{"Submitted","Gesendet"}.
|
||||
{"Subscriber Address","Abonnenten Adresse"}.
|
||||
{"Subscriber Address","Abonnenten-Adresse"}.
|
||||
{"Subscription","Abonnement"}.
|
||||
{"Sunday","Sonntag"}.
|
||||
{"That nickname is already in use by another occupant","Dieser Spitzname wird bereits von einem Teilnehmer genutzt"}.
|
||||
{"That nickname is registered by another person","Dieser Spitzname wurde bereits von jemand anderem registriert"}.
|
||||
{"The captcha is valid.","Die Verifizierung ist gültig."}.
|
||||
{"That nickname is already in use by another occupant","Dieser Benutzername wird bereits von einem Teilnehmer genutzt"}.
|
||||
{"That nickname is registered by another person","Dieser Benutzername wurde bereits von jemand anderem registriert"}.
|
||||
{"The CAPTCHA is valid.","Die Verifizierung ist gültig."}.
|
||||
{"The CAPTCHA verification has failed","Die CAPTCHA Verifizierung schlug fehl"}.
|
||||
{"The collections with which a node is affiliated","Sammlungen, mit denen ein Knoten verknüpft ist"}.
|
||||
{"the password is","das Passwort ist"}.
|
||||
{"This participant is kicked from the room because he sent an error message","Dieser Teilnehmer wurde aus dem Raum gekickt, da er eine Fehlernachricht gesendet hat"}.
|
||||
{"This participant is kicked from the room because he sent an error message to another participant","Dieser Teilnehmer wurde aus dem Raum gekickt, da er eine Fehlernachricht an einen anderen Teilnehmer gesendet hat"}.
|
||||
{"the password is","das Passwort lautet"}.
|
||||
{"The password is too weak","Das Passwort ist zu einfach"}.
|
||||
{"The password of your Jabber account was successfully changed.","Das Passwort von ihrem Jabber Konto wurde geändert."}.
|
||||
{"There was an error changing the password: ","Es trat ein Fehler beim Ändern des Passworts auf:"}.
|
||||
{"There was an error creating the account: ","Es trat ein Fehler beim erstellen des Kontos auf:"}.
|
||||
{"There was an error deleting the account: ","Es trat ein Fehler beim Löschen des Kontos auf:"}.
|
||||
{"This is case insensitive: macbeth is the same that MacBeth and Macbeth.","Groß/Klein-Schreibung spielt hierbei keine Rolle: macbeth ist gleich MacBeth und Macbeth."}.
|
||||
{"This page allows to create a Jabber account in this Jabber server. Your JID (Jabber IDentifier) will be of the form: username@server. Please read carefully the instructions to fill correctly the fields.","Diese Seite erlaubt das anlegen eines Jabber Kontos auf diesem Jabber Server. Ihre JID (Jabber IDentifier) setzt sich folgend zusammen: benutzername@server. Bitte lesen sie die Hinweise genau durch, um die Felder korrekt auszufüllen."}.
|
||||
{"This page allows to unregister a Jabber account in this Jabber server.","Diese Seite erlaubt es, ein Jabber Konto von diesem Server zu entfernen."}.
|
||||
{"This participant is kicked from the room because he sent an error message","Dieser Teilnehmer wurde aus dem Raum geworfen, da er eine fehlerhafte Nachricht gesendet hat"}.
|
||||
{"This participant is kicked from the room because he sent an error message to another participant","Dieser Teilnehmer wurde aus dem Raum geworfen, da er eine fehlerhafte Nachricht an einen anderen Teilnehmer gesendet hat"}.
|
||||
{"This participant is kicked from the room because he sent an error presence","Dieser Teilnehmer wurde aus dem Raum gekickt, da er einen fehlerhaften Status gesendet hat"}.
|
||||
{"This room is not anonymous","Dieser Raum ist nicht anonym"}.
|
||||
{"Thursday","Donnerstag"}.
|
||||
{"Time delay","Zeitverzögerung"}.
|
||||
{"Time","Zeit"}.
|
||||
{"To","An"}.
|
||||
{"Too many CAPTCHA requests","Zu viele CAPTCHA Anfragen"}.
|
||||
{"To ~s","An ~s"}.
|
||||
{"To","Zu"}.
|
||||
{"Traffic rate limit is exceeded","Datenratenlimit wurde überschritten"}.
|
||||
{"Transactions Aborted:","Vorgänge abgebrochen:"}.
|
||||
{"Transactions Committed:","Vorgänge durchgeführt:"}.
|
||||
{"Transactions Logged:","Vorgänge protokolliert:"}.
|
||||
{"Transactions Restarted:","Vorgänge neu gestartet:"}.
|
||||
{"Transactions Aborted:","Abgebrochene Transaktionen:"}.
|
||||
{"Transactions Committed:","Durchgeführte Transaktionen:"}.
|
||||
{"Transactions Logged:","Protokollierte Transaktionen:"}.
|
||||
{"Transactions Restarted:","Neu gestartete Transaktionen:"}.
|
||||
{"Tuesday","Dienstag"}.
|
||||
{"Unable to generate a captcha","Konnte Verifizierung nicht erstellen"}.
|
||||
{"Unable to generate a CAPTCHA","Konnte CAPTCHA nicht erstellen"}.
|
||||
{"Unauthorized","Nicht berechtigt"}.
|
||||
{"Unregister","Abmelden"}.
|
||||
{"Unregister a Jabber account","Jabber Konto entfernen"}.
|
||||
{"Update","Aktualisieren"}.
|
||||
{"Update ","Aktualisierung "}.
|
||||
{"Update message of the day (don't send)","Aktualisiere Nachricht des Tages (nicht senden)"}.
|
||||
@@ -350,22 +390,32 @@
|
||||
{"Use of STARTTLS required","Verwendung von STARTTLS erforderlich"}.
|
||||
{"User ","Benutzer "}.
|
||||
{"User","Benutzer"}.
|
||||
{"User Management","Benutzer Verwaltung"}.
|
||||
{"User JID","Benutzer JID"}.
|
||||
{"User Management","Benutzerverwaltung"}.
|
||||
{"Username:","Benutzername:"}.
|
||||
{"Users are not allowed to register accounts so quickly","Benutzer dürfen Konten nicht so schnell registrieren"}.
|
||||
{"Users","Benutzer"}.
|
||||
{"Users Last Activity","Letzte Benutzeraktivität"}.
|
||||
{"Validate","Validieren"}.
|
||||
{"vCard User Search","vCard Benutzer Suche"}.
|
||||
{"Visitors are not allowed to change their nicknames in this room","Besucher dürfen in diesem Raum ihren Spitznamen nicht ändern"}.
|
||||
{"vCard User Search","vCard-Benutzer-Suche"}.
|
||||
{"Virtual Hosts","Virtuelle Hosts"}.
|
||||
{"Visitors are not allowed to change their nicknames in this room","Besucher dürfen in diesem Raum ihren Benutzernamen nicht ändern"}.
|
||||
{"Visitors are not allowed to send messages to all occupants","Besucher dürfen nicht an alle Teilnehmer Nachrichten verschicken"}.
|
||||
{"Voice request","Anfrage für Sprachrechte"}.
|
||||
{"Voice requests are disabled in this conference","Anfragen für Sprachrechte sind in diesem Raum deaktiviert"}.
|
||||
{"Wednesday","Mittwoch"}.
|
||||
{"When to send the last published item","Wann soll das letzte veröffentlichte Objekt gesendet werden"}.
|
||||
{"Whether to allow subscriptions","Ob Abonnements erlaubt sind"}.
|
||||
{"You can later change your password using a Jabber client.","Sie können das Passwort später mit einem Jabber Client Programm ändern."}.
|
||||
{"You have been banned from this room","Sie wurden aus diesem Raum verbannt"}.
|
||||
{"You must fill in field \"Nickname\" in the form","Sie müssen das Feld \"Spitzname\" ausfüllen"}.
|
||||
{"You need an x:data capable client to configure mod_irc settings","Sie benötigen einen Client, der x:data unterstützt, um die mod_irc Einstellungen zu konfigurieren"}.
|
||||
{"You must fill in field \"Nickname\" in the form","Sie müssen das Feld \"Benutzername\" ausfüllen"}.
|
||||
{"You need a client that supports x:data and CAPTCHA to register","Sie benötigen einen Client, der x:data und CAPTCHA unterstützt, um Ihren Benutzernamen zu registrieren"}.
|
||||
{"You need a client that supports x:data to register the nickname","Sie benötigen einen Client, der x:data unterstützt, um Ihren Benutzernamen zu registrieren"}.
|
||||
{"You need an x:data capable client to configure mod_irc settings","Sie benötigen einen Client, der x:data unterstützt, um die mod_irc-Einstellungen zu konfigurieren"}.
|
||||
{"You need an x:data capable client to configure room","Sie benötigen einen Client, der x:data unterstützt, um den Raum zu konfigurieren"}.
|
||||
{"You need an x:data capable client to register nickname","Sie benötigen einen Client, der x:data unterstützt, um Ihren Spitznamen zu registrieren"}.
|
||||
{"You need an x:data capable client to search","Sie benötigen einen Client, der x:data unterstützt, um suchen zu können"}.
|
||||
{"Your contact offline message queue is full. The message has been discarded.","Ihre offline Kontakt Warteschlange ist voll. Die Nachricht wurde verworfen."}.
|
||||
{"You need an x:data capable client to search","Sie benötigen einen Client, der x:data unterstützt, um die Suche verwenden zu können"}.
|
||||
{"Your active privacy list has denied the routing of this stanza.","Ihre aktive Privacy Liste hat die Weiterleitung des Stanzas unterbunden."}.
|
||||
{"Your contact offline message queue is full. The message has been discarded.","Ihre Offline-Nachrichten-Warteschlange ist voll. Die Nachricht wurde verworfen."}.
|
||||
{"Your Jabber account was successfully created.","Ihr Jabber Konto wurde erfolgreich erstellt."}.
|
||||
{"Your Jabber account was successfully deleted.","Ihr Jabber Konto wurde erfolgreich gelöscht."}.
|
||||
{"Your messages to ~s are being blocked. To unblock them, visit ~s","Ihre Nachrichten an ~s werden blockiert. Um dies zu ändern, besuchen sie ~s"}.
|
||||
+1883
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -20,7 +20,9 @@
|
||||
{"Allow users to send invites","Επιτρέψετε στους χρήστες να αποστέλλουν προσκλήσεις"}.
|
||||
{"Allow users to send private messages","Επιτρέψετε στους χρήστες να αποστέλλουν ιδιωτικά μηνύματα"}.
|
||||
{"Allow visitors to change nickname","Επιτρέψετε στους επισκέπτες να αλλάζου ψευδώνυμο"}.
|
||||
{"Allow visitors to send private messages to","Επιτρέψετε στους χρήστες να αποστέλλουν ιδιωτικά μηνύματα σε"}.
|
||||
{"Allow visitors to send status text in presence updates","Επιτρέψτε στους επισκέπτες να αποστέλλουν κατάσταση στις ενημερώσεις παρουσίας"}.
|
||||
{"Allow visitors to send voice requests","Επιτρέψτε στους επισκέπτες να στέλνουν αιτήματα φωνής"}.
|
||||
{"All Users","Όλοι οι χρήστες"}.
|
||||
{"Announcements","Ανακοινώσεις"}.
|
||||
{"anyone","οποιοσδήποτε"}.
|
||||
@@ -33,9 +35,15 @@
|
||||
{"Backup","Αποθήκευση Αντιγράφου Ασφαλείας"}.
|
||||
{"Bad format","Ακατάλληλη μορφή"}.
|
||||
{"Birthday","Γενέθλια"}.
|
||||
{"CAPTCHA web page","Ιστοσελίδα CAPTCHA "}.
|
||||
{"Change Password","Αλλαγή κωδικού"}.
|
||||
{"Change User Password","Αλλαγή Κωδικού Πρόσβασης Χρήστη"}.
|
||||
{"Characters not allowed:","Χαρακτήρες δεν επιτρέπονται:"}.
|
||||
{"Chatroom configuration modified","Διαμόρφωση Αίθουσaς σύνεδριασης τροποποιηθηκε"}.
|
||||
{"Chatroom is created","Η αίθουσα σύνεδριασης δημιουργήθηκε"}.
|
||||
{"Chatroom is destroyed","Η αίθουσα σύνεδριασης διαγράφηκε"}.
|
||||
{"Chatroom is started","Η αίθουσα σύνεδριασης έχει ξεκινήσει"}.
|
||||
{"Chatroom is stopped","Η αίθουσα σύνεδριασης έχει σταματήσει"}.
|
||||
{"Chatrooms","Αίθουσες σύνεδριασης"}.
|
||||
{"Choose a username and password to register with this server","Επιλέξτε ένα όνομα χρήστη και κωδικό πρόσβασης για να εγγραφείτε σε αυτό τον διακομιστή"}.
|
||||
{"Choose modules to stop","Επιλέξτε modules για να σταματήσουν"}.
|
||||
@@ -65,15 +73,16 @@
|
||||
{"Description:","Περιγραφή:"}.
|
||||
{"Disc only copy","Αντίγραφο μόνο σε δίσκο"}.
|
||||
{"Displayed Groups:","Εμφανίσμενες Ομάδες:"}.
|
||||
{"Don't tell your password to anybody, not even the administrators of the Jabber server.","Μην πείτε τον κωδικό πρόσβασής σας σε κανέναν, ακόμη και στους διαχειριστές του διακομιστή Jabber."}.
|
||||
{"Dump Backup to Text File at ","Αποθήκευση Αντιγράφου Ασφαλείας σε αρχείο κειμένου στο "}.
|
||||
{"Dump to Text File","Αποθήκευση σε αρχείο κειμένου"}.
|
||||
{"Edit Properties","Επεξεργασία ιδιοτήτων"}.
|
||||
{"Either approve or decline the voice request.","Είτε εγκρίνετε ή απορρίψτε το αίτημα φωνής."}.
|
||||
{"ejabberd IRC module","ejabberd IRC module"}.
|
||||
{"ejabberd MUC module","ejabberd MUC module"}.
|
||||
{"ejabberd Publish-Subscribe module","ejabberd module Δημοσίευσης-Εγγραφής"}.
|
||||
{"ejabberd SOCKS5 Bytestreams module","ejabberd SOCKS5 Bytestreams module"}.
|
||||
{"ejabberd vCard module","ejabberd vCard module"}.
|
||||
{"ejabberd virtual hosts","εικονικοί κεντρικοί υπολογιστές ejabberd"}.
|
||||
{"ejabberd Web Admin","ejabberd Web Admin"}.
|
||||
{"Elements","Στοιχεία"}.
|
||||
{"Email","Email"}.
|
||||
@@ -92,8 +101,10 @@
|
||||
{"Erlang Jabber Server","Erlang Jabber Διακομιστής"}.
|
||||
{"Error","Σφάλμα"}.
|
||||
{"Example: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef.net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}].","Παράδειγμα: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef.net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."}.
|
||||
{"Exclude Jabber IDs from CAPTCHA challenge","Εξαίρεση από τις ταυτότητες Jabber, ή CAPTCHA πρόκληση"}.
|
||||
{"Export data of all users in the server to PIEFXIS files (XEP-0227):","Εξαγωγή δεδομένων όλων των χρηστών του διακομιστή σε PIEFXIS αρχεία (XEP-0227):"}.
|
||||
{"Export data of users in a host to PIEFXIS files (XEP-0227):","Εξαγωγή δεδομένων των χρηστών κεντρικού υπολογιστή σε PIEFXIS αρχεία (XEP-0227):"}.
|
||||
{"Failed to extract JID from your voice request approval","Απέτυχε η εξαγωγή JID από την έγκριση του αιτήματος φωνής σας"}.
|
||||
{"Family Name","Επώνυμο"}.
|
||||
{"February","Φεβρουάριος"}.
|
||||
{"Fill in fields to search for any matching Jabber User","Συμπληρώστε τα πεδία για να αναζητήσετε οποιαδήποτε ταιριάζοντα Jabber χρήστη"}.
|
||||
@@ -107,6 +118,7 @@
|
||||
{"Get User Last Login Time","Έκθεση Τελευταίας Ώρας Σύνδεσης Χρήστη"}.
|
||||
{"Get User Password","Έκθεση Κωδικού Πρόσβασης Χρήστη"}.
|
||||
{"Get User Statistics","Έκθεση Στατιστικών Χρήστη"}.
|
||||
{"Grant voice to this person?","Παραχώρηση φωνής σε αυτό το άτομο;"}.
|
||||
{"Groups","Ομάδες"}.
|
||||
{"Group ","Ομάδα"}.
|
||||
{"has been banned","έχει απαγορευθεί"}.
|
||||
@@ -116,6 +128,7 @@
|
||||
{"has been kicked","αποβλήθηκε "}.
|
||||
{" has set the subject to: "," έχει θέσει το θέμα σε: "}.
|
||||
{"Host","Κεντρικός Υπολογιστής"}.
|
||||
{"If you don't see the CAPTCHA image here, visit the web page.","Εάν δεν βλέπετε την εικόνα CAPTCHA εδώ, επισκεφθείτε την ιστοσελίδα."}.
|
||||
{"If you want to specify different ports, passwords, encodings for IRC servers, fill this list with values in format '{\"irc server\", \"encoding\", port, \"password\"}'. By default this service use \"~s\" encoding, port ~p, empty password.","Εάν θέλετε να καθορίσετε διαφορετικές θύρες, κωδικούς πρόσβασης, κωδικοποιήσεις για IRC διακομιστές, εισάγετε πληροφορίες στη μορφή '{\"irc διακομιστής\", \"κωδικοποιήσεις\", θύρα, \"κωδικός πρόσβασης\"}'. Προεπιλεγμενα αυτή η υπηρεσία χρησιμοποιεί \"~s\" κωδικοποιήση, θύρα ~p, κενό κωδικό πρόσβασης."}.
|
||||
{"Import Directory","Εισαγωγή κατάλογου αρχείων"}.
|
||||
{"Import File","Εισαγωγή αρχείων"}.
|
||||
@@ -141,6 +154,7 @@
|
||||
{"It is not allowed to send private messages of type \"groupchat\"","Δεν επιτρέπεται να στείλει προσωπικά μηνύματα του τύπου \"groupchat\""}.
|
||||
{"It is not allowed to send private messages to the conference","Δεν επιτρέπεται να στείλει προσωπικά μηνύματα για τη διάσκεψη"}.
|
||||
{"It is not allowed to send private messages","Δεν επιτρέπεται η αποστολή προσωπικών μηνυμάτων"}.
|
||||
{"Jabber Account Registration","Εγγραφή λογαριασμού Jabber"}.
|
||||
{"Jabber ID ~s is invalid","Η Jabber Ταυτότητα ~s είναι άκυρη"}.
|
||||
{"Jabber ID","Ταυτότητα Jabber"}.
|
||||
{"January","Ιανουάριος"}.
|
||||
@@ -160,7 +174,7 @@
|
||||
{"List of modules to start","Λίστα των Module για Εκκίνηση"}.
|
||||
{"Low level update script","Προγράμα ενημέρωσης χαμηλού επίπεδου "}.
|
||||
{"Make participants list public","Κάντε κοινό τον κατάλογο συμμετεχόντων"}.
|
||||
{"Make room captcha protected","Κάντε την αίθουσα CAPTCHA προστατεύονομενη"}.
|
||||
{"Make room CAPTCHA protected","Κάντε την αίθουσα CAPTCHA προστατεύονομενη"}.
|
||||
{"Make room members-only","Κάντε την αίθουσα μόνο για μέλη"}.
|
||||
{"Make room moderated","Κάντε την αίθουσα εποπτεύονομενη"}.
|
||||
{"Make room password protected","Κάντε την αίθουσα προστατεύομενη με κωδικό πρόσβασης"}.
|
||||
@@ -173,9 +187,11 @@
|
||||
{"May","Μάιος"}.
|
||||
{"Membership is required to enter this room","Απαιτείται αίτηση συμετοχής για είσοδο σε αυτή την αίθουσα"}.
|
||||
{"Members:","Μέλη:"}.
|
||||
{"Memorize your password, or write it in a paper placed in a safe place. In Jabber there isn't an automated way to recover your password if you forget it.","Απομνημονεύστε τον κωδικό πρόσβασής σας, ή γράψετε τον σε ένα χαρτί που είχε τοποθετηθεί σε ασφαλές μέρος. Στο Jabber δεν υπάρχει αυτοματοποιημένος τρόπος για να ανακτήσετε τον κωδικό σας αν τον ξεχάσετε."}.
|
||||
{"Memory","Μνήμη"}.
|
||||
{"Message body","Περιεχόμενο μηνυμάτως"}.
|
||||
{"Middle Name","Πατρώνυμο"}.
|
||||
{"Minimum interval between voice requests (in seconds)","Ελάχιστο χρονικό διάστημα μεταξύ αιτημάτων φωνής (σε δευτερόλεπτα)"}.
|
||||
{"Moderator privileges required","Aπαιτούνται προνόμια συντονιστή"}.
|
||||
{"moderators only","συντονιστές μόνο"}.
|
||||
{"Modified modules","Τροποποιημένα modules"}.
|
||||
@@ -186,10 +202,12 @@
|
||||
{"Name:","Όνομα:"}.
|
||||
{"Name","Όνομα"}.
|
||||
{"Never","Ποτέ"}.
|
||||
{"New Password:","Νέος κωδικός πρόσβασης:"}.
|
||||
{"Nickname Registration at ","Εγγραφή με Ψευδώνυμο στο "}.
|
||||
{"Nickname ~s does not exist in the room","Ψευδώνυμο ~s δεν υπάρχει σε αυτή την αίθουσα"}.
|
||||
{"Nickname","Ψευδώνυμο"}.
|
||||
{"No body provided for announce message","Δεν προμηθεύτικε περιεχόμενο ανακοινώσης"}.
|
||||
{"nobody","κανείς"}.
|
||||
{"No Data","Κανένα στοιχείο"}.
|
||||
{"Node ID","Ταυτότητα Κόμβου"}.
|
||||
{"Node not found","Κόμβος δεν βρέθηκε"}.
|
||||
@@ -210,12 +228,14 @@
|
||||
{"Offline Messages:","Χωρίς Σύνδεση Μηνύματα:"}.
|
||||
{"Offline Messages","Χωρίς Σύνδεση Μηνύματα"}.
|
||||
{"OK","Όλλα Καλά"}.
|
||||
{"Old Password:","Παλαιός κωδικός πρόσβασης:"}.
|
||||
{"Online Users:","Online Χρήστες:"}.
|
||||
{"Online Users","Συνδεμένοι χρήστες"}.
|
||||
{"Online","Συνδεδεμένο"}.
|
||||
{"Only deliver notifications to available users","Παράδωση κοινοποιήσεων μόνο σε διαθέσιμους χρήστες"}.
|
||||
{"Only moderators and participants are allowed to change the subject in this room","Μόνο οι συντονιστές και οι συμμετέχοντες μπορούν να αλλάξουν το θέμα αυτής της αίθουσας"}.
|
||||
{"Only moderators are allowed to change the subject in this room","Μόνο οι συντονιστές μπορούν να αλλάξουν το θέμα αυτής της αίθουσας"}.
|
||||
{"Only moderators can approve voice requests","Μόνο οι συντονιστές μπορούν να εγκρίνουν τις αιτήσεις φωνής"}.
|
||||
{"Only occupants are allowed to send messages to the conference","Μόνο οι συμμετέχωντες μπορούν να στέλνουν μηνύματα στο συνέδριο"}.
|
||||
{"Only occupants are allowed to send queries to the conference","Μόνο οι συμετεχόντες μπορούν να στείλουν ερωτήματα στη διάσκεψη"}.
|
||||
{"Only service administrators are allowed to send service messages","Μόνο οι διαχειριστές των υπηρεσιών επιτρέπεται να στείλουν υπηρεσιακά μηνύματα"}.
|
||||
@@ -228,6 +248,7 @@
|
||||
{"Owner privileges required","Aπαιτούνται προνόμια ιδιοκτήτη"}.
|
||||
{"Packet","Πακέτο"}.
|
||||
{"Password ~b","Κωδικός πρόσβασης ~b"}.
|
||||
{"Password Verification:","Επαλήθευση κωδικού πρόσβασης:"}.
|
||||
{"Password Verification","Επαλήθευση κωδικού πρόσβασης"}.
|
||||
{"Password","Κωδικός Πρόσβασης"}.
|
||||
{"Password:","Κωδικός πρόσβασης:"}.
|
||||
@@ -238,6 +259,7 @@
|
||||
{"Persist items to storage","Μονιμη αποθήκευση στοιχείων"}.
|
||||
{"Ping","Πινγκ"}.
|
||||
{"Please note that these options will only backup the builtin Mnesia database. If you are using the ODBC module, you also need to backup your SQL database separately.","Παρακαλώ σημειώστε ότι οι επιλογές αυτές θα αποθήκευσουν Αντιγράφο Ασφαλείας μόνο της ενσωματωμένης βάσης δεδομένων Mnesia. Εάν χρησιμοποιείτε το module ODBC, θα πρέπει επίσης να κάνετε χωριστά Αντιγράφο Ασφαλείας της SQL βάση δεδομένων σας ."}.
|
||||
{"Please, wait for a while before sending new voice request","Παρακαλώ, περιμένετε για λίγο πριν την αποστολή νέου αιτήματος φωνής"}.
|
||||
{"Pong","Πονγκ"}.
|
||||
{"Port ~b","Θύρα ~b"}.
|
||||
{"Port","Θύρα"}.
|
||||
@@ -246,14 +268,17 @@
|
||||
{"Protocol","Πρωτόκολλο"}.
|
||||
{"Publish-Subscribe","Δημοσίευση-Εγγραφή"}.
|
||||
{"PubSub subscriber request","Αίτηση συνδρομητή Δημοσίευσης-Εγγραφής"}.
|
||||
{"Purge all items when the relevant publisher goes offline","Διαγραφή όλων των στοιχείων όταν ο σχετικός εκδότης αποσυνδέεται"}.
|
||||
{"Queries to the conference members are not allowed in this room","Ερωτήματα πρώς τα μέλη της διασκέψεως δεν επιτρέπονται σε αυτήν την αίθουσα"}.
|
||||
{"RAM and disc copy","Αντίγραφο μόνο σε RAM καί δίσκο"}.
|
||||
{"RAM copy","Αντίγραφο σε RAM"}.
|
||||
{"Raw","Ακατέργαστο"}.
|
||||
{"Really delete message of the day?","Πραγματικά να διαγράψετε το μήνυμα της ημέρας;"}.
|
||||
{"Recipient is not in the conference room","Παραλήπτης δεν είναι στην αίθουσα συνεδριάσεων"}.
|
||||
{"Register a Jabber account","Καταχωρήστε έναν λογαριασμό Jabber"}.
|
||||
{"Registered Users:","Εγγεγραμμένοι Χρήστες:"}.
|
||||
{"Registered Users","Εγγεγραμμένοι Χρήστες"}.
|
||||
{"Register","Καταχωρήστε"}.
|
||||
{"Registration in mod_irc for ","Εγγραφή στο mod_irc για "}.
|
||||
{"Remote copy","Απομεμακρυσμένο αντίγραφο"}.
|
||||
{"Remove All Offline Messages","Αφαίρεση Όλων των Χωρίς Σύνδεση Μηνύματων"}.
|
||||
@@ -290,6 +315,7 @@
|
||||
{"Send announcement to all users","Αποστολή ανακοίνωσης σε όλους τους χρήστες"}.
|
||||
{"September","Σεπτέμβριος"}.
|
||||
{"Server ~b","Διακομιστής ~b"}.
|
||||
{"Server:","Διακομιστής:"}.
|
||||
{"Set message of the day and send to online users","Ορίστε μήνυμα ημέρας και αποστολή στους συνδεδεμένους χρήστες"}.
|
||||
{"Set message of the day on all hosts and send to online users","Ορίστε μήνυμα ημέρας και άμεση αποστολή στους συνδεδεμένους χρήστες σε όλους τους κεντρικούς υπολογιστές"}.
|
||||
{"Shared Roster Groups","Κοινές Ομάδες Καταλόγων Επαφών"}.
|
||||
@@ -297,7 +323,9 @@
|
||||
{"Show Ordinary Table","Δείτε Κοινό Πίνακα"}.
|
||||
{"Shut Down Service","Κλείσιμο Υπηρεσίας"}.
|
||||
{"~s invites you to the room ~s","~s σας προσκαλεί στην αίθουσα ~s"}.
|
||||
{"Some Jabber clients can store your password in your computer. Use that feature only if you trust your computer is safe.","Μερικοί πελάτες Jabber μπορεί να αποθηκεύσουν τον κωδικό πρόσβασής σας στον υπολογιστή σας. Χρησιμοποιήστε αυτό το χαρακτηριστικό μόνο εάν εμπιστεύεστε την ασφάλεια του υπολογιστή σας."}.
|
||||
{"Specify the access model","Καθορίστε το μοντέλο πρόσβασης"}.
|
||||
{"Specify the event message type","Καθορίστε τον τύπο μηνύματος συμβάντος"}.
|
||||
{"Specify the publisher model","Καθορίστε το μοντέλο εκδότη"}.
|
||||
{"~s's Offline Messages Queue","Η Σειρά Χωρίς Σύνδεση Μηνύματων τού ~s"}.
|
||||
{"Start Modules at ","Εκκίνηση Modules στο "}.
|
||||
@@ -320,9 +348,18 @@
|
||||
{"Sunday","Κυριακή"}.
|
||||
{"That nickname is already in use by another occupant","Αυτό το ψευδώνυμο είναι ήδη σε χρήση από άλλον συμμετέχων"}.
|
||||
{"That nickname is registered by another person","Αυτό το ψευδώνυμο είναι καταχωρημένο από άλλο πρόσωπο"}.
|
||||
{"The captcha is valid.","Το captcha είναι έγκυρο."}.
|
||||
{"The CAPTCHA is valid.","Το CAPTCHA είναι έγκυρο."}.
|
||||
{"The CAPTCHA verification has failed","Η επαλήθευση της εικόνας CAPTCHA απέτυχε"}.
|
||||
{"The collections with which a node is affiliated","Οι συλλογές με την οποία είναι ένας κόμβος συνδέεται"}.
|
||||
{"The password is too weak","Ο κωδικός πρόσβασης είναι πολύ ασθενές"}.
|
||||
{"the password is","ο κωδικός πρόσβασης είναι"}.
|
||||
{"The password of your Jabber account was successfully changed.","Ο κωδικός πρόσβασης του Jabber λογαριασμού σας έχει αλλάξει επιτυχώς."}.
|
||||
{"There was an error changing the password: ","Υπήρξε ένα σφάλμα κατά την αλλαγή του κωδικού πρόσβασης:"}.
|
||||
{"There was an error creating the account: ","Υπήρξε ένα σφάλμα κατά τη δημιουργία του λογαριασμού:"}.
|
||||
{"There was an error deleting the account: ","Υπήρξε ένα σφάλμα κατά τη διαγραφή του λογαριασμού:"}.
|
||||
{"This is case insensitive: macbeth is the same that MacBeth and Macbeth.","Ανεξαρτήτως με πεζά ή κεφαλαία: 'μιαλεξη' είναι το ίδιο με 'ΜιαΛέξη' και 'Μιαλέξη'."}.
|
||||
{"This page allows to create a Jabber account in this Jabber server. Your JID (Jabber IDentifier) will be of the form: username@server. Please read carefully the instructions to fill correctly the fields.","Αυτή η σελίδα σας επιτρέπει να δημιουργήσετε ένα λογαριασμό Jabber σε αυτόν το διακομιστή Jabber. JID σας (Jabber Identifier) θα είναι της μορφής: όνομα_χρήστη@διακομιστής_Jabber. Παρακαλώ διαβάστε προσεκτικά τις οδηγίες για να συμπληρώσετε σωστά τα πεδία."}.
|
||||
{"This page allows to unregister a Jabber account in this Jabber server.","Η σελίδα αυτή δίνει τη δυνατότητα να καταργήσετε την καταχώρηση ενός λογαριασμό Jabber σε αυτόν το διακομιστή Jabber."}.
|
||||
{"This participant is kicked from the room because he sent an error message to another participant","Αυτός ο συμμετέχων αποβλήθηκε από την αίθουσα, επειδή έστειλε ένα μήνυμα σφάλματος σε άλλον συμμετέχων"}.
|
||||
{"This participant is kicked from the room because he sent an error message","Αυτός ο συμμετέχων αποβλήθηκε από την αίθουσα, επειδή έστειλε ένα μήνυμα σφάλματος"}.
|
||||
{"This participant is kicked from the room because he sent an error presence","Αυτός ο συμμετέχων αποβλήθηκε από την αίθουσα, επειδή έστειλε σφάλμα παρουσίας "}.
|
||||
@@ -330,6 +367,7 @@
|
||||
{"Thursday","Πέμπτη"}.
|
||||
{"Time delay","Χρόνος καθυστέρησης"}.
|
||||
{"Time","Χρόνος"}.
|
||||
{"Too many CAPTCHA requests","Πάρα πολλά αιτήματα CAPTCHA"}.
|
||||
{"To ~s","Πρώς ~s"}.
|
||||
{"To","Πρώς"}.
|
||||
{"Traffic rate limit is exceeded","Υπέρφορτωση"}.
|
||||
@@ -338,8 +376,10 @@
|
||||
{"Transactions Logged:","Καταγραμμένες συναλλαγές:"}.
|
||||
{"Transactions Restarted:","Επανειλημμένες συναλλαγές:"}.
|
||||
{"Tuesday","Τρίτη"}.
|
||||
{"Unable to generate a captcha","Αδήνατο να δημιουργηθεί CAPTCHA"}.
|
||||
{"Unable to generate a CAPTCHA","Αδήνατο να δημιουργηθεί CAPTCHA"}.
|
||||
{"Unauthorized","Χορίς Εξουσιοδότηση"}.
|
||||
{"Unregister a Jabber account","Καταργήστε την εγγραφή ενός λογαριασμού Jabber"}.
|
||||
{"Unregister","Καταργήση εγγραφής"}.
|
||||
{"Update message of the day (don't send)","Ενημέρωση μηνύματως ημέρας (χωρίς άμεση αποστολή)"}.
|
||||
{"Update message of the day on all hosts (don't send)","Ενημέρωση μηνύματως ημέρας σε όλους τους κεντρικούς υπολογιστές (χωρίς άμεση αποστολή)"}.
|
||||
{"Update plan","Σχέδιο ενημέρωσης"}.
|
||||
@@ -348,7 +388,9 @@
|
||||
{"Update","Ενημέρωση"}.
|
||||
{"Uptime:","Uptime:"}.
|
||||
{"Use of STARTTLS required","Απαιτείται χρήση STARTTLS "}.
|
||||
{"User JID","JID Χρήστη"}.
|
||||
{"User Management","Διαχείριση χρηστών"}.
|
||||
{"Username:","Όνομα χρήστη"}.
|
||||
{"Users are not allowed to register accounts so quickly","Οι χρήστες δεν επιτρέπεται να εγγραφούν λογαριασμούς τόσο γρήγορα"}.
|
||||
{"Users Last Activity","Τελευταία Δραστηριότητα Χρήστη"}.
|
||||
{"Users","Χρήστες"}.
|
||||
@@ -356,16 +398,24 @@
|
||||
{"User","Χρήστης"}.
|
||||
{"Validate","Επαληθεύστε"}.
|
||||
{"vCard User Search","vCard Αναζήτηση χρηστών"}.
|
||||
{"Virtual Hosts","εικονικοί κεντρικοί υπολογιστές"}.
|
||||
{"Visitors are not allowed to change their nicknames in this room","Οι επισκέπτες δεν επιτρέπεται να αλλάξουν τα ψευδώνυμα τους σε αυτή την αίθουσα"}.
|
||||
{"Visitors are not allowed to send messages to all occupants","Οι επισκέπτες δεν επιτρέπεται να στείλουν μηνύματα σε όλους τους συμμετέχωντες"}.
|
||||
{"Voice requests are disabled in this conference","Τα αιτήματα φωνής είναι απενεργοποιημένα, σε αυτό το συνέδριο"}.
|
||||
{"Voice request","Αίτημα φωνής"}.
|
||||
{"Wednesday","Τετάρτη"}.
|
||||
{"When to send the last published item","Πότε να αποσταλθεί το τελευταίο στοιχείο που δημοσιεύθηκε"}.
|
||||
{"Whether to allow subscriptions","Εάν επιτρέποντε συνδρομές"}.
|
||||
{"You can later change your password using a Jabber client.","Μπορείτε αργότερα να αλλάξετε τον κωδικό πρόσβασής σας χρησιμοποιώντας έναν πελάτη Jabber."}.
|
||||
{"You have been banned from this room","Σας έχει απαγορευθεί η είσοδος σε αυτή την αίθουσα"}.
|
||||
{"You must fill in field \"Nickname\" in the form","Θα πρέπει να συμπληρώσετε το πεδίο \"Ψευδώνυμο\" στη φόρμα"}.
|
||||
{"You need a client that supports x:data and CAPTCHA to register","Χρειάζεστε ένα x:data και CAPTCHA ικανό πελάτη για εγγραφή"}.
|
||||
{"You need a client that supports x:data to register the nickname","Χρειάζεστε ένα x:data ικανό πελάτη για εγγραφή με ψευδώνυμο"}.
|
||||
{"You need an x:data capable client to configure mod_irc settings","Χρειάζεστε ένα x:data ικανό πελάτη για να ρυθμίσετε το mod_irc"}.
|
||||
{"You need an x:data capable client to configure room","Χρειάζεστε ένα x:data ικανό πελάτη για να ρυθμίσετε την αίθουσα "}.
|
||||
{"You need an x:data capable client to register nickname","Χρειάζεστε ένα x:data ικανό πελάτη για να εγγράφή με ψευδώνυμο"}.
|
||||
{"You need an x:data capable client to search","Χρειάζεστε ένα x:data ικανό πελάτη για αναζήτηση"}.
|
||||
{"Your active privacy list has denied the routing of this stanza.","Ο ενεργός κατάλογος απορρήτου, έχει αρνηθεί τη δρομολόγηση αυτής της στροφής (stanza)."}.
|
||||
{"Your contact offline message queue is full. The message has been discarded.","Η μνήμη χωρίς σύνδεση μήνυματών είναι πλήρης. Το μήνυμα έχει απορριφθεί."}.
|
||||
{"Your Jabber account was successfully created.","Ο Jabber λογαριασμός σας δημιουργήθηκε με επιτυχία."}.
|
||||
{"Your Jabber account was successfully deleted.","Ο Jabber λογαριασμός σας διαγράφηκε με επιτυχία."}.
|
||||
{"Your messages to ~s are being blocked. To unblock them, visit ~s","Τα μηνύματά σας πρως ~s είναι αποκλεισμένα. Για αποδεσμεύση, επισκεφθείτε ~s"}.
|
||||
+705
-453
File diff suppressed because it is too large
Load Diff
@@ -20,7 +20,9 @@
|
||||
{"Allow users to send invites","Permesu uzantojn sendi invitojn"}.
|
||||
{"Allow users to send private messages","Permesu uzantojn sendi privatajn mesaĝojn"}.
|
||||
{"Allow visitors to change nickname","Permesu al vizitantoj ŝanĝi siajn kaŝnomojn"}.
|
||||
{"Allow visitors to send private messages to","Permesu uzantojn sendi privatajn mesaĝojn al"}.
|
||||
{"Allow visitors to send status text in presence updates","Permesu al vizitantoj sendi statmesaĝon en ĉeest-sciigoj"}.
|
||||
{"Allow visitors to send voice requests","Permesu uzantojn sendi voĉ-petojn"}.
|
||||
{"All Users","Ĉiuj Uzantoj"}.
|
||||
{"Announcements","Anoncoj"}.
|
||||
{"anyone","iu ajn"}.
|
||||
@@ -33,9 +35,15 @@
|
||||
{"Backup to File at ","Faru sekurkopion je "}.
|
||||
{"Bad format","Malĝusta formo"}.
|
||||
{"Birthday","Naskiĝtago"}.
|
||||
{"CAPTCHA web page","CAPTCHA teksaĵ-paĝo"}.
|
||||
{"Change Password","Ŝanĝu pasvorton"}.
|
||||
{"Change User Password","Ŝanĝu pasvorton de uzanto"}.
|
||||
{"Characters not allowed:","Karaktroj ne permesata:"}.
|
||||
{"Chatroom configuration modified","Agordo de babilejo ŝanĝita"}.
|
||||
{"Chatroom is created","Babilejo kreita"}.
|
||||
{"Chatroom is destroyed","Babilejo neniigita"}.
|
||||
{"Chatroom is started","Babilejo lanĉita"}.
|
||||
{"Chatroom is stopped","Babilejo haltita"}.
|
||||
{"Chatrooms","Babilejoj"}.
|
||||
{"Choose a username and password to register with this server","Elektu uzantnomon kaj pasvorton por registri je ĉi tiu servilo"}.
|
||||
{"Choose modules to stop","Elektu modulojn por fini"}.
|
||||
@@ -65,15 +73,16 @@
|
||||
{"Description:","Priskribo:"}.
|
||||
{"Disc only copy","Nur disk-kopio"}.
|
||||
{"Displayed Groups:","Montrataj grupoj:"}.
|
||||
{"Don't tell your password to anybody, not even the administrators of the Jabber server.","Ne donu vian pasvorton al iun ajn, eĉ ne al la administrantoj de la Ĵabber-servilo."}.
|
||||
{"Dump Backup to Text File at ","Skribu sekurkopion en plata teksto al "}.
|
||||
{"Dump to Text File","Skribu en plata tekst-dosiero"}.
|
||||
{"Edit Properties","Redaktu atributojn"}.
|
||||
{"Either approve or decline the voice request.","Ĉu aprobu, aŭ malaprobu la voĉ-peton."}.
|
||||
{"ejabberd IRC module","ejabberd IRC-modulo"}.
|
||||
{"ejabberd MUC module","ejabberd MUC-modulo"}.
|
||||
{"ejabberd Publish-Subscribe module","ejabberd Public-Abonada modulo"}.
|
||||
{"ejabberd SOCKS5 Bytestreams module","ejabberd SOCKS5 Bajtfluo modulo"}.
|
||||
{"ejabberd vCard module","ejabberd vCard-modulo"}.
|
||||
{"ejabberd virtual hosts","ejabberd virtual-gastigoj"}.
|
||||
{"ejabberd Web Admin","ejabberd Teksaĵa Administro"}.
|
||||
{"Elements","Eroj"}.
|
||||
{"Email","Retpoŝto"}.
|
||||
@@ -87,13 +96,14 @@
|
||||
{"Enter path to jabberd14 spool file","Enmetu vojon al jabberd14-uzantdosiero"}.
|
||||
{"Enter path to text file","Enmetu vojon al plata teksto"}.
|
||||
{"Enter the text you see","Enmetu montrita teksto"}.
|
||||
{"Enter username and encodings you wish to use for connecting to IRC servers. Press 'Next' to get more fields to fill in. Press 'Complete' to save settings.","Enmetu uzantnomon kaj enkodigoj kiujn vi volas uzi por konektoj al IRC-serviloj. Elektu \"Sekvonto\" por ekhavi pliajn kampojn. Elektu \"Kompletigu\" por savi agordojn."}.
|
||||
{"Enter username, encodings, ports and passwords you wish to use for connecting to IRC servers","Enmetu uzantnomon,j enkodigojn, pordojn kaj pasvortojn kiujn vi volas uzi por konektoj al IRC-serviloj"}.
|
||||
{"Erlang Jabber Server","Erlang-a Jabber-Servilo"}.
|
||||
{"Error","Eraro"}.
|
||||
{"Example: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef.net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}].","Ekzemplo: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"sekreto\"}, {\"vendetta.fef.net\", \"iso8859-1\", 7000}, {\"irc.iutestservilo.net\", \"utf-8\"}]."}.
|
||||
{"Exclude Jabber IDs from CAPTCHA challenge","Esceptu Ĵabber-identigilojn je CAPTCHA-defio"}.
|
||||
{"Export data of all users in the server to PIEFXIS files (XEP-0227):","Eksportu datumojn de ĉiuj uzantoj en servilo al PIEFXIS dosieroj (XEP-0227):"}.
|
||||
{"Export data of users in a host to PIEFXIS files (XEP-0227):","Eksportu datumoj de uzantoj en gastigo al PIEFXIS dosieroj (XEP-0227):"}.
|
||||
{"Failed to extract JID from your voice request approval","Malsukcesis ekstrakti JID-on de via voĉ-pet-aprobo"}.
|
||||
{"Family Name","Lasta Nomo"}.
|
||||
{"February","Februaro"}.
|
||||
{"Fill in fields to search for any matching Jabber User","Kompletigu la formon por serĉi rekonata Jabber-uzanto"}.
|
||||
@@ -107,6 +117,7 @@
|
||||
{"Get User Last Login Time","Montru tempon de lasta ensaluto"}.
|
||||
{"Get User Password","Montru pasvorton de uzanto"}.
|
||||
{"Get User Statistics","Montru statistikojn de uzanto"}.
|
||||
{"Grant voice to this person?","Koncedu voĉon al ĉi-persono?"}.
|
||||
{"Group ","Grupo "}.
|
||||
{"Groups","Grupoj"}.
|
||||
{"has been banned","estas forbarita"}.
|
||||
@@ -116,6 +127,7 @@
|
||||
{"has been kicked","estas forpelita"}.
|
||||
{" has set the subject to: "," ŝanĝis la temon al: "}.
|
||||
{"Host","Gastigo"}.
|
||||
{"If you don't see the CAPTCHA image here, visit the web page.","Se vi ne vidas la CAPTCHA-imagon jene, vizitu la teksaĵ-paĝon."}.
|
||||
{"If you want to specify different ports, passwords, encodings for IRC servers, fill this list with values in format '{\"irc server\", \"encoding\", port, \"password\"}'. By default this service use \"~s\" encoding, port ~p, empty password.","Se vi volas specifi diversajn pordojn, pasvortojn, enkodigojn por IRC-serviloj, kompletigu la jenan liston kun la formo '{\"irc-servilo\", \"enkodigo\", porto, \"pasvorto\"}'. Se ne specifita, ĉi tiu servilo uzas la enkodigo \"~s\", porto ~p, malplena pasvorto."}.
|
||||
{"Import Directory","Importu dosierujo"}.
|
||||
{"Import File","Importu dosieron"}.
|
||||
@@ -141,6 +153,7 @@
|
||||
{"It is not allowed to send private messages","Ne estas permesata sendi privatajn mesaĝojn"}.
|
||||
{"It is not allowed to send private messages of type \"groupchat\"","Malpermesas sendi mesaĝojn de tipo \"groupchat\""}.
|
||||
{"It is not allowed to send private messages to the conference","Nur partoprenantoj rajtas sendi privatajn mesaĝojn al la babilejo"}.
|
||||
{"Jabber Account Registration","Ĵabber-konto registrado"}.
|
||||
{"Jabber ID","Jabber ID"}.
|
||||
{"Jabber ID ~s is invalid","Jabber ID ~s estas nevalida"}.
|
||||
{"January","Januaro"}.
|
||||
@@ -160,7 +173,7 @@
|
||||
{"List of modules to start","Listo de moduloj por starti"}.
|
||||
{"Low level update script","Bazanivela ĝisdatigo-skripto"}.
|
||||
{"Make participants list public","Farigu partoprento-liston publika"}.
|
||||
{"Make room captcha protected","Farigu babilejon protektata per aŭtomata Turingtesto"}.
|
||||
{"Make room CAPTCHA protected","Farigu babilejon protektata per CAPTCHA"}.
|
||||
{"Make room members-only","Farigu babilejon sole por membroj"}.
|
||||
{"Make room moderated","Farigu babilejon moderigata"}.
|
||||
{"Make room password protected","Farigu babilejon protektata per pasvorto"}.
|
||||
@@ -173,9 +186,11 @@
|
||||
{"May","Majo"}.
|
||||
{"Membership is required to enter this room","Membreco estas bezonata por eniri ĉi tiun babilejon"}.
|
||||
{"Members:","Membroj:"}.
|
||||
{"Memorize your password, or write it in a paper placed in a safe place. In Jabber there isn't an automated way to recover your password if you forget it.","Memoru vian pasvorton, aŭ skribu ĝin sur papero formetata je sekura loko. Je Ĵabber ne ekzistas aŭtomata metodo por reakiri vian pasvorton se vi forgesas ĝin."}.
|
||||
{"Memory","Memoro"}.
|
||||
{"Message body","Teksto de mesaĝo"}.
|
||||
{"Middle Name","Meza Nomo"}.
|
||||
{"Minimum interval between voice requests (in seconds)","Minimuma intervalo inter voĉ-petoj (je sekundoj)"}.
|
||||
{"Moderator privileges required","Moderantaj rajtoj bezonata"}.
|
||||
{"moderators only","moderantoj sole"}.
|
||||
{"Modified modules","Ĝisdatigitaj moduloj"}.
|
||||
@@ -186,9 +201,11 @@
|
||||
{"Name:","Nomo:"}.
|
||||
{"Name","Nomo"}.
|
||||
{"Never","Neniam"}.
|
||||
{"New Password:","Nova Pasvorto:"}.
|
||||
{"Nickname","Kaŝnomo"}.
|
||||
{"Nickname Registration at ","Kaŝnomo-registrado je "}.
|
||||
{"Nickname ~s does not exist in the room","Kaŝnomo ~s ne ekzistas en la babilejo"}.
|
||||
{"nobody","neniu"}.
|
||||
{"No body provided for announce message","Neniu teksto donita por anonc-mesaĝo"}.
|
||||
{"No Data","Neniu datumo"}.
|
||||
{"Node ID","Nodo ID"}.
|
||||
@@ -210,12 +227,14 @@
|
||||
{"Offline Messages:","Liverontaj mesaĝoj"}.
|
||||
{"Offline Messages","Liverontaj mesaĝoj"}.
|
||||
{"OK","Bone"}.
|
||||
{"Old Password:","Malnova Pasvorto:"}.
|
||||
{"Online","Konektata"}.
|
||||
{"Online Users:","Konektataj uzantoj:"}.
|
||||
{"Online Users","Konektataj Uzantoj"}.
|
||||
{"Only deliver notifications to available users","Nur liveru sciigojn al konektataj uzantoj"}.
|
||||
{"Only moderators and participants are allowed to change the subject in this room","Nur moderigantoj kaj partoprenantoj rajtas ŝanĝi la temon en ĉi tiu babilejo"}.
|
||||
{"Only moderators are allowed to change the subject in this room","Nur moderigantoj rajtas ŝanĝi la temon en ĉi tiu babilejo"}.
|
||||
{"Only moderators can approve voice requests","Nur moderigantoj povas aprobi voĉ-petojn"}.
|
||||
{"Only occupants are allowed to send messages to the conference","Nur partoprenantoj rajtas sendi mesaĝojn al la babilejo"}.
|
||||
{"Only occupants are allowed to send queries to the conference","Nur partoprenantoj rajtas sendi informmendojn al la babilejoj"}.
|
||||
{"Only service administrators are allowed to send service messages","Nur servo-administrantoj rajtas sendi serv-mesaĝojn"}.
|
||||
@@ -230,6 +249,7 @@
|
||||
{"Password ~b","Pasvorto ~b"}.
|
||||
{"Password:","Pasvorto:"}.
|
||||
{"Password","Pasvorto"}.
|
||||
{"Password Verification:","Pasvortkontrolo:"}.
|
||||
{"Password Verification","Pasvortkontrolo"}.
|
||||
{"Path to Dir","Vojo al dosierujo"}.
|
||||
{"Path to File","Voje de dosiero"}.
|
||||
@@ -238,6 +258,7 @@
|
||||
{"Persist items to storage","Savu erojn en konservado"}.
|
||||
{"Ping","Sondaĵo"}.
|
||||
{"Please note that these options will only backup the builtin Mnesia database. If you are using the ODBC module, you also need to backup your SQL database separately.","Rimarku ke ĉi tiuj elektebloj nur sekurkopias la propran Mnesia-datumbazon. Se vi uzas la ODBC-modulon, vi ankaŭ devas sekurkopii tiujn SQL-datumbazoj aparte."}.
|
||||
{"Please, wait for a while before sending new voice request","Bonvolu atendi iomete antaŭ ol sendi plian voĉ-peton"}.
|
||||
{"Pong","Resondaĵo"}.
|
||||
{"Port ~b","Pordo ~b"}.
|
||||
{"Port","Pordo"}.
|
||||
@@ -246,14 +267,17 @@
|
||||
{"Protocol","Protokolo"}.
|
||||
{"Publish-Subscribe","Public-Abonado"}.
|
||||
{"PubSub subscriber request","PubAbo abonpeto"}.
|
||||
{"Purge all items when the relevant publisher goes offline","Forigu ĉiujn erojn kiam la rilata publikanto malkonektiĝas"}.
|
||||
{"Queries to the conference members are not allowed in this room","Malpermesas informmendoj al partoprenantoj en ĉi tiu babilejo"}.
|
||||
{"RAM and disc copy","RAM- kaj disk-kopio"}.
|
||||
{"RAM copy","RAM-kopio"}.
|
||||
{"Raw","Kruda"}.
|
||||
{"Really delete message of the day?","Ĉu vere forigi mesaĝon de la tago?"}.
|
||||
{"Recipient is not in the conference room","Ricevanto ne ĉeestas en la babilejo "}.
|
||||
{"Register a Jabber account","Registru Ĵabber-konton"}.
|
||||
{"Registered Users:","Registritaj uzantoj:"}.
|
||||
{"Registered Users","Registritaj uzantoj"}.
|
||||
{"Register","Registru"}.
|
||||
{"Registration in mod_irc for ","Registraĵo en mod_irc de "}.
|
||||
{"Remote copy","Fora kopio"}.
|
||||
{"Remove All Offline Messages","Forigu ĉiujn liverontajn mesaĝojn"}.
|
||||
@@ -290,6 +314,7 @@
|
||||
{"Send announcement to all users","Sendu anoncon al ĉiu uzanto"}.
|
||||
{"September","Septembro"}.
|
||||
{"Server ~b","Servilo ~b"}.
|
||||
{"Server:","Servilo:"}.
|
||||
{"Set message of the day and send to online users","Enmetu mesaĝon de la tago kaj sendu al konektataj uzantoj"}.
|
||||
{"Set message of the day on all hosts and send to online users","Enmetu mesaĝon de la tago je ĉiu gastigo kaj sendu al konektataj uzantoj"}.
|
||||
{"Shared Roster Groups","Komuna Kontaktlist-grupo"}.
|
||||
@@ -297,7 +322,9 @@
|
||||
{"Show Ordinary Table","Montru ordinaran tabelon"}.
|
||||
{"Shut Down Service","Haltigu Servon"}.
|
||||
{"~s invites you to the room ~s","~s invitas vin al la babilejo ~s"}.
|
||||
{"Some Jabber clients can store your password in your computer. Use that feature only if you trust your computer is safe.","Kelkaj Ĵabber-klientoj povas memori vian pasvorton je via komputilo. Nur uzu tiun eblon se vi fidas ke via komputilo estas sekura."}.
|
||||
{"Specify the access model","Specifu atingo-modelon"}.
|
||||
{"Specify the event message type","Specifu tipo de event-mesaĝo"}.
|
||||
{"Specify the publisher model","Enmetu publikadan modelon"}.
|
||||
{"~s's Offline Messages Queue","Mesaĝo-atendovico de ~s"}.
|
||||
{"Start Modules at ","Startu modulojn je "}.
|
||||
@@ -320,9 +347,18 @@
|
||||
{"Sunday","Dimanĉo"}.
|
||||
{"That nickname is already in use by another occupant","Tiu kaŝnomo jam estas uzata de alia partoprenanto"}.
|
||||
{"That nickname is registered by another person","Kaŝnomo estas registrita de alia persono"}.
|
||||
{"The captcha is valid.","La aŭtomata Turingtesto estas ĝusta"}.
|
||||
{"The CAPTCHA is valid.","La CAPTCHA ĝustas"}.
|
||||
{"The CAPTCHA verification has failed","La CAPTCHA-kontrolado malsukcesis"}.
|
||||
{"The collections with which a node is affiliated","Aro kun kiu nodo estas filigita"}.
|
||||
{"the password is","la pasvorto estas"}.
|
||||
{"The password is too weak","La pasvorto estas ne sufiĉe forta"}.
|
||||
{"The password of your Jabber account was successfully changed.","La pasvorto de via Ĵabber-konto estas sukcese ŝanĝata."}.
|
||||
{"There was an error changing the password: ","Estis eraro dum ŝanĝi de la pasvortro:"}.
|
||||
{"There was an error creating the account: ","Estis eraro dum kreado de la konto:"}.
|
||||
{"There was an error deleting the account: ","Estis eraro dum forigado de la konto:"}.
|
||||
{"This is case insensitive: macbeth is the same that MacBeth and Macbeth.","Uskleco ne signifas: macbeth estas la sama ol MacBeth kaj Macbeth."}.
|
||||
{"This page allows to create a Jabber account in this Jabber server. Your JID (Jabber IDentifier) will be of the form: username@server. Please read carefully the instructions to fill correctly the fields.","Jena paĝo ebligas kreadon de Ĵabber-konto je ĉi-Ĵabber-servilo. Via JID (Ĵabber-IDentigilo) estos ĉi-tiel: uzantnomo@servilo. Bonvolu legu bone la instrukciojn por korekta enmetigo de la kampoj. "}.
|
||||
{"This page allows to unregister a Jabber account in this Jabber server.","Jena pagxo ebligas malregistri Jxabber-konton je ĉi-servilo."}.
|
||||
{"This participant is kicked from the room because he sent an error message","Ĉi tiu partoprenanta estas forpelata de la babilejo pro sendado de erar-mesaĝo"}.
|
||||
{"This participant is kicked from the room because he sent an error message to another participant","Ĉi tiu partoprenanto estas forpelata de la babilejo pro sendo de erar-mesaĝo al alia partoprenanto"}.
|
||||
{"This participant is kicked from the room because he sent an error presence","Ĉi tiu partoprenanto estas forpelata de la babilejo pro sendo de erar-ĉeesto"}.
|
||||
@@ -331,6 +367,7 @@
|
||||
{"Time delay","Prokrasto"}.
|
||||
{"Time","Tempo"}.
|
||||
{"To","Ĝis"}.
|
||||
{"Too many CAPTCHA requests","Tro multaj CAPTCHA-petoj"}.
|
||||
{"To ~s","Al ~s"}.
|
||||
{"Traffic rate limit is exceeded","Trafikrapida limigo superita"}.
|
||||
{"Transactions Aborted:","Transakcioj nuligitaj"}.
|
||||
@@ -338,8 +375,10 @@
|
||||
{"Transactions Logged:","Transakcioj protokolitaj"}.
|
||||
{"Transactions Restarted:","Transakcioj restartitaj"}.
|
||||
{"Tuesday","Mardo"}.
|
||||
{"Unable to generate a captcha","Ne eblis krei aŭtomatas turingteston"}.
|
||||
{"Unable to generate a CAPTCHA","Ne eblis krei CAPTCHA"}.
|
||||
{"Unauthorized","Nepermesita"}.
|
||||
{"Unregister a Jabber account","Malregistru Ĵabber-konton"}.
|
||||
{"Unregister","Malregistru"}.
|
||||
{"Update ","Ĝisdatigu "}.
|
||||
{"Update","Ĝisdatigu"}.
|
||||
{"Update message of the day (don't send)","Ŝanĝu mesaĝon de la tago (ne sendu)"}.
|
||||
@@ -348,7 +387,9 @@
|
||||
{"Update script","Ĝisdatigo-skripto"}.
|
||||
{"Uptime:","Daŭro de funkciado"}.
|
||||
{"Use of STARTTLS required","Uzo de STARTTLS bezonata"}.
|
||||
{"User JID","Uzant-JID"}.
|
||||
{"User Management","Uzanto-administrado"}.
|
||||
{"Username:","Uzantnomo"}.
|
||||
{"Users are not allowed to register accounts so quickly","Ne estas permesata al uzantoj registri tiel rapide"}.
|
||||
{"Users Last Activity","Lasta aktiveco de uzanto"}.
|
||||
{"Users","Uzantoj"}.
|
||||
@@ -356,16 +397,24 @@
|
||||
{"User","Uzanto"}.
|
||||
{"Validate","Validigu"}.
|
||||
{"vCard User Search","Serĉado de vizitkartoj"}.
|
||||
{"Virtual Hosts","Virtual-gastigoj"}.
|
||||
{"Visitors are not allowed to change their nicknames in this room","Ne estas permesata al vizitantoj ŝanĝi siajn kaŝnomojn en ĉi tiu ĉambro"}.
|
||||
{"Visitors are not allowed to send messages to all occupants","Vizitantoj ne rajtas sendi mesaĝojn al ĉiuj partoprenantoj"}.
|
||||
{"Voice requests are disabled in this conference","Voĉ-petoj estas malebligita en jena babilejo"}.
|
||||
{"Voice request","Voĉ-peto"}.
|
||||
{"Wednesday","Merkredo"}.
|
||||
{"When to send the last published item","Kiam sendi la laste publicitan eron"}.
|
||||
{"Whether to allow subscriptions","Ĉu permesi aboni"}.
|
||||
{"You can later change your password using a Jabber client.","Poste vi povas ŝanĝi vian pasvorton per Ĵabber-kliento."}.
|
||||
{"You have been banned from this room","Vi estas malpermesata en ĉi tiu babilejo"}.
|
||||
{"You must fill in field \"Nickname\" in the form","Vi devas kompletigi la \"Kaŝnomo\" kampon"}.
|
||||
{"You need a client that supports x:data and CAPTCHA to register","Vi bezonas klienton subtenante x:data-funkcio kaj CAPTCHA por registri kaŝnomon"}.
|
||||
{"You need a client that supports x:data to register the nickname","Vi bezonas klienton subtenante x:data-funkcio por registri kaŝnomon"}.
|
||||
{"You need an x:data capable client to configure mod_irc settings","Vi bezonas klienton kun x:data-funkcio por agordi mod_irc"}.
|
||||
{"You need an x:data capable client to configure room","Vi bezonas klienton kun x:data-funkcio por agordi la babilejon"}.
|
||||
{"You need an x:data capable client to register nickname","Vi bezonas klienton kun x:data-funkcio por registri kaŝnomon"}.
|
||||
{"You need an x:data capable client to search","Vi bezonas klienton kun x:data-funkcio por serĉado"}.
|
||||
{"Your active privacy list has denied the routing of this stanza.","Via aktiva privatec-listo malpermesas enkursigi ĉi-tiun pakaĵon"}.
|
||||
{"Your contact offline message queue is full. The message has been discarded.","Mesaĝo-atendovico de la senkonekta kontakto estas plena. La mesaĝo estas forĵetita"}.
|
||||
{"Your Jabber account was successfully created.","Via Ĵabber-konto estis sukcese kreata."}.
|
||||
{"Your Jabber account was successfully deleted.","Via Ĵabber-konto estas sukcese forigita."}.
|
||||
{"Your messages to ~s are being blocked. To unblock them, visit ~s","Viaj mesaĝoj al ~s estas blokata. Por malbloki ilin, iru al ~s"}.
|
||||
+693
-453
File diff suppressed because it is too large
Load Diff
@@ -14,13 +14,15 @@
|
||||
{"Administrator privileges required","Se necesita privilegios de administrador"}.
|
||||
{"A friendly name for the node","Un nombre sencillo para el nodo"}.
|
||||
{"All activity","Toda la actividad"}.
|
||||
{"Allow this Jabber ID to subscribe to this pubsub node?","¿Deseas permitir a este JabberID que se subscriba a este nodo PubSub?"}.
|
||||
{"Allow this Jabber ID to subscribe to this pubsub node?","¿Deseas permitir a este Jabber ID que se subscriba a este nodo PubSub?"}.
|
||||
{"Allow users to change the subject","Permitir a los usuarios cambiar el asunto"}.
|
||||
{"Allow users to query other users","Permitir a los usuarios consultar a otros usuarios"}.
|
||||
{"Allow users to send invites","Permitir a los usuarios enviar invitaciones"}.
|
||||
{"Allow users to send private messages","Permitir a los usuarios enviar mensajes privados"}.
|
||||
{"Allow visitors to change nickname","Permitir a los visitantes cambiarse el apodo"}.
|
||||
{"Allow visitors to send private messages to","Permitir a los visitantes enviar mensajes privados a"}.
|
||||
{"Allow visitors to send status text in presence updates","Permitir a los visitantes enviar texto de estado en las actualizaciones de presencia"}.
|
||||
{"Allow visitors to send voice requests","Permitir a los visitantes enviar peticiones de voz"}.
|
||||
{"All Users","Todos los usuarios"}.
|
||||
{"Announcements","Anuncios"}.
|
||||
{"anyone","cualquiera"}.
|
||||
@@ -33,9 +35,15 @@
|
||||
{"Backup to File at ","Guardar copia de seguridad en fichero en "}.
|
||||
{"Bad format","Mal formato"}.
|
||||
{"Birthday","Cumpleaños"}.
|
||||
{"CAPTCHA web page","Página web de CAPTCHA"}.
|
||||
{"Change Password","Cambiar contraseña"}.
|
||||
{"Change User Password","Cambiar contraseña de usuario"}.
|
||||
{"Characters not allowed:","Caracteres no permitidos:"}.
|
||||
{"Chatroom configuration modified","Configuración de la sala modificada"}.
|
||||
{"Chatroom is created","Se ha creado la sala"}.
|
||||
{"Chatroom is destroyed","Se ha destruido la sala"}.
|
||||
{"Chatroom is started","Se ha iniciado la sala"}.
|
||||
{"Chatroom is stopped","Se ha detenido la sala"}.
|
||||
{"Chatrooms","Salas de charla"}.
|
||||
{"Choose a username and password to register with this server","Escoge un nombre de usuario y contraseña para registrarte en este servidor"}.
|
||||
{"Choose modules to stop","Selecciona módulos a detener"}.
|
||||
@@ -65,15 +73,16 @@
|
||||
{"Description:","Descripción:"}.
|
||||
{"Disc only copy","Copia en disco solamente"}.
|
||||
{"Displayed Groups:","Mostrar grupos:"}.
|
||||
{"Don't tell your password to anybody, not even the administrators of the Jabber server.","No le digas tu contraseña a nadie, ni siquiera a los administradores del servidor Jabber."}.
|
||||
{"Dump Backup to Text File at ","Exporta copia de seguridad a fichero de texto en "}.
|
||||
{"Dump to Text File","Exportar a fichero de texto"}.
|
||||
{"Edit Properties","Editar propiedades"}.
|
||||
{"Either approve or decline the voice request.","Aprueba o rechaza la petición de voz."}.
|
||||
{"ejabberd IRC module","Módulo de IRC para ejabberd"}.
|
||||
{"ejabberd MUC module","Módulo de MUC para ejabberd"}.
|
||||
{"ejabberd Publish-Subscribe module","Módulo de Publicar-Subscribir de ejabberd"}.
|
||||
{"ejabberd SOCKS5 Bytestreams module","Módulo SOCKS5 Bytestreams para ejabberd"}.
|
||||
{"ejabberd vCard module","Módulo vCard para ejabberd"}.
|
||||
{"ejabberd virtual hosts","Dominios de ejabberd"}.
|
||||
{"ejabberd Web Admin","ejabberd Web Admin"}.
|
||||
{"Elements","Elementos"}.
|
||||
{"Email","correo"}.
|
||||
@@ -92,8 +101,10 @@
|
||||
{"Erlang Jabber Server","Servidor Jabber en Erlang"}.
|
||||
{"Error","Error"}.
|
||||
{"Example: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef.net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}].","Ejemplo: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef.net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."}.
|
||||
{"Exclude Jabber IDs from CAPTCHA challenge","Excluir Jabber IDs de las pruebas de CAPTCHA"}.
|
||||
{"Export data of all users in the server to PIEFXIS files (XEP-0227):","Exportar datos de todos los usuarios del servidor a ficheros PIEFXIS (XEP-0227):"}.
|
||||
{"Export data of users in a host to PIEFXIS files (XEP-0227):","Exportar datos de los usuarios de un dominio a ficheros PIEFXIS (XEP-0227):"}.
|
||||
{"Failed to extract JID from your voice request approval","Fallo al extraer el Jabber ID de tu aprobación de petición de voz"}.
|
||||
{"Family Name","Apellido"}.
|
||||
{"February","febrero"}.
|
||||
{"Fill in fields to search for any matching Jabber User","Rellena campos para buscar usuarios Jabber que concuerden"}.
|
||||
@@ -107,6 +118,7 @@
|
||||
{"Get User Last Login Time","Ver fecha de la última conexión de usuario"}.
|
||||
{"Get User Password","Ver contraseña de usuario"}.
|
||||
{"Get User Statistics","Ver estadísticas de usuario"}.
|
||||
{"Grant voice to this person?","¿Conceder voz a esta persona?"}.
|
||||
{"Group ","Grupo "}.
|
||||
{"Groups","Grupos"}.
|
||||
{"has been banned","ha sido bloqueado"}.
|
||||
@@ -116,6 +128,7 @@
|
||||
{"has been kicked","ha sido expulsado"}.
|
||||
{" has set the subject to: "," ha puesto el asunto: "}.
|
||||
{"Host","Dominio"}.
|
||||
{"If you don't see the CAPTCHA image here, visit the web page.","Si no ves la imagen CAPTCHA aquí, visita la página web."}.
|
||||
{"If you want to specify different ports, passwords, encodings for IRC servers, fill this list with values in format '{\"irc server\", \"encoding\", port, \"password\"}'. By default this service use \"~s\" encoding, port ~p, empty password.","Si quieres especificar distintos codificaciones de carácteres, contraseñas o puertos para cada servidor IRC rellena esta lista con valores en el formato '{\"servidor irc\", \"codificación\", \"puerto\", \"contrasela\"}'. Este servicio usa por defecto la codificación \"~s\", puerto ~p, sin contraseña."}.
|
||||
{"Import Directory","Importar directorio"}.
|
||||
{"Import File","Importar fichero"}.
|
||||
@@ -141,6 +154,7 @@
|
||||
{"It is not allowed to send private messages","No está permitido enviar mensajes privados"}.
|
||||
{"It is not allowed to send private messages of type \"groupchat\"","No está permitido enviar mensajes privados del tipo \"groupchat\""}.
|
||||
{"It is not allowed to send private messages to the conference","Impedir el envio de mensajes privados a la sala"}.
|
||||
{"Jabber Account Registration","Registro de Cuenta Jabber"}.
|
||||
{"Jabber ID","Jabber ID"}.
|
||||
{"Jabber ID ~s is invalid","El Jabber ID ~s no es válido"}.
|
||||
{"January","enero"}.
|
||||
@@ -160,7 +174,7 @@
|
||||
{"List of modules to start","Lista de módulos a iniciar"}.
|
||||
{"Low level update script","Script de actualización a bajo nivel"}.
|
||||
{"Make participants list public","La lista de participantes es pública"}.
|
||||
{"Make room captcha protected","Proteger la sala con captcha"}.
|
||||
{"Make room CAPTCHA protected","Proteger la sala con CAPTCHA"}.
|
||||
{"Make room members-only","Sala sólo para miembros"}.
|
||||
{"Make room moderated","Sala moderada"}.
|
||||
{"Make room password protected","Proteger la sala con contraseña"}.
|
||||
@@ -173,9 +187,11 @@
|
||||
{"May","mayo"}.
|
||||
{"Membership is required to enter this room","Necesitas ser miembro de esta sala para poder entrar"}.
|
||||
{"Members:","Miembros:"}.
|
||||
{"Memorize your password, or write it in a paper placed in a safe place. In Jabber there isn't an automated way to recover your password if you forget it.","Memoriza tu contraseña, o apúntala en un papel en un lugar seguro. En Jabber no hay un método automatizado para recuperar la contraseña si la olvidas."}.
|
||||
{"Memory","Memoria"}.
|
||||
{"Message body","Cuerpo del mensaje"}.
|
||||
{"Middle Name","Segundo nombre"}.
|
||||
{"Minimum interval between voice requests (in seconds)","Intervalo mínimo entre peticiones de voz (en segundos)"}.
|
||||
{"Moderator privileges required","Se necesita privilegios de moderador"}.
|
||||
{"moderators only","solo moderadores"}.
|
||||
{"Modified modules","Módulos modificados"}.
|
||||
@@ -186,9 +202,11 @@
|
||||
{"Name:","Nombre:"}.
|
||||
{"Name","Nombre"}.
|
||||
{"Never","Nunca"}.
|
||||
{"New Password:","Nueva contraseña:"}.
|
||||
{"Nickname","Apodo"}.
|
||||
{"Nickname Registration at ","Registro del apodo en "}.
|
||||
{"Nickname ~s does not exist in the room","El apodo ~s no existe en la sala"}.
|
||||
{"nobody","nadie"}.
|
||||
{"No body provided for announce message","No se ha proporcionado cuerpo de mensaje para el anuncio"}.
|
||||
{"No Data","Sin datos"}.
|
||||
{"Node ID","Nodo ID"}.
|
||||
@@ -210,12 +228,14 @@
|
||||
{"Offline Messages:","Mensajes diferidos:"}.
|
||||
{"Offline Messages","Mensajes diferidos"}.
|
||||
{"OK","Aceptar"}.
|
||||
{"Old Password:","Contraseña antigua:"}.
|
||||
{"Online","Conectado"}.
|
||||
{"Online Users:","Usuarios conectados:"}.
|
||||
{"Online Users","Usuarios conectados"}.
|
||||
{"Only deliver notifications to available users","Solo enviar notificaciones a los usuarios disponibles"}.
|
||||
{"Only moderators and participants are allowed to change the subject in this room","Solo los moderadores y participantes pueden cambiar el asunto de esta sala"}.
|
||||
{"Only moderators are allowed to change the subject in this room","Solo los moderadores pueden cambiar el asunto de esta sala"}.
|
||||
{"Only moderators can approve voice requests","Solo los moderadores pueden aprobar peticiones de voz"}.
|
||||
{"Only occupants are allowed to send messages to the conference","Solo los ocupantes pueden enviar mensajes a la sala"}.
|
||||
{"Only occupants are allowed to send queries to the conference","Solo los ocupantes pueden enviar solicitudes a la sala"}.
|
||||
{"Only service administrators are allowed to send service messages","Solo los administradores del servicio tienen permiso para enviar mensajes de servicio"}.
|
||||
@@ -230,6 +250,7 @@
|
||||
{"Password ~b","Contraseña ~b"}.
|
||||
{"Password:","Contraseña:"}.
|
||||
{"Password","Contraseña"}.
|
||||
{"Password Verification:","Verificación de la contraseña:"}.
|
||||
{"Password Verification","Verificación de la contraseña"}.
|
||||
{"Path to Dir","Ruta al directorio"}.
|
||||
{"Path to File","Ruta al fichero"}.
|
||||
@@ -238,6 +259,7 @@
|
||||
{"Persist items to storage","Persistir elementos al almacenar"}.
|
||||
{"Ping","Ping"}.
|
||||
{"Please note that these options will only backup the builtin Mnesia database. If you are using the ODBC module, you also need to backup your SQL database separately.","Ten en cuenta que estas opciones solo harán copia de seguridad de la base de datos Mnesia embebida. Si estás usando ODBC tendrás que hacer también copia de seguridad de tu base de datos SQL."}.
|
||||
{"Please, wait for a while before sending new voice request","Por favor, espera un poco antes de enviar otra petición de voz"}.
|
||||
{"Pong","Pong"}.
|
||||
{"Port ~b","Puerto ~b"}.
|
||||
{"Port","Puerto"}.
|
||||
@@ -246,14 +268,17 @@
|
||||
{"Protocol","Protocolo"}.
|
||||
{"Publish-Subscribe","Servicio de Publicar-Subscribir"}.
|
||||
{"PubSub subscriber request","Petición de subscriptor de PubSub"}.
|
||||
{"Purge all items when the relevant publisher goes offline","Borra todos los elementos cuando el publicador relevante se desconecta"}.
|
||||
{"Queries to the conference members are not allowed in this room","En esta sala no se permiten solicitudes a los miembros de la sala"}.
|
||||
{"RAM and disc copy","Copia en RAM y disco"}.
|
||||
{"RAM copy","Copia en RAM"}.
|
||||
{"Raw","Crudo"}.
|
||||
{"Really delete message of the day?","¿Está seguro de quere borrar el mensaje del dia?"}.
|
||||
{"Recipient is not in the conference room","El receptor no está en la sala de conferencia"}.
|
||||
{"Register a Jabber account","Registrar una cuenta Jabber"}.
|
||||
{"Registered Users:","Usuarios registrados:"}.
|
||||
{"Registered Users","Usuarios registrados"}.
|
||||
{"Register","Registrar"}.
|
||||
{"Registration in mod_irc for ","Registro en mod_irc para"}.
|
||||
{"Remote copy","Copia remota"}.
|
||||
{"Remove All Offline Messages","Borrar todos los mensajes diferidos"}.
|
||||
@@ -290,6 +315,7 @@
|
||||
{"Send announcement to all users on all hosts","Enviar anuncio a todos los usuarios en todos los dominios"}.
|
||||
{"September","septiembre"}.
|
||||
{"Server ~b","Servidor ~b"}.
|
||||
{"Server:","Servidor:"}.
|
||||
{"Set message of the day and send to online users","Poner mensaje del dia y enviar a todos los usuarios conectados"}.
|
||||
{"Set message of the day on all hosts and send to online users","Poner mensaje del día en todos los dominios y enviar a los usuarios conectados"}.
|
||||
{"Shared Roster Groups","Grupos Compartidos"}.
|
||||
@@ -297,7 +323,9 @@
|
||||
{"Show Ordinary Table","Mostrar Tabla Ordinaria"}.
|
||||
{"Shut Down Service","Detener el servicio"}.
|
||||
{"~s invites you to the room ~s","~s te invita a la sala ~s"}.
|
||||
{"Some Jabber clients can store your password in your computer. Use that feature only if you trust your computer is safe.","Algunos clientes Jabber pueden recordar tu contraseña en la máquina. Usa esa opción solo si confías en que la máquina que usas es segura."}.
|
||||
{"Specify the access model","Especifica el modelo de acceso"}.
|
||||
{"Specify the event message type","Especifica el tipo del mensaje de evento"}.
|
||||
{"Specify the publisher model","Especificar el modelo del publicante"}.
|
||||
{"~s's Offline Messages Queue","Cola de mensajes diferidos de ~s"}.
|
||||
{"Start","Iniciar"}.
|
||||
@@ -320,9 +348,18 @@
|
||||
{"Sunday","domingo"}.
|
||||
{"That nickname is already in use by another occupant","Ese apodo ya está siendo usado por otro ocupante"}.
|
||||
{"That nickname is registered by another person","El apodo ya está registrado por otra persona"}.
|
||||
{"The captcha is valid.","El captcha es válido."}.
|
||||
{"The CAPTCHA is valid.","El CAPTCHA es válido."}.
|
||||
{"The CAPTCHA verification has failed","La verificación de CAPTCHA ha fallado"}.
|
||||
{"The collections with which a node is affiliated","Las colecciones a las que un nodo está afiliado"}.
|
||||
{"the password is","la contraseña es"}.
|
||||
{"The password is too weak","La contraseña es demasiado débil"}.
|
||||
{"The password of your Jabber account was successfully changed.","La contraseña de tu cuenta Jabber se ha cambiado correctamente."}.
|
||||
{"There was an error changing the password: ","Hubo un error cambiando la contraseña."}.
|
||||
{"There was an error creating the account: ","Hubo uno error al crear la cuenta:"}.
|
||||
{"There was an error deleting the account: ","Hubo un error borrando la cuenta."}.
|
||||
{"This is case insensitive: macbeth is the same that MacBeth and Macbeth.","No importa si usas mayúsculas: macbeth es lo mismo que MacBeth y Macbeth."}.
|
||||
{"This page allows to create a Jabber account in this Jabber server. Your JID (Jabber IDentifier) will be of the form: username@server. Please read carefully the instructions to fill correctly the fields.","Esta página te permite crear una cuenta Jabber este servidor Jabber. Tu JID (Jabber IDentificador) será de la forma: nombredeusuario@servidor. Por favor lee detenidamente las instrucciones para rellenar correctamente los campos."}.
|
||||
{"This page allows to unregister a Jabber account in this Jabber server.","Esta página te permite borrar tu cuenta Jabber en este servidor Jabber."}.
|
||||
{"This participant is kicked from the room because he sent an error message","Este participante ha sido expulsado de la sala porque envió un mensaje de error"}.
|
||||
{"This participant is kicked from the room because he sent an error message to another participant","Este participante ha sido expulsado de la sala porque envió un mensaje de error a otro participante"}.
|
||||
{"This participant is kicked from the room because he sent an error presence","Este participante ha sido expulsado de la sala porque envió una presencia de error"}.
|
||||
@@ -330,6 +367,7 @@
|
||||
{"Thursday","jueves"}.
|
||||
{"Time delay","Retraso temporal"}.
|
||||
{"Time","Fecha"}.
|
||||
{"Too many CAPTCHA requests","Demasiadas peticiones de CAPTCHA"}.
|
||||
{"To","Para"}.
|
||||
{"To ~s","A ~s"}.
|
||||
{"Traffic rate limit is exceeded","Se ha exedido el límite de tráfico"}.
|
||||
@@ -338,8 +376,10 @@
|
||||
{"Transactions Logged:","Transacciones registradas:"}.
|
||||
{"Transactions Restarted:","Transacciones reiniciadas:"}.
|
||||
{"Tuesday","martes"}.
|
||||
{"Unable to generate a captcha","No se pudo generar un captcha."}.
|
||||
{"Unable to generate a CAPTCHA","No se pudo generar un CAPTCHA"}.
|
||||
{"Unauthorized","No autorizado"}.
|
||||
{"Unregister a Jabber account","Borrar una cuenta Jabber"}.
|
||||
{"Unregister","Borrar"}.
|
||||
{"Update ","Actualizar "}.
|
||||
{"Update","Actualizar"}.
|
||||
{"Update message of the day (don't send)","Actualizar mensaje del dia, pero no enviarlo"}.
|
||||
@@ -348,7 +388,9 @@
|
||||
{"Update script","Script de actualización"}.
|
||||
{"Uptime:","Tiempo desde el inicio:"}.
|
||||
{"Use of STARTTLS required","Es obligatorio usar STARTTLS"}.
|
||||
{"User JID","Jabber ID del usuario"}.
|
||||
{"User Management","Administración de usuarios"}.
|
||||
{"Username:","Nombre de usuario:"}.
|
||||
{"Users are not allowed to register accounts so quickly","Los usuarios no tienen permitido crear cuentas con tanta rapidez"}.
|
||||
{"Users Last Activity","Última actividad de los usuarios"}.
|
||||
{"Users","Usuarios"}.
|
||||
@@ -356,16 +398,24 @@
|
||||
{"User","Usuario"}.
|
||||
{"Validate","Validar"}.
|
||||
{"vCard User Search","Buscar vCard de usuario"}.
|
||||
{"Virtual Hosts","Dominios Virtuales"}.
|
||||
{"Visitors are not allowed to change their nicknames in this room","Los visitantes no tienen permitido cambiar sus apodos en esta sala"}.
|
||||
{"Visitors are not allowed to send messages to all occupants","Los visitantes no pueden enviar mensajes a todos los ocupantes"}.
|
||||
{"Voice request","Petición de voz"}.
|
||||
{"Voice requests are disabled in this conference","Las peticiones de voz están desactivadas en esta sala"}.
|
||||
{"Wednesday","miércoles"}.
|
||||
{"When to send the last published item","Cuando enviar el último elemento publicado"}.
|
||||
{"Whether to allow subscriptions","Permitir subscripciones"}.
|
||||
{"You can later change your password using a Jabber client.","Puedes cambiar tu contraseña después, usando un cliente Jabber."}.
|
||||
{"You have been banned from this room","Has sido bloqueado en esta sala"}.
|
||||
{"You must fill in field \"Nickname\" in the form","Debes rellenar el campo \"Apodo\" en el formulario"}.
|
||||
{"You need a client that supports x:data and CAPTCHA to register","Necesitas un cliente con soporte de x:data y CAPTCHA para registrarte"}.
|
||||
{"You need a client that supports x:data to register the nickname","Necesitas un cliente con soporte de x:data para poder registrar el apodo"}.
|
||||
{"You need an x:data capable client to configure mod_irc settings","Necesitas un cliente con soporte de x:data para configurar las opciones de mod_irc"}.
|
||||
{"You need an x:data capable client to configure room","Necesitas un cliente con soporte de x:data para configurar la sala"}.
|
||||
{"You need an x:data capable client to register nickname","Necesitas un cliente con soporte de x:data para poder registrar el apodo"}.
|
||||
{"You need an x:data capable client to search","Necesitas un cliente con soporte de x:data para poder buscar"}.
|
||||
{"Your active privacy list has denied the routing of this stanza.","Tu lista de privacidad activa ha denegado el encío de este paquete."}.
|
||||
{"Your contact offline message queue is full. The message has been discarded.","Tu cola de mensajes diferidos de contactos está llena. El mensaje se ha descartado."}.
|
||||
{"Your Jabber account was successfully created.","Tu cuenta Jabber se ha creado correctamente."}.
|
||||
{"Your Jabber account was successfully deleted.","Tu cuenta Jabber se ha borrado correctamente."}.
|
||||
{"Your messages to ~s are being blocked. To unblock them, visit ~s","Tus mensajes a ~s están siendo bloqueados. Para desbloquearlos, visita ~s"}.
|
||||
+692
-454
File diff suppressed because it is too large
Load Diff
@@ -33,9 +33,15 @@
|
||||
{"Backup to File at ","Sauvegarde sur fichier sur "}.
|
||||
{"Bad format","Mauvais format"}.
|
||||
{"Birthday","Date d'anniversaire"}.
|
||||
{"CAPTCHA web page","Page web de CAPTCHA"}.
|
||||
{"Change Password","Modifier le mot de passe"}.
|
||||
{"Change User Password","Changer le mot de passe de l'utilisateur"}.
|
||||
{"Characters not allowed:","Caractères non-autorisés :"}.
|
||||
{"Chatroom configuration modified","Configuration du salon modifiée"}.
|
||||
{"Chatroom is created","Le salon de discussion est créé"}.
|
||||
{"Chatroom is destroyed","Le salon de discussion est détruit"}.
|
||||
{"Chatroom is started","Le salon de discussion a démarré"}.
|
||||
{"Chatroom is stopped","Le salon de discussion est stoppé"}.
|
||||
{"Chatrooms","Salons de discussion"}.
|
||||
{"Choose a username and password to register with this server","Choisissez un nom d'utilisateur et un mot de passe pour s'enregistrer sur ce serveur"}.
|
||||
{"Choose modules to stop","Sélectionnez les modules à arrêter"}.
|
||||
@@ -65,6 +71,7 @@
|
||||
{"Description:","Description :"}.
|
||||
{"Disc only copy","Copie sur disque uniquement"}.
|
||||
{"Displayed Groups:","Groupes affichés :"}.
|
||||
{"Don't tell your password to anybody, not even the administrators of the Jabber server.","Ne révélez votre mot de passe à personne, pas même l'administrateur de ce serveur."}.
|
||||
{"Dump Backup to Text File at ","Enregistrer la sauvegarde dans un fichier texte sur "}.
|
||||
{"Dump to Text File","Sauvegarder dans un fichier texte"}.
|
||||
{"Edit Properties","Modifier les propriétés"}.
|
||||
@@ -73,7 +80,6 @@
|
||||
{"ejabberd Publish-Subscribe module","Module Publish-Subscribe d'ejabberd"}.
|
||||
{"ejabberd SOCKS5 Bytestreams module","ejabberd SOCKS5 Bytestreams module"}.
|
||||
{"ejabberd vCard module","Module vCard ejabberd"}.
|
||||
{"ejabberd virtual hosts","Serveurs virtuels d'ejabberd"}.
|
||||
{"ejabberd Web Admin","Console Web d'administration de ejabberd"}.
|
||||
{"Elements","Éléments"}.
|
||||
{"Email","Email"}.
|
||||
@@ -116,6 +122,7 @@
|
||||
{"has been kicked because the room has been changed to members-only","a été éjecté car la salle est désormais réservée aux membres"}.
|
||||
{" has set the subject to: "," a changé le sujet pour: "}.
|
||||
{"Host","Serveur"}.
|
||||
{"If you don't see the CAPTCHA image here, visit the web page.","SI vous ne voyez pas l'image CAPTCHA ici, visitez la page web."}.
|
||||
{"If you want to specify different ports, passwords, encodings for IRC servers, fill this list with values in format '{\"irc server\", \"encoding\", port, \"password\"}'. By default this service use \"~s\" encoding, port ~p, empty password.","Si vous voulez préciser différents ports, mots de passe, et encodages pour les serveurs IRC, remplissez cette liste avec des valeurs dans le format '{\"serveur irc\", \"encodage\", port, \"mot de passe\"}'. Par défaut ce service utilise l'encodage \"~s\", port ~p, mot de passe vide."}.
|
||||
{"Import Directory","Importer une répertoire"}.
|
||||
{"Import File","Importer un fichier"}.
|
||||
@@ -141,6 +148,7 @@
|
||||
{"It is not allowed to send private messages","L'envoi de messages privés n'est pas autorisé"}.
|
||||
{"It is not allowed to send private messages of type \"groupchat\"","Il n'est pas permis d'envoyer des messages privés de type \"groupchat\""}.
|
||||
{"It is not allowed to send private messages to the conference","Il n'est pas permis d'envoyer des messages \"normaux\" à la conférence"}.
|
||||
{"Jabber Account Registration","Enregistrement du Compte Jabber"}.
|
||||
{"Jabber ID","Jabber ID"}.
|
||||
{"Jabber ID ~s is invalid","Le Jabber ID ~s n'est pas valide"}.
|
||||
{"January","Janvier"}.
|
||||
@@ -160,7 +168,7 @@
|
||||
{"List of modules to start","Liste des modules à démarrer"}.
|
||||
{"Low level update script","Script de mise à jour de bas-niveau"}.
|
||||
{"Make participants list public","Rendre la liste des participants publique"}.
|
||||
{"Make room captcha protected","Protéger le salon par un captcha"}.
|
||||
{"Make room CAPTCHA protected","Protéger le salon par un CAPTCHA"}.
|
||||
{"Make room members-only","Réserver le salon aux membres uniquement"}.
|
||||
{"Make room moderated","Rendre le salon modéré"}.
|
||||
{"Make room password protected","Protéger le salon par mot de passe"}.
|
||||
@@ -173,6 +181,7 @@
|
||||
{"May","Mai"}.
|
||||
{"Membership is required to enter this room","Vous devez être membre pour accèder à ce salon"}.
|
||||
{"Members:","Membres :"}.
|
||||
{"Memorize your password, or write it in a paper placed in a safe place. In Jabber there isn't an automated way to recover your password if you forget it.","Mémorisez votre mot de passe, ou écrivez-le sur un papier conservé dans un endroit secret. Dans Jabber il n'y a pas de mécanisme pour retrouver votre mot de passe si vous l'avez oublié."}.
|
||||
{"Memory","Mémoire"}.
|
||||
{"Message body","Corps du message"}.
|
||||
{"Middle Name","Autre nom"}.
|
||||
@@ -186,6 +195,7 @@
|
||||
{"Name:","Nom :"}.
|
||||
{"Name","Nom"}.
|
||||
{"Never","Jamais"}.
|
||||
{"New Password:","Nouveau mot de passe:"}.
|
||||
{"Nickname","Pseudo"}.
|
||||
{"Nickname Registration at ","Enregistrement d'un pseudo sur "}.
|
||||
{"Nickname ~s does not exist in the room","Le pseudo ~s n'existe pas dans ce salon"}.
|
||||
@@ -210,6 +220,7 @@
|
||||
{"Offline Messages:","Messages en attente :"}.
|
||||
{"Offline Messages","Messages en attente"}.
|
||||
{"OK","OK"}.
|
||||
{"Old Password:","Ancien mot de passe:"}.
|
||||
{"Online","En ligne"}.
|
||||
{"Online Users:","Utilisateurs connectés:"}.
|
||||
{"Online Users","Utilisateurs en ligne"}.
|
||||
@@ -230,6 +241,7 @@
|
||||
{"Password ~b","Mot de passe ~b"}.
|
||||
{"Password:","Mot de passe:"}.
|
||||
{"Password","Mot de passe"}.
|
||||
{"Password Verification:","Vérification du mot de passe :"}.
|
||||
{"Password Verification","Vérification du mot de passe"}.
|
||||
{"Path to Dir","Chemin vers le répertoire"}.
|
||||
{"Path to File","Chemin vers le fichier"}.
|
||||
@@ -246,14 +258,17 @@
|
||||
{"Protocol","Protocole"}.
|
||||
{"Publish-Subscribe","Publication-Abonnement"}.
|
||||
{"PubSub subscriber request","Demande d'abonnement PubSub"}.
|
||||
{"Purge all items when the relevant publisher goes offline","Purger tous les items lorsque publieur est hors-ligne"}.
|
||||
{"Queries to the conference members are not allowed in this room","Les requêtes sur les membres de la conférence ne sont pas autorisé dans ce salon"}.
|
||||
{"RAM and disc copy","Copie en mémoire vive (RAM) et sur disque"}.
|
||||
{"RAM copy","Copie en mémoire vive (RAM)"}.
|
||||
{"Raw","Brut"}.
|
||||
{"Really delete message of the day?","Confirmer la suppression du message du jour ?"}.
|
||||
{"Recipient is not in the conference room","Le destinataire n'est pas dans la conférence"}.
|
||||
{"Register a Jabber account","Enregistrer un compte Jabber"}.
|
||||
{"Registered Users:","Utilisateurs enregistrés:"}.
|
||||
{"Registered Users","Utilisateurs enregistrés"}.
|
||||
{"Register","Enregistrer"}.
|
||||
{"Registration in mod_irc for ","Enregistrement du mod_irc pour "}.
|
||||
{"Remote copy","Copie distante"}.
|
||||
{"Remove All Offline Messages","Effacer tous les messages hors ligne"}.
|
||||
@@ -290,6 +305,7 @@
|
||||
{"Send announcement to all users on all hosts","Envoyer une annonce à tous les utilisateurs de tous les domaines"}.
|
||||
{"September","Septembre"}.
|
||||
{"Server ~b","Serveur ~b"}.
|
||||
{"Server:","Serveur :"}.
|
||||
{"Set message of the day and send to online users","Définir le message du jour et l'envoyer aux utilisateurs en ligne"}.
|
||||
{"Set message of the day on all hosts and send to online users","Définir le message du jour pour tous domaines et l'envoyer aux utilisateurs en ligne"}.
|
||||
{"Shared Roster Groups","Groupes de liste de contacts partagée"}.
|
||||
@@ -297,7 +313,9 @@
|
||||
{"Show Ordinary Table","Montrer la table ordinaire"}.
|
||||
{"Shut Down Service","Arrêter le service"}.
|
||||
{"~s invites you to the room ~s","~s vous a invité dans la salle de discussion ~s"}.
|
||||
{"Some Jabber clients can store your password in your computer. Use that feature only if you trust your computer is safe.","Certains clients Jabber peuvent stocker votre mot de passe sur votre ordinateur. N'utilisez cette fonctionnalité que si vous avez confiance en la sécurité de votre ordinateur."}.
|
||||
{"Specify the access model","Définir le modèle d'accès"}.
|
||||
{"Specify the event message type","Définir le type de message d'événement"}.
|
||||
{"Specify the publisher model","Définir le modèle de publication"}.
|
||||
{"~s's Offline Messages Queue","~s messages en file d'attente"}.
|
||||
{"Start","Démarrer"}.
|
||||
@@ -320,12 +338,21 @@
|
||||
{"Sunday","Dimanche"}.
|
||||
{"That nickname is already in use by another occupant","Le pseudo est déjà utilisé par un autre occupant"}.
|
||||
{"That nickname is registered by another person","Le pseudo est enregistré par une autre personne"}.
|
||||
{"The captcha is valid.","Le captcha est valide"}.
|
||||
{"The CAPTCHA is valid.","Le CAPTCHA est valide"}.
|
||||
{"The CAPTCHA verification has failed","La vérification du CAPTCHA a échoué"}.
|
||||
{"The collections with which a node is affiliated","Les collections avec lesquelle un nœud est affilié"}.
|
||||
{"the password is","le mot de passe est"}.
|
||||
{"This participant is kicked from the room because he sent an error message","Ce participant est expulsé du salon pour avoir envoyé un message erroné"}.
|
||||
{"This participant is kicked from the room because he sent an error message to another participant","Ce participant est expulsé du salon pour avoir envoyé un message erroné à un autre participant"}.
|
||||
{"This participant is kicked from the room because he sent an error presence","Ce participant est expulsé du salon pour avoir envoyé une présence erroné"}.
|
||||
{"The password is too weak","Le mot de passe est trop faible"}.
|
||||
{"The password of your Jabber account was successfully changed.","Le mot de passe de votre compte Jabber a été changé avec succès."}.
|
||||
{"There was an error changing the password: ","Il y a eu une erreur en changeant le mot de passe :"}.
|
||||
{"There was an error creating the account: ","Il y a eu une erreur en créant le compte :"}.
|
||||
{"There was an error deleting the account: ","Il y a eu une erreur en effaçant le compte :"}.
|
||||
{"This is case insensitive: macbeth is the same that MacBeth and Macbeth.","C'est insensible à la casse : macbeth est identique à MacBeth et Macbeth."}.
|
||||
{"This page allows to create a Jabber account in this Jabber server. Your JID (Jabber IDentifier) will be of the form: username@server. Please read carefully the instructions to fill correctly the fields.","Cette page permet de créer un compte Jabber sur ce serveur Jabber. Votre JID (Jabber IDentifier, identifiant Jabber) sera de la forme : nom@serveur. Prière de lire avec attention les instructions pour remplir correctement ces champs."}.
|
||||
{"This page allows to unregister a Jabber account in this Jabber server.","Cette page permet d'effacer un compte Jabber sur ce serveur Jabber."}.
|
||||
{"This participant is kicked from the room because he sent an error message","Ce participant est expulsé du salon pour avoir envoyé un message erronée"}.
|
||||
{"This participant is kicked from the room because he sent an error message to another participant","Ce participant est expulsé du salon pour avoir envoyé un message erronée à un autre participant"}.
|
||||
{"This participant is kicked from the room because he sent an error presence","Ce participant est expulsé du salon pour avoir envoyé une présence erronée"}.
|
||||
{"This room is not anonymous","Ce salon n'est pas anonyme"}.
|
||||
{"Thursday","Jeudi"}.
|
||||
{"Time delay","Délais"}.
|
||||
@@ -338,8 +365,10 @@
|
||||
{"Transactions Logged:","Transactions journalisées :"}.
|
||||
{"Transactions Restarted:","Transactions redémarrées :"}.
|
||||
{"Tuesday","Mardi"}.
|
||||
{"Unable to generate a captcha","Impossible de générer le captcha"}.
|
||||
{"Unable to generate a CAPTCHA","Impossible de générer le CAPTCHA"}.
|
||||
{"Unauthorized","Non autorisé"}.
|
||||
{"Unregister a Jabber account","Effacer un compte Jabber"}.
|
||||
{"Unregister","Effacer"}.
|
||||
{"Update message of the day (don't send)","Mise à jour du message du jour (pas d'envoi)"}.
|
||||
{"Update message of the day on all hosts (don't send)","Mettre à jour le message du jour sur tous les domaines (ne pas envoyer)"}.
|
||||
{"Update","Mettre à jour"}.
|
||||
@@ -349,6 +378,7 @@
|
||||
{"Uptime:","Temps depuis le démarrage :"}.
|
||||
{"Use of STARTTLS required","L'utilisation de STARTTLS est impérative"}.
|
||||
{"User Management","Gestion des utilisateurs"}.
|
||||
{"Username:","Nom d'utilisateur :"}.
|
||||
{"Users are not allowed to register accounts so quickly","Les utilisateurs ne sont pas autorisés à enregistrer des comptes si rapidement"}.
|
||||
{"Users Last Activity","Dernière activité des utilisateurs"}.
|
||||
{"Users","Utilisateurs"}.
|
||||
@@ -356,16 +386,22 @@
|
||||
{"User","Utilisateur"}.
|
||||
{"Validate","Valider"}.
|
||||
{"vCard User Search","Recherche dans l'annnuaire"}.
|
||||
{"Virtual Hosts","Serveurs virtuels"}.
|
||||
{"Visitors are not allowed to change their nicknames in this room","Les visiteurs ne sont pas autorisés à changer de pseudo dans ce salon"}.
|
||||
{"Visitors are not allowed to send messages to all occupants","Les visiteurs ne sont pas autorisés à envoyer des messages à tout les occupants"}.
|
||||
{"Wednesday","Mercredi"}.
|
||||
{"When to send the last published item","A quel moment envoyer le dernier élément publié"}.
|
||||
{"Whether to allow subscriptions","Autoriser l'abonnement ?"}.
|
||||
{"You can later change your password using a Jabber client.","Vous pouvez changer votre mot de passe plus tard en utilisant un client Jabber."}.
|
||||
{"You have been banned from this room","Vous avez été exclus de ce salon"}.
|
||||
{"You must fill in field \"Nickname\" in the form","Vous devez préciser le champ \"pseudo\" dans le formulaire"}.
|
||||
{"You need a client that supports x:data and CAPTCHA to register","Vous avez besoin d'un client prenant en charge x:data et CAPTCHA pour enregistrer un pseudo"}.
|
||||
{"You need a client that supports x:data to register the nickname","Vous avez besoin d'un client prenant en charge x:data pour enregistrer un pseudo"}.
|
||||
{"You need an x:data capable client to configure mod_irc settings","Vous avez besoin d'un client supportant x:data pour configurer le module IRC"}.
|
||||
{"You need an x:data capable client to configure room","Vous avez besoin d'un client supportant x:data pour configurer le salon"}.
|
||||
{"You need an x:data capable client to register nickname","Vous avez besoin d'un client supportant x:data pour enregistrer un pseudo"}.
|
||||
{"You need an x:data capable client to search","Vous avez besoin d'un client supportant x:data pour faire une recherche"}.
|
||||
{"Your active privacy list has denied the routing of this stanza.","Votre règle de flitrage active a empêché le routage de ce stanza."}.
|
||||
{"Your contact offline message queue is full. The message has been discarded.","La file d'attente de message de votre contact est pleine. Votre message a été détruit."}.
|
||||
{"Your Jabber account was successfully created.","Votre compte Jabber a été créé avec succès."}.
|
||||
{"Your Jabber account was successfully deleted.","Votre compte Jabber a été effacé avec succès."}.
|
||||
{"Your messages to ~s are being blocked. To unblock them, visit ~s","Vos messages pour ~s sont bloqués. Pour les débloquer, veuillez visiter ~s"}.
|
||||
+708
-460
File diff suppressed because it is too large
Load Diff
@@ -73,7 +73,6 @@
|
||||
{"ejabberd Publish-Subscribe module","Módulo de Publicar-Subscribir de ejabberd"}.
|
||||
{"ejabberd SOCKS5 Bytestreams module","ejabberd SOCKS5 Bytestreams module"}.
|
||||
{"ejabberd vCard module","Módulo vCard para ejabberd"}.
|
||||
{"ejabberd virtual hosts","Hosts virtuais de ejabberd"}.
|
||||
{"ejabberd Web Admin","Ejabberd Administrador Web"}.
|
||||
{"Elements","Elementos"}.
|
||||
{"Email","Email"}.
|
||||
@@ -160,7 +159,7 @@
|
||||
{"List of modules to start","Lista de módulos a iniciar"}.
|
||||
{"Low level update script","Script de actualización a baixo nivel"}.
|
||||
{"Make participants list public","A lista de participantes é pública"}.
|
||||
{"Make room captcha protected","Protexer a sala con captcha"}.
|
||||
{"Make room CAPTCHA protected","Protexer a sala con CAPTCHA"}.
|
||||
{"Make room members-only","Sala só para membros"}.
|
||||
{"Make room moderated","Facer sala moderada"}.
|
||||
{"Make room password protected","Protexer a sala con contrasinal"}.
|
||||
@@ -320,7 +319,7 @@
|
||||
{"Sunday","Domingo"}.
|
||||
{"That nickname is already in use by another occupant","Ese alcume que xa está en uso por outro ocupante"}.
|
||||
{"That nickname is registered by another person","O alcume xa está rexistrado por outra persoa"}.
|
||||
{"The captcha is valid.","O Captcha é válido."}.
|
||||
{"The CAPTCHA is valid.","O CAPTCHA é válido."}.
|
||||
{"The collections with which a node is affiliated","As coleccións coas que un nodo está afiliado"}.
|
||||
{"the password is","a contrasinal é"}.
|
||||
{"This participant is kicked from the room because he sent an error message","Este participante é expulsado da sala, xa que enviou unha mensaxe de erro"}.
|
||||
@@ -338,7 +337,6 @@
|
||||
{"Transactions Logged:","Transaccións rexistradas:"}.
|
||||
{"Transactions Restarted:","Transaccións reiniciadas:"}.
|
||||
{"Tuesday","Martes"}.
|
||||
{"Unable to generate a captcha","Non se pode xerar un Captcha"}.
|
||||
{"Unauthorized","Non autorizado"}.
|
||||
{"Update ","Actualizar"}.
|
||||
{"Update","Actualizar"}.
|
||||
@@ -356,6 +354,7 @@
|
||||
{"User","Usuario"}.
|
||||
{"Validate","Validar"}.
|
||||
{"vCard User Search","Procura de usuario en vCard"}.
|
||||
{"Virtual Hosts","Hosts Virtuais"}.
|
||||
{"Visitors are not allowed to change their nicknames in this room","Os visitantes non están autorizados a cambiar os seus That alcumes nesta sala"}.
|
||||
{"Visitors are not allowed to send messages to all occupants","Os visitantes non poden enviar mensaxes a todos os ocupantes"}.
|
||||
{"Wednesday","Mércores"}.
|
||||
@@ -365,7 +364,6 @@
|
||||
{"You must fill in field \"Nickname\" in the form","Debes encher o campo \"Alcumo\" no formulario"}.
|
||||
{"You need an x:data capable client to configure mod_irc settings","Necesitas un cliente con soporte de x:data para configurar as opcións de mod_irc"}.
|
||||
{"You need an x:data capable client to configure room","Necesitas un cliente con soporte de x:data para configurar a sala"}.
|
||||
{"You need an x:data capable client to register nickname","Necesitas un cliente con soporte de x:data para poder rexistrar o alcume"}.
|
||||
{"You need an x:data capable client to search","Necesitas un cliente con soporte de x:data para poder buscar"}.
|
||||
{"Your contact offline message queue is full. The message has been discarded.","A túa cola de mensaxes diferidas de contactos está chea. A mensaxe descartouse."}.
|
||||
{"Your messages to ~s are being blocked. To unblock them, visit ~s","As súas mensaxes a ~s encóntranse bloqueadas. Para desbloquear, visite ~s"}.
|
||||
+698
-453
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,407 @@
|
||||
{"Access Configuration","Akses Konfigurasi"}.
|
||||
{"Access Control List Configuration","Konfigurasi Daftar Akses Pengendalian"}.
|
||||
{"Access Control Lists","Akses Daftar Pengendalian"}.
|
||||
{"Access control lists","Daftar Pengendalian Akses"}.
|
||||
{"Access denied by service policy","Akses ditolak oleh kebijakan layanan"}.
|
||||
{"Access rules","Akses peraturan"}.
|
||||
{"Access Rules","Aturan Akses"}.
|
||||
{"Action on user","Tindakan pada pengguna"}.
|
||||
{"Add Jabber ID","Tambah Jabber ID"}.
|
||||
{"Add New","Tambah Baru"}.
|
||||
{"Add User","Tambah Pengguna"}.
|
||||
{"Administration","Administrasi"}.
|
||||
{"Administration of ","Administrasi"}.
|
||||
{"Administrator privileges required","Hak istimewa Administrator dibutuhkan"}.
|
||||
{"A friendly name for the node","Nama yang dikenal untuk node"}.
|
||||
{"All activity","Semua aktifitas"}.
|
||||
{"Allow this Jabber ID to subscribe to this pubsub node?","Izinkan ID Jabber ini untuk berlangganan pada node pubsub ini?"}.
|
||||
{"Allow users to change the subject","Perbolehkan pengguna untuk mengganti topik"}.
|
||||
{"Allow users to query other users","Perbolehkan pengguna untuk mengetahui pengguna lain"}.
|
||||
{"Allow users to send invites","Perbolehkan pengguna mengirimkan undangan"}.
|
||||
{"Allow users to send private messages","perbolehkan pengguna mengirimkan pesan ke pengguna lain secara pribadi"}.
|
||||
{"Allow visitors to change nickname","Perbolehkan visitor mengganti nama julukan"}.
|
||||
{"Allow visitors to send status text in presence updates","Izinkan pengunjung untuk mengirim teks status terbaru"}.
|
||||
{"All Users","Semua Pengguna"}.
|
||||
{"Announcements","Pengumuman"}.
|
||||
{"anyone","Siapapun"}.
|
||||
{"A password is required to enter this room","Diperlukan kata sandi untuk masuk ruangan ini"}.
|
||||
{"April","April"}.
|
||||
{"August","Agustus"}.
|
||||
{"Backup","Backup"}.
|
||||
{"Backup Management","Manajemen Backup"}.
|
||||
{"Backup of ","Cadangan dari"}.
|
||||
{"Backup to File at ","Backup ke File pada"}.
|
||||
{"Bad format","Format yang buruk"}.
|
||||
{"Birthday","Hari Lahir"}.
|
||||
{"CAPTCHA web page","CAPTCHA laman web"}.
|
||||
{"Change Password","Ubah Kata Sandi"}.
|
||||
{"Change User Password","Ubah User Password"}.
|
||||
{"Characters not allowed:","Karakter tidak diperbolehkan:"}.
|
||||
{"Chatroom configuration modified","Konfigurasi ruang chat diubah"}.
|
||||
{"Chatroom is created","Ruang chat telah dibuat"}.
|
||||
{"Chatroom is destroyed","Ruang chat dilenyapkan"}.
|
||||
{"Chatroom is started","Ruang chat dimulai"}.
|
||||
{"Chatroom is stopped","Ruang chat dihentikan"}.
|
||||
{"Chatrooms","Ruangan Chat"}.
|
||||
{"Choose a username and password to register with this server","Pilih nama pengguna dan kata sandi untuk mendaftar dengan layanan ini"}.
|
||||
{"Choose modules to stop","Pilih Modul untuk berhenti"}.
|
||||
{"Choose storage type of tables","Pilih jenis penyimpanan tabel"}.
|
||||
{"Choose whether to approve this entity's subscription.","Pilih apakah akan menyetujui hubungan pertemanan ini."}.
|
||||
{"City","Kota"}.
|
||||
{"Commands","Perintah"}.
|
||||
{"Conference room does not exist","Ruang Konferensi tidak ada"}.
|
||||
{"Configuration of room ~s","Pengaturan ruangan ~s"}.
|
||||
{"Configuration","Pengaturan"}.
|
||||
{"Connected Resources:","Sumber Daya Terhubung:"}.
|
||||
{"Connections parameters","Parameter Koneksi"}.
|
||||
{"Country","Negara"}.
|
||||
{"CPU Time:","Waktu CPU:"}.
|
||||
{"Database","Database"}.
|
||||
{"Database Tables at ","Tabel Database pada"}.
|
||||
{"Database Tables Configuration at ","Database Tabel Konfigurasi pada"}.
|
||||
{"December","Desember"}.
|
||||
{"Default users as participants","pengguna pertama kali masuk sebagai participant"}.
|
||||
{"Delete","Hapus"}.
|
||||
{"Delete message of the day","Hapus pesan harian"}.
|
||||
{"Delete message of the day on all hosts","Hapus pesan harian pada semua host"}.
|
||||
{"Delete Selected","Hapus Yang Terpilih"}.
|
||||
{"Delete User","Hapus Pengguna"}.
|
||||
{"Deliver event notifications","Memberikan pemberitahuan acara"}.
|
||||
{"Deliver payloads with event notifications","Memberikan muatan dengan pemberitahuan acara"}.
|
||||
{"Description:","Keterangan:"}.
|
||||
{"Disc only copy","Hanya salinan dari disc"}.
|
||||
{"Displayed Groups:","Tampilkan Grup:"}.
|
||||
{"Don't tell your password to anybody, not even the administrators of the Jabber server.","Jangan memberitahukan kata sandi Anda ke siapapun, bahkan para administrator dari layanan Jabber."}.
|
||||
{"Dump Backup to Text File at ","Dump Backup ke File Teks di"}.
|
||||
{"Dump to Text File","Dump menjadi File Teks"}.
|
||||
{"Edit Properties","Ganti Properti"}.
|
||||
{"ejabberd IRC module","ejabberd IRC modul"}.
|
||||
{"ejabberd MUC module","ejabberd MUC Module"}.
|
||||
{"ejabberd Publish-Subscribe module","Modul ejabberd Setujui-Pertemanan"}.
|
||||
{"ejabberd SOCKS5 Bytestreams module","modul ejabberd SOCKS5 Bytestreams"}.
|
||||
{"ejabberd vCard module","Modul ejabberd vCard"}.
|
||||
{"ejabberd Web Admin","Admin Web ejabberd"}.
|
||||
{"Elements","Elemen-elemen"}.
|
||||
{"Email","Email"}.
|
||||
{"Enable logging","Aktifkan catatan"}.
|
||||
{"Encoding for server ~b","Pengkodean untuk layanan ~b"}.
|
||||
{"End User Session","Akhir Sesi Pengguna"}.
|
||||
{"Enter list of {Module, [Options]}","Masukkan daftar {Modul, [Options]}"}.
|
||||
{"Enter nickname you want to register","Masukkan nama julukan Anda jika ingin mendaftar"}.
|
||||
{"Enter path to backup file","Masukkan path untuk file cadangan"}.
|
||||
{"Enter path to jabberd14 spool dir","Masukkan path ke direktori spool jabberd14"}.
|
||||
{"Enter path to jabberd14 spool file","Masukkan path ke file jabberd14 spool"}.
|
||||
{"Enter path to text file","Masukkan path ke file teks"}.
|
||||
{"Enter the text you see","Masukkan teks yang Anda lihat"}.
|
||||
{"Enter username and encodings you wish to use for connecting to IRC servers. Press 'Next' to get more fields to fill in. Press 'Complete' to save settings.","Masukkan username dan pengkodean yang ingin Anda gunakan untuk menghubungkan ke layanan IRC. Tekan 'Selanjutnya' untuk mendapatkan lagi formulir kemudian Tekan 'Lengkap' untuk menyimpan pengaturan."}.
|
||||
{"Enter username, encodings, ports and passwords you wish to use for connecting to IRC servers","Masukkan username, pengkodean, port dan sandi yang ingin Anda gunakan untuk menghubungkan ke layanan IRC"}.
|
||||
{"Erlang Jabber Server","Layanan Erlang Jabber"}.
|
||||
{"Error","Kesalahan"}.
|
||||
{"Example: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef.net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}].","Contoh: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef.net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."}.
|
||||
{"Export data of all users in the server to PIEFXIS files (XEP-0227):","Ekspor data dari semua pengguna pada layanan ke berkas PIEFXIS (XEP-0227):"}.
|
||||
{"Export data of users in a host to PIEFXIS files (XEP-0227):","Ekspor data pengguna pada sebuah host ke berkas PIEFXIS (XEP-0227):"}.
|
||||
{"Family Name","Nama Keluarga (marga)"}.
|
||||
{"February","Februari"}.
|
||||
{"Fill in fields to search for any matching Jabber User","Isi kolom untuk mencari pengguna Jabber yang sama"}.
|
||||
{"Fill in the form to search for any matching Jabber User (Add * to the end of field to match substring)","Isi formulir untuk pencarian pengguna Jabber yang cocok (Tambahkan * ke mengakhiri pengisian untuk menyamakan kata)"}.
|
||||
{"Friday","Jumat"}.
|
||||
{"From","Dari"}.
|
||||
{"From ~s","Dari ~s"}.
|
||||
{"Full Name","Nama Lengkap"}.
|
||||
{"Get Number of Online Users","Dapatkan Jumlah User Yang Online"}.
|
||||
{"Get Number of Registered Users","Dapatkan Jumlah Pengguna Yang Terdaftar"}.
|
||||
{"Get User Last Login Time","Dapatkan Waktu Login Terakhir Pengguna "}.
|
||||
{"Get User Password","Dapatkan User Password"}.
|
||||
{"Get User Statistics","Dapatkan Statistik Pengguna"}.
|
||||
{"Group ","Grup"}.
|
||||
{"Groups","Grup"}.
|
||||
{"has been banned","telah dibanned"}.
|
||||
{"has been kicked because of an affiliation change","telah dikick karena perubahan afiliasi"}.
|
||||
{"has been kicked because of a system shutdown","telah dikick karena sistem shutdown"}.
|
||||
{"has been kicked because the room has been changed to members-only","telah dikick karena ruangan telah diubah menjadi hanya untuk member"}.
|
||||
{"has been kicked","telah dikick"}.
|
||||
{" has set the subject to: ","telah menetapkan topik yaitu:"}.
|
||||
{"Host","Host"}.
|
||||
{"If you don't see the CAPTCHA image here, visit the web page.","Jika Anda tidak melihat gambar CAPTCHA disini, silahkan kunjungi halaman web."}.
|
||||
{"If you want to specify different ports, passwords, encodings for IRC servers, fill this list with values in format '{\"irc server\", \"encoding\", port, \"password\"}'. By default this service use \"~s\" encoding, port ~p, empty password.","Jika Anda ingin menentukan port yang berbeda, sandi, pengkodean untuk layanan IRC, isi daftar ini dengan nilai-nilai dalam format '{\"server irc \", \"encoding \", port, \"sandi \"}'. Secara default ini menggunakan layanan \"~s \" pengkodean, port ~p, kata sandi kosong."}.
|
||||
{"Import Directory","Impor Direktori"}.
|
||||
{"Import File","Impor File"}.
|
||||
{"Import user data from jabberd14 spool file:","Impor data pengguna dari sekumpulan berkas jabberd14:"}.
|
||||
{"Import User from File at ","Impor Pengguna dari File pada"}.
|
||||
{"Import users data from a PIEFXIS file (XEP-0227):","impor data-data pengguna dari sebuah PIEFXIS (XEP-0227):"}.
|
||||
{"Import users data from jabberd14 spool directory:","Импорт пользовательских данных из буферной директории jabberd14:"}.
|
||||
{"Import Users from Dir at ","Impor Pengguna dari Dir di"}.
|
||||
{"Import Users From jabberd14 Spool Files","Impor Pengguna Dari jabberd14 Spool File"}.
|
||||
{"Improper message type","Jenis pesan yang tidak benar"}.
|
||||
{"Incorrect password","Kata sandi salah"}.
|
||||
{"Invalid affiliation: ~s","Afiliasi tidak valid: ~s"}.
|
||||
{"Invalid role: ~s","Peran tidak valid: ~s"}.
|
||||
{"IP addresses","Alamat IP"}.
|
||||
{"IP","IP"}.
|
||||
{"IRC channel (don't put the first #)","Channel IRC (tidak perlu menempatkan # sebelumnya)"}.
|
||||
{"IRC server","Layanan IRC"}.
|
||||
{"IRC settings","Pengaturan IRC"}.
|
||||
{"IRC Transport","IRC Transport"}.
|
||||
{"IRC username","Nama Pengguna IRC"}.
|
||||
{"IRC Username","Nama Pengguna IRC"}.
|
||||
{"is now known as","sekarang dikenal sebagai"}.
|
||||
{"It is not allowed to send private messages","Hal ini tidak diperbolehkan untuk mengirim pesan pribadi"}.
|
||||
{"It is not allowed to send private messages of type \"groupchat\"","Hal ini tidak diperbolehkan untuk mengirim pesan pribadi jenis \"groupchat \""}.
|
||||
{"It is not allowed to send private messages to the conference","Hal ini tidak diperbolehkan untuk mengirim pesan pribadi ke konferensi"}.
|
||||
{"Jabber Account Registration","Pendaftaran Akun Jabber"}.
|
||||
{"Jabber ID","Jabber ID"}.
|
||||
{"Jabber ID ~s is invalid","Jabber ID ~s tidak valid"}.
|
||||
{"January","Januari"}.
|
||||
{"Join IRC channel","Gabung channel IRC"}.
|
||||
{"joins the room","bergabung ke ruangan"}.
|
||||
{"Join the IRC channel here.","Gabung ke channel IRC disini"}.
|
||||
{"Join the IRC channel in this Jabber ID: ~s","Gabung ke channel IRC dengan Jabber ID: ~s"}.
|
||||
{"July","Juli"}.
|
||||
{"June","Juni"}.
|
||||
{"Last Activity","Aktifitas Terakhir"}.
|
||||
{"Last login","Terakhir Login"}.
|
||||
{"Last month","Akhir bulan"}.
|
||||
{"Last year","Akhir tahun"}.
|
||||
{"leaves the room","meninggalkan ruangan"}.
|
||||
{"Listened Ports at ","Mendeteksi Port-port di"}.
|
||||
{"Listened Ports","Port Terdeteksi"}.
|
||||
{"List of modules to start","Daftar modul untuk memulai"}.
|
||||
{"Low level update script","Perbaruan naskah tingkat rendah"}.
|
||||
{"Make participants list public","Buat daftar participant diketahui oleh public"}.
|
||||
{"Make room CAPTCHA protected","Buat ruangan dilindungi dengan CAPTCHA"}.
|
||||
{"Make room members-only","Buat ruangan hanya untuk member saja"}.
|
||||
{"Make room moderated","Buat ruangan hanya untuk moderator saja"}.
|
||||
{"Make room password protected","Buat ruangan yang dilindungi dengan kata sandi"}.
|
||||
{"Make room persistent","Buat ruangan menjadi permanent"}.
|
||||
{"Make room public searchable","Buat ruangan dapat dicari"}.
|
||||
{"March","Maret"}.
|
||||
{"Maximum Number of Occupants","Maksimum Jumlah Penghuni"}.
|
||||
{"Max # of items to persist","Max item untuk bertahan"}.
|
||||
{"Max payload size in bytes","Max kapasitas ukuran dalam bytes"}.
|
||||
{"May","Mei"}.
|
||||
{"Members:","Anggota:"}.
|
||||
{"Membership is required to enter this room","Hanya Member yang dapat masuk ruangan ini"}.
|
||||
{"Memorize your password, or write it in a paper placed in a safe place. In Jabber there isn't an automated way to recover your password if you forget it.","Hafalkan kata sandi Anda, atau dicatat dan letakkan di tempat yang aman. Didalam Jabber tidak ada cara otomatis untuk mendapatkan kembali password Anda jika Anda lupa."}.
|
||||
{"Memory","Memori"}.
|
||||
{"Message body","Isi Pesan"}.
|
||||
{"Middle Name","Nama Tengah"}.
|
||||
{"Moderator privileges required","Hak istimewa moderator dibutuhkan"}.
|
||||
{"moderators only","Hanya moderator"}.
|
||||
{"Modified modules","Modifikasi modul-modul"}.
|
||||
{"Module","Modul"}.
|
||||
{"Modules at ","modul-modul di"}.
|
||||
{"Modules","Modul"}.
|
||||
{"Monday","Senin"}.
|
||||
{"Name:","Nama:"}.
|
||||
{"Name","Nama"}.
|
||||
{"Never","Tidak Pernah"}.
|
||||
{"New Password:","Password Baru:"}.
|
||||
{"Nickname","Nama Julukan"}.
|
||||
{"Nickname Registration at ","Pendaftaran Julukan pada"}.
|
||||
{"Nickname ~s does not exist in the room","Nama Julukan ~s tidak berada di dalam ruangan"}.
|
||||
{"No body provided for announce message","Tidak ada isi pesan yang disediakan untuk mengirimkan pesan"}.
|
||||
{"No Data","Tidak Ada Data"}.
|
||||
{"Node ID","ID Node"}.
|
||||
{"Node ","Node"}.
|
||||
{"Node not found","Node tidak ditemukan"}.
|
||||
{"Nodes","Node-node"}.
|
||||
{"No limit","Tidak terbatas"}.
|
||||
{"None","Tak satupun"}.
|
||||
{"No resource provided","Tidak ada sumber daya yang disediakan"}.
|
||||
{"Not Found","Tidak Ditemukan"}.
|
||||
{"Notify subscribers when items are removed from the node","Beritahu pelanggan ketika item tersebut dikeluarkan dari node"}.
|
||||
{"Notify subscribers when the node configuration changes","Beritahu pelanggan ketika ada perubahan konfigurasi node"}.
|
||||
{"Notify subscribers when the node is deleted","Beritahu pelanggan ketika node dihapus"}.
|
||||
{"November","Nopember"}.
|
||||
{"Number of occupants","Jumlah Penghuni"}.
|
||||
{"Number of online users","Jumlah pengguna online"}.
|
||||
{"Number of registered users","Jumlah pengguna terdaftar"}.
|
||||
{"October","Oktober"}.
|
||||
{"Offline Messages:","Pesan Offline:"}.
|
||||
{"Offline Messages","Pesan Offline"}.
|
||||
{"OK","YA"}.
|
||||
{"Old Password:","Password Lama:"}.
|
||||
{"Online","Online"}.
|
||||
{"Online Users:","Pengguna Online:"}.
|
||||
{"Online Users","Pengguna Yang Online"}.
|
||||
{"Only deliver notifications to available users","Hanya mengirimkan pemberitahuan kepada pengguna yang tersedia"}.
|
||||
{"Only moderators and participants are allowed to change the subject in this room","Hanya moderator dan peserta yang diizinkan untuk mengganti topik pembicaraan di ruangan ini"}.
|
||||
{"Only moderators are allowed to change the subject in this room","Hanya moderator yang diperbolehkan untuk mengubah topik dalam ruangan ini"}.
|
||||
{"Only occupants are allowed to send messages to the conference","Hanya penghuni yang diizinkan untuk mengirim pesan ke konferensi"}.
|
||||
{"Only occupants are allowed to send queries to the conference","Hanya penghuni diizinkan untuk mengirim permintaan ke konferensi"}.
|
||||
{"Only service administrators are allowed to send service messages","Layanan hanya diperuntukan kepada administrator yang diizinkan untuk mengirim layanan pesan"}.
|
||||
{"Options","Pilihan-pilihan"}.
|
||||
{"Organization Name","Nama Organisasi"}.
|
||||
{"Organization Unit","Unit Organisasi"}.
|
||||
{"Outgoing s2s Connections","Koneksi Keluar s2s"}.
|
||||
{"Outgoing s2s Connections:","Koneksi s2s yang keluar:"}.
|
||||
{"Outgoing s2s Servers:","Layanan s2s yang keluar:"}.
|
||||
{"Owner privileges required","Hak istimewa owner dibutuhkan"}.
|
||||
{"Packet","Paket"}.
|
||||
{"Password ~b","Kata Sandi ~b"}.
|
||||
{"Password:","Kata Sandi:"}.
|
||||
{"Password","Sandi"}.
|
||||
{"Password Verification:","Verifikasi Kata Sandi:"}.
|
||||
{"Password Verification","Verifikasi Sandi"}.
|
||||
{"Path to Dir","Jalur ke Dir"}.
|
||||
{"Path to File","Jalur ke File"}.
|
||||
{"Pending","Tertunda"}.
|
||||
{"Period: ","Periode:"}.
|
||||
{"Persist items to storage","Pertahankan item ke penyimpanan"}.
|
||||
{"Ping","Ping"}.
|
||||
{"Please note that these options will only backup the builtin Mnesia database. If you are using the ODBC module, you also need to backup your SQL database separately.","Harap dicatat bahwa pilihan ini hanya akan membuat cadangan builtin Mnesia database. Jika Anda menggunakan modul ODBC, anda juga perlu untuk membuat cadangan database SQL Anda secara terpisah."}.
|
||||
{"Pong","Pong"}.
|
||||
{"Port ~b","Port ~b"}.
|
||||
{"Port","Port"}.
|
||||
{"Present real Jabber IDs to","Tampilkan Jabber ID secara lengkap"}.
|
||||
{"private, ","pribadi, "}.
|
||||
{"Protocol","Protocol"}.
|
||||
{"Publish-Subscribe","Setujui-Pertemanan"}.
|
||||
{"PubSub subscriber request","Permintaan pertemanan PubSub"}.
|
||||
{"Purge all items when the relevant publisher goes offline","Bersihkan semua item ketika penerbit yang relevan telah offline"}.
|
||||
{"Queries to the conference members are not allowed in this room","Permintaan untuk para anggota konferensi tidak diperbolehkan di ruangan ini"}.
|
||||
{"RAM and disc copy","RAM dan disc salinan"}.
|
||||
{"RAM copy","Salinan RAM"}.
|
||||
{"Raw","mentah"}.
|
||||
{"Really delete message of the day?","Benar-benar ingin menghapus pesan harian?"}.
|
||||
{"Recipient is not in the conference room","Penerima tidak berada di ruangan konferensi"}.
|
||||
{"Register a Jabber account","Daftarkan sebuah akun jabber"}.
|
||||
{"Registered Users:","Pengguna Terdaftar:"}.
|
||||
{"Registered Users","Pengguna Terdaftar"}.
|
||||
{"Register","Mendaftar"}.
|
||||
{"Registration in mod_irc for ","Pendaftaran di mod_irc untuk"}.
|
||||
{"Remote copy","Salinan Remote"}.
|
||||
{"Remove All Offline Messages","Hapus Semua Pesan Offline"}.
|
||||
{"Remove","Menghapus"}.
|
||||
{"Remove User","Hapus Pengguna"}.
|
||||
{"Replaced by new connection","Diganti dengan koneksi baru"}.
|
||||
{"Resources","Sumber daya"}.
|
||||
{"Restart","Jalankan Ulang"}.
|
||||
{"Restart Service","Restart Layanan"}.
|
||||
{"Restore Backup from File at ","Kembalikan Backup dari File pada"}.
|
||||
{"Restore binary backup after next ejabberd restart (requires less memory):","Mengembalikan cadangan yang berpasanagn setelah ejabberd berikutnya dijalankan ulang (memerlukan memori lebih sedikit):"}.
|
||||
{"Restore binary backup immediately:","Segera mengembalikan cadangan yang berpasangan:"}.
|
||||
{"Restore","Mengembalikan"}.
|
||||
{"Restore plain text backup immediately:","Segera mengembalikan cadangan teks biasa:"}.
|
||||
{"Room Configuration","Konfigurasi Ruangan"}.
|
||||
{"Room creation is denied by service policy","Pembuatan Ruangan ditolak oleh kebijakan layanan"}.
|
||||
{"Room description","Keterangan ruangan"}.
|
||||
{"Room Occupants","Penghuni Ruangan"}.
|
||||
{"Room title","Nama Ruangan"}.
|
||||
{"Roster groups allowed to subscribe","Kelompok kontak yang diizinkan untuk berlangganan"}.
|
||||
{"Roster","Kontak"}.
|
||||
{"Roster of ","Kontak dari"}.
|
||||
{"Roster size","Ukuran Daftar Kontak"}.
|
||||
{"RPC Call Error","Panggilan Kesalahan RPC"}.
|
||||
{"Running Nodes","Menjalankan Node"}.
|
||||
{"~s access rule configuration","~s aturan akses konfigurasi"}.
|
||||
{"Saturday","Sabtu"}.
|
||||
{"Script check","Periksa naskah"}.
|
||||
{"Search Results for ","Hasil Pencarian untuk"}.
|
||||
{"Search users in ","Pencarian pengguna dalam"}.
|
||||
{"Send announcement to all online users","Kirim pengumuman untuk semua pengguna yang online"}.
|
||||
{"Send announcement to all online users on all hosts","Kirim pengumuman untuk semua pengguna yang online pada semua host"}.
|
||||
{"Send announcement to all users","Kirim pengumuman untuk semua pengguna"}.
|
||||
{"Send announcement to all users on all hosts","Kirim pengumuman untuk semua pengguna pada semua host"}.
|
||||
{"September","September"}.
|
||||
{"Server ~b","Layanan ~b"}.
|
||||
{"Server:","Layanan:"}.
|
||||
{"Set message of the day and send to online users","Mengatur pesan harian dan mengirimkan ke pengguna yang online"}.
|
||||
{"Set message of the day on all hosts and send to online users","Mengatur pesan harian pada semua host dan kirimkan ke pengguna yang online"}.
|
||||
{"Shared Roster Groups","Berbagi grup kontak"}.
|
||||
{"Show Integral Table","Tampilkan Tabel Terpisah"}.
|
||||
{"Show Ordinary Table","Tampilkan Tabel Normal"}.
|
||||
{"Shut Down Service","Shut Down Layanan"}.
|
||||
{"~s invites you to the room ~s","~s mengundang anda ke ruangan ~s"}.
|
||||
{"Some Jabber clients can store your password in your computer. Use that feature only if you trust your computer is safe.","Beberapa klien Jabber dapat menyimpan password di komputer Anda. Gunakan fitur itu hanya jika Anda mempercayai komputer Anda aman."}.
|
||||
{"Specify the access model","Tentukan model akses"}.
|
||||
{"Specify the event message type","Tentukan jenis acara pesan"}.
|
||||
{"Specify the publisher model","Tentukan model penerbitan"}.
|
||||
{"~s's Offline Messages Queue","Antrian Pesan Offline ~s"}.
|
||||
{"Start Modules at ","Mulai Modul pada"}.
|
||||
{"Start Modules","Memulai Modul"}.
|
||||
{"Start","Mulai"}.
|
||||
{"Statistics of ~p","statistik dari ~p"}.
|
||||
{"Statistics","Statistik"}.
|
||||
{"Stop","Hentikan"}.
|
||||
{"Stop Modules at ","Hentikan Modul pada"}.
|
||||
{"Stop Modules","Hentikan Modul"}.
|
||||
{"Stopped Nodes","Menghentikan node"}.
|
||||
{"Storage Type","Jenis Penyimpanan"}.
|
||||
{"Store binary backup:","Penyimpanan cadangan yang berpasangan:"}.
|
||||
{"Store plain text backup:","Simpan cadangan teks biasa:"}.
|
||||
{"Subject","Subyek"}.
|
||||
{"Submit","Serahkan"}.
|
||||
{"Submitted","Ulangi masukan"}.
|
||||
{"Subscriber Address","Alamat Pertemanan"}.
|
||||
{"Subscription","Berlangganan"}.
|
||||
{"Sunday","Minggu"}.
|
||||
{"That nickname is already in use by another occupant","Julukan itu sudah digunakan oleh penghuni lain"}.
|
||||
{"That nickname is registered by another person","Julukan tersebut telah didaftarkan oleh orang lain"}.
|
||||
{"The CAPTCHA is valid.","Captcha ini benar."}.
|
||||
{"The CAPTCHA verification has failed","Verifikasi CAPTCHA telah gagal"}.
|
||||
{"The collections with which a node is affiliated","Koleksi dengan yang berafiliasi dengan sebuah node"}.
|
||||
{"the password is","kata sandi yaitu:"}.
|
||||
{"The password is too weak","Kata sandi terlalu lemah"}.
|
||||
{"The password of your Jabber account was successfully changed.","Kata sandi pada akun Jabber Anda telah berhasil diubah."}.
|
||||
{"There was an error changing the password: ","Ada kesalahan dalam mengubah password:"}.
|
||||
{"There was an error creating the account: ","Ada kesalahan saat membuat akun:"}.
|
||||
{"There was an error deleting the account: ","Ada kesalahan saat menghapus akun:"}.
|
||||
{"This is case insensitive: macbeth is the same that MacBeth and Macbeth.","Pada bagian ini huruf besar dan kecil tidak dibedakan: Misalnya macbeth adalah sama dengan MacBeth juga Macbeth."}.
|
||||
{"This page allows to create a Jabber account in this Jabber server. Your JID (Jabber IDentifier) will be of the form: username@server. Please read carefully the instructions to fill correctly the fields.","Halaman ini memungkinkan untuk membuat akun Jabber di layanan Jabber ini. JID Anda (Jabber Pengenal) akan berbentuk: namapengguna@layanan. Harap baca dengan seksama petunjuk-petunjuk untuk mengisi kolom dengan benar."}.
|
||||
{"This page allows to unregister a Jabber account in this Jabber server.","Pada bagian ini memungkinkan Anda untuk membatalkan pendaftaran akun Jabber pada layanan Jabber ini."}.
|
||||
{"This participant is kicked from the room because he sent an error message","Peserta ini dikick dari ruangan karena dia mengirim pesan kesalahan"}.
|
||||
{"This participant is kicked from the room because he sent an error message to another participant","Participant ini dikick dari ruangan karena ia mengirim pesan kesalahan ke participant lain"}.
|
||||
{"This participant is kicked from the room because he sent an error presence","Participant ini dikick dari ruangan karena ia mengirim kehadiran kesalahan"}.
|
||||
{"This room is not anonymous","Ruangan ini tidak dikenal"}.
|
||||
{"Thursday","Kamis"}.
|
||||
{"Time delay","Waktu tunda"}.
|
||||
{"Time","Waktu"}.
|
||||
{"To","Kepada"}.
|
||||
{"To ~s","Kepada ~s"}.
|
||||
{"Traffic rate limit is exceeded","Lalu lintas melebihi batas"}.
|
||||
{"Transactions Aborted:","Transaksi yang dibatalkan:"}.
|
||||
{"Transactions Committed:","Transaksi yang dilakukan:"}.
|
||||
{"Transactions Logged:","Transaksi yang ditempuh:"}.
|
||||
{"Transactions Restarted:","Transaksi yang dijalankan ulang:"}.
|
||||
{"Tuesday","Selasa"}.
|
||||
{"Unable to generate a CAPTCHA","Tidak dapat menghasilkan CAPTCHA"}.
|
||||
{"Unauthorized","Ditolak"}.
|
||||
{"Unregister a Jabber account","Nonaktifkan akun jabber"}.
|
||||
{"Unregister","Nonaktifkan"}.
|
||||
{"Update ","Memperbarui "}.
|
||||
{"Update","Memperbarui"}.
|
||||
{"Update message of the day (don't send)","Rubah pesan harian (tidak dikirim)"}.
|
||||
{"Update message of the day on all hosts (don't send)","Rubah pesan harian pada semua host (tidak dikirim)"}.
|
||||
{"Update plan","Rencana Perubahan"}.
|
||||
{"Update script","Perbarui naskah"}.
|
||||
{"Uptime:","Sampai saat:"}.
|
||||
{"Use of STARTTLS required","Penggunaan STARTTLS diperlukan"}.
|
||||
{"User Management","Manajemen Pengguna"}.
|
||||
{"Username:","Nama Pengguna:"}.
|
||||
{"User ","Pengguna"}.
|
||||
{"User","Pengguna"}.
|
||||
{"Users are not allowed to register accounts so quickly","Pengguna tidak diperkenankan untuk mendaftar akun begitu cepat"}.
|
||||
{"Users Last Activity","Aktifitas terakhir para pengguna"}.
|
||||
{"Users","Pengguna"}.
|
||||
{"Validate","Mengesahkan"}.
|
||||
{"vCard User Search","vCard Pencarian Pengguna"}.
|
||||
{"Virtual Hosts","Virtual Hosts"}.
|
||||
{"Visitors are not allowed to change their nicknames in this room","Visitor tidak diperbolehkan untuk mengubah nama julukan di ruangan ini"}.
|
||||
{"Visitors are not allowed to send messages to all occupants","Visitor tidak diperbolehkan untuk mengirim pesan ke semua penghuni"}.
|
||||
{"Wednesday","Rabu"}.
|
||||
{"When to send the last published item","Ketika untuk mengirim item terakhir yang dipublikasikan"}.
|
||||
{"Whether to allow subscriptions","Apakah diperbolehkan untuk berlangganan"}.
|
||||
{"You can later change your password using a Jabber client.","Anda dapat mengubah kata sandi anda dilain waktu dengan menggunakan klien Jabber."}.
|
||||
{"You have been banned from this room","Anda telah diblokir dari ruangan ini"}.
|
||||
{"You must fill in field \"Nickname\" in the form","Anda harus mengisi kolom \"Julukan\" dalam formulir"}.
|
||||
{"You need a client that supports x:data and CAPTCHA to register","Anda memerlukan klien yang mendukung x:data dan CAPTCHA untuk mendaftar"}.
|
||||
{"You need a client that supports x:data to register the nickname","Anda memerlukan klien yang mendukung x:data untuk mendaftar julukan"}.
|
||||
{"You need an x:data capable client to configure mod_irc settings","Anda memerlukan x:data klien untuk mampu mengkonfigurasi pengaturan mod_irc"}.
|
||||
{"You need an x:data capable client to configure room","Anda memerlukan x:data klien untuk dapat mengkonfigurasi ruangan"}.
|
||||
{"You need an x:data capable client to search","Anda memerlukan x:data klien untuk melakukan pencarian"}.
|
||||
{"Your active privacy list has denied the routing of this stanza.","Daftar privasi aktif Anda telah menolak routing ztanza ini"}.
|
||||
{"Your contact offline message queue is full. The message has been discarded.","Kontak offline Anda pada antrian pesan sudah penuh. Pesan telah dibuang."}.
|
||||
{"Your Jabber account was successfully created.","Jabber akun Anda telah sukses dibuat"}.
|
||||
{"Your Jabber account was successfully deleted.","Jabber akun Anda berhasil dihapus."}.
|
||||
{"Your messages to ~s are being blocked. To unblock them, visit ~s","Pesan Anda untuk ~s sedang diblokir. Untuk membuka blokir tersebut, kunjungi ~s"}.
|
||||
+1866
File diff suppressed because it is too large
Load Diff
@@ -20,7 +20,9 @@
|
||||
{"Allow users to send invites","Consentire agli utenti l'invio di inviti"}.
|
||||
{"Allow users to send private messages","Consentire agli utenti l'invio di messaggi privati"}.
|
||||
{"Allow visitors to change nickname","Consentire ai visitatori di cambiare il nickname"}.
|
||||
{"Allow visitors to send private messages to","Consentire agli ospiti l'invio di messaggi privati a"}.
|
||||
{"Allow visitors to send status text in presence updates","Consentire ai visitatori l'invio di testo sullo stato in aggiornamenti sulla presenza"}.
|
||||
{"Allow visitors to send voice requests","Consentire agli ospiti l'invio di richieste di parola"}.
|
||||
{"All Users","Tutti gli utenti"}.
|
||||
{"Announcements","Annunci"}.
|
||||
{"anyone","tutti"}.
|
||||
@@ -33,9 +35,15 @@
|
||||
{"Backup to File at ","Salvataggio sul file "}.
|
||||
{"Bad format","Formato non valido"}.
|
||||
{"Birthday","Compleanno"}.
|
||||
{"CAPTCHA web page","Pagina web CAPTCHA"}.
|
||||
{"Change Password","Modificare la password"}.
|
||||
{"Change User Password","Cambiare la password dell'utente"}.
|
||||
{"Characters not allowed:","Caratteri non consentiti:"}.
|
||||
{"Chatroom configuration modified","Configurazione della stanza modificata"}.
|
||||
{"Chatroom is created","La stanza è creata"}.
|
||||
{"Chatroom is destroyed","La stanza è eliminata"}.
|
||||
{"Chatroom is started","La stanza è avviata"}.
|
||||
{"Chatroom is stopped","La stanza è arrestata"}.
|
||||
{"Chatrooms","Stanze"}.
|
||||
{"Choose a username and password to register with this server","Scegliere un nome utente e una password per la registrazione con questo server"}.
|
||||
{"Choose modules to stop","Selezionare i moduli da arrestare"}.
|
||||
@@ -65,15 +73,16 @@
|
||||
{"Description:","Descrizione:"}.
|
||||
{"Disc only copy","Copia su disco soltanto"}.
|
||||
{"Displayed Groups:","Gruppi visualizzati:"}.
|
||||
{"Don't tell your password to anybody, not even the administrators of the Jabber server.","Non comunicare la tua password a nessuno, neppure agli amministratori del server Jabber."}.
|
||||
{"Dump Backup to Text File at ","Trascrivere il salvataggio sul file di testo "}.
|
||||
{"Dump to Text File","Trascrivere su file di testo"}.
|
||||
{"Edit Properties","Modificare le proprietà"}.
|
||||
{"Either approve or decline the voice request.","Approva oppure respingi la richiesta di parola."}.
|
||||
{"ejabberd IRC module","Modulo IRC per ejabberd"}.
|
||||
{"ejabberd MUC module","Modulo MUC per ejabberd"}.
|
||||
{"ejabberd Publish-Subscribe module","Modulo Pubblicazione/Iscrizione (PubSub) per ejabberd"}.
|
||||
{"ejabberd SOCKS5 Bytestreams module","Modulo SOCKS5 Bytestreams per ejabberd"}.
|
||||
{"ejabberd vCard module","Modulo vCard per ejabberd"}.
|
||||
{"ejabberd virtual hosts","Host virtuali di ejabberd"}.
|
||||
{"ejabberd Web Admin","Amministrazione web ejabberd"}.
|
||||
{"Elements","Elementi"}.
|
||||
{"Email","E-mail"}.
|
||||
@@ -92,8 +101,10 @@
|
||||
{"Erlang Jabber Server","Erlang Jabber Server"}.
|
||||
{"Error","Errore"}.
|
||||
{"Example: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef.net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}].","Esempio: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"segreto\"}, {\"vendetta.fef.net\", \"iso8859-1\", 7000}, {\"irc.serverdiprova.net\", \"utf-8\"}]."}.
|
||||
{"Exclude Jabber IDs from CAPTCHA challenge","Escludi degli ID Jabber dal passaggio CAPTCHA"}.
|
||||
{"Export data of all users in the server to PIEFXIS files (XEP-0227):","Esportare i dati di tutti gli utenti nel server in file PIEFXIS (XEP-0227):"}.
|
||||
{"Export data of users in a host to PIEFXIS files (XEP-0227):","Esportare i dati degli utenti di un host in file PIEFXIS (XEP-0227):"}.
|
||||
{"Failed to extract JID from your voice request approval","Impossibile estrarre il JID dall'approvazione della richiesta di parola"}.
|
||||
{"Family Name","Cognome"}.
|
||||
{"February","Febbraio"}.
|
||||
{"Fill in fields to search for any matching Jabber User","Riempire i campi per la ricerca di utenti Jabber corrispondenti ai criteri"}.
|
||||
@@ -107,6 +118,7 @@
|
||||
{"Get User Last Login Time","Ottenere la data di ultimo accesso dell'utente"}.
|
||||
{"Get User Password","Ottenere la password dell'utente"}.
|
||||
{"Get User Statistics","Ottenere le statistiche dell'utente"}.
|
||||
{"Grant voice to this person?","Dare parola a questa persona?"}.
|
||||
{"Group ","Gruppo "}.
|
||||
{"Groups","Gruppi"}.
|
||||
{"has been banned","è stata/o bandita/o"}.
|
||||
@@ -116,6 +128,7 @@
|
||||
{"has been kicked","è stata/o espulsa/o"}.
|
||||
{" has set the subject to: "," ha modificato l'oggetto in: "}.
|
||||
{"Host","Host"}.
|
||||
{"If you don't see the CAPTCHA image here, visit the web page.","Se qui non vedi l'immagine CAPTCHA, visita la pagina web."}.
|
||||
{"If you want to specify different ports, passwords, encodings for IRC servers, fill this list with values in format '{\"irc server\", \"encoding\", port, \"password\"}'. By default this service use \"~s\" encoding, port ~p, empty password.","Se si vogliono specificare differenti porte, password, codifiche per i server IRC, si riempia questo elenco con valori nel formato '{\"server IRC\", \"codifica\", porta, \"password\"}'. Per default questo servizio utilizza la codifica \"~s\", la porta ~p, la password vuota."}.
|
||||
{"Import Directory","Importare una directory"}.
|
||||
{"Import File","Importare un file"}.
|
||||
@@ -141,6 +154,7 @@
|
||||
{"It is not allowed to send private messages","Non è consentito l'invio di messaggi privati"}.
|
||||
{"It is not allowed to send private messages of type \"groupchat\"","Non è consentito l'invio di messaggi privati di tipo \"groupchat\""}.
|
||||
{"It is not allowed to send private messages to the conference","Non è consentito l'invio di messaggi privati alla conferenza"}.
|
||||
{"Jabber Account Registration","Registrazione account Jabber"}.
|
||||
{"Jabber ID","Jabber ID (Jabber ID)"}.
|
||||
{"Jabber ID ~s is invalid","Il Jabber ID ~s non è valido"}.
|
||||
{"January","Gennaio"}.
|
||||
@@ -160,7 +174,7 @@
|
||||
{"List of modules to start","Elenco dei moduli da avviare"}.
|
||||
{"Low level update script","Script di aggiornamento di basso livello"}.
|
||||
{"Make participants list public","Rendere pubblica la lista dei partecipanti"}.
|
||||
{"Make room captcha protected","Rendere la stanza protetta da captcha"}.
|
||||
{"Make room CAPTCHA protected","Rendere la stanza protetta da CAPTCHA"}.
|
||||
{"Make room members-only","Rendere la stanza riservata ai membri"}.
|
||||
{"Make room moderated","Rendere la stanza moderata"}.
|
||||
{"Make room password protected","Rendere la stanza protetta da password"}.
|
||||
@@ -173,9 +187,11 @@
|
||||
{"May","Maggio"}.
|
||||
{"Membership is required to enter this room","Per entrare in questa stanza è necessario essere membro"}.
|
||||
{"Members:","Membri:"}.
|
||||
{"Memorize your password, or write it in a paper placed in a safe place. In Jabber there isn't an automated way to recover your password if you forget it.","Memorizza la password, o scrivila su un foglio di carta da conservare in un luogo sicuro. Jabber non prevede una modalità automatica per il recupero di una password dimenticata."}.
|
||||
{"Memory","Memoria"}.
|
||||
{"Message body","Corpo del messaggio"}.
|
||||
{"Middle Name","Altro nome"}.
|
||||
{"Minimum interval between voice requests (in seconds)","Intervallo minimo fra due richieste di parola (in secondi)"}.
|
||||
{"Moderator privileges required","Necessari i privilegi di moderatore"}.
|
||||
{"moderators only","moderatori soltanto"}.
|
||||
{"Modified modules","Moduli modificati"}.
|
||||
@@ -186,9 +202,11 @@
|
||||
{"Name:","Nome:"}.
|
||||
{"Name","Nome"}.
|
||||
{"Never","Mai"}.
|
||||
{"New Password:","Nuova password:"}.
|
||||
{"Nickname","Nickname"}.
|
||||
{"Nickname Registration at ","Registrazione di un nickname su "}.
|
||||
{"Nickname ~s does not exist in the room","Il nickname ~s non esiste nella stanza"}.
|
||||
{"nobody","nessuno"}.
|
||||
{"No body provided for announce message","Nessun corpo fornito per il messaggio di annuncio"}.
|
||||
{"No Data","Nessuna informazione"}.
|
||||
{"Node ID","ID del nodo"}.
|
||||
@@ -210,12 +228,14 @@
|
||||
{"Offline Messages:","Messaggi offline:"}.
|
||||
{"Offline Messages","Messaggi offline"}.
|
||||
{"OK","OK"}.
|
||||
{"Old Password:","Vecchia password:"}.
|
||||
{"Online","Online"}.
|
||||
{"Online Users:","Utenti connessi:"}.
|
||||
{"Online Users","Utenti online"}.
|
||||
{"Only deliver notifications to available users","Inviare le notifiche solamente agli utenti disponibili"}.
|
||||
{"Only moderators and participants are allowed to change the subject in this room","La modifica dell'oggetto di questa stanza è consentita soltanto ai moderatori e ai partecipanti"}.
|
||||
{"Only moderators are allowed to change the subject in this room","La modifica dell'oggetto di questa stanza è consentita soltanto ai moderatori"}.
|
||||
{"Only moderators can approve voice requests","Soltanto i moderatori possono approvare richieste di parola"}.
|
||||
{"Only occupants are allowed to send messages to the conference","L'invio di messaggi alla conferenza è consentito soltanto ai presenti"}.
|
||||
{"Only occupants are allowed to send queries to the conference","L'invio di query alla conferenza è consentito ai soli presenti"}.
|
||||
{"Only service administrators are allowed to send service messages","L'invio di messaggi di servizio è consentito solamente agli amministratori del servizio"}.
|
||||
@@ -230,6 +250,7 @@
|
||||
{"Password ~b","Password ~b"}.
|
||||
{"Password:","Password:"}.
|
||||
{"Password","Password"}.
|
||||
{"Password Verification:","Verifica della password:"}.
|
||||
{"Password Verification","Verifica della password"}.
|
||||
{"Path to Dir","Percorso della directory"}.
|
||||
{"Path to File","Percorso del file"}.
|
||||
@@ -238,6 +259,7 @@
|
||||
{"Persist items to storage","Conservazione persistente degli elementi"}.
|
||||
{"Ping","Ping"}.
|
||||
{"Please note that these options will only backup the builtin Mnesia database. If you are using the ODBC module, you also need to backup your SQL database separately.","N.B.: Queste opzioni comportano il salvataggio solamente del database interno Mnesia. Se si sta utilizzando il modulo ODBC, è necessario salvare anche il proprio database SQL separatamente."}.
|
||||
{"Please, wait for a while before sending new voice request","Attendi qualche istante prima di inviare una nuova richiesta di parola"}.
|
||||
{"Pong","Pong"}.
|
||||
{"Port ~b","Porta ~b"}.
|
||||
{"Port","Porta"}.
|
||||
@@ -246,14 +268,17 @@
|
||||
{"Protocol","Protocollo"}.
|
||||
{"Publish-Subscribe","Pubblicazione-Iscrizione"}.
|
||||
{"PubSub subscriber request","Richiesta di iscrizione per PubSub"}.
|
||||
{"Purge all items when the relevant publisher goes offline","Cancella tutti gli elementi quando chi li ha pubblicati non è più online"}.
|
||||
{"Queries to the conference members are not allowed in this room","In questa stanza non sono consentite query ai membri della conferenza"}.
|
||||
{"RAM and disc copy","Copia in memoria (RAM) e su disco"}.
|
||||
{"RAM copy","Copia in memoria (RAM)"}.
|
||||
{"Raw","Grezzo"}.
|
||||
{"Really delete message of the day?","Si conferma l'eliminazione del messaggio del giorno (MOTD)?"}.
|
||||
{"Recipient is not in the conference room","Il destinatario non è nella stanza per conferenze"}.
|
||||
{"Register a Jabber account","Registra un account Jabber"}.
|
||||
{"Registered Users:","Utenti registrati:"}.
|
||||
{"Registered Users","Utenti registrati"}.
|
||||
{"Register","Registra"}.
|
||||
{"Registration in mod_irc for ","Registrazione in mod_irc per "}.
|
||||
{"Remote copy","Copia remota"}.
|
||||
{"Remove All Offline Messages","Eliminare tutti i messaggi offline"}.
|
||||
@@ -290,6 +315,7 @@
|
||||
{"Send announcement to all users on all hosts","Inviare l'annuncio a tutti gli utenti su tutti gli host"}.
|
||||
{"September","Settembre"}.
|
||||
{"Server ~b","Server ~b"}.
|
||||
{"Server:","Server:"}.
|
||||
{"Set message of the day and send to online users","Impostare il messaggio del giorno (MOTD) ed inviarlo agli utenti online"}.
|
||||
{"Set message of the day on all hosts and send to online users","Impostare il messaggio del giorno (MOTD) su tutti gli host e inviarlo agli utenti online"}.
|
||||
{"Shared Roster Groups","Gruppi di liste di contatti comuni"}.
|
||||
@@ -297,7 +323,9 @@
|
||||
{"Show Ordinary Table","Mostrare la tabella normale"}.
|
||||
{"Shut Down Service","Terminare il servizio"}.
|
||||
{"~s invites you to the room ~s","~s ti invita nella stanza ~s"}.
|
||||
{"Some Jabber clients can store your password in your computer. Use that feature only if you trust your computer is safe.","Alcuni client Jabber possono conservare la password nel tuo computer. Utilizza tale funzione soltanto se ritieni che il tuo computer sia sicuro."}.
|
||||
{"Specify the access model","Specificare il modello di accesso"}.
|
||||
{"Specify the event message type","Specificare il tipo di messaggio di evento"}.
|
||||
{"Specify the publisher model","Definire il modello di pubblicazione"}.
|
||||
{"~s's Offline Messages Queue","Coda di ~s messaggi offline"}.
|
||||
{"Start","Avviare"}.
|
||||
@@ -320,9 +348,18 @@
|
||||
{"Sunday","Domenica"}.
|
||||
{"That nickname is already in use by another occupant","Il nickname è già in uso all'interno della conferenza"}.
|
||||
{"That nickname is registered by another person","Questo nickname è registrato da un'altra persona"}.
|
||||
{"The captcha is valid.","Il captcha è valido."}.
|
||||
{"The CAPTCHA is valid.","Il CAPTCHA è valido."}.
|
||||
{"The CAPTCHA verification has failed","La verifica del CAPTCHA ha avuto esito negativo"}.
|
||||
{"The collections with which a node is affiliated","Le collezioni a cui è affiliato un nodo"}.
|
||||
{"the password is","la password è"}.
|
||||
{"The password is too weak","La password è troppo debole"}.
|
||||
{"The password of your Jabber account was successfully changed.","Il cambio di password del tuo account Jabber è andato a buon fine."}.
|
||||
{"There was an error changing the password: ","Si è verificato un errore nel cambio di password: "}.
|
||||
{"There was an error creating the account: ","Si è verificato un errore nella creazione dell'account: "}.
|
||||
{"There was an error deleting the account: ","Si è verificato un errore nella cancellazione dell'account: "}.
|
||||
{"This is case insensitive: macbeth is the same that MacBeth and Macbeth.","Non fa differenza fra minuscolo e maiuscolo: macbeth, MacBeth e Macbeth si equivalgono."}.
|
||||
{"This page allows to create a Jabber account in this Jabber server. Your JID (Jabber IDentifier) will be of the form: username@server. Please read carefully the instructions to fill correctly the fields.","Questa pagina consente di creare un account Jabber in questo server Jabber. Il tuo JID (Jabber IDentifier) avrà la forma: nome_utente@server. Leggi attentamente le istruzioni per compilare i campi correttamente."}.
|
||||
{"This page allows to unregister a Jabber account in this Jabber server.","Questa pagina consente di eliminare un account Jabber da questo server Jabber."}.
|
||||
{"This participant is kicked from the room because he sent an error message","Partecipante espulso dalla stanza perché ha inviato un messaggio non valido"}.
|
||||
{"This participant is kicked from the room because he sent an error message to another participant","Partecipante espulso dalla stanza perché ha inviato un messaggio non valido a un altro partecipante"}.
|
||||
{"This participant is kicked from the room because he sent an error presence","Partecipante espulso dalla stanza perché ha inviato una presenza non valido"}.
|
||||
@@ -331,6 +368,7 @@
|
||||
{"Time delay","Ritardo"}.
|
||||
{"Time","Ora"}.
|
||||
{"To","A"}.
|
||||
{"Too many CAPTCHA requests","Troppe richieste CAPTCHA"}.
|
||||
{"To ~s","A ~s"}.
|
||||
{"Traffic rate limit is exceeded","Limite di traffico superato"}.
|
||||
{"Transactions Aborted:","Transazioni abortite:"}.
|
||||
@@ -338,8 +376,10 @@
|
||||
{"Transactions Logged:","Transazioni con log:"}.
|
||||
{"Transactions Restarted:","Transazioni riavviate:"}.
|
||||
{"Tuesday","Martedì"}.
|
||||
{"Unable to generate a captcha","Impossibile generare un captcha"}.
|
||||
{"Unable to generate a CAPTCHA","Impossibile generare un CAPTCHA"}.
|
||||
{"Unauthorized","Non autorizzato"}.
|
||||
{"Unregister a Jabber account","Elimina un account Jabber"}.
|
||||
{"Unregister","Elimina"}.
|
||||
{"Update ","Aggiornare "}.
|
||||
{"Update","Aggiornare"}.
|
||||
{"Update message of the day (don't send)","Aggiornare il messaggio del giorno (MOTD) (non inviarlo)"}.
|
||||
@@ -348,7 +388,9 @@
|
||||
{"Update script","Script di aggiornamento"}.
|
||||
{"Uptime:","Tempo dall'avvio:"}.
|
||||
{"Use of STARTTLS required","Utilizzo di STARTTLS obbligatorio"}.
|
||||
{"User JID","JID utente"}.
|
||||
{"User Management","Gestione degli utenti"}.
|
||||
{"Username:","Nome utente:"}.
|
||||
{"Users are not allowed to register accounts so quickly","Non è consentito agli utenti registrare account così rapidamente"}.
|
||||
{"Users Last Activity","Ultima attività degli utenti"}.
|
||||
{"Users","Utenti"}.
|
||||
@@ -356,16 +398,24 @@
|
||||
{"User","Utente"}.
|
||||
{"Validate","Validare"}.
|
||||
{"vCard User Search","Ricerca di utenti per vCard"}.
|
||||
{"Virtual Hosts","Host Virtuali"}.
|
||||
{"Visitors are not allowed to change their nicknames in this room","Non è consentito ai visitatori cambiare il nickname in questa stanza"}.
|
||||
{"Visitors are not allowed to send messages to all occupants","Non è consentito ai visitatori l'invio di messaggi a tutti i presenti"}.
|
||||
{"Voice request","Richiesta di parola"}.
|
||||
{"Voice requests are disabled in this conference","In questa conferenza le richieste di parola sono escluse"}.
|
||||
{"Wednesday","Mercoledì"}.
|
||||
{"When to send the last published item","Quando inviare l'ultimo elemento pubblicato"}.
|
||||
{"Whether to allow subscriptions","Consentire iscrizioni?"}.
|
||||
{"You can later change your password using a Jabber client.","Potrai in seguito cambiare la password utilizzando un client Jabber."}.
|
||||
{"You have been banned from this room","Sei stata/o bandita/o da questa stanza"}.
|
||||
{"You must fill in field \"Nickname\" in the form","Si deve riempire il campo \"Nickname\" nel modulo"}.
|
||||
{"You need a client that supports x:data and CAPTCHA to register","La registrazione richiede un client che supporti x:data e CAPTCHA"}.
|
||||
{"You need a client that supports x:data to register the nickname","Per registrare il nickname è necessario un client che supporti x:data"}.
|
||||
{"You need an x:data capable client to configure mod_irc settings","Per la configurazione del modulo IRC è necessario un client che supporti x:data"}.
|
||||
{"You need an x:data capable client to configure room","Per la configurazione della stanza è necessario un client che supporti x:data"}.
|
||||
{"You need an x:data capable client to register nickname","Per registrare un nickname è necessario un client che supportix:data"}.
|
||||
{"You need an x:data capable client to search","Per effettuare ricerche è necessario un client che supporti x:data"}.
|
||||
{"Your active privacy list has denied the routing of this stanza.","In base alla tua attuale lista privacy questa stanza è stata esclusa dalla navigazione."}.
|
||||
{"Your contact offline message queue is full. The message has been discarded.","La coda dei messaggi offline del contatto è piena. Il messaggio è stato scartato"}.
|
||||
{"Your Jabber account was successfully created.","La creazione del tuo account Jabber è andata a buon fine."}.
|
||||
{"Your Jabber account was successfully deleted.","La cancellazione del tuo account Jabber è andata a buon fine."}.
|
||||
{"Your messages to ~s are being blocked. To unblock them, visit ~s","I messaggi verso ~s sono bloccati. Per sbloccarli, visitare ~s"}.
|
||||
+704
-451
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,421 @@
|
||||
{"Access Configuration","アクセス設定"}.
|
||||
{"Access Control List Configuration","アクセスコントロールリスト設定"}.
|
||||
{"Access control lists","アクセスコントロールリスト"}.
|
||||
{"Access Control Lists","アクセスコントロールリスト"}.
|
||||
{"Access denied by service policy","サービスポリシーによってアクセスが禁止されました"}.
|
||||
{"Access rules","アクセスルール"}.
|
||||
{"Access Rules","アクセスルール"}.
|
||||
{"Action on user","ユーザー操作"}.
|
||||
{"Add Jabber ID","Jabber ID を追加"}.
|
||||
{"Add New","新規追加"}.
|
||||
{"Add User","ユーザーを追加"}.
|
||||
{"Administration of ","管理: "}.
|
||||
{"Administration","管理"}.
|
||||
{"Administrator privileges required","管理者権限が必要です"}.
|
||||
{"A friendly name for the node","ノードのフレンドリネーム"}.
|
||||
{"All activity","すべて"}.
|
||||
{"Allow this Jabber ID to subscribe to this pubsub node?","この Jabber ID に、この pubsubノードの購読を許可しますか ?"}.
|
||||
{"Allow users to change the subject","ユーザーによる題の変更を許可"}.
|
||||
{"Allow users to query other users","ユーザーによる他のユーザーへのクエリーを許可"}.
|
||||
{"Allow users to send invites","ユーザーによる招待を許可"}.
|
||||
{"Allow users to send private messages","ユーザーによるプライベートメッセージの送信を許可"}.
|
||||
{"Allow visitors to change nickname","傍聴者のニックネームの変更を許可"}.
|
||||
{"Allow visitors to send private messages to","傍聴者によるプライベートメッセージの送信を次の相手に許可"}.
|
||||
{"Allow visitors to send status text in presence updates","傍聴者によるプレゼンス更新のステータス文の送信を許可"}.
|
||||
{"Allow visitors to send voice requests","傍聴者による発言権の要求を許可"}.
|
||||
{"All Users","全ユーザー"}.
|
||||
{"Announcements","アナウンス"}.
|
||||
{"anyone","誰にでも"}.
|
||||
{"A password is required to enter this room","この談話室に入るにはパスワードが必要です"}.
|
||||
{"April","4月"}.
|
||||
{"August","8月"}.
|
||||
{"Backup","バックアップ"}.
|
||||
{"Backup Management","バックアップ管理"}.
|
||||
{"Backup of ","バックアップ: "}.
|
||||
{"Backup to File at ","ファイルにバックアップ: "}.
|
||||
{"Bad format","不正なフォーマット"}.
|
||||
{"Birthday","誕生日"}.
|
||||
{"CAPTCHA web page","CAPTCHA ウェブページ"}.
|
||||
{"Change Password","パスワードを変更"}.
|
||||
{"Change User Password","パスワードを変更"}.
|
||||
{"Characters not allowed:","使用できない文字:"}.
|
||||
{"Chatroom configuration modified","談話室の設定が変更されました"}.
|
||||
{"Chatroom is created","談話室を作りました"}.
|
||||
{"Chatroom is destroyed","談話室を削除しました"}.
|
||||
{"Chatroom is started","談話室を開始しました"}.
|
||||
{"Chatroom is stopped","談話室を停止しました"}.
|
||||
{"Chatrooms","談話室"}.
|
||||
{"Choose a username and password to register with this server","サーバーに登録するユーザー名とパスワードを選択してください"}.
|
||||
{"Choose modules to stop","停止するモジュールを選択"}.
|
||||
{"Choose storage type of tables","テーブルのストレージタイプを選択"}.
|
||||
{"Choose whether to approve this entity's subscription.","このエントリを承認するかどうかを選択してください"}.
|
||||
{"City","都道府県"}.
|
||||
{"Commands","コマンド"}.
|
||||
{"Conference room does not exist","会議室は存在しません"}.
|
||||
{"Configuration of room ~s","談話室 ~s の設定"}.
|
||||
{"Configuration","設定"}.
|
||||
{"Connected Resources:","接続リソース:"}.
|
||||
{"Connections parameters","接続パラメーター"}.
|
||||
{"Country","国"}.
|
||||
{"CPU Time:","CPU時間:"}.
|
||||
{"Database","データーベース"}.
|
||||
{"Database Tables at ","データーベーステーブル: "}.
|
||||
{"Database Tables Configuration at ","データーベーステーブル設定 "}.
|
||||
{"December","12月"}.
|
||||
{"Default users as participants","デフォルトのユーザーは参加者"}.
|
||||
{"Delete message of the day on all hosts","全ホストのお知らせメッセージを削除"}.
|
||||
{"Delete message of the day","お知らせメッセージを削除"}.
|
||||
{"Delete Selected","選択した項目を削除"}.
|
||||
{"Delete User","ユーザーを削除"}.
|
||||
{"Delete","削除"}.
|
||||
{"Deliver event notifications","イベント通知を配送する"}.
|
||||
{"Deliver payloads with event notifications","イベント通知と同時にペイロードを配送する"}.
|
||||
{"Description:","説明:"}.
|
||||
{"Disc only copy","ディスクだけのコピー"}.
|
||||
{"Displayed Groups:","表示グループ"}.
|
||||
{"Don't tell your password to anybody, not even the administrators of the Jabber server.","パスワードは誰にも教えないようにしてください。Jabber サーバーの管理者があなたにパスワードを尋ねることはありません。"}.
|
||||
{"Dump Backup to Text File at ","テキストファイルにバックアップ: "}.
|
||||
{"Dump to Text File","テキストファイルに出力"}.
|
||||
{"Edit Properties","プロパティを編集"}.
|
||||
{"Either approve or decline the voice request.","発言権の要求を承認または却下します。"}.
|
||||
{"ejabberd IRC module","ejabberd IRC module"}.
|
||||
{"ejabberd MUC module","ejabberd MUC module"}.
|
||||
{"ejabberd Publish-Subscribe module","ejabberd Publish-Subscribe モジュール"}.
|
||||
{"ejabberd SOCKS5 Bytestreams module","ejabberd SOCKS5 Bytestreams モジュール"}.
|
||||
{"ejabberd vCard module","ejabberd vCard モジュール"}.
|
||||
{"ejabberd Web Admin","ejabberd ウェブ管理"}.
|
||||
{"Elements","要素"}.
|
||||
{"Email","メールアドレス"}.
|
||||
{"Enable logging","ロギングを有効"}.
|
||||
{"Encoding for server ~b","サーバーのエンコーディング ~b"}.
|
||||
{"End User Session","エンドユーザーセッション"}.
|
||||
{"Enter list of {Module, [Options]}","{モジュール, [オプション]}のリストを入力してください"}.
|
||||
{"Enter nickname you want to register","登録するニックネームを入力してください"}.
|
||||
{"Enter path to backup file","バックアップファイルのパスを入力してください"}.
|
||||
{"Enter path to jabberd14 spool dir","jabberd14 spool ディレクトリのディレクトリを入力してください"}.
|
||||
{"Enter path to jabberd14 spool file","jabberd14 spool ファイルのパスを入力してください"}.
|
||||
{"Enter path to text file","テキストファイルのパスを入力してください"}.
|
||||
{"Enter the text you see","見えているテキストを入力してください"}.
|
||||
{"Enter username and encodings you wish to use for connecting to IRC servers. Press 'Next' to get more fields to fill in. Press 'Complete' to save settings.","IRC サーバーに接続先するためのユーザー名と文字エンコーディングを入力してください。'Next' を押して次の項目に進みます。'Complete' を押すと設定が保存されます。"}.
|
||||
{"Enter username, encodings, ports and passwords you wish to use for connecting to IRC servers","IRC サーバーに接続先するために使用するユーザー名、文字エンコーディング、ポート、パスワードを入力してください"}.
|
||||
{"Erlang Jabber Server","Erlang Jabber Server"}.
|
||||
{"Error","エラー"}.
|
||||
{"Example: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef.net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}].","例: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef.net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."}.
|
||||
{"Exclude Jabber IDs from CAPTCHA challenge","CAPTCHA 試験を免除する Jabber ID"}.
|
||||
{"Export data of all users in the server to PIEFXIS files (XEP-0227):","サーバーにあるすべてのユーザーデータを PIEFXIS ファイルにエクスポート (XEP-0227):"}.
|
||||
{"Export data of users in a host to PIEFXIS files (XEP-0227):","ホストのユーザーデータを PIEFXIS ファイルにエクスポート (XEP-0227):"}.
|
||||
{"Failed to extract JID from your voice request approval","発言権要求の承認から JID を取り出すことに失敗しました"}.
|
||||
{"Family Name","姓"}.
|
||||
{"February","2月"}.
|
||||
{"Fill in fields to search for any matching Jabber User","欄を埋めて Jabber User を検索してください"}.
|
||||
{"Fill in the form to search for any matching Jabber User (Add * to the end of field to match substring)","欄を埋めて Jabber User を検索してください (* を使用すると部分文字列にマッチします)"}.
|
||||
{"Friday","金曜日"}.
|
||||
{"From ~s","差出人 ~s"}.
|
||||
{"From","差出人"}.
|
||||
{"Full Name","氏名"}.
|
||||
{"Get Number of Online Users","オンラインユーザー数を取得"}.
|
||||
{"Get Number of Registered Users","登録ユーザー数を取得"}.
|
||||
{"Get User Last Login Time","最終ログイン時間を取得"}.
|
||||
{"Get User Password","パスワードを取得"}.
|
||||
{"Get User Statistics","ユーザー統計を取得"}.
|
||||
{"Grant voice to this person?","この人に発言権を与えますか ?"}.
|
||||
{"Group ","グループ"}.
|
||||
{"Groups","グループ"}.
|
||||
{"has been banned","はバンされました"}.
|
||||
{"has been kicked","はキックされました"}.
|
||||
{"has been kicked because of an affiliation change","は分掌が変更されたためキックされました"}.
|
||||
{"has been kicked because of a system shutdown","はシステムシャットダウンのためキックされました"}.
|
||||
{"has been kicked because the room has been changed to members-only","は談話室がメンバー制に変更されたためキックされました"}.
|
||||
{" has set the subject to: "," は題を設定しました: "}.
|
||||
{"Host","ホスト"}.
|
||||
{"If you don't see the CAPTCHA image here, visit the web page.","ここに CAPTCHA 画像が表示されない場合、ウェブページを参照してください。"}.
|
||||
{"If you want to specify different ports, passwords, encodings for IRC servers, fill this list with values in format '{\"irc server\", \"encoding\", port, \"password\"}'. By default this service use \"~s\" encoding, port ~p, empty password.","別のポートやパスワード、文字エンコーディングを使用したい場合、'{\"irc server\", \"encoding\", port, \"password\"}' という形式のリストを入力してください。デフォルトでエンコーディングは \"~s\" を使用し、ポートは ~p、パスワードは空になっています。"}.
|
||||
{"Import Directory","ディレクトリインポート"}.
|
||||
{"Import File","ファイルからインポート"}.
|
||||
{"Import user data from jabberd14 spool file:","ユーザーデータを jabberd14 Spool ファイルからインポート:"}.
|
||||
{"Import User from File at ","ファイルからユーザーをインポート: "}.
|
||||
{"Import users data from a PIEFXIS file (XEP-0227):","ユーザーデータを PIEFXIS ファイルからインポート (XEP-0227):"}.
|
||||
{"Import users data from jabberd14 spool directory:","ユーザーデータを jabberd14 Spool ディレクトリからインポート:"}.
|
||||
{"Import Users from Dir at ","ディレクトリからユーザーをインポート: "}.
|
||||
{"Import Users From jabberd14 Spool Files","jabberd14 Spool ファイルからユーザーをインポート"}.
|
||||
{"Improper message type","誤ったメッセージタイプです"}.
|
||||
{"Incorrect password","パスワードが違います"}.
|
||||
{"Invalid affiliation: ~s","無効な分掌です: ~s"}.
|
||||
{"Invalid role: ~s","無効な役です: ~s"}.
|
||||
{"IP addresses","IP アドレス"}.
|
||||
{"IP","IP"}.
|
||||
{"IRC channel (don't put the first #)","IRC チャンネル (先頭に#は不要)"}.
|
||||
{"IRC server","IRC サーバー"}.
|
||||
{"IRC settings","IRC 設定"}.
|
||||
{"IRC Transport","IRC トランスポート"}.
|
||||
{"IRC username","IRC ユーザー名"}.
|
||||
{"IRC Username","IRC ユーザー名"}.
|
||||
{"is now known as","は名前を変更しました: "}.
|
||||
{"It is not allowed to send private messages of type \"groupchat\"","種別が\"groupchat\" であるプライベートメッセージを送信することはできません"}.
|
||||
{"It is not allowed to send private messages to the conference","この会議にプライベートメッセージを送信することはできません"}.
|
||||
{"It is not allowed to send private messages","プライベートメッセージを送信することはできません"}.
|
||||
{"Jabber Account Registration","Jabber アカウント登録"}.
|
||||
{"Jabber ID","Jabber ID"}.
|
||||
{"Jabber ID ~s is invalid","Jabber ID ~s は無効です"}.
|
||||
{"January","1月"}.
|
||||
{"Join IRC channel","IRC チャンネルに参加"}.
|
||||
{"joins the room","が談話室に参加しました"}.
|
||||
{"Join the IRC channel here.","この IRC チャンネルに参加します。"}.
|
||||
{"Join the IRC channel in this Jabber ID: ~s","Jabber ID: ~s でこの IRC チャンネルに参加"}.
|
||||
{"July","7月"}.
|
||||
{"June","6月"}.
|
||||
{"Last Activity","活動履歴"}.
|
||||
{"Last login","最終ログイン"}.
|
||||
{"Last month","先月"}.
|
||||
{"Last year","去年"}.
|
||||
{"leaves the room","が談話室から退出しました"}.
|
||||
{"Listened Ports at ","Listen ポート "}.
|
||||
{"Listened Ports","Listen ポート"}.
|
||||
{"List of modules to start","起動モジュールの一覧"}.
|
||||
{"Low level update script","低レベル更新スクリプト"}.
|
||||
{"Make participants list public","参加者一覧を公開"}.
|
||||
{"Make room CAPTCHA protected","談話室を CAPTCHA で保護"}.
|
||||
{"Make room members-only","談話室をメンバーのみに制限"}.
|
||||
{"Make room moderated","談話室をモデレート化"}.
|
||||
{"Make room password protected","談話室をパスワードで保護"}.
|
||||
{"Make room persistent","談話室を永続化"}.
|
||||
{"Make room public searchable","談話室を検索可"}.
|
||||
{"March","3月"}.
|
||||
{"Maximum Number of Occupants","最大在室者数"}.
|
||||
{"Max # of items to persist","アイテムの最大保存数"}.
|
||||
{"Max payload size in bytes","最大ぺイロードサイズ (byte)"}.
|
||||
{"May","5月"}.
|
||||
{"Members:","メンバー:"}.
|
||||
{"Membership is required to enter this room","この談話室に入るにはメンバーでなければなりません"}.
|
||||
{"Memorize your password, or write it in a paper placed in a safe place. In Jabber there isn't an automated way to recover your password if you forget it.","パスワードは記憶するか、紙に書いて安全な場所に保管してください。もしあなたがパスワードを忘れてしまった場合、Jabber ではパスワードのリカバリを自動的に行うことはできません。"}.
|
||||
{"Memory","メモリ"}.
|
||||
{"Message body","本文"}.
|
||||
{"Middle Name","ミドルネーム"}.
|
||||
{"Minimum interval between voice requests (in seconds)","発言権の要求の最小時間間隔 (秒)"}.
|
||||
{"Moderator privileges required","モデレーター権限が必要です"}.
|
||||
{"moderators only","モデレーターにのみ"}.
|
||||
{"Modified modules","変更されたモジュール"}.
|
||||
{"Module","モジュール"}.
|
||||
{"Modules","モジュール"}.
|
||||
{"Modules at ","モジュール "}.
|
||||
{"Monday","月曜日"}.
|
||||
{"Name","名"}.
|
||||
{"Name:","名前:"}.
|
||||
{"Never","なし"}.
|
||||
{"New Password:","新しいパスワード:"}.
|
||||
{"Nickname","ニックネーム"}.
|
||||
{"Nickname Registration at ","ニックネーム登録: "}.
|
||||
{"Nickname ~s does not exist in the room","ニックネーム ~s はこの談話室にいません"}.
|
||||
{"No body provided for announce message","アナウンスメッセージはありませんでした"}.
|
||||
{"nobody","誰にも許可しない"}.
|
||||
{"No Data","データなし"}.
|
||||
{"Node ","ノード "}.
|
||||
{"Node ID","ノードID"}.
|
||||
{"Node not found","ノードが見つかりません"}.
|
||||
{"Nodes","ノード"}.
|
||||
{"No limit","制限なし"}.
|
||||
{"None","なし"}.
|
||||
{"No resource provided","リソースが提供されませんでした"}.
|
||||
{"Not Found","見つかりません"}.
|
||||
{"Notify subscribers when items are removed from the node","アイテムがノードから消された時に購読者へ通知する"}.
|
||||
{"Notify subscribers when the node configuration changes","ノード設定に変更があった時に購読者へ通知する"}.
|
||||
{"Notify subscribers when the node is deleted","ノードが削除された時に購読者へ通知する"}.
|
||||
{"November","11月"}.
|
||||
{"Number of occupants","在室者の数"}.
|
||||
{"Number of online users","オンラインユーザー数"}.
|
||||
{"Number of registered users","登録ユーザー数"}.
|
||||
{"October","10月"}.
|
||||
{"Offline Messages:","オフラインメッセージ:"}.
|
||||
{"Offline Messages","オフラインメッセージ"}.
|
||||
{"OK","OK"}.
|
||||
{"Old Password:","古いパスワード:"}.
|
||||
{"Online","オンライン"}.
|
||||
{"Online Users:","オンラインユーザー:"}.
|
||||
{"Online Users","オンラインユーザー"}.
|
||||
{"Only deliver notifications to available users","有効なユーザーにのみ告知を送信する"}.
|
||||
{"Only moderators and participants are allowed to change the subject in this room","モデレーターと参加者のみが談話室の題を変更できます"}.
|
||||
{"Only moderators are allowed to change the subject in this room","モデレーターのみが談話室の題を変更できます"}.
|
||||
{"Only moderators can approve voice requests","モデレーターだけが発言権の要求を承認できます"}.
|
||||
{"Only occupants are allowed to send messages to the conference","在室者のみがこの会議にメッセージを送ることができます"}.
|
||||
{"Only occupants are allowed to send queries to the conference","在室者のみが会議にクエリーを送信することができます"}.
|
||||
{"Only service administrators are allowed to send service messages","サービス管理者のみがサービスメッセージを送信できます"}.
|
||||
{"Options","オプション"}.
|
||||
{"Organization Name","会社名"}.
|
||||
{"Organization Unit","部署名"}.
|
||||
{"Outgoing s2s Connections:","外向き s2s コネクション:"}.
|
||||
{"Outgoing s2s Connections","外向き s2s コネクション"}.
|
||||
{"Outgoing s2s Servers:","外向き s2s サービス:"}.
|
||||
{"Owner privileges required","主宰者の権限が必要です"}.
|
||||
{"Packet","パケット"}.
|
||||
{"Password:","パスワード"}.
|
||||
{"Password","パスワード"}.
|
||||
{"Password ~b","パスワード ~b"}.
|
||||
{"Password Verification:","パスワード (確認):"}.
|
||||
{"Password Verification","パスワード (確認)"}.
|
||||
{"Path to Dir","ディレクトリのパス"}.
|
||||
{"Path to File","ファイルのパス"}.
|
||||
{"Pending","保留"}.
|
||||
{"Period: ","期間: "}.
|
||||
{"Persist items to storage","アイテムをストレージに保存する"}.
|
||||
{"Ping","Ping"}.
|
||||
{"Please note that these options will only backup the builtin Mnesia database. If you are using the ODBC module, you also need to backup your SQL database separately.","これらのオプションは組み込みの Mnesia データーベースのバックアップのみを行うことに注意してください。もし ODBC モジュールを使用している場合は、SQL データーベースのバックアップを別に行う必要があります。"}.
|
||||
{"Please, wait for a while before sending new voice request","新しい発言権の要求を送るまで少し間をおいてください"}.
|
||||
{"Pong","Pong"}.
|
||||
{"Port","ポート"}.
|
||||
{"Port ~b","ポート ~b"}.
|
||||
{"Present real Jabber IDs to","本当の Jabber ID を公開"}.
|
||||
{"private, ","プライベート、"}.
|
||||
{"Protocol","プロトコル"}.
|
||||
{"Publish-Subscribe","Publish-Subscribe"}.
|
||||
{"PubSub subscriber request","PubSub 購読者のリクエスト"}.
|
||||
{"Purge all items when the relevant publisher goes offline","公開者がオフラインになるときに、すべてのアイテムを削除"}.
|
||||
{"Queries to the conference members are not allowed in this room","この談話室では、会議のメンバーへのクエリーは禁止されています"}.
|
||||
{"RAM and disc copy","RAM, ディスクコピー"}.
|
||||
{"RAM copy","RAM コピー"}.
|
||||
{"Raw","Raw"}.
|
||||
{"Really delete message of the day?","本当にお知らせメッセージを削除しますか ?"}.
|
||||
{"Recipient is not in the conference room","受信者はこの会議室にいません"}.
|
||||
{"Register a Jabber account","Jabber アカウントを登録"}.
|
||||
{"Registered Users:","登録ユーザー:"}.
|
||||
{"Registered Users","登録ユーザー"}.
|
||||
{"Register","登録"}.
|
||||
{"Registration in mod_irc for ","mod_irc での登録: "}.
|
||||
{"Remote copy","リモートコピー"}.
|
||||
{"Remove All Offline Messages","すべてのオフラインメッセージを削除"}.
|
||||
{"Remove User","ユーザーを削除"}.
|
||||
{"Remove","削除"}.
|
||||
{"Replaced by new connection","新しいコネクションによって置き換えられました"}.
|
||||
{"Resources","リソース"}.
|
||||
{"Restart Service","サービスを再起動"}.
|
||||
{"Restart","再起動"}.
|
||||
{"Restore","リストア"}.
|
||||
{"Restore Backup from File at ","ファイルからバックアップをリストア: "}.
|
||||
{"Restore binary backup after next ejabberd restart (requires less memory):","ejabberd の再起動時にバイナリバックアップからリストア (メモリ少):"}.
|
||||
{"Restore binary backup immediately:","直ちにバイナリバックアップからリストア:"}.
|
||||
{"Restore plain text backup immediately:","直ちにプレーンテキストバックアップからリストア:"}.
|
||||
{"Room Configuration","談話室の設定"}.
|
||||
{"Room creation is denied by service policy","サービスポリシーによって談話室の作成が禁止されています"}.
|
||||
{"Room description","談話室の説明"}.
|
||||
{"Room Occupants","在室者"}.
|
||||
{"Room title","談話室のタイトル"}.
|
||||
{"Roster groups allowed to subscribe","名簿グループは購読を許可しました"}.
|
||||
{"Roster of ","名簿: "}.
|
||||
{"Roster size","名簿サイズ"}.
|
||||
{"Roster","名簿"}.
|
||||
{"RPC Call Error","RPC 呼び出しエラー"}.
|
||||
{"Running Nodes","起動ノード"}.
|
||||
{"~s access rule configuration","~s アクセスルール設定"}.
|
||||
{"Saturday","土曜日"}.
|
||||
{"Script check","スクリプトチェック"}.
|
||||
{"Search Results for ","検索結果: "}.
|
||||
{"Search users in ","ユーザーの検索: "}.
|
||||
{"Send announcement to all online users on all hosts","全ホストのオンラインユーザーにアナウンスを送信"}.
|
||||
{"Send announcement to all online users","すべてのオンラインユーザーにアナウンスを送信"}.
|
||||
{"Send announcement to all users on all hosts","全ホストのユーザーにアナウンスを送信"}.
|
||||
{"Send announcement to all users","すべてのユーザーにアナウンスを送信"}.
|
||||
{"September","9月"}.
|
||||
{"Server:","サーバー:"}.
|
||||
{"Server ~b","サーバー ~b"}.
|
||||
{"Set message of the day and send to online users","お知らせメッセージを設定し、オンラインユーザーに送信"}.
|
||||
{"Set message of the day on all hosts and send to online users","全ホストのお知らせメッセージを設定し、オンラインユーザーに送信"}.
|
||||
{"Shared Roster Groups","共有名簿グループ"}.
|
||||
{"Show Integral Table","累積の表を表示"}.
|
||||
{"Show Ordinary Table","通常の表を表示"}.
|
||||
{"Shut Down Service","サービスを停止"}.
|
||||
{"~s invites you to the room ~s","~s はあなたを談話室 ~s に招待しています"}.
|
||||
{"Some Jabber clients can store your password in your computer. Use that feature only if you trust your computer is safe.","Jabber クライアントはコンピューターにパスワードを記憶できます。コンピューターが安全であると信頼できる場合にのみ、この機能を使用してください。"}.
|
||||
{"Specify the access model","アクセスモデルを設定する"}.
|
||||
{"Specify the event message type","イベントメッセージ種別を設定"}.
|
||||
{"Specify the publisher model","公開モデルを指定する"}.
|
||||
{"~s's Offline Messages Queue","~s' のオフラインメッセージキュー"}.
|
||||
{"Start Modules at ","モジュールを開始: "}.
|
||||
{"Start Modules","モジュールを起動"}.
|
||||
{"Start","開始"}.
|
||||
{"Statistics of ~p","~p の統計"}.
|
||||
{"Statistics","統計"}.
|
||||
{"Stop Modules at ","モジュールを停止: "}.
|
||||
{"Stop Modules","モジュールを停止"}.
|
||||
{"Stopped Nodes","停止ノード"}.
|
||||
{"Stop","停止"}.
|
||||
{"Storage Type","ストレージタイプ"}.
|
||||
{"Store binary backup:","バイナリバックアップを保存:"}.
|
||||
{"Store plain text backup:","プレーンテキストバックアップを保存:"}.
|
||||
{"Subject","題"}.
|
||||
{"Submitted","送信完了"}.
|
||||
{"Submit","送信"}.
|
||||
{"Subscriber Address","購読者のアドレス"}.
|
||||
{"Subscription","認可"}.
|
||||
{"Sunday","日曜日"}.
|
||||
{"That nickname is already in use by another occupant","そのニックネームは既にほかの在室者によって使用されています"}.
|
||||
{"That nickname is registered by another person","ニックネームはほかの人によって登録されています"}.
|
||||
{"The CAPTCHA is valid.","CAPTCHA は有効です。"}.
|
||||
{"The CAPTCHA verification has failed","CAPTCHA 検証は失敗しました"}.
|
||||
{"The collections with which a node is affiliated","提携されたノードの集合です"}.
|
||||
{"the password is","パスワードは"}.
|
||||
{"The password is too weak","このパスワードは単純過ぎます"}.
|
||||
{"The password of your Jabber account was successfully changed.","Jabber アカウントのパスワード変更に成功しました。"}.
|
||||
{"There was an error changing the password: ","パスワードの変更中にエラーが発生しました: "}.
|
||||
{"There was an error creating the account: ","アカウントの作成中にエラーが発生しました: "}.
|
||||
{"There was an error deleting the account: ","アカウントの削除中にエラーが発生しました: "}.
|
||||
{"This is case insensitive: macbeth is the same that MacBeth and Macbeth.","大文字と小文字は区別しません: macbeth は MacBeth や Macbeth と同じです。"}.
|
||||
{"This page allows to create a Jabber account in this Jabber server. Your JID (Jabber IDentifier) will be of the form: username@server. Please read carefully the instructions to fill correctly the fields.","ここはこの Jabber サーバーにアカウントを作成するページです。あなたの JID (JabberID) は username@server のような形式になります。注意事項どおり、正しく項目を記入してください。"}.
|
||||
{"This page allows to unregister a Jabber account in this Jabber server.","ここはこの Jabber サーバーのアカウントを削除するページです。"}.
|
||||
{"This participant is kicked from the room because he sent an error message to another participant","他の参加者にエラーメッセージを送信したため、この参加者はキックされました"}.
|
||||
{"This participant is kicked from the room because he sent an error message","エラーメッセージを送信したため、この参加者はキックされました"}.
|
||||
{"This participant is kicked from the room because he sent an error presence","エラープレゼンスを送信したため、この参加者はキックされました"}.
|
||||
{"This room is not anonymous","この談話室は非匿名です"}.
|
||||
{"Thursday","木曜日"}.
|
||||
{"Time delay","遅延時間"}.
|
||||
{"Time","時間"}.
|
||||
{"Too many CAPTCHA requests","CAPTCHA 要求が多すぎます"}.
|
||||
{"To ~s","宛先 ~s"}.
|
||||
{"To","宛先"}.
|
||||
{"Traffic rate limit is exceeded","トラフィックレートの制限を超えました"}.
|
||||
{"Transactions Aborted:","トランザクションの失敗:"}.
|
||||
{"Transactions Committed:","トランザクションのコミット:"}.
|
||||
{"Transactions Logged:","トランザクションのログ: "}.
|
||||
{"Transactions Restarted:","トランザクションの再起動:"}.
|
||||
{"Tuesday","火曜日"}.
|
||||
{"Unable to generate a CAPTCHA","CAPTCHA を生成できません"}.
|
||||
{"Unauthorized","認証されていません"}.
|
||||
{"Unregister a Jabber account","Jabber アカウントを削除"}.
|
||||
{"Unregister","削除"}.
|
||||
{"Update message of the day (don't send)","お知らせメッセージを更新 (送信しない)"}.
|
||||
{"Update message of the day on all hosts (don't send)","全ホストのお知らせメッセージを更新 (送信しない)"}.
|
||||
{"Update plan","更新計画"}.
|
||||
{"Update script","スクリプトの更新"}.
|
||||
{"Update ","更新 "}.
|
||||
{"Update","更新"}.
|
||||
{"Uptime:","起動時間:"}.
|
||||
{"Use of STARTTLS required","STARTTLS の使用が必要です"}.
|
||||
{"User ","ユーザー "}.
|
||||
{"User","ユーザー"}.
|
||||
{"User JID","ユーザー JID"}.
|
||||
{"User Management","ユーザー管理"}.
|
||||
{"Username:","ユーザー名:"}.
|
||||
{"Users","ユーザー"}.
|
||||
{"Users are not allowed to register accounts so quickly","それほど速くアカウントを登録することはできません"}.
|
||||
{"Users Last Activity","ユーザーの活動履歴"}.
|
||||
{"Validate","検証"}.
|
||||
{"vCard User Search","vCard ユーザー検索"}.
|
||||
{"Virtual Hosts","ヴァーチャルホスト"}.
|
||||
{"Visitors are not allowed to change their nicknames in this room","傍聴者はこの談話室でニックネームを変更することはできません"}.
|
||||
{"Visitors are not allowed to send messages to all occupants","傍聴者はすべての在室者にメッセージを送信することはできません"}.
|
||||
{"Voice requests are disabled in this conference","この会議では、発言権の要求はできません"}.
|
||||
{"Voice request","発言権を要求"}.
|
||||
{"Wednesday","水曜日"}.
|
||||
{"When to send the last published item","最後の公開アイテムを送信するタイミングで"}.
|
||||
{"Whether to allow subscriptions","購読を許可するかどうか"}.
|
||||
{"You can later change your password using a Jabber client.","あなたは後で Jabber クライアントを使用してパスワードを変更できます。"}.
|
||||
{"You have been banned from this room","あなたはこの談話室からバンされています"}.
|
||||
{"You must fill in field \"Nickname\" in the form","フォームの\"ニックネーム\"欄を入力する必要があります"}.
|
||||
{"You need a client that supports x:data and CAPTCHA to register","登録を行うには x:data と CAPTCHA をサポートするクライアントが必要です"}.
|
||||
{"You need a client that supports x:data to register the nickname","ニックネームを登録するには x:data をサポートするクライアントが必要です"}.
|
||||
{"You need an x:data capable client to configure mod_irc settings","mod_irc の設定には x:data をサポートするクライアントが必要です"}.
|
||||
{"You need an x:data capable client to configure room","談話室を設定するには x:data をサポートするクライアントが必要です"}.
|
||||
{"You need an x:data capable client to search","検索を行うためには x:data をサポートするクライアントが必要です"}.
|
||||
{"Your active privacy list has denied the routing of this stanza.","あなたのプライバシーリストはこのスタンザのルーティングを拒否しました。"}.
|
||||
{"Your contact offline message queue is full. The message has been discarded.","相手先のオフラインメッセージキューが一杯です。このメッセージは破棄されます。"}.
|
||||
{"Your Jabber account was successfully created.","Jabber アカウントの作成に成功しました。"}.
|
||||
{"Your Jabber account was successfully deleted.","Jabber アカウントの削除に成功しました。"}.
|
||||
{"Your messages to ~s are being blocked. To unblock them, visit ~s","~s 宛のメッセージはブロックされています。解除するにはこちらを見てください ~s"}.
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user